mediaCommentThumbnail spec fix

mediaCommentThumbnail spec fix

properly teardown sinon stub

fixes CNVS-10965

Change-Id: Id02b3d5923aba6671018bb9b6dec51a7e7711b81
Reviewed-on: https://gerrit.instructure.com/29622
Tested-by: Jenkins <d95b56ce41a2e1ac4cecdd398defd7414407cc08@instructure.com>
Reviewed-by: Simon Williams <088e16a1019277b15d58faf0541e11910eb756f6@instructure.com>
Product-Review: Bryan Madsen <0a3ba1af216659500dd8f41e29f3979f42452870@instructure.com>
QA-Review: Bryan Madsen <0a3ba1af216659500dd8f41e29f3979f42452870@instructure.com>
Reviewed-by: Mike Nomitch <74443f6f110b6b7b934c89126258ed3d843d673f@instructure.com>

--- spec/coffeescripts/jquery/mediaCommentThumbnailSpec.coffee
+++ spec/coffeescripts/jquery/mediaCommentThumbnailSpec.coffee
@@ -13,8 +13,8 @@
       @$fixtures = $('#fixtures')

     teardown: ->
+      _.defer.restore()
       window.INST.kalturaSettings = null
-      @stub.restore

   test "creates a thumbnail span with a background image URL generated from kaltura settings and media id", ->
     resourceDomain = 'resources.example.com'


allow all conditions to be arrays and register package events

--- lib/flex-tool-bar.coffee
+++ lib/flex-tool-bar.coffee
@@ -43,7 +43,7 @@
     @storeGrammar()
     @registerTypes()
     @registerCommand()
-    @registerEvent()
+    @registerEvents()
     @registerWatch()
     @registerProjectWatch()

@@ -107,7 +107,16 @@
       'flex-tool-bar:edit-config-file': =>
         atom.workspace.open @configFilePath if @configFilePath

-  registerEvent: ->
+  registerEvents: ->
+    @subscriptions.add atom.packages.onDidActivateInitialPackages  =>
+      @reloadToolbar()
+
+      @subscriptions.add atom.packages.onDidActivatePackage =>
+        @reloadToolbar()
+
+      @subscriptions.add atom.packages.onDidDeactivatePackage =>
+        @reloadToolbar()
+
     @subscriptions.add atom.workspace.onDidChangeActivePaneItem (item) =>

       if @storeProject()
@@ -149,6 +158,7 @@
     @toolBar.toolBarView || @toolBar.toolBar

   reloadToolbar: (withNotification=false) ->
+    console.log 'reloading tooblar'
     return unless @toolBar?
     try
       @fixToolBarHeight()
@@ -252,50 +262,76 @@

     return config

+  loopThrough: (items, func) ->
+    items = [items] if not Array.isArray items
+    for item in items
+      return true if func(item)
+
+    return false
+
   condition: (conditions) ->
-    conditions = [conditions] if not Array.isArray conditions
+    return @loopThrough conditions, (condition) =>
+
+      if typeof condition is 'string'
+        return true if @grammarCondition(condition)
+
+      else if typeof condition is 'function'
+        return true if @functionCondition(condition)
+
+      else
+
+        if condition.function?
+          return true if @loopThrough(condition.function, @functionCondition)
+
+        if condition.grammar?
+          return true if @loopThrough(condition.grammar, @grammarCondition)
+
+        if condition.pattern?
+          return true if @loopThrough(condition.pattern, @patternCondition)
+
+        if condition.package?
+          return true if @loopThrough(condition.package, @packageCondition)
+
+  functionCondition: (condition) ->
+    condition()
+
+  grammarCondition: (condition) ->
     filePath = atom.workspace.getActivePaneItem()?.getPath?()
-
-    for condition in conditions
-
-      if typeof condition is 'string'
-        reverse = false
-        if /^!/.test condition
-          condition = condition.replace '!', ''
-          reverse = true
-
-        if /^[^\/]+\.(.*?)$/.test condition
-          result = true if filePath isnt undefined and filePath.match(condition)?.length > 0
-        else
-          result = true if @currentGrammar? and @currentGrammar.includes condition.toLowerCase()
-
-        result = !result if reverse
-        return true if result
-
-      else if typeof condition is 'function'
-        return true if condition()
-
-      else
-
-        if condition.pattern?
-          if filePath isnt undefined
-            result = globToRegexp(condition.pattern, extended: true).test filePath
-
-          return true if result is true
-
-        if condition.package?
-          pkg = condition.package
-          reverse = false
-          if /^!/.test pkg
-            pkg = pkg.replace '!', ''
-            reverse = true
-
-          result = true if atom.packages.isPackageLoaded(pkg) and not atom.packages.isPackageDisabled(pkg)
-          result = !result if reverse
-          return true if result
-
-
-    return false
+    result = false
+    reverse = false
+    if /^!/.test condition
+      condition = condition.replace '!', ''
+      reverse = true
+
+    if /^[^\/]+\.(.*?)$/.test condition
+      result = true if filePath isnt undefined and filePath.match(condition)?.length > 0
+    else
+      result = true if @currentGrammar? and @currentGrammar.includes condition.toLowerCase()
+
+    result = !result if reverse
+
+    result
+
+  patternCondition: (condition) ->
+    filePath = atom.workspace.getActivePaneItem()?.getPath?()
+    result = false
+
+    if filePath isnt undefined
+      result = globToRegexp(condition, extended: true).test filePath
+
+    result
+
+  packageCondition: (condition) ->
+    result = false
+    reverse = false
+    if /^!/.test condition
+      condition = condition.replace '!', ''
+      reverse = true
+
+    result = true if atom.packages.isPackageLoaded(condition) and not atom.packages.isPackageDisabled(condition)
+    result = !result if reverse
+
+    result

   storeProject: ->
     editor = atom.workspace.getActivePaneItem()


add .js and .coffee config file types

add .js and .coffee config file types

--- lib/flex-tool-bar.coffee
+++ lib/flex-tool-bar.coffee
@@ -49,9 +49,9 @@
     # Default directory
     @configFilePath = process.env.ATOM_HOME unless @configFilePath

-    # If configFilePath is a folder, check for `toolbar.(json|cson|json5)` file
+    # If configFilePath is a folder, check for `toolbar.(json|cson|json5|js|coffee)` file
     unless fs.isFileSync(@configFilePath)
-      @configFilePath = fs.resolve @configFilePath, 'toolbar', ['cson', 'json5', 'json']
+      @configFilePath = fs.resolve @configFilePath, 'toolbar', ['cson', 'json5', 'json', 'js', 'coffee']

     return true if @configFilePath

@@ -94,7 +94,7 @@
       while count < projectCount
         pathToCheck = atom.project.getPaths()[count]
         if editor.buffer.file.getParent().path.includes(pathToCheck)
-          @projectToolbarConfigPath = fs.resolve pathToCheck, 'toolbar', ['cson', 'json5', 'json']
+          @projectToolbarConfigPath = fs.resolve pathToCheck, 'toolbar', ['cson', 'json5', 'json', 'js', 'coffee']
         count++

     if @projectToolbarConfigPath is @configFilePath
@@ -195,6 +195,10 @@
     ext = path.extname @configFilePath

     switch ext
+      when '.js', '.coffee'
+        config = require(@configFilePath)()
+        delete require.cache[@configFilePath]
+
       when '.json'
         config = require @configFilePath
         delete require.cache[@configFilePath]
@@ -212,6 +216,10 @@
       ext = path.extname @projectToolbarConfigPath

       switch ext
+        when '.js', '.coffee'
+          projConfig = require(@projectToolbarConfigPath)()
+          delete require.cache[@projectToolbarConfigPath]
+
         when '.json'
           projConfig = require @projectToolbarConfigPath
           delete require.cache[@projectToolbarConfigPath]


Remove unneeded import

Remove unneeded import

--- lib/font/embedded.coffee
+++ lib/font/embedded.coffee
@@ -1,5 +1,4 @@
 PDFFont = require '../font'
-TTFSubset = require 'fontkit/src/TTFSubset'
 PDFObject = require '../object'

 class EmbeddedFont extends PDFFont


Autorender.

Autorender.

--- examples/dragdrop.coffee
+++ examples/dragdrop.coffee
@@ -15,6 +15,7 @@
   # re-render entire view on any model changes.
   render: ->
     @el[k] = v for own k,v of @model
+    @
   template: -> ''

 Dropzone = Model
@@ -28,6 +29,7 @@
   render: ->
     for d in @model.drops
       @el.appendChild d.el
+    @

   bindings:
     # Various state changes
@@ -53,17 +55,18 @@

   template: -> '

'

-# Create some dropzones
+# Create some dropzones. Objects are used as initial state for declared models.
+# Rendering happens automatically.
 dropzone1 = DropzoneView
   drops: [
-    ImgView src: 'image1.jpg',
-    ImgView src: 'image2.jpg',
+    ImgView src: 'image1.jpg'
+    ImgView src: 'image2.jpg'
   ]
 dropzone2 = DropzoneView()

 # Render them
-document.body.appendChild dropzone1.render().el
-document.body.appendChild dropzone2.render().el
+document.body.appendChild dropzone1.el
+document.body.appendChild dropzone2.el

 # Programmatically move a drop
 drop = dropzone1.removeDrop()


slackbot user agent

slackbot user agent

--- lib/looker_client.coffee
+++ lib/looker_client.coffee
@@ -17,6 +17,7 @@
     requestConfig.url = "#{@options.baseUrl}/#{requestConfig.path}"
     headers =
       Authorization: "token #{@token}"
+      "User-Agent": "looker-slackbot"
     requestConfig.headers = _.extend(headers, requestConfig.headers || {})
     request(requestConfig, (error, response, body) =>
       if error


Don't try to be clever with bracket matching. Fixes #5.

--- lib/python-indent.coffee
+++ lib/python-indent.coffee
@@ -25,7 +25,7 @@

   activate: ->
     @subscriptions = new CompositeDisposable
-    @subscriptions.add atom.commands.add 'atom-text-editor', 'editor:newline': => @properlyIndent()
+    @subscriptions.add atom.commands.add 'atom-text-editor', 'editor:newline': => @properlyIndent(event)

     # Cache settings
     @openingDelimiterIndentRegex = new RegExp(atom.config.get 'python-indent.openingDelimiterIndentRegex')
@@ -35,7 +35,7 @@
   deactivate: ->
     @subscriptions.dispose()

-  properlyIndent: ->
+  properlyIndent: (e) ->
     # Make sure this is a Python file
     editor = atom.workspace.getActiveTextEditor()
     return unless editor.getGrammar().scopeName.substring(0, 13) == 'source.python'
@@ -103,6 +103,4 @@
     indent = (editor.indentationForBufferRow row) + (atom.config.get 'python-indent.hangingIndentTabs')

     # Set the indent
-    editor.transact =>
-      editor.delete() if /^\s*$/.test editor.buffer.lineForRow(row)
-      editor.setIndentationForBufferRow row, indent
+    editor.setIndentationForBufferRow row, indent


better code doc

better code doc

--- src/coffee/choropleth.coffee
+++ src/coffee/choropleth.coffee
@@ -22,6 +22,8 @@
     color_val = (iso3)->
         if data_by_iso[iso3] then colorize(data_by_iso[iso3]) else '#eeeeee'

+    # Zoom map on mouse click. If clicked on country and not zoomed, zoom in,
+    # else zoom out and center map.
     clicked = (d)->
         x = null
         y = null
@@ -47,6 +49,7 @@
             .attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')scale(' + k + ')translate(' + -x + ',' + -y + ')')
             .style('stroke-width', 1 / k + 'px')

+    # Calculate data mapping, draw and colorize countries.
     update = ()->
         # Create mapping of iso3 to data selected value and set min and max.
         min = null
@@ -73,6 +76,7 @@
             .append('title')
                 .text((d)-> d.properties.name + ': ' + format(iso_val(d.id)))

+    # Draw map base and load geo data once, and call update to draw countries.
     draw = (selection)->
         svg = selection.append('svg')
             .attr('width', width)
@@ -110,6 +114,7 @@
         columns = d3.keys(data[0]).filter(
             (d)-> if d isnt '' and d isnt 'iso3' then d else null).sort()

+    # Expose update method.
     geomap.update = ()->
         update()


Change Default HTML Output Template docs.

--- src/coffee/lockscreen.coffee
+++ src/coffee/lockscreen.coffee
@@ -6,7 +6,7 @@
 # Licensed under the MIT license.
 #

-# HTML Outpout default template
+# Default HTML Outpout Template
 #
 #

 #


slash command typing indicator

slash command typing indicator

--- lib/reply_context.coffee
+++ lib/reply_context.coffee
@@ -15,10 +15,16 @@
       @defaultBot.reply(@sourceMessage, message, cb)

   replyPublic: (message, cb) ->
+    @hasRepliedToSlashCommand = true
     if @isSlashCommand()
       @messageBot.replyPublicDelayed(@sourceMessage, message, cb)
     else
       @defaultBot.reply(@sourceMessage, message, cb)

   startTyping: ->
-    @messageBot.startTyping(@sourceMessage)
+    @hasRepliedToSlashCommand = true
+    if @isSlashCommand()
+      @messageBot.replyPublicDelayed(@sourceMessage, { type: 'typing' })
+    else
+      @defaultBot.startTyping(@sourceMessage)
+


Serialize uri in state

Serialize uri in state

Without this a second settings view could be opened if one was
already open at startup.

--- lib/settings-view.coffee
+++ lib/settings-view.coffee
@@ -77,6 +77,7 @@
     deserializer: 'SettingsView'
     version: 2
     activePanelName: @activePanelName ? @panelToShow
+    uri: @uri

   getPackages: ->
     return @packages if @packages?


upload photo from filesystem to vk server: log read_stream, unlog form_data

--- src/controllers/index.coffee
+++ src/controllers/index.coffee
@@ -47,8 +47,8 @@
     read_stream = fs.createReadStream('/img/life_is_random.jpg')
     console.log read_stream
     form_data.append 'photo', read_stream
-    console.log form_data.getHeaders()
-    console.log form_data
+    #console.log form_data.getHeaders()
+    #console.log form_data
     form_data.submit server_url, (err, resp)->
       if err
         console.log "Error submitting photo to upload: " + err


TOUCH IT #3

TOUCH IT #3

--- lib/touch-gesture.coffee
+++ lib/touch-gesture.coffee
@@ -15,17 +15,17 @@
     @addEvent 'touchend',@touchEnd

   threeActive: false
-  touchStart: (e) ->
+  touchStart: (e) =>
     if e.touches.length==3
       @threeActive=on
       @onThreeTouch e
       # console.log "three touch"

-  touchMove: (e) ->
+  touchMove: (e) =>
     if @threeActive
       @onThreeTouch e
       # console.log e.diff.left
-  touchEnd: (e) ->
+  touchEnd: (e) =>
     @threeActive=off if e.touches.length==0


Use https for pivotal plugin

Use https for pivotal plugin

--- plugins/pivotal-tracker/index.coffee
+++ plugins/pivotal-tracker/index.coffee
@@ -22,16 +22,15 @@

     # Send the request to the url
     @request
-      .post("http://www.pivotaltracker.com/services/v3/projects/#{config.projectId}/stories")
+      .post("https://www.pivotaltracker.com/services/v3/projects/#{config.projectId}/stories")
       .set("X-TrackerToken", config.apiToken)
       .type("form")
       .send(params)
       .buffer(true)
       .end((res) ->
-        if res?.text
-          console.log res.text
-        else
-          console.log "No response from pivotal! Status #{res.status}"
+        if res && res.status != 200
+          console.log "Status code: #{res.status}"
+          console.log res.text || "No response from pivotal!"
       );

 module.exports = PivotalTracker


API/service layout deprecation warning

API/service layout deprecation warning

--- services/track-changes/app/coffee/WebApiManager.coffee
+++ services/track-changes/app/coffee/WebApiManager.coffee
@@ -2,6 +2,11 @@
 logger = require "logger-sharelatex"
 Settings = require "settings-sharelatex"

+# DEPRECATED! This method of getting user details via track-changes is deprecated
+# in the way we lay out our services.
+# Instead, web should be responsible for collecting the raw data (user_ids) and
+# filling it out with calls to other services. All API calls should create a
+# tree-like structure as much as possible, with web as the root.
 module.exports = WebApiManager =
 	sendRequest: (url, callback = (error, body) ->) ->
 		request.get {
@@ -56,4 +61,4 @@
 				project = JSON.parse(body)
 			catch error
 				return callback(error)
-			callback null, project+			callback null, project


add on-success and on-error handlers to async-form.

--- services/web/public/coffee/directives/asyncForm.coffee
+++ services/web/public/coffee/directives/asyncForm.coffee
@@ -33,6 +33,10 @@
 							response.success = true
 							response.error = false

+							if onSuccessHandler = scope[attrs.onSuccess]
+								onSuccessHandler(data, status, headers, config)
+								return
+
 							if data.redir?
 								ga('send', 'event', formName, 'success')
 								window.location = data.redir
@@ -50,6 +54,11 @@
 							scope[attrs.name].inflight = false
 							response.success = false
 							response.error = true
+
+							if onErrorHandler = scope[attrs.onError]
+								onErrorHandler(data, status, headers, config)
+								return
+
 							if status == 403 # Forbidden
 								response.message =
 									text: "Session error. Please check you have cookies enabled. If the problem persists, try clearing your cache and cookies."


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

--- test/flickerable.coffee
+++ test/flickerable.coffee
@@ -10,5 +10,6 @@

   player.flicker
     duration:
+    frequency:

 module()


Fix weird spacing issue

Fix weird spacing issue


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

--- test/flickerable.coffee
+++ test/flickerable.coffee
@@ -46,36 +46,6 @@
   equals boss.I.flickerDuration, 3

 #TODO test this with new time step stuff
-test 'it should change the alpha value when the flicker duration has elapsed', ->
-  player = GameObject
-    alpha: 0.9
-
-  player.include Flickerable
-
-  equals player.I.alpha, 0.9
-
-  player.flicker
-    duration: 12
-    frequency: 5
-    alpha: 0.2
-
-  5.times ->
-    player.update(1)
-    player.trigger "afterUpdate", 1
-    equals player.I.alpha, 0.2
-
-  5.times ->
-    player.update(1)
-    player.trigger "afterUpdate", 1
-    equals player.I.alpha, 0.9
-
-  player.update(1)
-  player.trigger "afterUpdate", 1
-  equals player.I.alpha, 0.2
-
-  # returns to original alpha when flicker duration hits 0
-  player.update(1)
-  player.trigger "afterUpdate", 1
-  equals player.I.alpha, 0.9
+#test 'it should change the alpha value when the flicker duration has elapsed', ->

 module()


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

--- test/flickerable.coffee
+++ test/flickerable.coffee
@@ -34,7 +34,7 @@

   5.times ->
     player.update()
-    eequal
+    equals player.I.alpha, 0

 module()


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

--- test/game_object.coffee
+++ test/game_object.coffee
@@ -16,7 +16,7 @@
     GameObject.construct
       class: "aaaaa"

-
+test "#closest",

 test "[event] create", 2, ->
   GameObject


remove step from game object default events

--- test/game_object.coffee
+++ test/game_object.coffee
@@ -46,7 +46,7 @@
 test "[event] update", 2, ->
   gameObject = GameObject()

-
+  gameObject.bind "step"
     update: "equals(I.age, 0, 'Age should be 0 on first step')"

   gameObject.trigger "update", 1


FIX: was sometimes rendering bitmaps at 2x correctly size! (4x pixels! ouch)

--- source/Art/Engine/Core/Drawing/ElementDrawMixin.coffee
+++ source/Art/Engine/Core/Drawing/ElementDrawMixin.coffee
@@ -65,10 +65,6 @@
       cacheDraw:
         default: false
         validate: (v) -> v == false || v == true || isPlainObject v
-        # preprocess: (v) -> if v == true then "auto" else v
-
-        description:
-          "true => stage always unless cacheThrough or it's not needed AND it's faster w/o"

     @drawLayoutProperty

@@ -406,6 +402,15 @@
         @drawOrderRequiresStaging
       )

+    getWhyStagingIsNeeded: (elementToTargetMatrix) ->
+      switch
+        when @stage then "stage property is true"
+        when @getIsMask() then "is mask"
+        when ((@getHasChildren() || @draw?) && !@getCompositingIsBasic()) then "compositing requires staging: #{@compositeMode}, opacity: #{@opacity}"
+        when (@_clip && elementToTargetMatrix?.getHasSkew()) then "clipping and non-rectangular area due to matrix: #{elementToTargetMatrix}"
+        when @getChildRequiresParentStagingBitmap() then "child needs parent staging"
+        when @drawOrderRequiresStaging then "draw property requries staging: #{formattedInspect @draw}"
+
     @getter
       compositingIsBasic: -> @_compositeMode == "normal" && floatEq @_opacity, 1
       cacheIsValid: -> !!@_drawCacheBitmap
@@ -438,8 +443,10 @@
       return if elementSpaceDrawArea.getArea() <= 0

       cacheScale =
-        pixelsPerPoint *
-          if @getCacheDraw() || @getStage() then 1 else elementToTargetMatrix.getExactScaler()
+        if @getCacheDraw() || @getStage()
+          pixelsPerPoint
+        else
+          elementToTargetMatrix.getExactScaler()

       cacheSpaceDrawArea = elementSpaceDrawArea.mul cacheScale
       while cacheSpaceDrawArea.area >= maxCanvasSize


Fix formation

Fix formation

--- index.cjsx
+++ index.cjsx
@@ -452,6 +452,7 @@
           [shipName, shipLv] = getInfo shipName, shipLv, _decks[body.api_dock_id - 1].api_ship, body.api_ship_ke, body.api_ship_lv
           [maxHp, nowHp] = getHp maxHp, nowHp, body.api_maxhps, body.api_nowhps
           if body.api_formation?
+            enemyFormation = body.api_formation[1]
             enemyIntercept = body.api_formation[2]
           afterHp = Object.clone nowHp
           if body.api_kouku.api_stage3?


Add test about super

Add test about super

--- test/classes.coffee
+++ test/classes.coffee
@@ -661,6 +661,21 @@
       ok a instanceof A
       eq nonce, a.nonce

+    test 'super function', ->
+      class Super
+        func: (@a = 1) ->
+
+      class Sub extends Super
+        func: ->
+          super
+          eq @a, 1
+          super 3
+          eq @a, 3
+          # a = super # TODO: must fix
+
+      a = new Sub
+      a.func()
+
     test '#199: implicit object as static class member', ->
       nonceA = {}
       nonceB = {}


convert more ids to strings in tests

convert more ids to strings in tests

--- test/loadable.spec.cjsx
+++ test/loadable.spec.cjsx
@@ -34,7 +34,7 @@

   it 'should work with id=0', (done) ->
-    id = 0
+    id = '0'
     expect(CrudStore.isUnknown(id)).to.be.true
     CrudActions.load.once 'trigger', (args...) ->
       done()
@@ -42,7 +42,7 @@

   it 'should call load when props updated', (done) ->
-    id = 123
+    id = '123'
     expect(CrudStore.isUnknown(id)).to.be.true
     CrudActions.load.once 'trigger', (myId) ->
       expect(myId).to.equal(id)
@@ -51,7 +51,7 @@

   it 'should reflect the state changes from loading to loaded', (done) ->
-    id = 234
+    id = '234'
     expect(CrudStore.isUnknown(id)).to.be.true
     CrudActions.load.once 'trigger', (myId) ->
       delay ->
@@ -69,7 +69,7 @@

   it 'should show an error when loading fails', (done) ->
-    id = 345
+    id = '345'
     expect(CrudStore.isUnknown(id)).to.be.true
     CrudActions.load.once 'trigger', (myId) ->
       delay ->


Improve test case for line counter

Improve test case for line counter

--- test/counter.coffee
+++ test/counter.coffee
@@ -4,7 +4,7 @@

 describe 'line counter', ->

-  it 'should display correct line number when parse error', (next) ->
+  it 'should display correct line number when invalid opening quotes', (next) ->
     parse """
     "this","line","is",valid
     "this","line",is,"also",valid
@@ -24,6 +24,7 @@
     "",1974,8.8392926E7,"",""
     """, (err, data) ->
       err.message.should.match /Quoted field not terminated at line 4/
+      (data == undefined).should.be.true
       next()

   it 'should display correct line number when invalid quotes', (next) ->
@@ -33,8 +34,9 @@
       ""  1974    8.8392926E7 ""t ""
       "  1974    8.8392926E7 ""t "
       "  1974    8.8392926E7 "t ""
-    """, quote: '"', escape: '"', delimiter: "\t", (err) ->
+    """, quote: '"', escape: '"', delimiter: "\t", (err, data) ->
       err.message.should.match /Invalid closing quote at line 3/
+      (data == undefined).should.be.true
       next()

   it 'should display correct line number when invalid quotes from string', (next) ->
@@ -45,6 +47,7 @@
     "",1974,8.8392926E7,"",""
     "",1974,8.8392926E7,"",""
     "",1974,8.8392926E7,""t,""
-    """, quote: '"', escape: '"', (err) ->
+    """, quote: '"', escape: '"', (err, data) ->
       err.message.should.match /Invalid closing quote at line 2/
+      (data == undefined).should.be.true
       next()


DEMO: add title and bottom for sortable options to preview

--- demo/src/demos/Form/FormDemo.coffee
+++ demo/src/demos/Form/FormDemo.coffee
@@ -351,6 +351,8 @@
 					right: actionButton
 				name: "sortable_group"
 				sortable: true
+				sortable_hint: "Sort checked options, unchecked are sorted alphabetically"
+				title: "Title at the top"
 				options: [
 					value: 1
 					text: "One"


deployment: added koding-proxy-dev-us-e-1-v2 to proxy list

--- deployment/grouptoenvmapping.coffee
+++ deployment/grouptoenvmapping.coffee
@@ -4,6 +4,7 @@
   "koding-proxy-eu-west-1"
   "koding-proxy-us-west-2"
   "koding-proxy-dev-us-e-1"
+  "koding-proxy-dev-us-e-1-v2"
 ]

 envs =  [


Ridiculous comma bug.

Ridiculous comma bug.

--- test/factory.coffee
+++ test/factory.coffee
@@ -25,7 +25,7 @@
   ability: 'Synchronize'
   moves: ['Psychic', 'AncientPower']

-Factory.register 'Corphish'
+Factory.register 'Corphish',
   moves: ['Trump Card', "Crunch", "Round"]

 Factory.register 'Porygon-Z',


Add images task for background page

Add images task for background page

--- config/application.coffee
+++ config/application.coffee
@@ -5,7 +5,7 @@
   pkg: lineman.grunt.file.readJSON("package.json")

   appTasks:
-    common: [ "coffee", "less", "jshint", "handlebars", "jst", "concat", "copy", "pages" ]
+    common: [ "coffee", "less", "jshint", "handlebars", "jst", "concat", "copy", "images", "pages" ]
     dev: [ "exec", "watch" ]
     dist: []

@@ -70,6 +70,13 @@
     background:
       src: "<%= files.background.template.handlebars %>"
       dest: "generated/<%= files.background.template.generatedHandlebars %>"
+
+  images:
+    background:
+      files: [
+        { expand: true, cwd: "vendor/background/", src: "img/**/*.*", dest: "generated/" }
+        { expand: true, cwd: "background/",        src: "img/**/*.*", dest: "generated/" }
+      ]

   jshint:
     options:


formats contributers map

formats contributers map

--- maps/contributors.coffee
+++ maps/contributors.coffee
@@ -1,246 +1,273 @@
-module.exports =
+module.exports = [
   name: 'Zarinah Agnew'
-    location: 'San Francisco'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Zarinah is a neuroscientist at UCSF using non-invasive neuroimaging and brain stimulation techniques to probe how the brain controls complex voluntary movements. Outside of neuroscience her interests lie in designing new cultural behaviors, encouraging discourse and critical thinking for an improved society. She is heavily involved in public engagement of science, as a speaker and demonstrator as a way to forge links between academia and the public.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'San Francisco'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Zarinah is a neuroscientist at UCSF using non-invasive neuroimaging and brain stimulation techniques to probe how the brain controls complex voluntary movements. Outside of neuroscience her interests lie in designing new cultural behaviors, encouraging discourse and critical thinking for an improved society. She is heavily involved in public engagement of science, as a speaker and demonstrator as a way to forge links between academia and the public.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Raphaël Bastide'
-    location: 'Paris'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Raphaël Bastide is an artist, independent graphic designer and teacher based in Paris. He studied digital art and typography in Brussels where he began to delete the proprietary software from his hard drive. He recently had solo exhibitions in Belgium where he shown “Branch” and “Diff”, two installations inspired by versioning and revision control systems. He is also involved in several collectives related to free culture, design and typography.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Paris'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Raphaël Bastide is an artist, independent graphic designer and teacher based in Paris. He studied digital art and typography in Brussels where he began to delete the proprietary software from his hard drive. He recently had solo exhibitions in Belgium where he shown “Branch” and “Diff”, two installations inspired by versioning and revision control systems. He is also involved in several collectives related to free culture, design and typography.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Carson Chan'
-    location: 'Princeton'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Princeton'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Douglas Coupland'
-    location: 'Vancouver'
-    links: []
-    bio: 'Douglas Coupland is a Canadian writer and visual artist whose practise involves crossing the borders of all media, as well as the creation of cross-media projects. He exhibits internationally and currently has a solo exhibition at Rotterdam\'s _Witte de With Center for Contemporary Art_.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Vancouver'
+  links: []
+  bio: 'Douglas Coupland is a Canadian writer and visual artist whose practise involves crossing the borders of all media, as well as the creation of cross-media projects. He exhibits internationally and currently has a solo exhibition at Rotterdam\'s _Witte de With Center for Contemporary Art_.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Diakron'
-    location: 'Copenhagen'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Diakron is a platform and studio for transdisciplinary research and practice located in Amager, Copenhagen. Diakron is based on explorative research as a core value, currently interested in creative ways of identifying and dealing with changes that invisibly permeate or unavoidably overwhelm ways of life. This work is tied to concerned interests in various pervasive ecological, humanitarian, existential, digital, or economic shifts.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Copenhagen'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Diakron is a platform and studio for transdisciplinary research and practice located in Amager, Copenhagen. Diakron is based on explorative research as a core value, currently interested in creative ways of identifying and dealing with changes that invisibly permeate or unavoidably overwhelm ways of life. This work is tied to concerned interests in various pervasive ecological, humanitarian, existential, digital, or economic shifts.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Louise Drulhe'
-    location: 'Paris'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Louise Drulhe is currently working as a graphic designer in Paris. Author of the Critical Atlas of the Internet (originally her thesis project at ENSAD- École des Arts Décoratifs, Paris) using spatial analysis as a tool for political and social purposes.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Paris'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Louise Drulhe is currently working as a graphic designer in Paris. Author of the Critical Atlas of the Internet (originally her thesis project at ENSAD- École des Arts Décoratifs, Paris) using spatial analysis as a tool for political and social purposes.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'FOAM'
-    location: 'Mobile'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'FOAM is a decentralized architecture office (ĐAO) working to apply blockchain technologies to the production of the built environment and office-form. FOAM recently realized a partner installation, The Tropical Mining Station, and symposium, The Art of Economy for the inaugural Chicago Architecture Biennial. The Tropical Mining station is a prototype spatial product that extracts surplus value from the process of cryptocurrency mining to produce space. FOAM was founded in 2015 by Ryan John King, Ekaterina Zavyalova and Nick Axel.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Mobile'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'FOAM is a decentralized architecture office (ĐAO) working to apply blockchain technologies to the production of the built environment and office-form. FOAM recently realized a partner installation, The Tropical Mining Station, and symposium, The Art of Economy for the inaugural Chicago Architecture Biennial. The Tropical Mining station is a prototype spatial product that extracts surplus value from the process of cryptocurrency mining to produce space. FOAM was founded in 2015 by Ryan John King, Ekaterina Zavyalova and Nick Axel.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Patri Friedman'
-    location: 'Berkeley'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Former Google engineer and grandson of Nobel Prize-winning economist Milton Friedman wants to build “start-up countries”: autonomous dwellings in the middle of the ocean. American libertarian activist and theorist of political economy. Patri founded the nonprofit Seasteading Institute, which explores the creation of sovereign ocean colonies. Later, he co-founded the Future Cities Development Corporation, a project to establish a self-governing charter city within the borders of Honduras.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Berkeley'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Former Google engineer and grandson of Nobel Prize-winning economist Milton Friedman wants to build “start-up countries”: autonomous dwellings in the middle of the ocean. American libertarian activist and theorist of political economy. Patri founded the nonprofit Seasteading Institute, which explores the creation of sovereign ocean colonies. Later, he co-founded the Future Cities Development Corporation, a project to establish a self-governing charter city within the borders of Honduras.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Pieterjan Ginckels'
-    location: 'Brussels'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Brussels'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Sam Hart'
-    location: 'New York City'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Sam Hart is a scientist, publisher, and artist based in New York. His interests include complex systems modelling and developing strategies that advance a more ethical technoculture. Sam works as a Bioinformatician at Sloan Kettering\'s Reis-Filho Lab, where he investigates the mechanisms of cancer evolution. He is also Co-Founder and Editor-in-Chief of AVANT.org, an internet project space for critical interdisciplinarity.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'New York City'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Sam Hart is a scientist, publisher, and artist based in New York. His interests include complex systems modelling and developing strategies that advance a more ethical technoculture. Sam works as a Bioinformatician at Sloan Kettering\'s Reis-Filho Lab, where he investigates the mechanisms of cancer evolution. He is also Co-Founder and Editor-in-Chief of AVANT.org, an internet project space for critical interdisciplinarity.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'IF'
-    location: 'London'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'London'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Zoltan Istvan'
-    location: 'Mill Valley'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Mill Valley'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Indy Johar'
-    location: 'London'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Indy Johar is an architect, co-founder of 00 (project00.cc) and a Senior Innovation Associate with the Young Foundation. Indy, on behalf of 00, has co-founded multiple social ventures from Impact Hub Westminster to Impact Hub Birmingham and has also co-led research projects such as The Compendium for the Civic Economy. Indy is an Advisor to the Earth Security Initiative and a director of WikiHouse Foundation and Civic Systems Laboratory.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'London'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Indy Johar is an architect, co-founder of 00 (project00.cc) and a Senior Innovation Associate with the Young Foundation. Indy, on behalf of 00, has co-founded multiple social ventures from Impact Hub Westminster to Impact Hub Birmingham and has also co-led research projects such as The Compendium for the Civic Economy. Indy is an Advisor to the Earth Security Initiative and a director of WikiHouse Foundation and Civic Systems Laboratory.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Marvin Jordan'
-    location: 'New York City'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Marvin Jordan is an editorial assistant at DIS Magazine and Black Market co-founder. Black Market is a program highlighting the practices of mostly under-recognized, young artists of color that \"focuses on deconstructing and reinventing current themes central to hip hop—such as finance, determination, and celebration—in the context of contemporary art.\"- conceived in collaboration with artist James Allister Sprang, who raps under the name GAZR.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'New York City'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Marvin Jordan is an editorial assistant at DIS Magazine and Black Market co-founder. Black Market is a program highlighting the practices of mostly under-recognized, young artists of color that \"focuses on deconstructing and reinventing current themes central to hip hop—such as finance, determination, and celebration—in the context of contemporary art.\"- conceived in collaboration with artist James Allister Sprang, who raps under the name GAZR.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Martti Kalliala'
-    location: 'Berlin - Helsinki'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Martti Kalliala is an architect based between Berlin and Helsinki whose work focuses on the intersection of technology, architectural form and social innovation across a variety of media: architectural and urban design, writing, curating, video, software and sound. Alongside his work as an architect he has sustained for the past ten years – under several aliases – an international career in electronic music.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Berlin - Helsinki'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Martti Kalliala is an architect based between Berlin and Helsinki whose work focuses on the intersection of technology, architectural form and social innovation across a variety of media: architectural and urban design, writing, curating, video, software and sound. Alongside his work as an architect he has sustained for the past ten years – under several aliases – an international career in electronic music.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Daniel Keller'
-    location: 'Berlin'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Berlin'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Nora N. Khan'
-    location: 'Boston'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Nora N. Khan explores issues in technology, literature, games and electronic music through fiction, essays and reviews. A contributing editor at Rhizome, she writes regularly for Rhizome and Kill Screen, and has recent work in Conjunctions, DIS, After Us, AVANT, and American Literary Review. She studied literature, history and theory at Harvard and fiction writing at the Iowa Writers\' Workshop.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Boston'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Nora N. Khan explores issues in technology, literature, games and electronic music through fiction, essays and reviews. A contributing editor at Rhizome, she writes regularly for Rhizome and Kill Screen, and has recent work in Conjunctions, DIS, After Us, AVANT, and American Literary Review. She studied literature, history and theory at Harvard and fiction writing at the Iowa Writers\' Workshop.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Nick Land'
-    location: 'Shanghai'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Shanghai'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Metahaven'
-    location: 'Amsterdam'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Amsterdam'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Marina Otero Verzier'
-    location: 'Rotterdam'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Marina Otero Verzier is an architect based in Rotterdam. She is Head of Research at Het Nieuwe Instituut, and Chief Curator of the Oslo Architecture Triennale 2016 together with After Belonging Agency. Previously, she was Director of Global Network Programming at Studio-X, and Adjunct Assistant Professor at Columbia University GSAPP. Her work, has been published in different publications including sqm: The quantified Home, Arquitectura Viva, The Avery Review, and Domus.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Rotterdam'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Marina Otero Verzier is an architect based in Rotterdam. She is Head of Research at Het Nieuwe Instituut, and Chief Curator of the Oslo Architecture Triennale 2016 together with After Belonging Agency. Previously, she was Director of Global Network Programming at Studio-X, and Adjunct Assistant Professor at Columbia University GSAPP. Her work, has been published in different publications including sqm: The quantified Home, Arquitectura Viva, The Avery Review, and Domus.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Nick Pinkston'
-    location: 'San Francisco'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Nick is the founder of Plethora - a rapid manufacturing service that lets you go from CAD to parts faster than ever before using a flexible manufacturing system. Previously, Nick started CloudFab: the world\'s first manufacturing-as-a-service API, and also HackPittsburgh: a collective workshop for the makers of Pittsburgh. Nick\'s mission is to democratize the means of production, making developing hardware as easy software.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'San Francisco'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Nick is the founder of Plethora - a rapid manufacturing service that lets you go from CAD to parts faster than ever before using a flexible manufacturing system. Previously, Nick started CloudFab: the world\'s first manufacturing-as-a-service API, and also HackPittsburgh: a collective workshop for the makers of Pittsburgh. Nick\'s mission is to democratize the means of production, making developing hardware as easy software.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Sascha Pohflepp'
-    location: 'San Diego'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Sascha Pohflepp is a German-born artist, researcher and writer. Notable exhibitions include Talk To Me at MoMA New York, Hyperlinks at the Art Institute of Chicago, Micro Impact at Boijmans Van Beuningen Museum Rotterdam, Pre-History of the Image at STUK Kunstencentrum Leuven, and Science Fiction: New Death at FACT Liverpool. Sascha’s work has won two Honorary Mentions from the VIDA Art and Artificial Life Awards and in June 2015 was shortlisted for the Berlin Art Prize.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'San Diego'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Sascha Pohflepp is a German-born artist, researcher and writer. Notable exhibitions include Talk To Me at MoMA New York, Hyperlinks at the Art Institute of Chicago, Micro Impact at Boijmans Van Beuningen Museum Rotterdam, Pre-History of the Image at STUK Kunstencentrum Leuven, and Science Fiction: New Death at FACT Liverpool. Sascha’s work has won two Honorary Mentions from the VIDA Art and Artificial Life Awards and in June 2015 was shortlisted for the Berlin Art Prize.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Venkatesh Rao'
-    location: 'Seattle'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Venkatesh Rao is a Seattle-based independent researcher and consultant. He is the founder of _ribbonfarm_ and the author of 3 books on decision-making and organizational behavior.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Seattle'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Venkatesh Rao is a Seattle-based independent researcher and consultant. He is the founder of _ribbonfarm_ and the author of 3 books on decision-making and organizational behavior.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Carson Salter'
-    location: 'New York City'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'New York City'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Jessy Kate Schingler'
-    location: 'San Francisco'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Jessy Kate Schingler is a space geek turned computer scientist designing human settlements on a planet called Earth. She is a founding member of Embassy Network, a collective of people and places using physical place and the built environment to experiment with new modes of human organizing, and push the boundaries of how we live.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'San Francisco'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Jessy Kate Schingler is a space geek turned computer scientist designing human settlements on a planet called Earth. She is a founding member of Embassy Network, a collective of people and places using physical place and the built environment to experiment with new modes of human organizing, and push the boundaries of how we live.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Jack Self'
-    location: 'London'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'London'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Benedict Singleton'
-    location: 'London'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Benedict Singleton is a designer based in London. His work, both self-directed and commercial, uses design, film and writing to address contemporary questions of strategy and narrative. He is the author of the forthcoming book The Long Con, and runs a graduate architecture studio at the Royal College of Art. He also speaks on his work widely, most recently at Tate Britain, Brighton Lighthouse, and the HKW in Berlin.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'London'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Benedict Singleton is a designer based in London. His work, both self-directed and commercial, uses design, film and writing to address contemporary questions of strategy and narrative. He is the author of the forthcoming book The Long Con, and runs a graduate architecture studio at the Royal College of Art. He also speaks on his work widely, most recently at Tate Britain, Brighton Lighthouse, and the HKW in Berlin.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Nick Srnicek'
-    location: 'London'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Nick Srnicek is the author of Postcapitalist Technologies (Polity, 2016) and Inventing the Future: Postcapitalism and a World Without Work (Verso, 2015 with Alex Williams), and editor of The Speculative Turn (Re.press, 2011 with Levi Bryant and Graham Harman).'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'London'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Nick Srnicek is the author of Postcapitalist Technologies (Polity, 2016) and Inventing the Future: Postcapitalism and a World Without Work (Verso, 2015 with Alex Williams), and editor of The Speculative Turn (Re.press, 2011 with Levi Bryant and Graham Harman).'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Jenna Sutela'
-    location: 'Helsinki - Berlin'
-    links: ['(Website)[http://jennasutela.com/]', '(twitter)[https://twitter.com/jennaemilia]']
-    bio: "Jenna Sutela is an artist and writer based between Helsinki and Berlin. Her projects seek to identify and react to precarious social and material moments—most recently, the relationship between the body and its technologically-mediated environment. She is a contributor to several international publications, such as _Frieze_ and _Harvard Design Magazine_, and her work has been presented at, for example, _Haus der Kulturen der Welt_, _Museum of Contemporary Art Kiasma_ and _South London Gallery_."
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Helsinki - Berlin'
+  links: ['(Website)[http://jennasutela.com/]', '(twitter)[https://twitter.com/jennaemilia]']
+  bio: "Jenna Sutela is an artist and writer based between Helsinki and Berlin. Her projects seek to identify and react to precarious social and material moments—most recently, the relationship between the body and its technologically-mediated environment. She is a contributor to several international publications, such as _Frieze_ and _Harvard Design Magazine_, and her work has been presented at, for example, _Haus der Kulturen der Welt_, _Museum of Contemporary Art Kiasma_ and _South London Gallery_."
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Morgan Sutherland'
-    location: 'New York City'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Morgan Sutherland works between the art and tech worlds as consultant, researcher, designer, and developer. Currently he works with Are.na, Diakron, and OS Fund. Previously he was artist-in-residence at Intel Labs, UX designer at Octopart, and research assistant developing responsive environments with the Topological Media Lab.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'New York City'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Morgan Sutherland works between the art and tech worlds as consultant, researcher, designer, and developer. Currently he works with Are.na, Diakron, and OS Fund. Previously he was artist-in-residence at Intel Labs, UX designer at Octopart, and research assistant developing responsive environments with the Topological Media Lab.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Ben Vickers'
-    location: 'London'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'London'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'McKenzie Wark'
-    location: 'New York City'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'New York City'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Molly Wright Steenson'
-    location: 'Pittsburgh'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: 'Molly Wright Steenson is an associate professor in the School of Design at Carnegie Mellon University. She researches the history of design, architecture, computation and artificial intelligence, and is completing a book titled Architecting Interactivity that explores these linkages, with a focus on the practices of Nicholas Negroponte, Cedric Price, Christopher Alexander, and Richard Saul Wurman.'
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'Pittsburgh'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: 'Molly Wright Steenson is an associate professor in the School of Design at Carnegie Mellon University. She researches the history of design, architecture, computation and artificial intelligence, and is completing a book titled Architecting Interactivity that explores these linkages, with a focus on the practices of Nicholas Negroponte, Cedric Price, Christopher Alexander, and Richard Saul Wurman.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
   name: 'Damon Zucconi'
-    location: 'New York City'
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
-  name: ''
-    location: ''
-    links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-    bio: ''
-    azone_uersname: ''
-    azone_reviews: []
-    azone_funds: []
+  location: 'New York City'
+  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  bio: ''
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+]


pwr location

pwr location

--- maps/contributors.coffee
+++ maps/contributors.coffee
@@ -1,31 +1,31 @@
 module.exports = [
   name: 'Zarinah Agnew'
   location: 'San Francisco'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Zarinah is a neuroscientist at UCSF using non-invasive neuroimaging and brain stimulation techniques to probe how the brain controls complex voluntary movements. Outside of neuroscience her interests lie in designing new cultural behaviors, encouraging discourse and critical thinking for an improved society. She is heavily involved in public engagement of science, as a speaker and demonstrator as a way to forge links between academia and the public.'
+  links: ['(@zarinahagnew)[https://twitter.com/zarinahagnew]']
+  bio: 'Zarinah Agnew is a neuroscientist at UCSF using non-invasive neuroimaging and brain stimulation techniques to probe how the brain controls complex voluntary movements. Outside of neuroscience her interests lie in designing new cultural behaviors, encouraging discourse and critical thinking for an improved society. She is heavily involved in public engagement of science, as a speaker and demonstrator as a way to forge links between academia and the public.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Raphaël Bastide'
   location: 'Paris'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Raphaël Bastide is an artist, independent graphic designer and teacher based in Paris. He studied digital art and typography in Brussels where he began to delete the proprietary software from his hard drive. He recently had solo exhibitions in Belgium where he shown “Branch” and “Diff”, two installations inspired by versioning and revision control systems. He is also involved in several collectives related to free culture, design and typography.'
+  links: ['(Website)[http://www.raphaelbastide.com/]', '(@raphaelbastide)[https://twitter.com/raphaelbastide]', '(are.na/raphael-bastide)[https://www.are.na/raphael-bastide]']
+  bio: 'Raphaël Bastide is an artist, independent graphic designer and teacher based in Paris. He studied digital art and typography in Brussels where he began to delete the proprietary software from his hard drive. He recently had solo exhibitions in Belgium where he shown _Branch_ and _Diff_, two installations inspired by versioning and revision control systems. He is also involved in several collectives related to free culture, design and typography.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Carson Chan'
   location: 'Princeton'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(Website)[http://www.carsonchan.net/]']
+  bio: 'Carson Chan is an architecture writer and curator, pursuing a PhD in architecture at Princeton University. In 2006, he co-founded PROGRAM in Berlin, a non-profit initiative for art and architecture collaborations. In 2012, he co-curated the 4th Marrakech Biennale, and he was Executive Curator of the Biennial of the Americas in Denver, 2013. He guest curated Aurora Dallas 2015, an outdoor public art biennial. Chan is Contributing Editor at Kaleidoscope, and Editor-at-Large at 032c.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Douglas Coupland'
   location: 'Vancouver'
-  links: []
+  links: ['(Website)[http://coupland.com/]', '(twitter)[https://twitter.com/DougCoupland]']
   bio: 'Douglas Coupland is a Canadian writer and visual artist whose practise involves crossing the borders of all media, as well as the creation of cross-media projects. He exhibits internationally and currently has a solo exhibition at Rotterdam\'s _Witte de With Center for Contemporary Art_.'
   azone_uersname: ''
   azone_reviews: []
@@ -33,7 +33,7 @@
   ,
   name: 'Diakron'
   location: 'Copenhagen'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  links: ['(Website)[http://diakron.dk/organisation]', '(@diakron)[https://twitter.com/diakron]', '(are.na/david-hilmer-rex)[https://www.are.na/david-hilmer-rex]', '(@aslakaamot)[https://twitter.com/aslakaamot]', '(are.na/aslak-aamot-kjaerulff)[https://www.are.na/aslak-aamot-kjaerulff]', '(@amitairomm)[https://twitter.com/amitairomm]', '(are.na/amitai-romm)[https://www.are.na/amitai-romm]']
   bio: 'Diakron is a platform and studio for transdisciplinary research and practice located in Amager, Copenhagen. Diakron is based on explorative research as a core value, currently interested in creative ways of identifying and dealing with changes that invisibly permeate or unavoidably overwhelm ways of life. This work is tied to concerned interests in various pervasive ecological, humanitarian, existential, digital, or economic shifts.'
   azone_uersname: ''
   azone_reviews: []
@@ -41,15 +41,15 @@
   ,
   name: 'Louise Drulhe'
   location: 'Paris'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Louise Drulhe is currently working as a graphic designer in Paris. Author of the Critical Atlas of the Internet (originally her thesis project at ENSAD- École des Arts Décoratifs, Paris) using spatial analysis as a tool for political and social purposes.'
+  links: ['(Website)[http://louisedrulhe.fr/]', '(twitter)[https://twitter.com/louisedrulhe]']
+  bio: 'Louise Drulhe is currently working as a graphic designer in Paris. Author of the _Critical Atlas of the Internet_ (originally her thesis project at ENSAD- École des Arts Décoratifs, Paris) using spatial analysis as a tool for political and social purposes.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'FOAM'
   location: 'Mobile'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  links: ['(Website)[http://foam.space/]', '(@FOAM_dao)[https://twitter.com/FOAM_dao]']
   bio: 'FOAM is a decentralized architecture office (ĐAO) working to apply blockchain technologies to the production of the built environment and office-form. FOAM recently realized a partner installation, The Tropical Mining Station, and symposium, The Art of Economy for the inaugural Chicago Architecture Biennial. The Tropical Mining station is a prototype spatial product that extracts surplus value from the process of cryptocurrency mining to produce space. FOAM was founded in 2015 by Ryan John King, Ekaterina Zavyalova and Nick Axel.'
   azone_uersname: ''
   azone_reviews: []
@@ -57,63 +57,63 @@
   ,
   name: 'Patri Friedman'
   location: 'Berkeley'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Former Google engineer and grandson of Nobel Prize-winning economist Milton Friedman wants to build “start-up countries”: autonomous dwellings in the middle of the ocean. American libertarian activist and theorist of political economy. Patri founded the nonprofit Seasteading Institute, which explores the creation of sovereign ocean colonies. Later, he co-founded the Future Cities Development Corporation, a project to establish a self-governing charter city within the borders of Honduras.'
+  links: ['(Website)[http://patrifriedman.com/]', '(@patrissimo)[https://twitter.com/patrissimo]']
+  bio: 'Patri Friedman, former Google engineer and grandson of Nobel Prize-winning economist Milton Friedman wants to build “start-up countries”: autonomous dwellings in the middle of the ocean. American libertarian activist and theorist of political economy. Friedman founded the nonprofit Seasteading Institute, which explores the creation of sovereign ocean colonies. Later, he co-founded the Future Cities Development Corporation, a project to establish a self-governing charter city within the borders of Honduras.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Pieterjan Ginckels'
   location: 'Brussels'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(Website)[http://www.pieterjanginckels.be/]']
+  bio: '"Our lives are hyper-real, and we feel the urge to continuously pimp, remix, recollect our own identity," says Pieterjan Ginckels. "As such, I see myself as an embedded outsider, playing with ambivalences in speed and authenticity." The Belgian artist and designer\'s work concerns itself with the acceleration of modern life. With SPEEDISM he proposes anti-methods for an increasingly theme-based, spectacular, and accelerated society.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Sam Hart'
   location: 'New York City'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Sam Hart is a scientist, publisher, and artist based in New York. His interests include complex systems modelling and developing strategies that advance a more ethical technoculture. Sam works as a Bioinformatician at Sloan Kettering\'s Reis-Filho Lab, where he investigates the mechanisms of cancer evolution. He is also Co-Founder and Editor-in-Chief of AVANT.org, an internet project space for critical interdisciplinarity.'
+  links: ['(Website)[http://hxrts.com/]', '(@hxrts)[https://twitter.com/hxrts]']
+  bio: 'Sam Hart is a scientist, publisher, and artist based in New York. His interests include complex systems modelling and developing strategies that advance a more ethical technoculture. Hart works as a Bioinformatician at Sloan Kettering\'s Reis-Filho Lab, where he investigates the mechanisms of cancer evolution. He is also Co-Founder and Editor-in-Chief of AVANT.org, an internet project space for critical interdisciplinarity.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'IF'
   location: 'London'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(Website)[project-if.com]', '(@sarahtgold)[https://twitter.com/sarahtgold]', '(@ihutc)[https://twitter.com/ihutc]']
+  bio: 'IF is a new design collective, London-based but working globally, proactively engaged with the evolution of the Internet. We imagine, build and test radical tools that are capable of providing more democratic futures, unlocking the potential of emerging technologies by focusing on real user needs. Through these technologies and their civic frameworks, IF interrogates the issues of governance, ownership and control that sit behind products and services.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Zoltan Istvan'
   location: 'Mill Valley'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(Website)[http://www.zoltanistvan.com/]', '(@zoltan_istvan)[https://twitter.com/zoltan_istvan]']
+  bio: 'Zoltan Istvan is a San Francisco-based futurist, journalist, and author of the novel The Transhumanist Wager. He is also the 2016 US Presidential candidate of the Transhumanist Party, a political organization dedicated to putting science, health, and technology at the forefront of American politics. He is driving the Immortality Bus—a 40-foot vehicle that looks like a giant coffin—across America to raise life extension science issues.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Indy Johar'
   location: 'London'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Indy Johar is an architect, co-founder of 00 (project00.cc) and a Senior Innovation Associate with the Young Foundation. Indy, on behalf of 00, has co-founded multiple social ventures from Impact Hub Westminster to Impact Hub Birmingham and has also co-led research projects such as The Compendium for the Civic Economy. Indy is an Advisor to the Earth Security Initiative and a director of WikiHouse Foundation and Civic Systems Laboratory.'
+  links: ['(Website)[https://about.me/indy.johar]', '(@indy_johar)[https://twitter.com/indy_johar]']
+  bio: 'Indy Johar is an architect, co-founder of 00 (project00.cc) and a Senior Innovation Associate with the Young Foundation. Johar, on behalf of 00, has co-founded multiple social ventures from Impact Hub Westminster to Impact Hub Birmingham and has also co-led research projects such as The Compendium for the Civic Economy. Johar is an Advisor to the Earth Security Initiative and a director of WikiHouse Foundation and Civic Systems Laboratory.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Marvin Jordan'
   location: 'New York City'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Marvin Jordan is an editorial assistant at DIS Magazine and Black Market co-founder. Black Market is a program highlighting the practices of mostly under-recognized, young artists of color that \"focuses on deconstructing and reinventing current themes central to hip hop—such as finance, determination, and celebration—in the context of contemporary art.\"- conceived in collaboration with artist James Allister Sprang, who raps under the name GAZR.'
+  links: []
+  bio: 'Marvin Jordan is an editorial assistant at _DIS Magazine_ and Black Market co-founder. Black Market is a program highlighting the practices of mostly under-recognized, young artists of color that "focuses on deconstructing and reinventing current themes central to hip hop—such as finance, determination, and celebration—in the context of contemporary art."- conceived in collaboration with artist James Allister Sprang, who raps under the name GAZR.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Martti Kalliala'
   location: 'Berlin - Helsinki'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  links: ['(Website)[http://marttikalliala.com/]', '(@marttikalliala)[https://twitter.com/marttikalliala]']
   bio: 'Martti Kalliala is an architect based between Berlin and Helsinki whose work focuses on the intersection of technology, architectural form and social innovation across a variety of media: architectural and urban design, writing, curating, video, software and sound. Alongside his work as an architect he has sustained for the past ten years – under several aliases – an international career in electronic music.'
   azone_uersname: ''
   azone_reviews: []
@@ -121,79 +121,87 @@
   ,
   name: 'Daniel Keller'
   location: 'Berlin'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: [ '(are.na/daniel-keller)[https://www.are.na/daniel-keller]']
+  bio: 'Daniel Keller was born in Detroit and now lives and works in Berlin. In 2012 he became Director of Absolute Vitality Inc, a Wyoming based corporation-sculpture co-owned by the artist and a group of private collectors. Daniel Keller\'s wide-ranging output engages with issues at the intersection of economics, technology, culture and collaboration. Keller, alongside the artist Nik Kosmas form a collective called AIDS-3D which explores techno-utopianism along with other popular notions of progress.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Nora N. Khan'
   location: 'Boston'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Nora N. Khan explores issues in technology, literature, games and electronic music through fiction, essays and reviews. A contributing editor at Rhizome, she writes regularly for Rhizome and Kill Screen, and has recent work in Conjunctions, DIS, After Us, AVANT, and American Literary Review. She studied literature, history and theory at Harvard and fiction writing at the Iowa Writers\' Workshop.'
+  links: ['(Website)[http://noranahidkhan.com/]', '(@noranahidkhan)[https://twitter.com/noranahidkhan]']
+  bio: 'Nora N. Khan explores issues in technology, literature, games and electronic music through fiction, essays and reviews. A contributing editor at _Rhizome_, she writes regularly for _Rhizome_ and _Kill Screen_, and has recent work in _Conjunctions_, _DIS_, _After Us_, _AVANT_, and _American Literary Review_. She studied literature, history and theory at Harvard and fiction writing at the Iowa Writers\' Workshop.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Nick Land'
   location: 'Shanghai'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: []
+  bio: 'Nick Land is an English philosopher and writer. The most recent of his writings can be found in various issues of _Collapse_, an independent UK-based journal for philosophical research and development, and _#Accelerate: The Accelerationist Reader_. Land is founder of two electronic presses, Urbanatomy Electronic and Time Spiral Press (with Anna Greenspan). He currently works as a freelance writer and editor, and teaches at the New Centre for Research & Practice.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Metahaven'
   location: 'Amsterdam'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(Website)[http://metahaven.net/Site/Metahaven.html]', '(@mthvn)[https://twitter.com/mthvn]']
+  bio: 'A studio for design, research, and art, based in Amsterdam. Founded by Vinca Kruk and Daniel van der Velden in 2007 as a design and research studio, Metahaven has come to define a new methodology in graphic design. The studio’s speculative practice privileges the vocabulary of graphic design as a means of knowledge production, using it as a tool to analyze organizational models and power structures.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Marina Otero Verzier'
   location: 'Rotterdam'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Marina Otero Verzier is an architect based in Rotterdam. She is Head of Research at Het Nieuwe Instituut, and Chief Curator of the Oslo Architecture Triennale 2016 together with After Belonging Agency. Previously, she was Director of Global Network Programming at Studio-X, and Adjunct Assistant Professor at Columbia University GSAPP. Her work, has been published in different publications including sqm: The quantified Home, Arquitectura Viva, The Avery Review, and Domus.'
+  links: ['(@marina_ov)[https://twitter.com/marina_ov]']
+  bio: 'Marina Otero Verzier is an architect based in Rotterdam. She is Head of Research at Het Nieuwe Instituut, and Chief Curator of the Oslo Architecture Triennale 2016 together with After Belonging Agency. Previously, she was Director of Global Network Programming at Studio-X, and Adjunct Assistant Professor at Columbia University GSAPP. Her work, has been published in different publications including _sqm: The quantified Home_, _Arquitectura Viva_, _The Avery Review_, and _Domus_.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Nick Pinkston'
   location: 'San Francisco'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Nick is the founder of Plethora - a rapid manufacturing service that lets you go from CAD to parts faster than ever before using a flexible manufacturing system. Previously, Nick started CloudFab: the world\'s first manufacturing-as-a-service API, and also HackPittsburgh: a collective workshop for the makers of Pittsburgh. Nick\'s mission is to democratize the means of production, making developing hardware as easy software.'
+  links: ['(Website)[http://www.nickpinkston.com/]', '(@nickpinkston)[https://twitter.com/nickpinkston]']
+  bio: 'Nick Pinkston is the founder of Plethora - a rapid manufacturing service that lets you go from CAD to parts faster than ever before using a flexible manufacturing system. Previously, Pinkston started CloudFab: the world\'s first manufacturing-as-a-service API, and also HackPittsburgh: a collective workshop for the makers of Pittsburgh. Pinkston\'s mission is to democratize the means of production, making developing hardware as easy software.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Sascha Pohflepp'
   location: 'San Diego'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Sascha Pohflepp is a German-born artist, researcher and writer. Notable exhibitions include Talk To Me at MoMA New York, Hyperlinks at the Art Institute of Chicago, Micro Impact at Boijmans Van Beuningen Museum Rotterdam, Pre-History of the Image at STUK Kunstencentrum Leuven, and Science Fiction: New Death at FACT Liverpool. Sascha’s work has won two Honorary Mentions from the VIDA Art and Artificial Life Awards and in June 2015 was shortlisted for the Berlin Art Prize.'
+  links: ['(Website)[http://pohflepp.net/]', '(@plugimi)[https://twitter.com/plugimi]']
+  bio: 'Sascha Pohflepp is a German-born artist, researcher and writer. Notable exhibitions include Talk To Me at MoMA New York, _Hyperlinks_ at the Art Institute of Chicago, _Micro Impact_ at Boijmans Van Beuningen Museum Rotterdam, _Pre-History of the Image_ at STUK Kunstencentrum Leuven, and _Science Fiction: New Death_ at FACT Liverpool. Pohflepp’s work has won two Honorary Mentions from the VIDA Art and Artificial Life Awards and in June 2015 was shortlisted for the Berlin Art Prize.'
+  azone_uersname: ''
+  azone_reviews: []
+  azone_funds: []
+  ,
+  name: 'PWR Studio'
+  location: 'Berlin'
+  links: ['(Website)[http://pwr.site]']
+  bio: 'PWR is a studio for research, design and development. We are occupied with practical investigations into the Cloud and the Dirt. Current themes include trustlessness, home-mining and the wheezing metabolism of Capital.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Venkatesh Rao'
   location: 'Seattle'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Venkatesh Rao is a Seattle-based independent researcher and consultant. He is the founder of _ribbonfarm_ and the author of 3 books on decision-making and organizational behavior.'
+  links: ['(Website)[http://www.ribbonfarm.com/]', '(@vgr)[https://twitter.com/vgr]']
+  bio: 'Venkatesh Rao is a Seattle-based independent researcher and technology consultant. He is the founder of the popular ribbonfarm blog, and the author of 3 books on decision-making and organizational behavior. He earned his PhD in aerospace engineering, in systems and control theory, from the University of Michigan in 2003.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Carson Salter'
   location: 'New York City'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(Website)[http://carsonsalter.com/]', '(@carsonsalter)[https://twitter.com/carsonsalter]', '(are.na/carson-salter)[https://www.are.na/carson-salter]']
+  bio: 'Carson Salter is an American artist and strategist based in New York. Early work dealt with alternative models of publishing and education in contemporary art. In 2013, Salter earned a Master\'s Degree in Art, Culture, and Technology at MIT, and has since focused on knowledge-based artist enterprises. Salter currently works as a Strategist for a creative agency specializing in brand-driven collaborations.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Jessy Kate Schingler'
   location: 'San Francisco'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  links: ['(@jessykate)[https://twitter.com/jessykate]']
   bio: 'Jessy Kate Schingler is a space geek turned computer scientist designing human settlements on a planet called Earth. She is a founding member of Embassy Network, a collective of people and places using physical place and the built environment to experiment with new modes of human organizing, and push the boundaries of how we live.'
   azone_uersname: ''
   azone_reviews: []
@@ -201,39 +209,39 @@
   ,
   name: 'Jack Self'
   location: 'London'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(Website)[http://www.jackself.com/]', '(@jack_self)[https://twitter.com/jack_self]']
+  bio: 'Jack Self is an architect and writer based in London. He is Director of the REAL Foundation, Contributing Editor for the _Architectural Review_ and author of _Real Estates: Life Without Debt_. He has worked for the _Architectural Review_ in a number of capacities since 2009, and was previously Associate Editor at Strelka Press. His writing has appeared in _Architectural Design_, the _Guardian_, _Blueprint_ and _Dezeen_, as well as elsewhere.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Benedict Singleton'
   location: 'London'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Benedict Singleton is a designer based in London. His work, both self-directed and commercial, uses design, film and writing to address contemporary questions of strategy and narrative. He is the author of the forthcoming book The Long Con, and runs a graduate architecture studio at the Royal College of Art. He also speaks on his work widely, most recently at Tate Britain, Brighton Lighthouse, and the HKW in Berlin.'
+  links: ['(Website)[http://www.benedictsingleton.com/]', '(@benedict)[https://twitter.com/benedict]', '(are.na/benedict-singleton)[https://www.are.na/benedict-singleton--2]']
+  bio: 'Benedict Singleton is a designer based in London. His work, both self-directed and commercial, uses design, film and writing to address contemporary questions of strategy and narrative. He is the author of the forthcoming book _The Long Con_, and runs a graduate architecture studio at the Royal College of Art. He also speaks on his work widely, most recently at Tate Britain, Brighton Lighthouse, and the HKW in Berlin.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Nick Srnicek'
   location: 'London'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Nick Srnicek is the author of Postcapitalist Technologies (Polity, 2016) and Inventing the Future: Postcapitalism and a World Without Work (Verso, 2015 with Alex Williams), and editor of The Speculative Turn (Re.press, 2011 with Levi Bryant and Graham Harman).'
+  links: ['(@n_srnck)[https://twitter.com/n_srnck]']
+  bio: 'Nick Srnicek is the author of _Postcapitalist Technologies_ (Polity, 2016) and _Inventing the Future: Postcapitalism_ and a _World Without Work_ (Verso, 2015 with Alex Williams), and editor of _The Speculative Turn_ (Re.press, 2011 with Levi Bryant and Graham Harman).'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Jenna Sutela'
   location: 'Helsinki - Berlin'
-  links: ['(Website)[http://jennasutela.com/]', '(twitter)[https://twitter.com/jennaemilia]']
-  bio: "Jenna Sutela is an artist and writer based between Helsinki and Berlin. Her projects seek to identify and react to precarious social and material moments—most recently, the relationship between the body and its technologically-mediated environment. She is a contributor to several international publications, such as _Frieze_ and _Harvard Design Magazine_, and her work has been presented at, for example, _Haus der Kulturen der Welt_, _Museum of Contemporary Art Kiasma_ and _South London Gallery_."
+  links: ['(Website)[http://jennasutela.com/]', '(@jennaemilia)[https://twitter.com/jennaemilia]', '(are.na/jenna-sutela)[https://www.are.na/jenna-sutela]']
+  bio: "Jenna Sutela is an artist and writer based between Helsinki and Berlin. Her projects seek to identify and react to precarious social and material moments—most recently, the relationship between the body and its technologically-mediated environment. She is a contributor to several international publications, such as _Frieze_ and _Harvard Design Magazine_, and her work has been presented at, for example, Haus der Kulturen der Welt, Museum of Contemporary Art Kiasma and South London Gallery."
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Morgan Sutherland'
   location: 'New York City'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
+  links: ['(Website)[http://morgansutherland.com/]', '(@msutherl)[https://twitter.com/msutherl]', '(are.na/morgan-sutherland)[https://www.are.na/morgan-sutherland]']
   bio: 'Morgan Sutherland works between the art and tech worlds as consultant, researcher, designer, and developer. Currently he works with Are.na, Diakron, and OS Fund. Previously he was artist-in-residence at Intel Labs, UX designer at Octopart, and research assistant developing responsive environments with the Topological Media Lab.'
   azone_uersname: ''
   azone_reviews: []
@@ -241,32 +249,32 @@
   ,
   name: 'Ben Vickers'
   location: 'London'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(Website)[http://www.benvickers.net/]', '(@benvickers_)[https://twitter.com/benvickers_]']
+  bio: 'Ben Vickers is a curator, writer, network analyst, technologist and luddite. He is currently Curator of Digital at the Serpentine Gallery, co-runs LIMAZULU Project Space, is an active member of EdgeRyders, leads Brighton University’s Professional \'Reality\' Development Program and facilitates the development of unMonastery, a new kind of social space designed to serve the local communities of towns or small cities throughout Europe in solving key social and infrastructural problems.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'McKenzie Wark'
   location: 'New York City'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(@mckenziewark)[https://twitter.com/mckenziewark]']
+  bio: 'Mckenzie Wark is an Australian-born writer and scholar. Wark is known for his writings on media theory, critical theory, new media, and the Situationist International. His best known works are _A Hacker Manifesto_ and _Gamer Theory_. He is professor of culture and media at the New School for Social Research and Eugene Lang College, in New York City.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Molly Wright Steenson'
   location: 'Pittsburgh'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: 'Molly Wright Steenson is an associate professor in the School of Design at Carnegie Mellon University. She researches the history of design, architecture, computation and artificial intelligence, and is completing a book titled Architecting Interactivity that explores these linkages, with a focus on the practices of Nicholas Negroponte, Cedric Price, Christopher Alexander, and Richard Saul Wurman.'
+  links: ['(Website)[http://www.girlwonder.com/]', '(@maximolly)[https://twitter.com/maximolly]']
+  bio: 'Molly Wright Steenson is an associate professor in the School of Design at Carnegie Mellon University. She researches the history of design, architecture, computation and artificial intelligence, and is completing a book titled _Architecting Interactivity_ that explores these linkages, with a focus on the practices of Nicholas Negroponte, Cedric Price, Christopher Alexander, and Richard Saul Wurman.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []
   ,
   name: 'Damon Zucconi'
   location: 'New York City'
-  links: ['(Website)[]', '(twitter)[]', '(are.na)[]']
-  bio: ''
+  links: ['(Website)[http://www.damonzucconi.com/]', '(@dzucconi)[https://twitter.com/dzucconi]', '(are.na/damon-zucconi)[https://www.are.na/damon-zucconi]']
+  bio: 'Damon Zucconi (b.1985, Bethpage, NY) is an artist who lives and works in Providence, RI. He has presented solo exhibitions with JTT in New York and Gentili Apri in Italy. Most recently he has been included in group exhibitions at Institute of Contemporary Art, Miami and Het Nieuwe Instituut, Rotterdam.'
   azone_uersname: ''
   azone_reviews: []
   azone_funds: []


Tweak

Tweak

--- config/test_groups.coffee
+++ config/test_groups.coffee
@@ -17,7 +17,7 @@

 TEST_GROUPS.browser_globals = []
 for library_name, library_files of LIBRARIES
-  TEST_GROUPS.browser_globals.push({name: "browser_globals_#{library_name}", files: library_files.concat(['./_temp/parameters.js', './_temp/option_sets.js', './node_modules/backbone-orm/test/spec/lib/**/*.tests.coffee', './node_modules/backbone-orm/test/spec/sync/**/*.tests.coffee'])})
+  TEST_GROUPS.browser_globals.push({name: "browser_globals_#{library_name}", files: library_files.concat(['./_temp/parameters.js', './_temp/option_sets.js', './node_modules/backbone-orm/test/spec/sync/**/*.tests.coffee'])})

 ###############################
 # AMD


Make process() a static method on batch client

Accept api key argument

--- src/kissmetrics-batch.coffee
+++ src/kissmetrics-batch.coffee
@@ -3,6 +3,9 @@
 class BatchKissmetricsClient
   @HOST: 'api.kissmetrics.com'
   @HTTP_METHOD: 'POST'
+
+  @process: (apiKey) ->
+    queue = @get()

   constructor: (@options) ->
     @queue = options.queue
@@ -16,9 +19,6 @@

   get: ->
     @queue.get()
-
-  process: ->
-    queue = @get()

   _transformData: (data) ->
     data.identity = data._p


code quality violation

code quality violation

--- bokehjs/src/coffee/palettes/palettes.coffee
+++ bokehjs/src/coffee/palettes/palettes.coffee
@@ -479,4 +479,3 @@
   palettes.Magma,
   palettes.Plasma,
   palettes.Viridis)
-


Fix merge conflict

Fix merge conflict

--- test/xy/moves.coffee
+++ test/xy/moves.coffee
@@ -514,6 +514,39 @@
       @battle.performMove(@p1, simpleBeam)
       mock.verify()

+  testTrappingMove = (name) ->
+    describe name, ->
+      it "deals 1/8 of the pokemon's max hp every turn", ->
+        shared.create.call this,
+          gen: 'xy'
+          team2: [Factory("Blissey")]
+        @battle.performMove(@p1, @battle.getMove(name))
+        @p2.currentHP = @p2.stat('hp')
+        @battle.endTurn()
+        maxHP = @p2.stat('hp')
+        expected = maxHP - Math.floor(maxHP / 8)
+        @p2.currentHP.should.equal expected
+
+      it "deals 1/6 of the pokemon's max hp every turn if the user is holding a Binding Band", ->
+        shared.create.call this,
+          gen: 'xy'
+          team1: [Factory("Magikarp", item: "Binding Band")]
+          team2: [Factory("Blissey")]
+        @battle.performMove(@p1, @battle.getMove(name))
+        @p2.currentHP = @p2.stat('hp')
+        @battle.endTurn()
+        maxHP = @p2.stat('hp')
+        expected = maxHP - Math.floor(maxHP / 6)
+        @p2.currentHP.should.equal expected
+
+  testTrappingMove "Bind"
+  testTrappingMove "Clamp"
+  testTrappingMove "Fire Spin"
+  testTrappingMove "Infestation"
+  testTrappingMove "Magma Storm"
+  testTrappingMove "Sand Tomb"
+  testTrappingMove "Wrap"
+
   describe "Entrainment", ->
     it "does not change some abilities", ->
       shared.create.call this,


Added timeout to pjax constructor

Added timeout to pjax constructor

--- app/assets/javascripts/lib/utils/pjax_constructor.js.coffee
+++ app/assets/javascripts/lib/utils/pjax_constructor.js.coffee
@@ -1,12 +1,7 @@
 # ------------------------------------------------------------------------------
 # Handling pjax calls
 # @constructor
-# @param {#object} args
-#   url - the remote url for the ajax call
-#   parent - The parent dom element for the events, defaults to body
-#   container - defaults to js-pjax-container
-#   success - Callback function to fire on pjax success
-#   error - Callback function to fire on pjax error
+# @param {#object} args - defined by config below
 # ------------------------------------------------------------------------------

 define ['jquery', 'jplugs/jquery.pjax'], ($) ->
@@ -16,7 +11,10 @@
     config =
       container : '#js-pjax-container'
       parent    : 'body'
+      type      : 'GET'
+      timeout   : 650
       url       : ''
+      data      : ''
       success   : ->
       error     : ->

@@ -31,4 +29,7 @@
       init()
       $.pjax
         url       : config.url
-        container : config.container+        container : config.container
+        data      : config.data
+        type      : config.type
+        timeout   : config.timeout


Added flash message when user logs out

Added flash message when user logs out

--- app/assets/javascripts/sprangular/controllers/header.coffee
+++ app/assets/javascripts/sprangular/controllers/header.coffee
@@ -1,4 +1,4 @@
-Sprangular.controller "HeaderCtrl", ($scope, $location, $routeParams, Cart, Account, Catalog, Env, Status) ->
+Sprangular.controller "HeaderCtrl", ($scope, $location, $routeParams, Cart, Account, Catalog, Env, Flash, Status) ->

   $scope.cart = Cart
   $scope.catalog = Catalog
@@ -13,6 +13,7 @@
   $scope.logout = ->
     Account.logout()
       .then (content) ->
+        Flash.success "Successfully logged out"
         $location.path '/'

   $scope.login = ->


Added use_billing to list of attributes sent to server

--- app/assets/javascripts/sprangular/resources/checkout.coffee
+++ app/assets/javascripts/sprangular/resources/checkout.coffee
@@ -1,10 +1,11 @@
-Sprangular.service "Checkout", ($http, _, Account, Cart) ->
+Sprangular.service "Checkout", ($http, _, Env, Account, Cart) ->

   checkout =
     update: ->
       order = Cart.current

       params =
+        use_billing: order.shipToBillAddress
         order:
           ship_address_attributes: order.actualShippingAddress().serialize()
           bill_address_attributes: order.billingAddress.serialize()


Add "entity.name" scope to RUNOFF functions

This improves highlighting on GitHub, and also ensures functions use the
same colour as Roff commands between themes.

--- grammars/runoff.cson
+++ grammars/runoff.cson
@@ -121,7 +121,8 @@
 			"""
 			patterns: [include: "#arguments"]
 			beginCaptures:
-				1: name: "keyword.function.name.runoff"
+				0: name: "keyword.function.name.runoff"
+				1: name: "entity.name.function.runoff"
 				2: name: "punctuation.definition.function.runoff"
 				3: patterns: [
 					# Allow punctuation/parameters in clustered command-chains to be highlighted:


Added more comments to the router and extracted method for improved clarity (hopefully)

--- app/assets/javascripts/components/router.js.jsx.coffee
+++ app/assets/javascripts/components/router.js.jsx.coffee
@@ -1,37 +1,37 @@
 # The Router is responsible for routing the user to view the correct part of
 # the site.
 #
-# Most of the actual routing is handled by the Page.js library--the
-# function of the Router component is mainly to set up page to work with react,
-# so that every time the user navigates, RootContainer gets updated with new
-# props (properties) describing the new routing information, i.e. which section
-# and page to show.
+# Page.js itself takes care of handling route changes and making links not
+# refresh the page when clicked. The Router component's only job is to
+# initialize page, and make it update the React app whenever something changed.
+#
+# The result is that every time the user clicks an internal link (i.e. to
+# another page on the site), RootContainer gets updated with new props
+# describing which section is now the active section
+#
+# The sections themselves live in @Helpers.SECTIONS since they are also
+# referenced by other components.

 { SECTIONS } = @Helpers
 { RootContainer } = @Components

 # The router ensures that we update the page once the user navigates
 @Router = React.createClass
+  # If the app is rendered server-side, we will be given the current path in
+  # props.path
   getInitialState: ->
     path: @props.path or "/"

   componentWillMount: ->
-    # The router does not run server side
+    # The router is only needed when the app is running in client-side mode
     unless page = window.page
       return

     # Whenever the user clicks on a link, update the section
     for sectionPath, sectionDetails of SECTIONS
-      # (do => =>) means `sectionPath` is stored with the closure here
-      page sectionPath, do (sectionPath) =>
-        =>
-          @setState path: sectionPath
-          return false
+      page sectionPath, @createRouteHandlerForPath sectionPath

-    # 404 not found
-    page '*', ->
-      # TODO
-      console.log "Not found"
+    page '*', @on404NotFound

     # Start tracking user clicks
     page.start()
@@ -40,3 +40,14 @@
     RootContainer
       section: SECTIONS[@state.path]
       data: @props.wordpressResources
+
+  createRouteHandlerForPath: (path) ->
+    # We return a handler that is set up to set the state to the given path
+    =>
+      @setState { path }
+      # Return false to cancel propagation and default event handling
+      return false
+
+  on404NotFound: ->
+    # TODO
+    console.log "Not found"


add back in editor update code

add back in editor update code

--- app/assets/javascripts/pages/agent-edit-page.js.coffee
+++ app/assets/javascripts/pages/agent-edit-page.js.coffee
@@ -174,7 +174,8 @@

   invokeDryRun: (e) =>
     e.preventDefault()
-    Utils.handleDryRunButton(this)
+    @updateFromEditors()
+    Utils.handleDryRunButton(e.target)

 $ ->
   Utils.registerPage(AgentEditPage, forPathsMatching: /^agents/)


Hygiene -- remove 'return @'

Hygiene -- remove 'return @'

--- admin/static/coffee/resolve_issues.coffee
+++ admin/static/coffee/resolve_issues.coffee
@@ -105,9 +105,6 @@
                 url: 'ajax/issues'
                 contentType: 'application/json'
                 success: set_issues
-
-            return @
-

     class @ResolveVClockModal extends UIComponents.AbstractModal
         template: Handlebars.templates['resolve_vclock-modal-template']


Add real IP module directives

Add real IP module directives

Signed-off-by: Sonmez Kartal <d2d15c3d37396a5f2a09f8b42cf5f27d43a3fbde@koding.com>

--- deployment/nginx.coffee
+++ deployment/nginx.coffee
@@ -324,6 +324,8 @@
     proxy_cache_path /tmp/nginx levels=1:2 keys_zone=asset_cache:10m max_size=10g inactive=60m;
     proxy_cache_key "$scheme$request_method$host$request_uri";

+    #{createRealIpDirectives(KONFIG)}
+
     # start server
     server {
       # we should not timeout on proxy connections
@@ -469,3 +471,15 @@
       # use generic names, do not hardcode values
       return 301 https://$host$request_uri;
     }"""
+
+createRealIpDirectives = (KONFIG) ->
+  return ''  unless KONFIG.nginx?.real_ip
+
+  options = _.assign real_ip_options, KONFIG.nginx.real_ip
+
+  return """
+  \t\t\t
+    set_real_ip_from #{options.from};
+    real_ip_header #{options.header};
+    real_ip_recursive #{options.recursive};
+  """


added format method to wrap text to fixed line length

--- platforms/node/tools/mail.coffee
+++ platforms/node/tools/mail.coffee
@@ -2,7 +2,8 @@
 mailer = require('nodemailer').createTransport 'SMTP'

 module.exports =
-
+
+    ##
     sendMail: (data, fn)->

         for field in ['subject', 'from', 'to', 'text']
@@ -17,4 +18,20 @@
             return fn new Error 'verify to'

         mailer.sendMail data, fn
-        +
+    ##
+    format: (txt, wrap=70)->
+        words = txt.split ' '
+        txt = ''
+
+        lines = 1
+        while words.length
+            word = words.shift()
+            if txt.length + word.length > wrap * lines
+                lines++
+                txt += word + '\n'
+            else
+                txt += word + ' '
+
+        return txt.trimRight()
+


remove stubChildClasses

remove stubChildClasses

--- apps/artwork/components/partner_locations/test/index.coffee
+++ apps/artwork/components/partner_locations/test/index.coffee
@@ -4,7 +4,6 @@
 Backbone = require 'backbone'
 rewire = require 'rewire'
 { fabricate } = require 'antigravity'
-{ stubChildClasses } = require '../../../../../test/helpers/stubs'
 Artwork = require '../../../../../models/artwork'
 PartnerLocations = rewire '../index'
 PartnerPhoneNumberView = benv.requireWithJadeify require.resolve('../../partner_phone_number/view.coffee'), [