summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/install/Production-Ubuntu.md12
-rw-r--r--doc/install/Requirements.md2
-rw-r--r--doc/install/Troubleshooting.md6
-rw-r--r--doc/process/documentation-guidelines.md4
-rw-r--r--doc/process/release-process.md4
-rw-r--r--docker/1.0/Dockerrun.aws.zipbin711 -> 0 bytes
-rw-r--r--docker/1.2/Dockerfile (renamed from docker/1.0/Dockerfile)2
-rw-r--r--docker/1.2/Dockerrun.aws.zipbin0 -> 867 bytes
-rw-r--r--docker/1.2/Dockerrun.aws/.ebextensions/01_files.config (renamed from docker/1.0/Dockerrun.aws/.ebextensions/01_files.config)0
-rwxr-xr-xdocker/1.2/Dockerrun.aws/Dockerrun.aws.json (renamed from docker/1.0/Dockerrun.aws/Dockerrun.aws.json)2
-rw-r--r--docker/1.2/README.md23
-rw-r--r--docker/1.2/config_docker.json (renamed from docker/1.0/config_docker.json)14
-rwxr-xr-xdocker/1.2/docker-entry.sh (renamed from docker/1.0/docker-entry.sh)0
-rw-r--r--model/version.go1
-rw-r--r--store/sql_channel_store.go49
-rw-r--r--store/sql_post_store.go17
-rw-r--r--store/sql_team_store.go5
-rw-r--r--store/sql_user_store.go2
-rw-r--r--web/react/components/posts_view.jsx13
-rw-r--r--web/react/components/posts_view_container.jsx2
-rw-r--r--web/react/components/tutorial/tutorial_tip.jsx7
-rw-r--r--web/react/components/user_settings/manage_incoming_hooks.jsx2
-rw-r--r--web/react/components/user_settings/manage_outgoing_hooks.jsx2
-rw-r--r--web/sass-files/sass/partials/_tutorial.scss8
-rw-r--r--web/static/images/tutorialTip.gifbin18421 -> 22502 bytes
-rw-r--r--web/static/images/tutorialTipWhite.gifbin0 -> 6704 bytes
26 files changed, 86 insertions, 91 deletions
diff --git a/doc/install/Production-Ubuntu.md b/doc/install/Production-Ubuntu.md
index ec0c1c96b..098707ada 100644
--- a/doc/install/Production-Ubuntu.md
+++ b/doc/install/Production-Ubuntu.md
@@ -24,6 +24,16 @@
* ```postgre=# \q```
1. You can exit the postgres account by typing:
* ``` exit```
+1. Allow Postgres to listen on all assigned IP Addresses
+ * ```sudo vi /etc/postgresql/9.3/main/postgresql.conf```
+ * Uncomment 'listen_addresses' and change 'localhost' to '*'
+1. Alter pg_hba.conf to allow the mattermost server to talk to the postgres database
+ * ```sudo vi /etc/postgresql/9.3/main/pg_hba.conf```
+ * Add the following line to the 'IPv4 local connections'
+ * host all all 10.10.10.2/32 md5
+1. Reload Postgres database
+ * ```sudo /etc/init.d/postgresql reload```
+
## Set up Mattermost Server
1. For the purposes of this guide we will assume this server has an IP address of 10.10.10.2
@@ -32,7 +42,7 @@
1. Unzip the Mattermost Server by typing:
* ``` tar -xvzf mattermost.tar.gz```
1. For the sake of making this guide simple we located the files at `/home/ubuntu/mattermost`. In the future we will give guidance for storing under `/opt`.
-1. We have also elected to run the Mattermost Server as the `ubuntu` account for simplicity. We recommend settings up and running the service under a `mattermost` user account with limited permissions.
+1. We have also elected to run the Mattermost Server as the `ubuntu` account for simplicity. We recommend setting up and running the service under a `mattermost` user account with limited permissions.
1. 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 `/mattermost/data`.
* Create the directory by typing:
* ``` sudo mkdir -p /mattermost/data```
diff --git a/doc/install/Requirements.md b/doc/install/Requirements.md
index 61fa8e7be..b877b6dc0 100644
--- a/doc/install/Requirements.md
+++ b/doc/install/Requirements.md
@@ -47,7 +47,7 @@ The Mattermost roadmap does not currently include production support for Fedora,
Mattermost offers both real-time communication and file sharing. CPU and Memory requirements are typically driven by the number of concurrent users using real-time messaging. Storage requirements are typically driven by number and size of files shared.
-The below guidelines offer estimates based on real world usage of Mattermost across industries.
+The below guidelines offer estimates based on real world usage of Mattermost in multi-team configurations ranging from 10-100 users per team.
### CPU
diff --git a/doc/install/Troubleshooting.md b/doc/install/Troubleshooting.md
index 7166f9978..51699a39c 100644
--- a/doc/install/Troubleshooting.md
+++ b/doc/install/Troubleshooting.md
@@ -28,3 +28,9 @@ The following is a list of common error messages and solutions:
###### `panic: runtime error: invalid memory address or nil pointer dereference`
- This error can occur if you have manually manipulated the Mattermost database, typically with deletions. Mattermost is designed to serve as a searchable archive, and manual manipulation of the database elements compromises integrity and may prevent upgrade.
- **Solution:** Restore from database backup created prior to manual database updates, or reinstall the system.
+
+###### `Token request failed`
+ - This error can appear in the web browser after attempting to create a new team with GitLab SSO enabled
+ - **Solutions:**
+ 1. Check that your SSL settings for the SSO provider match the `http://` or `https://` choice selected in `config.json` under `GitLabSettings`
+ 2. Follow steps 1 to 3 of the manual [GitLab SSO configuration procedure](https://github.com/mattermost/platform/blob/master/doc/integrations/Single-Sign-On/Gitlab.md) to confirm your `Secret` and `Id` settings in `config.json` match your GitLab settings, and if they don't, manually update `config.json` to the correct settings and see if this clears the issue.
diff --git a/doc/process/documentation-guidelines.md b/doc/process/documentation-guidelines.md
index f37f0c5fc..59ed0a445 100644
--- a/doc/process/documentation-guidelines.md
+++ b/doc/process/documentation-guidelines.md
@@ -49,7 +49,7 @@ Headings in markdown provide anchors that can be used to easily reference sub-se
##### Step 1: Add a heading
This makes things easier to reference via hyperlinks
##### Step 2: Link to headings
-So things are eariser to find
+So things are easier to find
----
##### Incorrect:
@@ -58,7 +58,7 @@ So things are eariser to find
**Step 1: Add a heading**
This makes things easier to reference via hyperlinks
**Step 2: Link to headings**
-So things are eariser to find
+So things are easier to find
----
### Use appropriate heading case
diff --git a/doc/process/release-process.md b/doc/process/release-process.md
index 04ec9a366..96bd2b050 100644
--- a/doc/process/release-process.md
+++ b/doc/process/release-process.md
@@ -43,12 +43,12 @@ This is a working document that will update as our process evolves.
- (Team) Select "Top Contributor" for the release from external contributions to be mentioned in release announcement
- (Marketing) Decides announce date (discuss in meeting)
- (Ops) Post Announce Date in Release channel + update the channel header to reflect date
-- (Marketing) Communicates checklist of items needed by specific dates to write the blog post announce (eg screenshots, GIFs, documentation) and begins to write the blog post, tweet, and email for the release announcement
+- (Marketing) Communicates checklist of items needed by specific dates to write the blog post announce (e.g. screenshots, GIFs, documentation) and begins to write the blog post, tweet, and email for the release announcement
- (PM) Works with Ops to check the Quality Gate for feature complete
- (PM) Communicate to team the plan for next release
- (Stand-up) Each team member discusses worst bug
-### - (5 weekdays before release date) Code Compete and Release Candidate Cut
+### - (5 weekdays before release date) Code Complete and Release Candidate Cut
- (Team) Meets to discuss release at 10am PST
- (PM) Each area changed in latest release is assigned a PM owner to lead testing
- (Ops) Walks through each item of the **Code Complete and Release Candidate Cut** checklist
diff --git a/docker/1.0/Dockerrun.aws.zip b/docker/1.0/Dockerrun.aws.zip
deleted file mode 100644
index 8c2c16e10..000000000
--- a/docker/1.0/Dockerrun.aws.zip
+++ /dev/null
Binary files differ
diff --git a/docker/1.0/Dockerfile b/docker/1.2/Dockerfile
index a41c73514..6a8d69196 100644
--- a/docker/1.0/Dockerfile
+++ b/docker/1.2/Dockerfile
@@ -34,7 +34,7 @@ VOLUME /var/lib/mysql
WORKDIR /mattermost
# Copy over files
-ADD https://github.com/mattermost/platform/releases/download/v1.0.0/mattermost.tar.gz /
+ADD https://github.com/mattermost/platform/releases/download/v1.2.0-rc1/mattermost.tar.gz /
RUN tar -zxvf /mattermost.tar.gz --strip-components=1 && rm /mattermost.tar.gz
ADD config_docker.json /
ADD docker-entry.sh /
diff --git a/docker/1.2/Dockerrun.aws.zip b/docker/1.2/Dockerrun.aws.zip
new file mode 100644
index 000000000..4de6ec362
--- /dev/null
+++ b/docker/1.2/Dockerrun.aws.zip
Binary files differ
diff --git a/docker/1.0/Dockerrun.aws/.ebextensions/01_files.config b/docker/1.2/Dockerrun.aws/.ebextensions/01_files.config
index 7f40a8b34..7f40a8b34 100644
--- a/docker/1.0/Dockerrun.aws/.ebextensions/01_files.config
+++ b/docker/1.2/Dockerrun.aws/.ebextensions/01_files.config
diff --git a/docker/1.0/Dockerrun.aws/Dockerrun.aws.json b/docker/1.2/Dockerrun.aws/Dockerrun.aws.json
index 9fdded15e..c32a998e4 100755
--- a/docker/1.0/Dockerrun.aws/Dockerrun.aws.json
+++ b/docker/1.2/Dockerrun.aws/Dockerrun.aws.json
@@ -1,7 +1,7 @@
{
"AWSEBDockerrunVersion": "1",
"Image": {
- "Name": "mattermost/platform:1.0",
+ "Name": "mattermost/platform:1.2",
"Update": "true"
},
"Ports": [
diff --git a/docker/1.2/README.md b/docker/1.2/README.md
new file mode 100644
index 000000000..f737a1554
--- /dev/null
+++ b/docker/1.2/README.md
@@ -0,0 +1,23 @@
+Mattermost
+==========
+
+http:/mattermost.org
+
+Mattermost is an open-source team communication service. It brings team messaging and file sharing into one place, accessible across PCs and phones, with archiving and search.
+
+Installing Mattermost
+=====================
+
+To run an instance of the latest version of mattermost on your local machine you can run:
+
+`docker run --name mattermost-dev -d --publish 8065:80 mattermost/platform`
+
+To update this image to the latest version you can run:
+
+`docker pull mattermost/platform`
+
+To run an instance of the latest code from the master branch on GitHub you can run:
+
+`docker run --name mattermost-dev -d --publish 8065:80 mattermost/platform:dev`
+
+Any questions, please visit http://forum.mattermost.org
diff --git a/docker/1.0/config_docker.json b/docker/1.2/config_docker.json
index 806071376..80e6ab14e 100644
--- a/docker/1.0/config_docker.json
+++ b/docker/1.2/config_docker.json
@@ -5,15 +5,21 @@
"SegmentDeveloperKey": "",
"GoogleDeveloperKey": "",
"EnableOAuthServiceProvider": false,
- "EnableIncomingWebhooks": false,
- "EnableTesting": false
+ "EnableIncomingWebhooks": true,
+ "EnableOutgoingWebhooks": true,
+ "EnablePostUsernameOverride": false,
+ "EnablePostIconOverride": false,
+ "EnableTesting": false,
+ "EnableSecurityFixAlert": true
},
"TeamSettings": {
"SiteName": "Mattermost",
"MaxUsersPerTeam": 50,
"EnableTeamCreation": true,
"EnableUserCreation": true,
- "RestrictCreationToDomains": ""
+ "RestrictCreationToDomains": "",
+ "RestrictTeamNames": true,
+ "EnableTeamListing": false
},
"SqlSettings": {
"DriverName": "mysql",
@@ -86,4 +92,4 @@
"TokenEndpoint": "",
"UserApiEndpoint": ""
}
-} \ No newline at end of file
+}
diff --git a/docker/1.0/docker-entry.sh b/docker/1.2/docker-entry.sh
index 6bd2a1263..6bd2a1263 100755
--- a/docker/1.0/docker-entry.sh
+++ b/docker/1.2/docker-entry.sh
diff --git a/model/version.go b/model/version.go
index a61004fde..6eae436bc 100644
--- a/model/version.go
+++ b/model/version.go
@@ -12,6 +12,7 @@ import (
// It should be maitained in chronological order with most current
// release at the front of the list.
var versions = []string{
+ "1.2.0",
"1.1.0",
"1.0.0",
"0.7.1",
diff --git a/store/sql_channel_store.go b/store/sql_channel_store.go
index 2d62b8614..6fcad5dc2 100644
--- a/store/sql_channel_store.go
+++ b/store/sql_channel_store.go
@@ -40,55 +40,6 @@ func NewSqlChannelStore(sqlStore *SqlStore) ChannelStore {
}
func (s SqlChannelStore) UpgradeSchemaIfNeeded() {
-
- // REMOVE AFTER 1.2 SHIP see PLT-828
- if s.CreateColumnIfNotExists("ChannelMembers", "NotifyProps", "varchar(2000)", "varchar(2000)", "{}") {
- // populate NotifyProps from existing NotifyLevel field
-
- // set default values
- _, err := s.GetMaster().Exec(
- `UPDATE
- ChannelMembers
- SET
- NotifyProps = CONCAT('{"desktop":"', CONCAT(NotifyLevel, '","mark_unread":"` + model.CHANNEL_MARK_UNREAD_ALL + `"}'))`)
- if err != nil {
- l4g.Error("Unable to set default values for ChannelMembers.NotifyProps")
- l4g.Error(err.Error())
- }
-
- // assume channels with all notifications enabled are just using the default settings
- _, err = s.GetMaster().Exec(
- `UPDATE
- ChannelMembers
- SET
- NotifyProps = '{"desktop":"` + model.CHANNEL_NOTIFY_DEFAULT + `","mark_unread":"` + model.CHANNEL_MARK_UNREAD_ALL + `"}'
- WHERE
- NotifyLevel = '` + model.CHANNEL_NOTIFY_ALL + `'`)
- if err != nil {
- l4g.Error("Unable to set values for ChannelMembers.NotifyProps when members previously had notifyLevel=all")
- l4g.Error(err.Error())
- }
-
- // set quiet mode channels to have no notifications and only mark the channel unread on mentions
- _, err = s.GetMaster().Exec(
- `UPDATE
- ChannelMembers
- SET
- NotifyProps = '{"desktop":"` + model.CHANNEL_NOTIFY_NONE + `","mark_unread":"` + model.CHANNEL_MARK_UNREAD_MENTION + `"}'
- WHERE
- NotifyLevel = 'quiet'`)
- if err != nil {
- l4g.Error("Unable to set values for ChannelMembers.NotifyProps when members previously had notifyLevel=quiet")
- l4g.Error(err.Error())
- }
-
- s.RemoveColumnIfExists("ChannelMembers", "NotifyLevel")
- }
-
- // BEGIN REMOVE AFTER 1.2.0
- s.RenameColumnIfExists("Channels", "Description", "Header", "varchar(1024)")
- s.CreateColumnIfNotExists("Channels", "Purpose", "varchar(1024)", "varchar(1024)", "")
- // END REMOVE AFTER 1.2.0
}
func (s SqlChannelStore) CreateIndexesIfNotExists() {
diff --git a/store/sql_post_store.go b/store/sql_post_store.go
index 3460fca92..3a25fe89b 100644
--- a/store/sql_post_store.go
+++ b/store/sql_post_store.go
@@ -9,10 +9,8 @@ import (
"strconv"
"strings"
- l4g "code.google.com/p/log4go"
"github.com/mattermost/platform/model"
"github.com/mattermost/platform/utils"
- "time"
)
type SqlPostStore struct {
@@ -40,21 +38,6 @@ func NewSqlPostStore(sqlStore *SqlStore) PostStore {
}
func (s SqlPostStore) UpgradeSchemaIfNeeded() {
- colType := s.GetColumnDataType("Posts", "Props")
- if colType != "text" {
-
- query := "ALTER TABLE Posts MODIFY COLUMN Props TEXT"
- if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_POSTGRES {
- query = "ALTER TABLE Posts ALTER COLUMN Props TYPE text"
- }
-
- _, err := s.GetMaster().Exec(query)
- if err != nil {
- l4g.Critical("Failed to alter column Posts.Props to TEXT: " + err.Error())
- time.Sleep(time.Second)
- panic("Failed to alter column Posts.Props to TEXT: " + err.Error())
- }
- }
}
func (s SqlPostStore) CreateIndexesIfNotExists() {
diff --git a/store/sql_team_store.go b/store/sql_team_store.go
index e0f95fa7e..1a0aeabde 100644
--- a/store/sql_team_store.go
+++ b/store/sql_team_store.go
@@ -30,11 +30,6 @@ func NewSqlTeamStore(sqlStore *SqlStore) TeamStore {
}
func (s SqlTeamStore) UpgradeSchemaIfNeeded() {
- // REMOVE AFTER 1.2 SHIP see PLT-828
- s.RemoveColumnIfExists("Teams", "AllowValet")
- s.CreateColumnIfNotExists("Teams", "InviteId", "varchar(32)", "varchar(32)", "")
- s.CreateColumnIfNotExists("Teams", "AllowOpenInvite", "tinyint(1)", "boolean", "0")
- s.CreateColumnIfNotExists("Teams", "AllowTeamListing", "tinyint(1)", "boolean", "0")
}
func (s SqlTeamStore) CreateIndexesIfNotExists() {
diff --git a/store/sql_user_store.go b/store/sql_user_store.go
index 686949a4d..d38b5c214 100644
--- a/store/sql_user_store.go
+++ b/store/sql_user_store.go
@@ -41,8 +41,6 @@ func NewSqlUserStore(sqlStore *SqlStore) UserStore {
}
func (us SqlUserStore) UpgradeSchemaIfNeeded() {
- // REMOVE AFTER 1.2 SHIP see PLT-828
- us.CreateColumnIfNotExists("Users", "ThemeProps", "varchar(2000)", "character varying(2000)", "{}")
}
func (us SqlUserStore) CreateIndexesIfNotExists() {
diff --git a/web/react/components/posts_view.jsx b/web/react/components/posts_view.jsx
index 2b81d1d79..b782268fa 100644
--- a/web/react/components/posts_view.jsx
+++ b/web/react/components/posts_view.jsx
@@ -30,6 +30,9 @@ export default class PostsView extends React.Component {
static get SIDEBAR_OPEN() {
return 3;
}
+ static get SCROLL_TYPE_NEW_MESSAGE() {
+ return 4;
+ }
isAtBottom() {
return ((this.refs.postlist.scrollHeight - this.refs.postlist.scrollTop) === this.refs.postlist.clientHeight);
}
@@ -145,6 +148,7 @@ export default class PostsView extends React.Component {
<div
id={newSeparatorId}
key='unviewed'
+ ref='newMessageSeparator'
className='new-separator'
>
<hr
@@ -165,6 +169,15 @@ export default class PostsView extends React.Component {
window.requestAnimationFrame(() => {
this.refs.postlist.scrollTop = this.refs.postlist.scrollHeight;
});
+ } else if (this.props.scrollType === PostsView.SCROLL_TYPE_NEW_MESSAGE) {
+ window.requestAnimationFrame(() => {
+ // If separator exists scroll to it. Otherwise scroll to bottom.
+ if (this.refs.newMessageSeparator) {
+ this.refs.newMessageSeparator.scrollIntoView();
+ } else {
+ this.refs.postlist.scrollTop = this.refs.postlist.scrollHeight;
+ }
+ });
} else if (this.props.scrollType === PostsView.SCROLL_TYPE_POST && this.props.scrollPost) {
window.requestAnimationFrame(() => {
const postNode = ReactDOM.findDOMNode(this.refs[this.props.scrollPost]);
diff --git a/web/react/components/posts_view_container.jsx b/web/react/components/posts_view_container.jsx
index 5059747bd..5037a86cd 100644
--- a/web/react/components/posts_view_container.jsx
+++ b/web/react/components/posts_view_container.jsx
@@ -109,7 +109,7 @@ export default class PostsViewContainer extends React.Component {
this.setState({
currentChannelIndex: newIndex,
currentLastViewed: lastViewed,
- scrollType: PostsView.SCROLL_TYPE_BOTTOM,
+ scrollType: PostsView.SCROLL_TYPE_NEW_MESSAGE,
channels,
postLists});
}
diff --git a/web/react/components/tutorial/tutorial_tip.jsx b/web/react/components/tutorial/tutorial_tip.jsx
index 3094b2f4c..75d73e920 100644
--- a/web/react/components/tutorial/tutorial_tip.jsx
+++ b/web/react/components/tutorial/tutorial_tip.jsx
@@ -69,11 +69,16 @@ export default class TutorialTip extends React.Component {
}
}
+ var tipColor = '';
+ if (this.props.overlayClass === 'tip-overlay--header') {
+ tipColor = 'White';
+ }
+
return (
<div className={'tip-div ' + this.props.overlayClass}>
<img
className='tip-button'
- src='/static/images/tutorialTip.gif'
+ src={'/static/images/tutorialTip' + tipColor + '.gif'}
width='35'
onClick={this.toggle}
ref='target'
diff --git a/web/react/components/user_settings/manage_incoming_hooks.jsx b/web/react/components/user_settings/manage_incoming_hooks.jsx
index 6b8c09718..128c011ea 100644
--- a/web/react/components/user_settings/manage_incoming_hooks.jsx
+++ b/web/react/components/user_settings/manage_incoming_hooks.jsx
@@ -163,7 +163,7 @@ export default class ManageIncomingHooks extends React.Component {
return (
<div key='addIncomingHook'>
{'Create webhook URLs for use in external integrations. Please see '}<a href='http://mattermost.org/webhooks'>{'http://mattermost.org/webhooks'}</a> {' to learn more.'}
- <label className='control-label padding-top x2'>{'Add a new incoming webhook'}</label>
+ <div><label className='control-label padding-top x2'>{'Add a new incoming webhook'}</label></div>
<div className='row padding-top'>
<div className='col-sm-10 padding-bottom'>
<select
diff --git a/web/react/components/user_settings/manage_outgoing_hooks.jsx b/web/react/components/user_settings/manage_outgoing_hooks.jsx
index 93be988d1..7b7cf7401 100644
--- a/web/react/components/user_settings/manage_outgoing_hooks.jsx
+++ b/web/react/components/user_settings/manage_outgoing_hooks.jsx
@@ -241,7 +241,7 @@ export default class ManageOutgoingHooks extends React.Component {
return (
<div key='addOutgoingHook'>
{'Create webhooks to send new message events to an external integration. Please see '}<a href='http://mattermost.org/webhooks'>{'http://mattermost.org/webhooks'}</a> {' to learn more.'}
- <label className='control-label'>{'Add a new outgoing webhook'}</label>
+ <div><label className='control-label padding-top x2'>{'Add a new outgoing webhook'}</label></div>
<div className='padding-top divider-light'></div>
<div className='padding-top'>
<div>
diff --git a/web/sass-files/sass/partials/_tutorial.scss b/web/sass-files/sass/partials/_tutorial.scss
index 08d491fd9..a6e16fe37 100644
--- a/web/sass-files/sass/partials/_tutorial.scss
+++ b/web/sass-files/sass/partials/_tutorial.scss
@@ -127,7 +127,11 @@
right:0px;
&.tip-overlay--header {
- top: 20px;
+ top: 21px;
+ right: 2px;
+ .tip-button {
+ @include opacity(0.8);
+ }
}
&.tip-overlay--sidebar {
@@ -154,7 +158,7 @@
margin-bottom: 50px;
text-align: left;
display: inline-block;
- padding-bottom: 30px;
+ padding-bottom: 30px;
}
.btn-primary {
position: absolute;
diff --git a/web/static/images/tutorialTip.gif b/web/static/images/tutorialTip.gif
index f185ff4b9..c925f0222 100644
--- a/web/static/images/tutorialTip.gif
+++ b/web/static/images/tutorialTip.gif
Binary files differ
diff --git a/web/static/images/tutorialTipWhite.gif b/web/static/images/tutorialTipWhite.gif
new file mode 100644
index 000000000..ecf8e97be
--- /dev/null
+++ b/web/static/images/tutorialTipWhite.gif
Binary files differ