Permalink
Browse files

Automatically start either a Rails or Jasmine Gem server.

  • Loading branch information...
1 parent 6ecc5b7 commit ae633303ed16412562bf2222f08b0dd8308271ae @netzpirat netzpirat committed Nov 1, 2011
View
5 Gemfile
@@ -4,14 +4,15 @@ source 'http://rubygems.org'
gemspec
gem 'rake'
+gem 'jasmine'
require 'rbconfig'
-if Config::CONFIG['target_os'] =~ /darwin/i
+if RbConfig::CONFIG['target_os'] =~ /darwin/i
gem 'rb-fsevent', '>= 0.4.0'
gem 'growl', '~> 1.0.3'
end
-if Config::CONFIG['target_os'] =~ /linux/i
+if RbConfig::CONFIG['target_os'] =~ /linux/i
gem 'rb-inotify', '>= 0.8.4'
gem 'libnotify', '~> 0.3.0'
end
View
245 README.md
@@ -1,6 +1,6 @@
# Guard::Jasmine [![Build Status](https://secure.travis-ci.org/netzpirat/guard-jasmine.png)](http://travis-ci.org/netzpirat/guard-jasmine)
-Guard::Jasmine automatically tests your Jasmine specs when files are modified.
+Guard::Jasmine automatically tests your Jasmine specs on Rails when files are modified.
Tested on MRI Ruby 1.8.7, 1.9.2, 1.9.3, REE and the latest versions of JRuby & Rubinius.
@@ -22,21 +22,6 @@ various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.
* Runs on Mac OS X, Linux and Windows.
-## How it works
-
-![Guard Jasmine](https://github.com/netzpirat/guard-jasmine/raw/master/resources/guard-jasmine.png)
-
-1. Guard is triggered by a file modification.
-2. Guard::Jasmine executes the [PhantomJS script][].
-3. The PhantomJS script requests the Jasmine test runner via HTTP.
-4. Rails uses the asset pipeline to get the Jasmine runner, the code to be tested and the specs.
-5. The asset pipeline prepares the assets, compiles the CoffeeScripts if necessary.
-6. The asset pipeline has finished to prepare the needed assets.
-7. Rails returns the Jasmine runner HTML.
-8. PhantomJS requests linked assets and runs the Jasmine tests headless.
-9. The PhantomJS script extracts the result from the DOM and returns a JSON report.
-10. Guard::Jasmine reports the results to the console and system notifications.
-
## Install
### Guard and Guard::Jasmine
@@ -47,7 +32,7 @@ Please make sure to have [Guard][] installed.
Add Guard::Jasmine to your `Gemfile`:
```ruby
-group :development do
+group :development, :test do
gem 'guard-jasmine'
end
```
@@ -58,10 +43,52 @@ Add the default Guard::Jasmine template to your `Guardfile` by running:
$ guard init jasmine
```
-### Jasminerice
+### PhantomJS
+
+You need the PhantomJS browser installed on your system. You can download binaries for Mac OS X and Windows from
+[the PhantomJS download section][].
+
+Alternatively you can install [Homebrew][] on Mac OS X and install it with:
+
+```bash
+$ brew install phantomjs
+```
+
+If you are using Ubuntu 10.10, you can install it with apt:
+
+```bash
+$ sudo add-apt-repository ppa:jerome-etienne/neoip
+$ sudo apt-get update
+$ sudo apt-get install phantomjs
+```
+
+You can also build it from source for several other operating systems, please consult the
+[PhantomJS build instructions][].
+
+## Rails 3.1 setup
With Rails 3.1 you can write your Jasmine specs in addition to JavaScript with CoffeeScript, fully integrated into the
-Rails 3.1 asset pipeline with Jasminerice.
+Rails 3.1 asset pipeline with [Jasminerice][]. You have full access to your running Rails app, but it's a good practice
+to fake the server response. Check out the excellent [Sinon.JS][] documentation to learn more about this topic.
+
+Guard::Jasmine will start a Rails Rack server to run your specs.
+
+### How it works
+
+![Guard Jasmine](https://github.com/netzpirat/guard-jasmine/raw/master/resources/guard-jasmine-rails31.jpg)
+
+1. Guard is triggered by a file modification.
+2. Guard::Jasmine executes the [PhantomJS script][].
+3. The PhantomJS script requests the Jasmine test runner via HTTP.
+4. Rails uses the asset pipeline to get the Jasmine runner, the code to be tested and the specs.
+5. The asset pipeline prepares the assets, compiles the CoffeeScripts if necessary.
+6. The asset pipeline has finished to prepare the needed assets.
+7. Rails returns the Jasmine runner HTML.
+8. PhantomJS requests linked assets and runs the Jasmine tests headless.
+9. The PhantomJS script collects the Jasmine runner results and returns a JSON report.
+10. Guard::Jasmine reports the results to the console and system notifications.
+
+### Jasminerice
Please read the detailed installation and configuration instructions at [Jasminerice][].
@@ -88,27 +115,64 @@ asset pipeline manifest in `spec/javascripts/spec.js.coffee`:
#=require_tree ./
```
-### PhantomJS
+## Rails 2 & Rails 3 setup
-You need the PhantomJS browser installed on your system. You can download binaries for Mac OS X and Windows from
-[the PhantomJS download section][].
+With Rails 2 or Rails 3 you can use [the Jasmine Gem][] to configure your Jasmine specs and server the Jasmine
+runner. You don't have full access to your running Rails app, but it's anyway a good practice to fake the server
+response. Check out the excellent [Sinon.JS][] documentation to learn more about this topic.
-Alternatively you can install [Homebrew][] on Mac OS X and install it with:
+Guard::Jasmine will start a Jasmine Gem Rack server to run your specs.
+
+### How it works
+
+![Guard Jasmine](https://github.com/netzpirat/guard-jasmine/raw/master/resources/guard-jasmine-rails23.jpg)
+
+1. Guard is triggered by a file modification.
+2. Guard::Jasmine executes the [PhantomJS script][].
+3. The PhantomJS script requests the Jasmine test runner via HTTP.
+4. The Jasmine Gem reads your configuration and get the assets.
+5. The Jasmine Gem serves the the code to be tested and the specs.
+6. PhantomJS runs the Jasmine tests headless.
+7. The PhantomJS script collects the Jasmine runner results and returns a JSON report.
+8. Guard::Jasmine reports the results to the console and system notifications.
+
+### Jasmine Gem
+
+Please read the detailed installation and configuration instructions at [the Jasmine Gem][].
+
+In short, you add it to your `Gemfile`:
+
+```ruby
+group :development, :test do
+ gem 'jasmine'
+end
+```
+
+and generate the configuration files:
+
+#### for Rails 3
```bash
-$ brew install phantomjs
+$ rails g jasmine:install
```
-If you are using Ubuntu 10.10, you can install it with apt:
+#### for Rails 2
```bash
-$ sudo add-apt-repository ppa:jerome-etienne/neoip
-$ sudo apt-get update
-$ sudo apt-get install phantomjs
+$ script/generate jasmine
```
-You can also build it from source for several other operating systems, please consult the
-[PhantomJS build instructions][].
+Now you can configure your spec suite in the Jasmine configuration file `specs/javascripts/support/jasmine.yml`.
+
+#### Writing CoffeeScript specs
+
+It is also possible to use CoffeeScript in this setup, by using [Guard::CoffeeScript][] to compile your code and even
+specs. Just add something like this *before* Guard::Jasmine:
+
+```ruby
+guard 'coffeescript', :input => 'app/coffeescripts', :output => 'public/javascripts'
+guard 'coffeescript', :input => 'spec/coffeescripts', :output => 'spec/javascripts'
+```
## Usage
@@ -143,8 +207,11 @@ end
The general options configures the environment that is needed to run Guard::Jasmine:
```ruby
-:jasmine_url => 'http://192.168.1.5/jasmine' # URL where Jasmine is served.
- # default: http://127.0.0.1/jasmine
+:server => :jasmine # Jasmine server to use, either :auto, :rack, :jasmine_gem or :none
+ # default: :auto
+
+:port => 9292 # Jasmine server port to use.
+ # default: 8888
:phantomjs_bin => '~/bin/phantomjs' # Path to phantomjs.
# default: '/usr/local/bin/phantomjs'
@@ -153,6 +220,13 @@ The general options configures the environment that is needed to run Guard::Jasm
# default: 10000
```
+If you're setting the `:server` option to `:none`, you can supply the Jasmine runner url manually:
+
+```ruby
+:jasmine_url => 'http://192.168.1.5/jasmine' # URL where Jasmine is served.
+ # default: http://127.0.0.1:8888/jasmine
+```
+
### Spec runner options
The spec runner options configures the behavior driven development (or BDD) cycle:
@@ -229,81 +303,6 @@ These options affects what system notifications (growl, libnotify or notifu) are
# default: 3
```
-## A note on Rails 2 and 3
-
-This readme describes the use of Guard::Jasmine with Jasminerice through the asset pipeline, but it is not really
-a requirement for Guard::Jasmine. As long as you serve the Jasmine test runner under a certain url,
-it's freely up to you how you'll prepare the assets and serve the Jasmine runner.
-
-You can use [the Jasmine Gem][], configure the test suite in `jasmine.yml` and start the Jasmine test runner with
-the supplied Rake task:
-
-```bash
-$ rake jasmine
-```
-
-Next follows an example on how to configure your `Guardfile` with the Jasmine gem:
-
-```ruby
-guard 'jasmine', :jasmine_url => 'http://127.0.0.1:8888' do
- watch(%r{public/javascripts/(.+)\.js}) { |m| "spec/javascripts/#{m[1]}_spec.js" }
- watch(%r{spec/javascripts/(.+)_spec\.js}) { |m| "spec/javascripts/#{m[1]}_spec.js" }
- watch(%r{spec/javascripts/support/jasmine\.yml}) { "spec/javascripts" }
- watch(%r{spec/javascripts/support/jasmine_config\.rb}) { "spec/javascripts" }
-end
-```
-
-You can also use [guard-process](https://github.com/socialreferral/guard-process) to start the Jasmine Gem server when
-Guard starts:
-
-```ruby
-guard 'process', :name => 'Jasmine server', :command => 'bundle exec rake jasmine' do
- watch(%r{spec/javascripts/support/*})
-end
-
-JASMINE_HOST = '127.0.0.1'
-JASMINE_PORT = '8888'
-JASMINE_URL = "http://#{JASMINE_HOST}:#{JASMINE_PORT}/"
-
-Thread.new do
- require 'socket'
-
- puts "\nWaiting for Jasmine to accept connections on #{JASMINE_URL}..."
- wait_for_open_connection(JASMINE_HOST, JASMINE_PORT)
- puts "Jasmine is now ready to accept connections; change a file or press ENTER run your suite."
- puts "You can also view and run specs by visiting:"
- puts JASMINE_URL
-
- guard 'jasmine', :jasmine_url => JASMINE_URL do
- watch(%r{public/javascripts/(.+)\.js}) { |m| "spec/javascripts/#{m[1]}_spec.js" }
- watch(%r{spec/javascripts/(.+)_spec\.js}) { |m| "spec/javascripts/#{m[1]}_spec.js" }
- watch(%r{spec/javascripts/support/jasmine\.yml}) { "spec/javascripts" }
- watch(%r{spec/javascripts/support/jasmine_config\.rb}) { "spec/javascripts" }
- end
-end
-
-def wait_for_open_connection(host, port)
- while true
- begin
- TCPSocket.new(host, port).close
- return
- rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
- end
- end
-end
-```
-
-This elegant solution is provided by [Jason Morrison](http://twitter.com/#!/jayunit), see his original
-[Gist](https://gist.github.com/1224382).
-
-It is also possible to use CoffeeScript in this setup, by using [Guard::CoffeeScript][] to compile your code and even
-specs. Just add something like this *before* Guard::Jasmine:
-
-```ruby
-guard 'coffeescript', :input => 'app/coffeescripts', :output => 'public/javascripts'
-guard 'coffeescript', :input => 'spec/coffeescripts', :output => 'spec/javascripts'
-```
-
## Guard::Jasmine for your CI server
Guard::Jasmine includes a little command line utility to run your specs once and output the specdoc to the console.
@@ -315,19 +314,24 @@ $ guard-jasmine
You can get help on the available options with the `help` task:
```bash
-$ guard-jasmine help start
- Usage:
- guard-jasmine start
-
- Options:
- -u, [--url=URL] # The url of the Jasmine test runner
- # Default: http://127.0.0.1:3000/jasmine
- -b, [--bin=BIN] # The location of the PhantomJS binary
- # Default: /usr/local/bin/phantomjs
- -t, [--timeout=N] # The maximum time in milliseconds to wait for the spec runner to finish
- # Default: 10000
- -c, [--console=CONSOLE] # Whether to show console.log statements in the spec runner, either `always`, `never` or `failure`
- # Default: failure
+Usage:
+ guard-jasmine spec
+
+Options:
+ -s, [--server=SERVER] # Server to start, either `auto`, `rack`, `jasmine_gem` or `none`
+ # Default: auto
+ -p, [--port=N] # Server port to use
+ # Default: 8888
+ -u, [--url=URL] # The url of the Jasmine test runner
+ # Default: http://127.0.0.1:8888/jasmine
+ -b, [--bin=BIN] # The location of the PhantomJS binary
+ # Default: /usr/local/bin/phantomjs
+ -t, [--timeout=N] # The maximum time in milliseconds to wait for the spec runner to finish
+ # Default: 10000
+ -c, [--console=CONSOLE] # Whether to show console.log statements in the spec runner, either `always`, `never` or `failure`
+ # Default: failure
+
+Run the Jasmine spec runner
```
By default all specs are run, but you can supply multiple paths to your specs to run only a subset:
@@ -466,3 +470,4 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
[Evergreen]: https://github.com/jnicklas/evergreen
[PhantomJS script]: https://github.com/netzpirat/guard-jasmine/blob/master/lib/guard/jasmine/phantomjs/run-jasmine.coffee
[Guard::CoffeeScript]: https://github.com/guard/guard-coffeescript
+[Sinon.JS]: http://sinonjs.org
View
1 guard-jasmine.gemspec
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
s.add_dependency 'multi_json', '~> 1.0.3'
s.add_dependency 'version', '~> 1.0.0'
s.add_dependency 'thor', '~> 0.14.6'
+ s.add_dependency 'rack', '~> 1.3.5'
s.add_development_dependency 'bundler', '~> 1.0'
s.add_development_dependency 'guard-rspec', '~> 0.5'
View
19 lib/guard/jasmine.rb
@@ -14,11 +14,14 @@ class Jasmine < Guard
autoload :Formatter, 'guard/jasmine/formatter'
autoload :Inspector, 'guard/jasmine/inspector'
autoload :Runner, 'guard/jasmine/runner'
+ autoload :Server, 'guard/jasmine/server'
attr_accessor :last_run_failed, :last_failed_paths
DEFAULT_OPTIONS = {
- :jasmine_url => 'http://localhost:3000/jasmine',
+ :server => :auto,
+ :port => 8888,
+ :jasmine_url => 'http://localhost:8888/jasmine',
:phantomjs_bin => '/usr/local/bin/phantomjs',
:timeout => 10000,
:notification => true,
@@ -36,6 +39,8 @@ class Jasmine < Guard
#
# @param [Array<Guard::Watcher>] watchers the watchers in the Guard block
# @param [Hash] options the options for the Guard
+ # @option options [String] :server the server to use, either :rails or :jasmine
+ # @option options [String] :port the port for the Jasmine test server
# @option options [String] :jasmine_url the url of the Jasmine test runner
# @option options [String] :phantomjs_bin the location of the PhantomJS binary
# @option options [Integer] :timeout the maximum time in milliseconds to wait for the spec runner to finish
@@ -52,6 +57,7 @@ class Jasmine < Guard
def initialize(watchers = [], options = { })
options = DEFAULT_OPTIONS.merge(options)
options[:specdoc] = :failure if ![:always, :never, :failure].include? options[:specdoc]
+ options[:server] = :auto if ![:auto, :none, :rack, :jasmine_gem].include? options[:server]
super(watchers, options)
@@ -65,6 +71,9 @@ def initialize(watchers = [], options = { })
#
def start
if phantomjs_bin_valid?(options[:phantomjs_bin])
+
+ Server.start(options[:server], options[:port]) unless options[:server] == :none
+
if jasmine_runner_available?(options[:jasmine_url])
run_all if options[:all_on_start]
end
@@ -73,6 +82,14 @@ def start
end
end
+ # Gets called once when Guard stops.
+ #
+ # @raise [:task_has_failed] when stop has failed
+ #
+ def stop
+ Server.stop
+ end
+
# Gets called when the Guard should reload itself.
#
# @raise [:task_has_failed] when run_on_change has failed
View
24 lib/guard/jasmine/cli.rb
@@ -3,6 +3,7 @@
require 'guard/jasmine/version'
require 'guard/jasmine/runner'
require 'guard/jasmine/formatter'
+require 'guard/jasmine/server'
module Guard
class Jasmine
@@ -19,10 +20,22 @@ class CLI < Thor
desc 'spec', 'Run the Jasmine spec runner'
+ method_option :server,
+ :type => :string,
+ :aliases => '-s',
+ :default => 'auto',
+ :desc => 'Server to start, either `auto`, `rack`, `jasmine_gem` or `none`'
+
+ method_option :port,
+ :type => :numeric,
+ :aliases => '-p',
+ :default => 8888,
+ :desc => 'Server port to use'
+
method_option :url,
:type => :string,
:aliases => '-u',
- :default => 'http://127.0.0.1:3000/jasmine',
+ :default => 'http://127.0.0.1:8888/jasmine',
:desc => 'The url of the Jasmine test runner'
method_option :bin,
@@ -55,15 +68,22 @@ def spec(*paths)
runner[:jasmine_url] = options.url
runner[:phantomjs_bin] = options.bin
runner[:timeout] = options.timeout
+ runner[:port] = options.port
runner[:console] = [:always, :never, :failure].include?(options.console.to_sym) ? options.console.to_sym : :failure
+ runner[:server] = [:auto, :rack, :jasmine_gem].include?(options.server.to_sym) ? options.server.to_sym : :auto
runner[:notification] = false
runner[:hide_success] = true
runner[:max_error_notify] = 0
runner[:specdoc] = :always
+ ::Guard::Jasmine::Server.start(runner[:server], runner[:port]) unless runner[:server] == :none
result = ::Guard::Jasmine::Runner.run(paths, runner)
- Process.exit (result.first ? 0 : 1)
+
+ ::Guard::Jasmine::Server.stop
+
+ exit_code = result.first ? 0 : 1
+ Process.exit exit_code
rescue Exception => e
raise e if e.is_a?(SystemExit)
View
111 lib/guard/jasmine/server.rb
@@ -0,0 +1,111 @@
+# coding: utf-8
+
+module Guard
+ class Jasmine
+
+ # Start and stop a Jasmine test server for requesting the specs
+ # from PhantomJS.
+ #
+ module Server
+ class << self
+
+ attr_accessor :thread
+
+ # Start the internal test server for getting the Jasmine runner.
+ #
+ # @param [String] strategy the server strategy to use
+ # @param [Number] port the server port
+ #
+ def start(strategy, port)
+ strategy = detect_server if strategy == :auto
+
+ case strategy
+ when :rack
+ start_rack_server(port)
+ when :jasmine_gem
+ start_jasmine_gem_server(port)
+ end
+
+ wait_for_server(port) unless strategy == :none
+ end
+
+ # Stop the server thread.
+ #
+ def stop
+ self.thread.kill if self.thread && self.thread.alive?
+ end
+
+ private
+
+ # Start the Rack server of the current project. This
+ # will simply start a server that uses the `config.ru`
+ # in the current directory.
+ #
+ # @param [Number] port the server port
+ #
+ def start_rack_server(port)
+ require 'rack'
+
+ ::Guard::UI.info "Guard::Jasmine starts Rack test server on port #{ port }."
+
+ self.thread = Thread.new { Rack::Server.start(:config => 'config.ru', :Port => port, :AccessLog => []) }
+
+ rescue Exception => e
+ ::Guard::UI.error "Cannot start Rack server: #{ e.message }"
+ end
+
+ # Start the Jasmine gem server of the current project.
+ #
+ # @param [Number] port the server port
+ #
+ def start_jasmine_gem_server(port)
+ require 'jasmine/config'
+
+ jasmine_config_overrides = File.join(::Jasmine::Config.new.project_root, 'spec', 'javascripts' ,'support' ,'jasmine_config.rb')
+ require jasmine_config_overrides if File.exist?(jasmine_config_overrides)
+
+ ::Guard::UI.info "Guard::Jasmine starts Jasmine Gem test server on port #{ port }."
+
+ self.thread = Thread.new { ::Jasmine::Config.new.start_server(port) }
+
+ rescue Exception => e
+ ::Guard::UI.error "Cannot start Jasmine Gem server: #{ e.message }"
+ end
+
+ # Detect the server to use
+ #
+ # @return [Symbol] the server strategy
+ #
+ def detect_server
+ if File.exists?('config.ru')
+ :rack
+ elsif File.exists?(File.join('spec', 'javascripts', 'support', 'jasmine.yml'))
+ :jasmine_gem
+ else
+ :none
+ end
+ end
+
+ # Wait until the Jasmine test server is running.
+ #
+ # @param [Number] port the server port
+ #
+ def wait_for_server(port)
+ require 'socket'
+
+ while true
+ begin
+ ::TCPSocket.new('127.0.0.1', port).close
+ return
+ rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
+ # Ignore, server still not available
+ end
+ sleep 0.1
+ end
+ end
+
+ end
+ end
+
+ end
+end
View
1,313 resources/guard-jasmine-rails23.graffle
@@ -0,0 +1,1313 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGraffle.MacAppStore</string>
+ <string>138.31</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {559, 783}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2011-09-09 11:28:58 +0000</string>
+ <key>Creator</key>
+ <string>Michael Kessler</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>8</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{117, 375}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>176</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 8.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{174, 302.63574}, {15, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>175</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 7.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{139, 235}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>174</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 6.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{278.75, 246.05469}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>173</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 5.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{353, 300.75}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>170</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 4.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{277.75, 286}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>169</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 3.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{226.5, 303}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>168</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 2.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{211.5, 449.36426}, {16, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 1.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>20</integer>
+ </dict>
+ <key>ID</key>
+ <integer>58</integer>
+ <key>Points</key>
+ <array>
+ <string>{111.01562, 411}</string>
+ <string>{160, 386}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>Arrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>56</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>20</integer>
+ </dict>
+ <key>ID</key>
+ <integer>57</integer>
+ <key>Points</key>
+ <array>
+ <string>{111.01562, 354.5}</string>
+ <string>{160, 386}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>Arrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>12</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{39.015625, 388.5}, {72, 45}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>56</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>DisplayShape</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs18 \cf0 Notification}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{39.015625, 332}, {72, 45}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>12</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>DisplayShape</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>w</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 Console}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>55</integer>
+ <key>Points</key>
+ <array>
+ <string>{371.5, 476.5}</string>
+ <string>{370.5, 316}</string>
+ <string>{370.63672, 296}</string>
+ </array>
+ <key>Rotation</key>
+ <real>270</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>Arrow</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>24</integer>
+ <key>Info</key>
+ <integer>4</integer>
+ </dict>
+ <key>ID</key>
+ <integer>35</integer>
+ <key>Points</key>
+ <array>
+ <string>{174.70703, 260}</string>
+ <string>{160.5, 228.23633}</string>
+ <string>{129.38672, 229.63672}</string>
+ <string>{125.41602, 260}</string>
+ <string>{160.05513, 277.77176}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>FilledArrow</string>
+ <key>LineType</key>
+ <integer>1</integer>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>52</integer>
+ <key>Points</key>
+ <array>
+ <string>{191.09375, 332}</string>
+ <string>{191, 316}</string>
+ <string>{191.13672, 296}</string>
+ </array>
+ <key>Rotation</key>
+ <real>270</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>Arrow</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>51</integer>
+ <key>Points</key>
+ <array>
+ <string>{250, 285.09375}</string>
+ <string>{326, 285.57812}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>Arrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>43</integer>
+ <key>Points</key>
+ <array>
+ <string>{250, 269.5}</string>
+ <string>{326, 269.98438}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>Arrow</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>53</integer>
+ <key>Points</key>
+ <array>
+ <string>{224.09375, 332}</string>
+ <string>{224, 316}</string>
+ <string>{224.13672, 296}</string>
+ </array>
+ <key>Rotation</key>
+ <real>270</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>Arrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{326, 260}, {90, 36}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>40</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.660326</string>
+ <key>g</key>
+ <string>0.768418</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.366017</string>
+ <key>g</key>
+ <string>0.451484</string>
+ <key>r</key>
+ <string>0.799805</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 Jasmine Gem}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>ID</key>
+ <integer>38</integer>
+ <key>Points</key>
+ <array>
+ <string>{205.09375, 476}</string>
+ <string>{205, 460}</string>
+ <string>{205.13672, 440}</string>
+ </array>
+ <key>Rotation</key>
+ <real>270</real>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>Arrow</string>
+ <key>TailArrow</key>
+ <string>0</string>
+ </dict>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{160.5, 260}, {90, 36}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>24</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.710801</string>
+ <key>g</key>
+ <string>1</string>
+ <key>r</key>
+ <string>0.681395</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.452519</string>
+ <key>g</key>
+ <string>0.706522</string>
+ <key>r</key>
+ <string>0.512017</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 PhantomJS}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{160, 476}, {256, 36}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>23</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.712052</string>
+ <key>g</key>
+ <string>0.995375</string>
+ <key>r</key>
+ <string>1</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.346524</string>
+ <key>g</key>
+ <string>0.581073</string>
+ <key>r</key>
+ <string>0.666667</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 Code and Specs}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{160, 404}, {90, 36}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>21</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.951087</string>
+ <key>g</key>
+ <string>0.869714</string>
+ <key>r</key>
+ <string>0.767299</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.792672</string>
+ <key>g</key>
+ <string>0.783324</string>
+ <key>r</key>
+ <string>0.567379</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 FS Events}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{160, 368}, {90, 36}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>20</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.951087</string>
+ <key>g</key>
+ <string>0.869714</string>
+ <key>r</key>
+ <string>0.767299</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.792672</string>
+ <key>g</key>
+ <string>0.783324</string>
+ <key>r</key>
+ <string>0.567379</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 Guard}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{160, 332}, {90, 36}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>19</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Color</key>
+ <dict>
+ <key>b</key>
+ <string>0.951087</string>
+ <key>g</key>
+ <string>0.869714</string>
+ <key>r</key>
+ <string>0.767299</string>
+ </dict>
+ <key>FillType</key>
+ <integer>3</integer>
+ <key>GradientColor</key>
+ <dict>
+ <key>b</key>
+ <string>0.792672</string>
+ <key>g</key>
+ <string>0.783324</string>
+ <key>r</key>
+ <string>0.567379</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
+
+\f0\fs20 \cf0 Guard::Jasmine}</string>
+ <key>VerticalPad</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>GridInfo</key>
+ <dict/>
+ <key>GuidesLocked</key>
+ <string>NO</string>
+ <key>GuidesVisible</key>
+ <string>YES</string>
+ <key>HPages</key>
+ <integer>1</integer>
+ <key>ImageCounter</key>
+ <integer>1</integer>
+ <key>KeepToScale</key>
+ <false/>
+ <key>Layers</key>
+ <array>
+ <dict>
+ <key>Lock</key>
+ <string>NO</string>
+ <key>Name</key>
+ <string>Layer 1</string>
+ <key>Print</key>
+ <string>YES</string>
+ <key>View</key>
+ <string>YES</string>
+ </dict>
+ </array>
+ <key>LayoutInfo</key>
+ <dict>
+ <key>Animate</key>
+ <string>NO</string>
+ <key>circoMinDist</key>
+ <real>18</real>
+ <key>circoSeparation</key>
+ <real>0.0</real>
+ <key>layoutEngine</key>
+ <string>dot</string>
+ <key>neatoSeparation</key>
+ <real>0.0</real>
+ <key>twopiSeparation</key>
+ <real>0.0</real>
+ </dict>
+ <key>LinksVisible</key>
+ <string>NO</string>
+ <key>MagnetsVisible</key>
+ <string>NO</string>
+ <key>MasterSheets</key>
+ <array/>
+ <key>ModificationDate</key>
+ <string>2011-11-01 10:58:31 +0000</string>
+ <key>Modifier</key>
+ <string>Michael Kessler</string>
+ <key>NotesVisible</key>
+ <string>NO</string>
+ <key>Orientation</key>
+ <integer>2</integer>
+ <key>OriginVisible</key>
+ <string>NO</string>
+ <key>PageBreaks</key>
+ <string>YES</string>
+ <key>PrintInfo</key>
+ <dict>
+ <key>NSBottomMargin</key>
+ <array>
+ <string>float</string>
+ <string>41</string>
+ </array>
+ <key>NSHorizonalPagination</key>
+ <array>
+ <string>int</string>
+ <string>0</string>
+ </array>
+ <key>NSLeftMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSPaperSize</key>
+ <array>
+ <string>coded</string>
+ <string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAx7X05TU2l6ZT1mZn2WgVMCgUoDhg==</string>
+ </array>
+ <key>NSPrintReverseOrientation</key>
+ <array>
+ <string>int</string>
+ <string>0</string>
+ </array>
+ <key>NSRightMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ <key>NSTopMargin</key>
+ <array>
+ <string>float</string>
+ <string>18</string>
+ </array>
+ </dict>
+ <key>PrintOnePage</key>
+ <false/>
+ <key>ReadOnly</key>
+ <string>NO</string>
+ <key>RowAlign</key>
+ <integer>1</integer>
+ <key>RowSpacing</key>
+ <real>36</real>
+ <key>SheetTitle</key>
+ <string>Canvas 1</string>
+ <key>SmartAlignmentGuidesActive</key>
+ <string>YES</string>
+ <key>SmartDistanceGuidesActive</key>
+ <string>YES</string>
+ <key>UniqueID</key>
+ <integer>1</integer>
+ <key>UseEntirePage</key>
+ <false/>
+ <key>VPages</key>
+ <integer>1</integer>
+ <key>WindowInfo</key>
+ <dict>
+ <key>CurrentSheet</key>
+ <integer>0</integer>
+ <key>ExpandedCanvases</key>
+ <array>
+ <dict>
+ <key>name</key>
+ <string>Canvas 1</string>
+ </dict>
+ </array>
+ <key>Frame</key>
+ <string>{{977, 163}, {1502, 1207}}</string>
+ <key>ListView</key>
+ <true/>
+ <key>OutlineWidth</key>
+ <integer>142</integer>
+ <key>RightSidebar</key>
+ <false/>
+ <key>ShowRuler</key>
+ <true/>
+ <key>Sidebar</key>
+ <true/>
+ <key>SidebarWidth</key>
+ <integer>120</integer>
+ <key>VisibleRegion</key>
+ <string>{{-62, 155.5}, {683.5, 526}}</string>
+ <key>Zoom</key>
+ <real>2</real>
+ <key>ZoomValues</key>
+ <array>
+ <array>
+ <string>Canvas 1</string>
+ <real>2</real>
+ <real>1</real>
+ </array>
+ </array>
+ </dict>
+ <key>saveQuickLookFiles</key>
+ <string>YES</string>
+</dict>
+</plist>
View
BIN resources/guard-jasmine-rails23.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
1,531 resources/guard-jasmine-rails31.graffle
@@ -0,0 +1,1531 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActiveLayerIndex</key>
+ <integer>0</integer>
+ <key>ApplicationVersion</key>
+ <array>
+ <string>com.omnigroup.OmniGraffle.MacAppStore</string>
+ <string>138.31</string>
+ </array>
+ <key>AutoAdjust</key>
+ <true/>
+ <key>BackgroundGraphic</key>
+ <dict>
+ <key>Bounds</key>
+ <string>{{0, 0}, {559, 783}}</string>
+ <key>Class</key>
+ <string>SolidGraphic</string>
+ <key>ID</key>
+ <integer>2</integer>
+ <key>Style</key>
+ <dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ </dict>
+ <key>CanvasOrigin</key>
+ <string>{0, 0}</string>
+ <key>ColumnAlign</key>
+ <integer>1</integer>
+ <key>ColumnSpacing</key>
+ <real>36</real>
+ <key>CreationDate</key>
+ <string>2011-09-09 11:28:58 +0000</string>
+ <key>Creator</key>
+ <string>Michael Kessler</string>
+ <key>DisplayScale</key>
+ <string>1 0/72 in = 1.0000 in</string>
+ <key>GraphDocumentVersion</key>
+ <integer>8</integer>
+ <key>GraphicsList</key>
+ <array>
+ <dict>
+ <key>Bounds</key>
+ <string>{{117, 375}, {24, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>176</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 10.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{174, 302.63574}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>175</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 9.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{139, 235}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>174</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 8.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{278.75, 246.05469}, {15, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>173</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 7.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{383, 300.75}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>172</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 6.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{379, 447}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>171</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 5.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{346, 300.75}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>170</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 4.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{277.75, 286}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>169</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 3.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{226.5, 303}, {17, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>168</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 2.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{211.5, 449.36426}, {16, 22}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>FitText</key>
+ <string>YES</string>
+ <key>Flow</key>
+ <string>Resize</string>
+ <key>FontInfo</key>
+ <dict>
+ <key>Font</key>
+ <string>Futura-Medium</string>
+ <key>Size</key>
+ <real>13</real>
+ </dict>
+ <key>ID</key>
+ <integer>158</integer>
+ <key>Shape</key>
+ <string>Rectangle</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>shadow</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ <key>stroke</key>
+ <dict>
+ <key>Draws</key>
+ <string>NO</string>
+ </dict>
+ </dict>
+ <key>Text</key>
+ <dict>
+ <key>Align</key>
+ <integer>0</integer>
+ <key>Pad</key>
+ <integer>2</integer>
+ <key>Text</key>
+ <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
+{\fonttbl\f0\fnil\fcharset0 Futura-Medium;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
+
+\f0\fs26 \cf0 1.}</string>
+ <key>VerticalPad</key>
+ <integer>2</integer>
+ </dict>
+ <key>Wrap</key>
+ <string>NO</string>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>20</integer>
+ </dict>
+ <key>ID</key>
+ <integer>58</integer>
+ <key>Points</key>
+ <array>
+ <string>{111.01562, 411}</string>
+ <string>{160, 386}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>Arrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>56</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Class</key>
+ <string>LineGraphic</string>
+ <key>Head</key>
+ <dict>
+ <key>ID</key>
+ <integer>20</integer>
+ </dict>
+ <key>ID</key>
+ <integer>57</integer>
+ <key>Points</key>
+ <array>
+ <string>{111.01562, 354.5}</string>
+ <string>{160, 386}</string>
+ </array>
+ <key>Style</key>
+ <dict>
+ <key>stroke</key>
+ <dict>
+ <key>HeadArrow</key>
+ <string>0</string>
+ <key>TailArrow</key>
+ <string>Arrow</string>
+ </dict>
+ </dict>
+ <key>Tail</key>
+ <dict>
+ <key>ID</key>
+ <integer>12</integer>
+ </dict>
+ </dict>
+ <dict>
+ <key>Bounds</key>
+ <string>{{39.015625, 388.5}, {72, 45}}</string>
+ <key>Class</key>
+ <string>ShapedGraphic</string>
+ <key>ID</key>
+ <integer>56</integer>
+ <key>Magnets</key>
+ <array>
+ <string>{0, 1}</string>
+ <string>{0, -1}</string>
+ <string>{1, 0}</string>
+ <string>{-1, 0}</string>
+ </array>
+ <key>Shape</key>
+ <string>DisplayShape</string>
+ <key>Style</key>
+ <dict>
+ <key>fill</key>
+ <dict>
+ <key>FillType</key>
+ <integer>3</integer>