:fire: Delete line handling from TextEditorPresenter

--- src/text-editor-presenter.coffee
+++ src/text-editor-presenter.coffee
@@ -77,8 +77,7 @@
     @updateHiddenInputState() if @shouldUpdateHiddenInputState
     @updateContentState() if @shouldUpdateContentState
     @updateDecorations() if @shouldUpdateDecorations
-    @updateTilesState() if @shouldUpdateLinesState
-    @updateLinesState() if @shouldUpdateLinesState
+    @updateTilesState() if @shouldUpdateTilesState
     @updateCursorsState() if @shouldUpdateCursorsState
     @updateOverlaysState() if @shouldUpdateOverlaysState
     @updateLineNumberGutterState() if @shouldUpdateLineNumberGutterState
@@ -100,7 +99,7 @@
     @shouldUpdateHiddenInputState = false
     @shouldUpdateContentState = false
     @shouldUpdateDecorations = false
-    @shouldUpdateLinesState = false
+    @shouldUpdateTilesState = false
     @shouldUpdateCursorsState = false
     @shouldUpdateOverlaysState = false
     @shouldUpdateLineNumberGutterState = false
@@ -118,7 +117,7 @@
       @shouldUpdateScrollbarsState = true
       @shouldUpdateContentState = true
       @shouldUpdateDecorations = true
-      @shouldUpdateLinesState = true
+      @shouldUpdateTilesState = true
       @shouldUpdateLineNumberGutterState = true
       @shouldUpdateLineNumbersState = true
       @shouldUpdateGutterOrderState = true
@@ -134,7 +133,7 @@
       @shouldUpdateScrollbarsState = true
       @shouldUpdateContentState = true
       @shouldUpdateDecorations = true
-      @shouldUpdateLinesState = true
+      @shouldUpdateTilesState = true
       @shouldUpdateLineNumberGutterState = true
       @shouldUpdateLineNumbersState = true
       @shouldUpdateGutterOrderState = true
@@ -210,7 +209,6 @@
         scrollingVertically: false
         cursorsVisible: false
         tiles: {}
-        lines: {}
         highlights: {}
         overlays: {}
       gutters:
@@ -235,7 +233,6 @@
     @updateContentState()
     @updateDecorations()
     @updateTilesState()
-    @updateLinesState()
     @updateCursorsState()
     @updateOverlaysState()
     @updateLineNumberGutterState()
@@ -327,51 +324,6 @@
       tile = @state.content.tiles[index] ?= {}
       tile.top = (index * linesPerTile * @lineHeight) - @scrollTop
       tile.lines = presenter.getState()
-
-  updateLinesState: ->
-    return unless @startRow? and @endRow? and @lineHeight?
-
-    visibleLineIds = {}
-    row = @startRow
-    while row < @endRow
-      line = @model.tokenizedLineForScreenRow(row)
-      unless line?
-        throw new Error("No line exists for row #{row}. Last screen row: #{@model.getLastScreenRow()}")
-
-      visibleLineIds[line.id] = true
-      if @state.content.lines.hasOwnProperty(line.id)
-        @updateLineState(row, line)
-      else
-        @buildLineState(row, line)
-      row++
-
-    if @mouseWheelScreenRow?
-      if preservedLine = @model.tokenizedLineForScreenRow(@mouseWheelScreenRow)
-        visibleLineIds[preservedLine.id] = true
-
-    for id, line of @state.content.lines
-      unless visibleLineIds.hasOwnProperty(id)
-        delete @state.content.lines[id]
-    return
-
-  updateLineState: (row, line) ->
-    lineState = @state.content.lines[line.id]
-    lineState.screenRow = row
-    lineState.top = row * @lineHeight
-    lineState.decorationClasses = @lineDecorationClassesForRow(row)
-
-  buildLineState: (row, line) ->
-    @state.content.lines[line.id] =
-      screenRow: row
-      text: line.text
-      tokens: line.tokens
-      isOnlyWhitespace: line.isOnlyWhitespace()
-      endOfLineInvisibles: line.endOfLineInvisibles
-      indentLevel: line.indentLevel
-      tabLength: line.tabLength
-      fold: line.fold
-      top: row * @lineHeight
-      decorationClasses: @lineDecorationClassesForRow(row)

   updateCursorsState: ->
     @state.content.cursors = {}
@@ -748,7 +700,7 @@
       @shouldUpdateVerticalScrollState = true
       @shouldUpdateHiddenInputState = true
       @shouldUpdateDecorations = true
-      @shouldUpdateLinesState = true
+      @shouldUpdateTilesState = true
       @shouldUpdateCursorsState = true
       @shouldUpdateLineNumbersState = true
       @shouldUpdateCustomGutterDecorationState = true
@@ -771,7 +723,7 @@
     @state.content.scrollingVertically = false
     if @mouseWheelScreenRow?
       @mouseWheelScreenRow = null
-      @shouldUpdateLinesState = true
+      @shouldUpdateTilesState = true
       @shouldUpdateLineNumbersState = true
       @shouldUpdateCustomGutterDecorationState = true

@@ -834,7 +786,7 @@
       @shouldUpdateVerticalScrollState = true
       @shouldUpdateScrollbarsState = true
       @shouldUpdateDecorations = true
-      @shouldUpdateLinesState = true
+      @shouldUpdateTilesState = true
       @shouldUpdateCursorsState = true
       @shouldUpdateLineNumbersState = true
       @shouldUpdateCustomGutterDecorationState = true
@@ -862,7 +814,7 @@
       @shouldUpdateScrollbarsState = true
       @shouldUpdateContentState = true
       @shouldUpdateDecorations = true
-      @shouldUpdateLinesState = true
+      @shouldUpdateTilesState = true
       @shouldUpdateCursorsState = true unless oldContentFrameWidth?

       @emitDidUpdateState()
@@ -928,7 +880,7 @@
       @shouldUpdateScrollbarsState = true
       @shouldUpdateHiddenInputState = true
       @shouldUpdateDecorations = true
-      @shouldUpdateLinesState = true
+      @shouldUpdateTilesState = true
       @shouldUpdateCursorsState = true
       @shouldUpdateLineNumbersState = true
       @shouldUpdateCustomGutterDecorationState = true
@@ -980,7 +932,7 @@
     @shouldUpdateHiddenInputState = true
     @shouldUpdateContentState = true
     @shouldUpdateDecorations = true
-    @shouldUpdateLinesState = true
+    @shouldUpdateTilesState = true
     @shouldUpdateCursorsState = true
     @shouldUpdateOverlaysState = true

@@ -1072,7 +1024,7 @@
         intersectsVisibleRowRange = true

       if intersectsVisibleRowRange
-        @shouldUpdateLinesState = true if decoration.isType('line')
+        @shouldUpdateTilesState = true if decoration.isType('line')
         if decoration.isType('line-number')
           @shouldUpdateLineNumbersState = true
         else if decoration.isType('gutter')
@@ -1097,7 +1049,7 @@
         decoration.getMarker().getScreenRange())
       @addToLineDecorationCaches(decoration, decoration.getMarker().getScreenRange())
       if decoration.isType('line') or Decoration.isType(oldProperties, 'line')
-        @shouldUpdateLinesState = true
+        @shouldUpdateTilesState = true
       if decoration.isType('line-number') or Decoration.isType(oldProperties, 'line-number')
         @shouldUpdateLineNumbersState = true
       if (decoration.isType('gutter') and not decoration.isType('line-number')) or
@@ -1113,7 +1065,7 @@
   didDestroyDecoration: (decoration) ->
     if decoration.isType('line') or decoration.isType('gutter')
       @removeFromLineDecorationCaches(decoration, decoration.getMarker().getScreenRange())
-      @shouldUpdateLinesState = true if decoration.isType('line')
+      @shouldUpdateTilesState = true if decoration.isType('line')
       if decoration.isType('line-number')
         @shouldUpdateLineNumbersState = true
       else if decoration.isType('gutter')
@@ -1138,7 +1090,7 @@

     if decoration.isType('line') or decoration.isType('gutter')
       @addToLineDecorationCaches(decoration, decoration.getMarker().getScreenRange())
-      @shouldUpdateLinesState = true if decoration.isType('line')
+      @shouldUpdateTilesState = true if decoration.isType('line')
       if decoration.isType('line-number')
         @shouldUpdateLineNumbersState = true
       else if decoration.isType('gutter')


Check if cursor is blinking before pausing

--- src/text-editor-presenter.coffee
+++ src/text-editor-presenter.coffee
@@ -1386,12 +1386,15 @@
     @emitDidUpdateState()

   startBlinkingCursors: ->
-    unless @toggleCursorBlinkHandle
+    unless @isCursorBlinking()
       @state.content.cursorsVisible = true
       @toggleCursorBlinkHandle = setInterval(@toggleCursorBlink.bind(this), @getCursorBlinkPeriod() / 2)

+  isCursorBlinking: ->
+    @toggleCursorBlinkHandle?
+
   stopBlinkingCursors: (visible) ->
-    if @toggleCursorBlinkHandle
+    if @isCursorBlinking()
       @state.content.cursorsVisible = visible
       clearInterval(@toggleCursorBlinkHandle)
       @toggleCursorBlinkHandle = null
@@ -1401,7 +1404,8 @@
     @emitDidUpdateState()

   pauseCursorBlinking: ->
-    @stopBlinkingCursors(true)
-    @startBlinkingCursorsAfterDelay ?= _.debounce(@startBlinkingCursors, @getCursorBlinkResumeDelay())
-    @startBlinkingCursorsAfterDelay()
-    @emitDidUpdateState()
+    if @isCursorBlinking()
+      @stopBlinkingCursors(true)
+      @startBlinkingCursorsAfterDelay ?= _.debounce(@startBlinkingCursors, @getCursorBlinkResumeDelay())
+      @startBlinkingCursorsAfterDelay()
+      @emitDidUpdateState()


Client: Activity: Added CommentList component. It lists comments to feedItem

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


sidebar: add generic SidebarList component


add import react and react-dom snippets

add import react and react-dom snippets

/bin/sh: 1: Syntax error: "(" unexpected


update off-canvas js

update off-canvas js

--- app/assets/javascripts/leather/off_canvas.js.coffee
+++ app/assets/javascripts/leather/off_canvas.js.coffee
@@ -1,28 +1,44 @@
 $ ->
   if $(".off-canvas").length > 0
+    offCanvas.init()
+
+offCanvas =
+  init: ->
+    @setupDocument()
+    @bindEvents()
+
+  setupDocument: ->
     $('body').wrapInner("<div id='off-canvas-wrapper' />")
-
     $(".off-canvas, .fixed").each ->
       $("#off-canvas-wrapper").before(this)

+  bindEvents: ->
     $(document).on 'click', '[data-toggle="off-canvas"]', (e) ->
-      e.stopPropagation()
-      e.preventDefault()
       if e.handled != true
-        side = $(this).data('side')
-        if side == "left"
-          $('body').removeClass "off-canvas-show-right"
-        if side == "right"
-          $('body').removeClass "off-canvas-show-left"
-        $('body').toggleClass("off-canvas-show-#{side}")
-        e.handled = true
-      else
-        false
+        e.handled = offCanvas.toggle($(this), e)

     $(document).on 'click touchstart', '.off-canvas-show-left, .off-canvas-show-right', (e) ->
+      clicked = $(e.target)
       if e.handled != true
-        e.preventDefault()
-        unless ($(e.target).hasClass("off-canvas") || ($(e.target).parents(".off-canvas").length && !$(e.target).hasClass("close")) || $(e.target).data('toggle') == "off-canvas")
-          $(this).removeClass("off-canvas-show-right")
-          $(this).removeClass("off-canvas-show-left")
-        e.handled = true+        if (!clicked.hasClass("off-canvas") && clicked.parents(".off-canvas").length == 0 && clicked.data('toggle') != "off-canvas")
+          e.preventDefault()
+        else if (clicked.data('toggle') == "off-canvas" || (clicked.parents(".off-canvas").length && clicked.hasClass("close")))
+          e.handled = offCanvas.close(e)
+
+  toggle: (target, e) ->
+    e.stopPropagation()
+    e.preventDefault()
+    side = target.data('side')
+    if side == "left"
+      $('body').removeClass "off-canvas-show-right"
+    if side == "right"
+      $('body').removeClass "off-canvas-show-left"
+    $('body').toggleClass("off-canvas-show-#{side}")
+    true
+
+  close: (e) ->
+    e.preventDefault()
+    e.stopPropagation()
+    $('body').removeClass("off-canvas-show-right")
+    $('body').removeClass("off-canvas-show-left")
+    true


login

login

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/YY030913/tg.git/'


new script that will have all the necessary functions to be used in the scripts

error: pathspec 'i3-project-focus-workflow/necessaryFuncs.coffee' did not match any file(s) known to git

--- i3-project-focus-workflow/necessaryFuncs.coffee
+++ i3-project-focus-workflow/necessaryFuncs.coffee
@@ -0,0 +1,16 @@
+_ = require('lodash')
+
+getValidWorkspaceNums = (wkList, num) ->
+  num = +num
+  wkNums = _.pluck(wkList,'num')
+  if wkNums.length == 0
+    return(undefined)
+  maxWKNum = _.max(wkNums)
+  fullWKNums = [0..(maxWKNum-1)]
+  goodWKNums  = _.difference(fullWKNums, wkNums)
+  if num <= goodWKNums.length
+    return goodWKNums[0..(num-1)]
+  else
+    return goodWKNums.concat ([(maxWKNum + 1)..(maxWKNum + num - goodWKNums.length)])
+
+module.exports = getValidWorkspaceNums;


Replaced project-dota with level id and major version

--- server/queues/scoring.coffee
+++ server/queues/scoring.coffee
@@ -181,7 +181,8 @@
       $gt:opponentSessionTotalScore + 0.5
     _id:
       $ne: opponentSessionID
-    levelID: "project-dota"
+    "level.original": "52d97ecd32362bc86e004e87"
+    "level.majorVersion": 0
     submitted: true
     submittedCode:
       $exists: true
@@ -280,7 +281,8 @@
 fetchInitialSessionsToRankAgainst = (opposingTeam, callback) ->
   console.log "Fetching sessions to rank against for opposing team #{opposingTeam}"
   findParameters =
-    levelID: "project-dota"
+    "level.original": "52d97ecd32362bc86e004e87"
+    "level.majorVersion": 0
     submitted: true
     submittedCode:
       $exists: true


Sanitize new email address

Sanitize new email address


Implement tests for indent_style

Implement tests for indent_style

error: pathspec 'test/brave-mouse/validate.coffee' did not match any file(s) known to git

--- test/brave-mouse/validate.coffee
+++ test/brave-mouse/validate.coffee
@@ -0,0 +1,75 @@
+bmValidate = require '../../lib/brave-mouse/validate'
+
+mockFs = require 'mock-fs'
+
+prepareFs = (ecProperty, ecValue, file) ->
+	mockFs
+		'.editorconfig': "[*]\n#{ecProperty}=#{ecValue}"
+		'file.txt': fixtures[file]
+
+describe 'brave-mouse (programmatically)', ->
+	describe 'validate', ->
+		describe 'properties', ->
+			describe 'indent_style', ->
+				after ->
+					mockFs.restore()
+
+				it 'should validate if file uses tabs but spaces are expected', (done) ->
+					prepareFs 'indent_style', 'space', 'indent_style/tabs.txt'
+
+					bmValidate 'file.txt', (err, results) ->
+						results.indent_style.should.deep.equal
+							expected: 'space'
+							is: 'tab'
+
+						done()
+
+				it 'should validate if file uses spaces but tabs are expected', (done) ->
+					prepareFs 'indent_style', 'tab', 'indent_style/spaces.txt'
+
+					bmValidate 'file.txt', (err, results) ->
+						results.indent_style.should.deep.equal
+							expected: 'tab'
+							is: 'space'
+
+						done()
+
+				it 'should validate if file uses tabs and tabs are expected', (done) ->
+					prepareFs 'indent_style', 'tab', 'indent_style/tabs.txt'
+
+					bmValidate 'file.txt', (err, results) ->
+						results.should.be.true
+
+						done()
+
+				it 'should validate if file uses spaces and spaces are expected', (done) ->
+					prepareFs 'indent_style', 'space', 'indent_style/spaces.txt'
+
+					bmValidate 'file.txt', (err, results) ->
+						results.should.be.true
+
+						done()
+
+				it 'should validate if file uses no indentation and tabs are expected', (done) ->
+					prepareFs 'indent_style', 'tab', 'indent_style/none.txt'
+
+					bmValidate 'file.txt', (err, results) ->
+						results.should.be.true
+
+						done()
+
+				it 'should validate if file uses no indentation and spaces are expected', (done) ->
+					prepareFs 'indent_style', 'tab', 'indent_style/none.txt'
+
+					bmValidate 'file.txt', (err, results) ->
+						results.should.be.true
+
+						done()
+
+				it 'should not validate if nothing is expected', (done) ->
+					prepareFs null, null, 'indent_style/none.txt'
+
+					bmValidate 'file.txt', (err, results) ->
+						results.should.be.true
+
+						done()


node: depracate uid

node: depracate uid

it was used for kontainer machine users


Add project list from work laptop

Add project list from work laptop

error: pathspec 'atom/projects.charger.cson' did not match any file(s) known to git

--- atom/projects.charger.cson
+++ atom/projects.charger.cson
@@ -0,0 +1 @@
+[]


"Yes" -> "Done"

"Yes" -> "Done"

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/prognostikos/uploadcare-widget.git/'


New es.ES translations

New es.ES translations

--- app/locale/es-ES.coffee
+++ app/locale/es-ES.coffee
@@ -483,8 +483,8 @@
     forum_prefix: "Para asuntos públicos, por favor usa "
     forum_page: "nuestro foro"
     forum_suffix: " en su lugar."
-#    faq_prefix: "There's also a"
-#    faq: "FAQ"
+    faq_prefix: "Tambien existe un"
+    faq: "FAQ"
     subscribe_prefix: "Si necesitas ayuda para resolver el nivel, por favor"
     subscribe: "compra una subscripción de CodeCombat"
     subscribe_suffix: "y estaremos encantados de ayudarte con tu código."
@@ -574,22 +574,22 @@
   classes:
     archmage_title: "Archimago"
     archmage_title_description: "(Programador)"
-#    archmage_summary: "If you are a developer interested in coding educational games, become an archmage to help us build CodeCombat!"
+    archmage_summary: "¡Si eres un desarrollador interesado en crear juegos educacionales, conviértete en un Archimago y ayuda a la construcción de CodeCombat!"
     artisan_title: "Artesano"
     artisan_title_description: "(Diseñador de Niveles)"
-#    artisan_summary: "Build and share levels for you and your friends to play. Become an Artisan to learn the art of teaching others to program."
+    artisan_summary: "Construye y comparte niveles para que puedas jugar tu y tus amigos. Conviértete en un Artesano para aprender el arte de enseñar a otros a programar."
     adventurer_title: "Aventurero"
     adventurer_title_description: "(Tester de Niveles)"
-#    adventurer_summary: "Get our new levels (even our subscriber content) for free one week early and help us work out bugs before our public release."
+    adventurer_summary: "Consigue una semana antes y gratis, los nuevos niveles (incluso aquellos que requieren subscripción) y ayúdanos a solucionar bugs (fallos) antes de que se publiquen los niveles."
     scribe_title: "Escriba"
     scribe_title_description: "(Editor de Artículos)"
-#    scribe_summary: "Good code needs good documentation. Write, edit, and improve the docs read by millions of players across the globe."
+    scribe_summary: "El buen código requiere de buena documentación. Escribe, edita, y mejora la documentación leída por millones de jugadores a lo largo del globo."
     diplomat_title: "Diplomático"
     diplomat_title_description: "(Traductor)"
-#    diplomat_summary: "CodeCombat is localized in 45+ languages by our Diplomats. Help us out and contribute translations."
+    diplomat_summary: "CodeCombat está traducido a más de 45 idiomas por nuestros Diplomáticos. Ayúdanos realizando traducciones."
     ambassador_title: "Embajador"
     ambassador_title_description: "(Soporte)"
-#    ambassador_summary: "Tame our forum users and provide direction for those with questions. Our ambassadors represent CodeCombat to the world."
+    ambassador_summary: "Amansa a los usuarios de nuestro foro y guía a aquellos que tengan preguntas. Nuestros Embajadores representan a CodeCombat frente al mundo."

   editor:
     main_title: "Editores de CodeCombat"


Code cleanup

Code cleanup

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/enrmarc/f.git/'


Extract teacher content toggle into component

error: pathspec 'src/components/reference-book/teacher-content-toggle.cjsx' did not match any file(s) known to git

--- src/components/reference-book/teacher-content-toggle.cjsx
+++ src/components/reference-book/teacher-content-toggle.cjsx
@@ -0,0 +1,27 @@
+React = require 'react'
+BS = require 'react-bootstrap'
+
+TeacherContentToggle = React.createClass
+
+  getInitialState: ->
+    isShowing: false
+
+  propTypes:
+    onChange: React.PropTypes.func.isRequired
+
+  onClick: ->
+    isShowing = not @state.isShowing
+    @setState({isShowing})
+    @props.onChange(isShowing)
+
+  render: ->
+    teacherLinkText = if @state.isShowing
+      'Hide Teacher Edition'
+    else
+      'Show Teacher Edition'
+
+    <BS.Button className='btn-sm teacher-edition' onClick={@onClick}>
+      {teacherLinkText}
+    </BS.Button>
+
+module.exports = TeacherContentToggle


draft of an adapter-dispatcher class

draft of an adapter-dispatcher class

error: pathspec 'src/dispatchers/adapter.coffee' did not match any file(s) known to git

--- src/dispatchers/adapter.coffee
+++ src/dispatchers/adapter.coffee
@@ -0,0 +1,76 @@
+
+# Example handler function:
+#  (details, callback) ->
+#    {resource, action, authorization, identifier, query, content} = details
+#    {topic} = content
+#    callback null, {description: "#{topic} is smurfy"}
+
+module.exports = class AdapterDispatcher
+
+  constructor: (@service, @handlers) ->
+    # Handlers for built-in resources, such as the API definition.
+    for resource, actions of @service.default_handlers
+      handlers[resource] ||= {}
+      for name, handler of actions
+        handlers[resource][name] = handler
+
+    # Fill in missing handlers with a default error handler.
+    for resource, definition of @service.resources
+      for action, spec of definition.actions
+        @handlers[resource] ||= {}
+        @handlers[resource][action] ||= @unimplemented
+
+  request_listener: () ->
+    (request, response) =>
+
+    context = @service.context(request, response)
+    unless context.match.error?
+      details = @format(context)
+      callback = @create_callback(context)
+      @find_handler(context.match)(details, callback)
+
+  format: ({match, request}) ->
+    {resource_type, action_name} = match
+    {
+      resource: resource_type
+      action: action_name
+      authorization: match.authorization
+      identifier: match.path
+      query: match.query
+      content: request.body
+    }
+
+  create_callback: (context) ->
+    (error, result) ->
+      if error
+        context.error error.message, error.reason
+      else
+        status = context.match.success_status
+        switch status
+          when 202, 204
+            context.respond status
+          else
+            context.respond status, result
+
+
+  find_handler: (match) ->
+    if !(resource = @handlers[match.resource_type])?
+      throw "No such resource: #{match.resource_type}"
+
+    if !(action = resource[match.action_name])?
+      throw "Resource '#{match.resource_type}' has no such action: #{match.action_name}"
+
+    action
+
+
+  unimplemented: (context) ->
+    {match} = context
+
+    content = JSON.stringify
+      message: "Unimplemented: #{match.resource_type}.#{match.action_name}"
+    context.set_cors_headers("*")
+    context.respond 501, content,
+      "Content-Type": "application/json"
+      "Content-Length": content.length
+
+


Editor.save spec removes test files in afterEach method

--- spec/atom/editor-spec.coffee
+++ spec/atom/editor-spec.coffee
@@ -1060,10 +1060,12 @@
       tempFilePath = null

       beforeEach ->
-        tempFilePath = '/tmp/temp.txt'
-        expect(fs.remove(tempFilePath))
+        tempFilePath = '/tmp/atom-temp.txt'
         editor.setBuffer new Buffer(tempFilePath)
         expect(editor.buffer.path).toBe tempFilePath
+
+      afterEach ->
+        expect(fs.remove(tempFilePath))

       it "saves the current buffer to disk", ->
         editor.buffer.setText 'Edited!'


Don't filter out ANSI colours

Don't filter out ANSI colours

--- src/application.coffee
+++ src/application.coffee
@@ -105,8 +105,6 @@
 				es.pipeline(
 					stream
 					es.split()
-					# Remove color escape sequences
-					es.mapSync((s) -> s.replace(/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]/g, ''))
 					es.mapSync(publish)
 				)
 	.tap ->


Add tests to ensure common interface.

Add tests to ensure common interface.

error: pathspec 'spec/dummy/spec/javascripts/image_viewer_spec.js.coffee' did not match any file(s) known to git

--- spec/dummy/spec/javascripts/image_viewer_spec.js.coffee
+++ spec/dummy/spec/javascripts/image_viewer_spec.js.coffee
@@ -0,0 +1,36 @@
+describe "ImageViewer", ->
+  viewer = $('#ImageViewer').imageViewer
+
+  beforeEach ->
+    loadFixtures 'image_viewer_index'
+    $('#ImageViewer').imageViewer(["/assets/test_image_1.jpeg"])
+
+  it "implements zoom", ->
+    expect(typeof(viewer.rotate) == "function").toBe(true)
+
+  it "implements rotate", ->
+    expect(typeof(viewer.rotate) == "function").toBe(true)
+
+  it "implements rotate_all", ->
+    expect(typeof(viewer.rotate_all) == "function").toBe(true)
+
+  it "implements scrollPage", ->
+    expect(typeof(viewer.scrollPage) == "function").toBe(true)
+
+  it "implements scroll", ->
+    expect(typeof(viewer.scroll) == "function").toBe(true)
+
+  it "implements print", ->
+    expect(typeof(viewer.print) == "function").toBe(true)
+
+  it "implements displayLegend()", ->
+    expect(typeof(viewer.displayLegend) == "function").toBe(true)
+
+  it "implements settings()", ->
+    expect(typeof(viewer.settings) == "function").toBe(true)
+
+  it "implements teardownKeyBindings()", ->
+    expect(typeof(viewer.teardownKeyBindings) == "function").toBe(true)
+
+  it "implements setupKeyBindings()", ->
+    expect(typeof(viewer.setupKeyBindings) == "function").toBe(true)


module renames

module renames

error: pathspec 'src/game_state_cameras.coffee' did not match any file(s) known to git

--- src/game_state_cameras.coffee
+++ src/game_state_cameras.coffee
@@ -0,0 +1,33 @@
+GameState.Cameras = (I, self) ->
+  cameras = [Camera()]
+
+  self.bind 'update', (elapsedTime) ->
+    self.cameras().invoke 'trigger', 'update', elapsedTime
+
+  self.bind 'afterUpdate', (elapsedTime) ->
+    self.cameras().invoke 'trigger', 'afterUpdate', elapsedTime
+
+  self.bind 'draw', (canvas) ->
+    self.cameras().invoke 'trigger', 'draw', canvas, self.objects()
+
+  self.bind 'overlay', (canvas) ->
+    self.cameras().invoke 'trigger', 'overlay', canvas, self.objects()
+
+  return {
+    addCamera: (data) ->
+      cameras.push(Camera(data))
+    ###*
+    Returns the array of camera objects.
+
+    @name cameras
+    @methodOf Engine#
+    @returns {Array}
+    ###
+    cameras: (newCameras) ->
+      if newCameras
+        cameras = newCameras
+
+        return self
+      else
+        return cameras
+  }


basic d3 line

basic d3 line

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/svexican/tada.git/'


Implement actual Grunt task

Implement actual Grunt task

error: pathspec 'tasks/gyp.coffee' did not match any file(s) known to git

--- tasks/gyp.coffee
+++ tasks/gyp.coffee
@@ -0,0 +1,41 @@
+gyp = require('node-gyp')()
+
+# The first two arguments are apparently necessary as else nopt won’t include
+# loglevel as an option.
+defaultArgv = ['node', '.', '--loglevel=silent']
+
+# It is necessary to execute rebuild manually as calling node-gyp’s rebuild
+# programmatically fires the callback function too early.
+manualRebuild = (callback) ->
+	gyp.commands.clean [], (error) ->
+		callback(error) if error
+
+		gyp.commands.configure [], (error) ->
+			callback(error) if error
+
+			gyp.commands.build [], callback
+
+module.exports = (grunt) ->
+	grunt.registerMultiTask 'gyp', 'Run node-gyp commands from Grunt.', ->
+		done = @async()
+
+		options = @options
+			debug: false
+
+		argv = defaultArgv.slice()
+
+		# If we do not push '--no-debug' node-gyp might keep the debug option on
+		# as it was set on an earlier run.
+		if options.debug then argv.push '--debug' else argv.push '--no-debug'
+
+		gyp.parseArgv argv
+
+		gypCallback = (error) -> if error then done(false) else done()
+
+		@data.command = 'rebuild' if !@data.command
+
+		switch @data.command
+			when 'clean'     then gyp.commands.clean [], gypCallback
+			when 'configure' then gyp.commands.configure [], gypCallback
+			when 'build'     then gyp.commands.build [], gypCallback
+			when 'rebuild'   then manualRebuild gypCallback


Client: add AccountSessionListWrapper

Client: add AccountSessionListWrapper

error: pathspec 'client/account/lib/accountsessionlistwrapper.coffee' did not match any file(s) known to git

--- client/account/lib/accountsessionlistwrapper.coffee
+++ client/account/lib/accountsessionlistwrapper.coffee
@@ -0,0 +1,32 @@
+kd             = require 'kd'
+KDView         = kd.View
+globals        = require 'globals'
+KDSelectBox    = kd.SelectBox
+KDLabelView    = kd.LabelView
+KDHeaderView   = kd.HeaderView
+
+AccountSessionList           = require './accountsessionlist'
+AccountSessionListController = require './views/accountsessionlistcontroller'
+
+
+module.exports = class AccountSessionListWrapper extends KDView
+
+  constructor: (options = {}, data) ->
+
+    super options, data
+
+    @addSubView @top = new KDView
+      cssClass : 'top'
+
+    @top.addSubView @header = new KDHeaderView
+      title : 'Active Sessions'
+
+    @listController = new AccountSessionListController
+      view                    : new AccountSessionList
+      limit                   : 8
+      useCustomScrollView     : yes
+      lazyLoadThreshold       : 8
+
+    @addSubView @listController.getView()
+
+


EditorPane: Code styling refactor.

EditorPane: Code styling refactor.

--- client/ide/lib/workspace/panes/ideeditorpane.coffee
+++ client/ide/lib/workspace/panes/ideeditorpane.coffee
@@ -46,7 +46,7 @@

   createEditor: ->

-    {file, content} = @getOptions()
+    { file, content } = @getOptions()

     unless file instanceof FSFile
       throw new TypeError 'File must be an instance of FSFile'
@@ -55,14 +55,14 @@
       throw new TypeError 'You must pass file content to IDEEditorPane'

     aceOptions =
+      aceClass                 : IDEAce
       delegate                 : @getDelegate()
       createBottomBar          : no
       createFindAndReplaceView : no
-      aceClass                 : IDEAce

     @addSubView @aceView = new AceView aceOptions, file

-    {ace} = @aceView
+    { ace } = @aceView

     ace.ready =>
       @getEditor().setValue content, 1
@@ -85,34 +85,47 @@
       @save ignoreActiveLineOnTrim: yes

-  save: (options = {}) ->
-
-    @getAce().requestSave options
-
-
-  getAce: ->
-
-    return @aceView.ace
-
-
-  getEditor: ->
-
-    return @getAce().editor
-
-
-  getEditorSession: ->
-
-    return @getEditor().getSession()
-
-
-  getValue: ->
-
-    return  @getEditorSession().getValue()
-
-
-  goToLine: (lineNumber) ->
-
-    @getAce().gotoLine lineNumber
+  save: (options = {}) -> @getAce().requestSave options
+
+
+  getAce: -> return @aceView.ace
+
+
+  getEditor: -> return @getAce().editor
+
+
+  getEditorSession: -> return @getEditor().getSession()
+
+
+  getValue: -> return  @getEditorSession().getValue()
+
+
+  goToLine: (lineNumber) -> @getAce().gotoLine lineNumber
+
+
+  getAceScrollTop: -> @getEditorSession().getScrollTop()
+
+
+  setAceScrollTop: (top) -> @getEditorSession().setScrollTop top
+
+
+  getContent: -> return if @getEditor() then @getAce().getContents() else ''
+
+
+  setContent: (content, emitFileContentChangedEvent = yes) ->
+
+    @getAce().setContent content, emitFileContentChangedEvent
+
+
+  getCursor: -> return @getEditor().selection.getCursor()
+
+
+  setCursor: (positions) ->
+
+    @getEditor().selection.moveCursorTo positions.row, positions.column
+
+
+  getFile: -> return @aceView.getData()

   setFocus: (state) ->
@@ -124,31 +137,6 @@
     if state
     then ace.focus()
     else ace.blur()
-
-
-  getContent: ->
-
-    return if @getEditor() then @getAce().getContents() else ''
-
-
-  setContent: (content, emitFileContentChangedEvent = yes) ->
-
-    @getAce().setContent content, emitFileContentChangedEvent
-
-
-  getCursor: ->
-
-    return @getEditor().selection.getCursor()
-
-
-  setCursor: (positions) ->
-
-    @getEditor().selection.moveCursorTo positions.row, positions.column
-
-
-  getFile: ->
-
-    return @aceView.getData()

   getInitialChangeObject: ->
@@ -400,14 +388,10 @@
     @removeAllCursorWidgets()

-  makeReadOnly: ->
-
-    @getEditor()?.setReadOnly yes
-
-
-  makeEditable: ->
-
-    @getEditor()?.setReadOnly no
+  makeReadOnly: -> @getEditor()?.setReadOnly yes
+
+
+  makeEditable: -> @getEditor()?.setReadOnly no

   handleSaveFailed: (err) ->
@@ -419,6 +403,7 @@
   destroy: ->

     @file.off [ 'fs.save.failed', 'fs.saveAs.failed' ], @bound 'handleSaveFailed'
+
     super


Initial implementation of Packet

Initial implementation of Packet

error: pathspec 'src/wrathnet/net/packet.coffee' did not match any file(s) known to git

--- src/wrathnet/net/packet.coffee
+++ src/wrathnet/net/packet.coffee
@@ -0,0 +1,22 @@
+#
+# WrathNet Foundation
+# Copyright (c) 2012 Tim Kurvers <http://wrathnet.org>
+#
+# World of Warcraft client foundation written in JavaScript, enabling
+# development of expansion-agnostic clients, bots and other useful tools.
+#
+# The contents of this file are subject to the MIT License, under which
+# this library is licensed. See the LICENSE file for the full license.
+#
+
+# Denotes a network packet
+class WrathNet.net.Packet
+
+  # Creates a new packet optionally with given opcode
+  constructor: (opcode, outgoing=true) ->
+
+    # Holds the opcode for this packet
+    @opcode = opcode
+
+    # Whether this packet is outgoing or incoming
+    @outgoing = outgoing


now with more Unknown Error

now with more Unknown Error

--- resources/assets/coffee/_classes/beatmap-pack.coffee
+++ resources/assets/coffee/_classes/beatmap-pack.coffee
@@ -51,8 +51,9 @@
       .done (data) =>
         @packBody.innerHTML = data
         @slideDown() if @isCurrent
-      .fail (xhr) ->
-        console.error(xhr)
+
+      .fail osu.ajaxError
+
       .always =>
         @busy = false


Sort scores by winning team

Sort scores by winning team

--- resources/assets/coffee/react/mp-history/game.coffee
+++ resources/assets/coffee/react/mp-history/game.coffee
@@ -30,6 +30,13 @@
     winningTeam = if @props.teamScores.blue > @props.teamScores.red then 'blue' else 'red'
     difference = Math.abs @props.teamScores.blue - @props.teamScores.red

+    scores = game.scores.data.map (m) ->
+      if m.team == winningTeam
+        m.winning = true
+      m
+
+    scores = _.orderBy scores, ['winning', 'score'], ['asc', 'desc']
+
     div className: 'mp-history-game',
       el MPHistory.BeatmapHeader,
         beatmap: game.beatmap.data
@@ -37,7 +44,7 @@
         game: game

       div className: className,
-        game.scores.data.map (m) =>
+        scores.map (m) =>
           el MPHistory.Score,
             score: m
             mode: game.mode
@@ -45,7 +52,6 @@
             key: m.slot

       if showTeams
-        console.log @props.teamScores
         div {},
           div className: 'mp-history-game__team-scores',
             ['blue', 'red'].map (m) =>


login: use new gravatar getter

login: use new gravatar getter


Add snapshot item to pricing plan features lists

--- client/landing/site.landing/coffee/pricing/plans.coffee
+++ client/landing/site.landing/coffee/pricing/plans.coffee
@@ -54,6 +54,7 @@
       { partial: '1GB RAM'        , cssClass: 'ram' }
       { partial: '3GB Total Disk' , cssClass: 'storage' }
       { partial: '0 Always on VM' , cssClass: 'always-on disabled' }
+      { partial: '' } # empty line for 'VM Snapshots'
       { partial: '' } # empty line for 'Shareable VMs'
       { partial: '' } # empty line for 'Static IP'
     ]
@@ -71,6 +72,7 @@
       { partial: '1GB RAM'         , cssClass: 'ram' }
       { partial: '10GB Total Disk' , cssClass: 'storage' }
       { partial: '1 Always on VM'  , cssClass: 'always-on disabled' }
+      { partial: '1 VM Snapshot'   , cssClass: 'snapshots' }
       { partial: 'Shareable VMs'   , cssClass: 'share' }
       { partial: 'Static IP'       , cssClass: 'static-ip' }
     ]
@@ -88,6 +90,7 @@
       { partial: '1GB RAM each'    , cssClass: 'ram' }
       { partial: '25GB Total Disk' , cssClass: 'storage' }
       { partial: '1 Always on VM'  , cssClass: 'always-on' }
+      { partial: '3 VM Snapshots'  , cssClass: 'snapshots' }
       { partial: 'Shareable VMs'   , cssClass: 'share' }
       { partial: 'Static IP'       , cssClass: 'static-ip' }
     ]
@@ -105,6 +108,7 @@
       { partial: '1GB RAM each'    , cssClass: 'ram' }
       { partial: '50GB Total Disk' , cssClass: 'storage' }
       { partial: '2 Always on VMs' , cssClass: 'always-on' }
+      { partial: '5 VM Snapshots'  , cssClass: 'snapshots' }
       { partial: 'Shareable VMs'   , cssClass: 'share' }
       { partial: 'Static IP'       , cssClass: 'static-ip' }
     ]


Switch to i.TV Collection

Switch to i.TV Collection

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/idottv/grunt-itv.git/'


Change input size

Change input size

[#97184290]

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/netguru/review.git/'


[CHG] Compare text, not id to determine duplicate choices

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/saijim/Multipleter.git/'


[bot] Added 'scard' to Mikuia.Database

[bot] Added 'scard' to Mikuia.Database

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Mikuia/Mikuia.git/'


Update patch

Update patch

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ziagrosvenor/sound-machine.git/'


bug fix

bug fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


Add spec coverage for channel.js.coffee

Add spec coverage for channel.js.coffee

error: pathspec 'spec/javascripts/websocket_rails/channel_spec.coffee' did not match any file(s) known to git

--- spec/javascripts/websocket_rails/channel_spec.coffee
+++ spec/javascripts/websocket_rails/channel_spec.coffee
@@ -0,0 +1,51 @@
+describe 'WebSocketRails.Channel:', ->
+  beforeEach ->
+    @dispatcher =
+      new_message: -> true
+      dispatch: -> true
+      trigger_event: (event) -> true
+      state: 'connected'
+      connection_id: 12345
+    @channel = new WebSocketRails.Channel('public',@dispatcher)
+    sinon.spy @dispatcher, 'trigger_event'
+
+  afterEach ->
+    @dispatcher.trigger_event.restore()
+
+  describe 'public channels', ->
+    beforeEach ->
+      @channel = new WebSocketRails.Channel('forchan',@dispatcher,false)
+      @event = @dispatcher.trigger_event.lastCall.args[0]
+
+    it 'should trigger an event containing the channel name', ->
+      expect(@event.data.channel).toEqual 'forchan'
+
+    it 'should trigger an event containing the correct connection_id', ->
+      expect(@event.connection_id).toEqual 12345
+
+    it 'should initialize an empty callbacks property', ->
+      expect(@channel._callbacks).toBeDefined()
+      expect(@channel._callbacks).toEqual {}
+
+    it 'should be public', ->
+      expect(@channel.is_private).toBeFalsy
+
+    describe '.bind', ->
+      it 'should add a function to the callbacks collection', ->
+        test_func = ->
+        @channel.bind 'event_name', test_func
+        expect(@channel._callbacks['event_name'].length).toBe 1
+        expect(@channel._callbacks['event_name']).toContain test_func
+
+  describe 'private channels', ->
+    beforeEach ->
+      @channel = new WebSocketRails.Channel('forchan',@dispatcher,true)
+      @event = @dispatcher.trigger_event.lastCall.args[0]
+
+    it 'should trigger a subscribe_private event when created', ->
+      expect(@event.name).toEqual 'websocket_rails.subscribe_private'
+
+    it 'should be private', ->
+      expect(@channel.is_private).toBe true
+
+


gorup: delete subscrition when destroying the team

--- workers/social/lib/social/models/group/index.coffee
+++ workers/social/lib/social/models/group/index.coffee
@@ -1574,6 +1574,7 @@
     success  : (client, password, callback) ->

       account = client?.connection?.delegate
+      { sessionToken } = client

       @checkUserPassword account, password, (err) =>

@@ -1617,6 +1618,13 @@
           (next) =>
             ComputeProvider = require '../computeproviders/computeprovider'
             ComputeProvider.destroyGroupResources this, -> next()
+
+          (next) ->
+            url = '/api/social/payment/subscription/delete'
+            { deleteReq } = require '../socialapi/requests'
+
+            deleteReq url, { sessionToken }, (err, body) ->
+              next err

           (next) =>
             JSession = require '../session'


JGroup: remove same permissions for public/private

--- workers/social/lib/social/models/group/index.coffee
+++ workers/social/lib/social/models/group/index.coffee
@@ -45,9 +45,7 @@
     permissions     :
       'grant permissions'                 : []
       'open group'                        : ['member', 'moderator']
-      'list members'                      :
-        public                            : ['moderator', 'member']
-        private                           : ['moderator', 'member']
+      'list members'                      : ['moderator', 'member']
       'read group activity'               :
         public                            : ['guest', 'member', 'moderator']
         private                           : ['member', 'moderator']
@@ -77,9 +75,7 @@
       'delete channel'          : ['member', 'moderator']

       # JTag related permissions
-      'read tags'               :
-        public                  : ['member', 'moderator']
-        private                 : ['member', 'moderator']
+      'read tags'               : ['member', 'moderator']
       'create tags'             : ['member', 'moderator']
       'freetag content'         : ['member', 'moderator']
       'browse content by tag'   : ['member', 'moderator']


ScriptBlock: inject loggedIn status to served page for sync requirements

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Remove testapp from mainapp

Remove testapp from mainapp

--- workers/social/lib/social/render/scriptblock.coffee
+++ workers/social/lib/social/render/scriptblock.coffee
@@ -22,7 +22,6 @@
     require.config({baseUrl: "/js", waitSeconds:30});
     require(["order!/js/highlightjs/highlight.pack.js",
              "order!/js/kd.#{KONFIG.version}.js",
-             "order!/js/testapp.js",
              "order!/js/kdapp.#{KONFIG.version}.js"]);
   </script>


Track a couple profile events.

Track a couple profile events.

[#51845303]

--- client/helpers/profiles.coffee
+++ client/helpers/profiles.coffee
@@ -33,9 +33,11 @@
         Profiles.remove profileId, (error) ->
           if not error
             showNavSuccess "Profile removed."
+            SpendflowStats.track "Profile removed."
           else
             showNavError "I couldn't remove the profile for some reason. Try again, and contact us if the problems persist."
             console.log error
+            SpendflowStats.track "Removing profile failed.",  { profile: profile }
 }

 Template.newProfileForm.profilesCount = ->
@@ -52,9 +54,11 @@
       if not error
         clearFormFields $context
         showNavSuccess "New profile added."
+        SpendflowStats.track "Created new profile.", { record: Profiles.findOne result }
       else
         showNavError "There was a problem adding the new profile. Please try again. If the problem persists, contact us."
         console.log error
+        SpendflowStats.track "New profile creation failed.", { error: error }

   'click .save-profile': (event) ->
     event.preventDefault()


Adding script to display random images of Gorby Thunderhorse.

error: pathspec 'src/scripts/gorbypuff.coffee' did not match any file(s) known to git

--- src/scripts/gorbypuff.coffee
+++ src/scripts/gorbypuff.coffee
@@ -0,0 +1,63 @@
+# Description:
+#   Gorbypuff Thunderstone
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   gorby - Display a picture of everyone's favorite flat-faced cat
+#
+# Author:
+#   bradly
+
+gorbies = [
+  "http://24.media.tumblr.com/ded6b610059bac9203432ae1999fb439/tumblr_mix1ntHwN21rt6kj7o1_1280.jpg",
+  "http://25.media.tumblr.com/4eaabf5111c8444e68208adaa22c1c3a/tumblr_mewmgwxzZA1rt6kj7o1_1280.jpg",
+  "http://24.media.tumblr.com/tumblr_me3ubx13ck1rt6kj7o1_1280.jpg",
+  "http://25.media.tumblr.com/tumblr_md5v15WAWI1rt6kj7o1_1280.jpg",
+  "http://25.media.tumblr.com/tumblr_mcbxaz9w7T1rt6kj7o1_1280.jpg",
+  "http://25.media.tumblr.com/tumblr_mbqotcRr4j1rt6kj7o1_1280.jpg",
+  "http://25.media.tumblr.com/tumblr_m99wdgHcNN1rt6kj7o1_1280.jpg",
+  "http://25.media.tumblr.com/tumblr_m94zjtC4sy1rt6kj7o1_1280.jpg",
+  "http://25.media.tumblr.com/tumblr_m8cju4aFeS1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m7a3unqPjr1rt6kj7o1_1280.jpg",
+  "http://25.media.tumblr.com/tumblr_m6lev83Gak1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m6leq7NrsY1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m5vy9hfcTs1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m5g0bmkl601rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m5g0ab3EiH1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m51suk3wfS1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m50tx5IWhJ1rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m4q48mVFXj1rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m4hxmurzlL1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m4hxioPUln1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m4gqg94kSA1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m4c9ncT0LM1rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m44m5g6m001rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m3v8keZVhR1rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m3k8rvS6Uq1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m3k88eKJQf1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m3elppeyqa1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m3ekqyJ1iy1rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m35xkkGbKO1rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m305ndXRNH1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m2v55jdLgV1rt6kj7o1_500.png",
+  "http://25.media.tumblr.com/tumblr_m2ro01h07O1rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m2olbl9Uw61rt6kj7o1_1280.png",
+  "http://25.media.tumblr.com/tumblr_m2n4grjjN51rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m2j8mhAuMm1rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m2i8utX5Qv1rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m2i85ws1561rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m288synRIj1rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m21kfe7zir1rt6kj7o1_400.png",
+  "http://25.media.tumblr.com/tumblr_m21hprOGO71rt6kj7o1_1280.png",
+  "http://24.media.tumblr.com/tumblr_m21gc84uY21rt6kj7o1_1280.png"
+]
+
+module.exports = (robot) ->
+  robot.hear /gorby|puff|thunderhorse/i, (msg) ->
+    msg.send msg.random gorbies
+


nouvelles questions

nouvelles questions

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/LucasAdam/hubot-trivia-game-french.git/'


Grunt: update template path

Grunt: update template path

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Aprila/laboratory.git/'


Be more explicit in Gruntfile.

Be more explicit in Gruntfile.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/dhabersack/respaintive.git/'


http redirect for bot HTTP homepage

http redirect for bot HTTP homepage

error: pathspec 'scripts/scopyleft-http.coffee' did not match any file(s) known to git

--- scripts/scopyleft-http.coffee
+++ scripts/scopyleft-http.coffee
@@ -0,0 +1,5 @@
+module.exports = (robot) ->
+  robot.router.get "/", (req, res) ->
+    res.statusCode = 302 # we never know
+    res.setHeader 'Location', 'http://scopyleft.fr/'
+    res.end('Redirecting to http://scopyleft.fr/');


Revert "Removed view file"

Revert "Removed view file"

This reverts commit fddc7969a7db907241e0e12e9089943ca716d4e1.

error: pathspec 'lib/bookmarklet-view.coffee' did not match any file(s) known to git

--- lib/bookmarklet-view.coffee
+++ lib/bookmarklet-view.coffee
@@ -0,0 +1,24 @@
+{View} = require 'atom'
+
+module.exports =
+class BookmarkletView extends View
+  @content: ->
+    @div class: 'bookmarklet overlay from-top', =>
+      @div "The Bookmarklet package is Alive! It's ALIVE!", class: "message"
+
+  initialize: (serializeState) ->
+    atom.workspaceView.command "bookmarklet:toggle", => @toggle()
+
+  # Returns an object that can be retrieved when package is activated
+  serialize: ->
+
+  # Tear down any state and detach
+  destroy: ->
+    @detach()
+
+  toggle: ->
+    console.log "BookmarkletView was toggled!"
+    if @hasParent()
+      @detach()
+    else
+      atom.workspaceView.append(this)


MIL-291: When form is submitted, force all valid inputs to $pristine

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/crdschurch/crds-angular-ajax-form.git/'


Fixed archive creation issue

Fixed archive creation issue

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


Create validator.coffee

Create validator.coffee

error: pathspec 'validator.coffee' did not match any file(s) known to git

--- validator.coffee
+++ validator.coffee
@@ -0,0 +1,155 @@
+Validator = {}
+Validator.validators = {}
+Validator.messages = {}
+Validator.messageHandlers = {}
+
+Validator.cfg =
+	ignore: ':hidden'
+
+
+Validator.validate = (id) ->
+	$form = $ '#' + id
+	throw 'should be form' unless $form[0].nodeName.toLowerCase() is 'form'
+
+	elements = $form .data "_#{id}_"
+	if not elements
+		elements = $form
+			.find 'input, textarea, select'
+			.not ':submit, :reset, :image, [disabled]'
+			.not @cfg.ignore
+		$form .data "_#{id}_", elements
+
+	pass = yes
+	for elem in elements
+		type = elem.nodeName.toLowerCase()
+		$elem = $ elem
+		# @validateElement $elem, type
+		pass = no if not @validateElement $elem, type
+	return pass
+
+Validator.validateElement = (elem, type) ->
+	type = 'input' if type is 'textarea'
+	pass = Validator[type].call(this, elem)
+	return pass
+
+Validator.input = (elem) ->
+	pass = yes
+	if @checkable elem
+		pass = @check elem
+	else
+		val = elem.val()
+		for rule, validator of @validators when elem.is '['+rule+']'
+			if not (pass = validator.call this, val, elem)
+				@tip rule, elem
+				break
+	return pass
+
+
+Validator.select = (elem) ->
+	pass = !!elem.val()
+	elem.css 'color', 'red' if not pass
+	elem.one 'change', ->
+		$(this) .css 'color', ''
+	return pass
+
+# OPTIMIZE: should be better
+Validator.check = (elem) ->
+	pass = yes
+	name = elem[0].name
+	form = elem[0].form
+	$group = $(form).find "[name=#{name}]"
+	elem0 = $($group[0])
+	if elem0.is '[required]'
+		checkedCount = $group.filter(':checked').length
+		pass = checkedCount > 0
+
+		if not pass then @messageHandlers.check.call this, ' ', elem
+
+	return pass
+
+
+Validator.tip = (rule, elem) ->
+	messageHandler = if rule of @messageHandlers then rule else 'defaults'
+	message = if rule of @messages then rule else 'defaults'
+	@messageHandlers[messageHandler].call this, (@messages[message].call this, elem), elem
+
+
+Validator.isOptional = (val, elem) ->
+	it_is_optional = if elem.is '[required]' then @validators.required.call this, val, elem else val.length
+	return not it_is_optional
+
+Validator.checkable = (elem) ->
+	/radio|checkbox/i.test elem.attr('type')
+
+
+$.extend Validator.validators, {
+	required: (val, elem) ->
+		!!val
+
+	max: (val, elem) ->
+		max = elem.attr 'max'
+		@isOptional(val, elem) or val.length <= max
+		# val.length <= max unless @isOptional(val, elem)
+
+	min: (val, elem) ->
+		min = elem.attr 'min'
+		@isOptional(val, elem) or val.length >= min
+		# val.length >= min unless @isOptional(val, elem)
+
+	regexp: (val, elem) ->
+		reStr = elem.attr 'regexp'
+		re = new RegExp reStr
+		@isOptional(val, elem) or re.test val
+		# re.test val unless @isOptional(val, elem)
+
+	hidden: (val, elem) ->
+		!!val
+}
+
+
+$.extend Validator.messageHandlers, {
+	defaults: (msg, elem) ->
+		elem.css('color', 'red').val(msg).one 'focus', ->
+			$(this) .val('') .css 'color', ''
+
+	hidden: (msg, elem) ->
+		console.log "#{elem.attr 'name'} say: i am hidden input but i am required"
+
+	check: (msg, elem) ->
+		console.log "#{elem.attr 'name'} say: i am required"
+
+}
+
+
+$.extend Validator.messages, {
+	defaults: (elem) ->
+		msg = elem.attr 'data-msg'
+		msg ?= '总感觉哪里不对-_-'
+
+	required: (elem) ->
+		msg = elem.attr 'data-msg'
+		msg ?= '必填'
+
+	min: (elem) ->
+		min = elem.attr 'min'
+		msg = elem.attr 'data-msg'
+		msg ?= "不能小于#{min}个字符"
+
+	max: (elem) ->
+		max = elem.attr 'max'
+		msg = elem.attr 'data-msg'
+		msg ?= "不能大于#{max}个字符"
+
+	regexp: (elem) ->
+		msg = elem.attr 'data-msg'
+		msg ?= '格式错误'
+
+}
+
+# exports as global object
+@Validator or= Validator
+
+# exports as jQuery plupin
+$.fn.validate = ->
+	id = @attr 'id'
+	Validator.validate id


Add the getArchives function to preload archives

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/GregDesplaces/classe-1914.git/'


Wire it all up

Wire it all up

error: pathspec 'index.coffee' did not match any file(s) known to git

--- index.coffee
+++ index.coffee
@@ -0,0 +1,36 @@
+surveyor = require './lib/surveyor.coffee'
+websocket = require './lib/websocket.coffee'
+webserver = require './lib/webserver.coffee'
+webserver.listen 4001
+util = require './lib/util.coffee'
+
+lock = false
+check = ->
+  return if lock
+  lock = true
+  surveyor.getManifest (err) ->
+    console.error err if err?
+    throw new Error err if err?
+    surveyor.buildRequired ->
+      surveyor.spawnMissing (err, procs) ->
+        lock = false
+        return console.error err if err?
+        console.log "spawned", procs if Object.keys(procs).length isnt 0
+
+currentRoutingTable = ""
+route = ->
+  surveyor.calculateRoutingTable (err, table) ->
+    return console.error err if err?
+    hash = util.hashObj(table)
+    if hash isnt currentRoutingTable
+      surveyor.propagateRoutingTable table, (errs) ->
+        currentRoutingTable = hash unless errs?
+        console.error errs if err?
+
+setInterval ->
+  check()
+, 3000
+
+setInterval ->
+  route()
+, 3001


Check in a primitive stub for the kernel

error: pathspec 'library/gearing/kernel.coffee' did not match any file(s) known to git

--- library/gearing/kernel.coffee
+++ library/gearing/kernel.coffee
@@ -0,0 +1,52 @@
+###
+Copyright (c) 2013, Alexander Cherniuk <ts33kr@gmail.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###
+
+_ = require "lodash"
+connect = require "connect"
+logger = require "winston"
+events = require "events"
+colors = require "colors"
+util = require "util"
+
+# This is a primary gateway interface for the framework. This class
+# provides methods and routines necessary to bootstrap the framework
+# and the end user application constructed within the framework. It
+# is both an abstract base class as well as a ready to use bootstrap.
+# Please refer to the documentation of the methods for more info.
+module.exports.Kernel = class Kernel extends events.EventEmitter
+
+    # Setup the Connect middleware framework along with the default
+    # pipeline of middlewares necessary for the Flames framework to
+    # operate correctly. You are encouraged to override this method
+    # to provide a Connect setup procedure to your own liking, etc.
+    setupConnectPipeline: (middlewares...) ->
+        @connect = connect()
+        connect.use(connect.query())
+        connect.use(connect.favicon())
+        connect.use(connect.bodyParser())
+        connect.use(connect.errorHandler())
+        connect.use(connect.cookieParser())
+        connect.use(@router.connectMiddleware)
+        connect.use m for m in middlewares


animal crossing fish puns.

animal crossing fish puns.

Converted from http://www.adiumxtras.com/index.php?a=xtras&xtra_id=571

error: pathspec 'src/fishpun.coffee' did not match any file(s) known to git

--- src/fishpun.coffee
+++ src/fishpun.coffee
@@ -0,0 +1,49 @@
+# Horrible Animal Crossing fish puns
+#
+# fishpun - Get fishy.
+#
+module.exports = (robot) ->
+  robot.hear /^fishpun$/i, (msg) ->
+    quotes = [
+      "I caught an angelfish! It looks divine!",
+      "I caught an arapaima! This thing is huge!",
+      "I caught an arowana! It's the golden dragon fish! I wonder what it's worth...",
+      "I caught a barbel steed! That's funny...It looks more like a fish than a horse.",
+      "I caught a barred knifejaw! I'm really cut-up over how to turn this into a pun...",
+      "I caught a bass! If I can catch a drummer, maybe I'll form a band!",
+      "I caught a bitterling! I wonder what makes this little guy so angry...",
+      "I caught a bluegill! Don't worry I caught the rest of the fish, too!",
+      "I caught a brook trout! I guess that little guy's just trOUT of luck!",
+      "I caught a carp! Ouch! I hurt my wrist! It might be CARPal-tunnel!",
+      "I caught a catfish! I think I'll name it Whiskers...",
+      "I caught a cherry salmon! It looks so PITiful! Get it? Pit? Oh, never mind.",
+      "I caught a coelacanth! Would you look at that! A living fossil. I didn't know they truly existed.",
+      "I caught a crawfish! Check out those pincers!",
+      "I caught a crucian carp! Carpe diem!",
+      "I caught a dace! Daces wild!",
+      "I caught an eel! I've been told they're rEELy tough to catch (I'm sorry).",
+      "I caught a freshwater goby! Go me, goby!",
+      "I caught a frog! Think I should kiss it? (Ew...it's all warty!)",
+      "I caught a giant catfish! (That's because I used a giant mousefish as bait!)",
+      "I caught a giant snakehead! Yep! A giant snakehead. Who names these things?",
+      "I caught a goldfish! It's worth its weight in...fish. Great.",
+      "I caught a guppy! He ate an awful lot of bait for being so tiny!",
+      "I caught a jellyfish! I wonder how it would taste on some toast...",
+      "I caught a killifish! Killer!",
+      "I caught a koi! Whoever colored it did a real good job.",
+      "I caught a large bass! Well, it's pretty big...I guess...",
+      "I caught a large char! I wonder what it tastes like CHAR-broiled...",
+      "I caught a loach! You don't suppose it's Hylian, do you?",
+      "I caught a pale chub! Looks like it could use a little sun...and a little diet",
+      "I caught a piranha! Which river is this, anyway? I'm glad I didn't take a dip!",
+      "I caught a pond smelt! Whew! And I thought the POND smelt bad!",
+      "I caught a popeyed goldfish! Aw, look... He wants his spinach...",
+      "I caught a rainbow trout! Now that's a trout of a different color!",
+      "I caught a red snapper! That was a snap! (I really have to stop saying things like that.)",
+      "I caught a salmon! And it made it all the way back here! Now i feel bad.",
+      "I caught a sea bass! See? Bass! (Why do I keep saying things like that?)",
+      "I caught a small bass! Now, I just need to catch a small bass amp. (Oh, that was terrible...)",
+      "I caught a stringfish! Ohhh, boy! I hooked a stringfish! I was just stringing it along...",
+      "I caught a sweetfish! And let me tell you, that is one SWEET fish!"
+    ]
+    msg.send msg.random quotes


Don't load npm packages in release version.

--- src/helpers.coffee
+++ src/helpers.coffee
@@ -366,6 +366,7 @@
     callback {components, aliases, order}

 loadNpm = (config, cb) ->
+  return cb(components: []) unless global.isDevBrunch
   {paths} = config
   rootPath = sysPath.resolve paths.root
   jsonPath = sysPath.join(rootPath, paths.packageConfig)


Simplified logic for publication, based on changes from migration v20.

--- server/publications/roomFiles.coffee
+++ server/publications/roomFiles.coffee
@@ -4,26 +4,10 @@

   console.log '[publish] roomFiles'.green, rid

-  # list of channel messages which were created after uploading a file
-  msgQuery =
-    rid: rid
-    'file._id': { $exists: true }
-  msgOptions =
-    fields:
-      _id: 1
-      'file._id': 1
-    limit: 50
-  cursorFileMessages = RocketChat.models.Messages.find(msgQuery, msgOptions);
-  uploadedFilesMessages = cursorFileMessages.fetch()
-  unless uploadedFilesMessages
-    return this.ready()
-
-  uploadIdList = _.map(uploadedFilesMessages, (doc) -> return doc?.file?._id)
-  unless uploadIdList
-    return this.ready()
+  pub = this

   fileQuery =
-    _id: { $in : uploadIdList }
+    rid: rid
     complete: true
     uploading: false

@@ -34,26 +18,10 @@
       type: 1
       url: 1

-  cursorFileList = fileCollection.find(fileQuery, fileOptions)
-
-  # observe whether a new file was sent to the room and notifies subscribers
-  pub = this
-  cursorFileMessagesHandle = cursorFileMessages.observeChanges
+  cursorFileListHandle = fileCollection.find(fileQuery, fileOptions).observeChanges
     added: (_id, record) ->
-      unless record?.file?._id
-        return pub.ready()
-
-      data = fileCollection.findOne({ _id: record.file._id }, fileOptions)
-
-      data.rid = rid
-      pub.added('room_files', record.file._id, data)
-
-  cursorFileListHandle = cursorFileList.observeChanges
-    added: (_id, record) ->
-      record.rid = rid
       pub.added('room_files', _id, record)

   this.ready()
   this.onStop ->
     cursorFileListHandle.stop()
-    cursorFileMessagesHandle.stop()


first cut random - needs collision detecting

error: pathspec 'src/woodentrack.random.coffee' did not match any file(s) known to git

--- src/woodentrack.random.coffee
+++ src/woodentrack.random.coffee
@@ -0,0 +1,39 @@
+###
+Ideas for random:
+builder can randomly select next piece or what connection to add it to
+constraints can be based on boundary, mix of pieces and number of allowed loose connections
+1. completely random. unbounded
+1a. completely random but with weights for occurance of pieces.
+2. completely random. bounded by box. pieces cannot be added that break the boundary.  start in middle of box.
+2a. completely random. bounded by box. pieces can break boundary but after each iteration remove section if boundary broken.
+###
+
+addRandom = (track, num, transform = new Transform(100,100,0)) ->
+	[1..num].forEach ->
+		# which new piece
+		type = Math.floor(Math.random()*6)
+		flip = 2*Math.floor(Math.random()*2)-1
+		switch type
+			when 0
+				piece = new Straight
+			when 1
+				piece = new Bend { flip : flip }
+			when 2
+				piece = new Split { flip : flip }
+			when 3
+				piece = new Merge { flip : flip }
+			when 4
+				piece = new Join { flip : flip }
+			when 5
+				piece = new Crossover { flip : flip }
+		# which connection
+		connections = track.connections()
+		if connections.length==0
+			track.add piece, transform
+		else
+			connection = connections[Math.floor(Math.random()*connections.length)]
+			console.log piece, connection
+			track.connect piece, connection
+
+root = exports ? window
+root.addRandom = addRandom


add pull request API

add pull request API

--- src/octokat.coffee
+++ src/octokat.coffee
@@ -133,8 +133,8 @@
           | commits / [a-f0-9]{40} / comments
           | contents (/[^/]+)* # The path is allowed in the URL
           | collaborators (/[^/]+)?
-          | issues
-          | issues/ (
+          | (issues|pulls)
+          | (issues|pulls) / (
               | events
               | events/ [0-9]+
               | comments (/[0-9]+)?
@@ -142,7 +142,10 @@
               | [0-9]+ /events
               | [0-9]+ /comments
               )
-
+          | pulls/ [0-9]+ / (
+                files
+              | commits
+              )
           | git/ (
                 refs
               | refs / heads (/[^/]+)?
@@ -234,6 +237,11 @@
       'releases'      : false
       'events'        : false
       'merges'        : false
+      'pulls':
+        'merge'       : false
+        'comments'    : false
+        'commits'     : false
+        'files'       : false
       'pages':
         'builds':
           'latest'    : false


add title and useLongTable options that get passed to toLatexTable

--- queries/individual/performance.coffee
+++ queries/individual/performance.coffee
@@ -17,6 +17,7 @@
       conditions: []
       stat: "lines"
       sort: "desc"
+      title_part: "Most Lines"
     }

   ]
@@ -64,7 +65,6 @@
       m = Math.floor value/60
       s = value % 60
       return m + ":" + _.lpad s, 2, "0"
-
   }
   {
     title: "Win Rank"
@@ -104,7 +104,6 @@
   from = "FROM playermatch p, tntmatch t"
   where = "WHERE t.matchid = p.matchid"
   limit = "LIMIT #{opts.limit}"
-

   async.forEachSeries reports, (report, report_cb) ->

@@ -126,9 +125,13 @@

       # ties logic, # records, second order calculations

+      title = report.title_part + ", " + opts.caption
+
       tableText = toLatexTable
         data: rows
         columns: activeColumns
+        useLongTable: false
+        title: title

       # row outfile
       outFile = opts.outfile_path + "/" + report.file + ".tex"


Added an initial benchmark script, but the numbers look funny to me

error: pathspec 'test/wordnet_benchmark.coffee' did not match any file(s) known to git

--- test/wordnet_benchmark.coffee
+++ test/wordnet_benchmark.coffee
@@ -0,0 +1,357 @@
+NanoTimer = require('nanotimer')
+async = require('async')
+
+Wordnet = require('../lib/wordnet')
+wordnet = new Wordnet()
+
+testText = """
+Emma Woodhouse, handsome, clever, and rich, with a comfortable home
+and happy disposition, seemed to unite some of the best blessings of
+existence; and had lived nearly twenty-one years in the world with very
+little to distress or vex her.
+
+She was the youngest of the two daughters of a most affectionate,
+indulgent father; and had, in consequence of her sister's marriage, been
+mistress of his house from a very early period. Her mother had died
+too long ago for her to have more than an indistinct remembrance of
+her caresses; and her place had been supplied by an excellent woman as
+governess, who had fallen little short of a mother in affection.
+
+Sixteen years had Miss Taylor been in Mr. Woodhouse's family, less as a
+governess than a friend, very fond of both daughters, but particularly
+of Emma. Between _them_ it was more the intimacy of sisters. Even before
+Miss Taylor had ceased to hold the nominal office of governess, the
+mildness of her temper had hardly allowed her to impose any restraint;
+and the shadow of authority being now long passed away, they had been
+living together as friend and friend very mutually attached, and Emma
+doing just what she liked; highly esteeming Miss Taylor's judgment, but
+directed chiefly by her own.
+
+The real evils, indeed, of Emma's situation were the power of having
+rather too much her own way, and a disposition to think a little too
+well of herself; these were the disadvantages which threatened alloy to
+her many enjoyments. The danger, however, was at present so unperceived,
+that they did not by any means rank as misfortunes with her.
+
+Sorrow came--a gentle sorrow--but not at all in the shape of any
+disagreeable consciousness.--Miss Taylor married. It was Miss Taylor's
+loss which first brought grief. It was on the wedding-day of this
+beloved friend that Emma first sat in mournful thought of any
+continuance. The wedding over, and the bride-people gone, her father and
+herself were left to dine together, with no prospect of a third to cheer
+a long evening. Her father composed himself to sleep after dinner, as
+usual, and she had then only to sit and think of what she had lost.
+
+The event had every promise of happiness for her friend. Mr. Weston
+was a man of unexceptionable character, easy fortune, suitable age, and
+pleasant manners; and there was some satisfaction in considering
+with what self-denying, generous friendship she had always wished and
+promoted the match; but it was a black morning's work for her. The want
+of Miss Taylor would be felt every hour of every day. She recalled her
+past kindness--the kindness, the affection of sixteen years--how she had
+taught and how she had played with her from five years old--how she had
+devoted all her powers to attach and amuse her in health--and how
+nursed her through the various illnesses of childhood. A large debt of
+gratitude was owing here; but the intercourse of the last seven
+years, the equal footing and perfect unreserve which had soon followed
+Isabella's marriage, on their being left to each other, was yet a
+dearer, tenderer recollection. She had been a friend and companion such
+as few possessed: intelligent, well-informed, useful, gentle, knowing
+all the ways of the family, interested in all its concerns, and
+peculiarly interested in herself, in every pleasure, every scheme of
+hers--one to whom she could speak every thought as it arose, and who had
+such an affection for her as could never find fault.
+
+How was she to bear the change?--It was true that her friend was going
+only half a mile from them; but Emma was aware that great must be the
+difference between a Mrs. Weston, only half a mile from them, and a Miss
+Taylor in the house; and with all her advantages, natural and domestic,
+she was now in great danger of suffering from intellectual solitude. She
+dearly loved her father, but he was no companion for her. He could not
+meet her in conversation, rational or playful.
+
+The evil of the actual disparity in their ages (and Mr. Woodhouse had
+not married early) was much increased by his constitution and habits;
+for having been a valetudinarian all his life, without activity of
+mind or body, he was a much older man in ways than in years; and though
+everywhere beloved for the friendliness of his heart and his amiable
+temper, his talents could not have recommended him at any time.
+
+Her sister, though comparatively but little removed by matrimony, being
+settled in London, only sixteen miles off, was much beyond her daily
+reach; and many a long October and November evening must be struggled
+through at Hartfield, before Christmas brought the next visit from
+Isabella and her husband, and their little children, to fill the house,
+and give her pleasant society again.
+
+Highbury, the large and populous village, almost amounting to a town,
+to which Hartfield, in spite of its separate lawn, and shrubberies, and
+name, did really belong, afforded her no equals. The Woodhouses
+were first in consequence there. All looked up to them. She had many
+acquaintance in the place, for her father was universally civil, but
+not one among them who could be accepted in lieu of Miss Taylor for even
+half a day. It was a melancholy change; and Emma could not but sigh over
+it, and wish for impossible things, till her father awoke, and made it
+necessary to be cheerful. His spirits required support. He was a nervous
+man, easily depressed; fond of every body that he was used to, and
+hating to part with them; hating change of every kind. Matrimony, as the
+origin of change, was always disagreeable; and he was by no means yet
+reconciled to his own daughter's marrying, nor could ever speak of her
+but with compassion, though it had been entirely a match of affection,
+when he was now obliged to part with Miss Taylor too; and from his
+habits of gentle selfishness, and of being never able to suppose that
+other people could feel differently from himself, he was very much
+disposed to think Miss Taylor had done as sad a thing for herself as for
+them, and would have been a great deal happier if she had spent all the
+rest of her life at Hartfield. Emma smiled and chatted as cheerfully
+as she could, to keep him from such thoughts; but when tea came, it was
+impossible for him not to say exactly as he had said at dinner,
+
+"Poor Miss Taylor!--I wish she were here again. What a pity it is that
+Mr. Weston ever thought of her!"
+
+"I cannot agree with you, papa; you know I cannot. Mr. Weston is such
+a good-humoured, pleasant, excellent man, that he thoroughly deserves
+a good wife;--and you would not have had Miss Taylor live with us for
+ever, and bear all my odd humours, when she might have a house of her
+own?"
+
+"A house of her own!--But where is the advantage of a house of her own?
+This is three times as large.--And you have never any odd humours, my
+dear."
+
+"How often we shall be going to see them, and they coming to see us!--We
+shall be always meeting! _We_ must begin; we must go and pay wedding
+visit very soon."
+
+"My dear, how am I to get so far? Randalls is such a distance. I could
+not walk half so far."
+
+"No, papa, nobody thought of your walking. We must go in the carriage,
+to be sure."
+
+"The carriage! But James will not like to put the horses to for such a
+little way;--and where are the poor horses to be while we are paying our
+visit?"
+
+"They are to be put into Mr. Weston's stable, papa. You know we have
+settled all that already. We talked it all over with Mr. Weston last
+night. And as for James, you may be very sure he will always like going
+to Randalls, because of his daughter's being housemaid there. I only
+doubt whether he will ever take us anywhere else. That was your doing,
+papa. You got Hannah that good place. Nobody thought of Hannah till you
+mentioned her--James is so obliged to you!"
+
+"I am very glad I did think of her. It was very lucky, for I would not
+have had poor James think himself slighted upon any account; and I am
+sure she will make a very good servant: she is a civil, pretty-spoken
+girl; I have a great opinion of her. Whenever I see her, she always
+curtseys and asks me how I do, in a very pretty manner; and when you
+have had her here to do needlework, I observe she always turns the lock
+of the door the right way and never bangs it. I am sure she will be an
+excellent servant; and it will be a great comfort to poor Miss Taylor
+to have somebody about her that she is used to see. Whenever James goes
+over to see his daughter, you know, she will be hearing of us. He will
+be able to tell her how we all are."
+
+Emma spared no exertions to maintain this happier flow of ideas, and
+hoped, by the help of backgammon, to get her father tolerably
+through the evening, and be attacked by no regrets but her own. The
+backgammon-table was placed; but a visitor immediately afterwards walked
+in and made it unnecessary.
+
+Mr. Knightley, a sensible man about seven or eight-and-thirty, was not
+only a very old and intimate friend of the family, but particularly
+connected with it, as the elder brother of Isabella's husband. He lived
+about a mile from Highbury, was a frequent visitor, and always welcome,
+and at this time more welcome than usual, as coming directly from their
+mutual connexions in London. He had returned to a late dinner, after
+some days' absence, and now walked up to Hartfield to say that all were
+well in Brunswick Square. It was a happy circumstance, and animated
+Mr. Woodhouse for some time. Mr. Knightley had a cheerful manner, which
+always did him good; and his many inquiries after "poor Isabella" and
+her children were answered most satisfactorily. When this was over, Mr.
+Woodhouse gratefully observed, "It is very kind of you, Mr. Knightley,
+to come out at this late hour to call upon us. I am afraid you must have
+had a shocking walk."
+
+"Not at all, sir. It is a beautiful moonlight night; and so mild that I
+must draw back from your great fire."
+
+"But you must have found it very damp and dirty. I wish you may not
+catch cold."
+
+"Dirty, sir! Look at my shoes. Not a speck on them."
+
+"Well! that is quite surprising, for we have had a vast deal of rain
+here. It rained dreadfully hard for half an hour while we were at
+breakfast. I wanted them to put off the wedding."
+
+"By the bye--I have not wished you joy. Being pretty well aware of what
+sort of joy you must both be feeling, I have been in no hurry with my
+congratulations; but I hope it all went off tolerably well. How did you
+all behave? Who cried most?"
+
+"Ah! poor Miss Taylor! 'Tis a sad business."
+
+"Poor Mr. and Miss Woodhouse, if you please; but I cannot possibly say
+'poor Miss Taylor.' I have a great regard for you and Emma; but when it
+comes to the question of dependence or independence!--At any rate, it
+must be better to have only one to please than two."
+
+"Especially when _one_ of those two is such a fanciful, troublesome
+creature!" said Emma playfully. "That is what you have in your head, I
+know--and what you would certainly say if my father were not by."
+
+"I believe it is very true, my dear, indeed," said Mr. Woodhouse, with a
+sigh. "I am afraid I am sometimes very fanciful and troublesome."
+
+"My dearest papa! You do not think I could mean _you_, or suppose Mr.
+Knightley to mean _you_. What a horrible idea! Oh no! I meant only
+myself. Mr. Knightley loves to find fault with me, you know--in a
+joke--it is all a joke. We always say what we like to one another."
+
+Mr. Knightley, in fact, was one of the few people who could see faults
+in Emma Woodhouse, and the only one who ever told her of them: and
+though this was not particularly agreeable to Emma herself, she knew
+it would be so much less so to her father, that she would not have him
+really suspect such a circumstance as her not being thought perfect by
+every body.
+
+"Emma knows I never flatter her," said Mr. Knightley, "but I meant no
+reflection on any body. Miss Taylor has been used to have two persons
+to please; she will now have but one. The chances are that she must be a
+gainer."
+
+"Well," said Emma, willing to let it pass--"you want to hear about
+the wedding; and I shall be happy to tell you, for we all behaved
+charmingly. Every body was punctual, every body in their best looks: not
+a tear, and hardly a long face to be seen. Oh no; we all felt that we
+were going to be only half a mile apart, and were sure of meeting every
+day."
+
+"Dear Emma bears every thing so well," said her father. "But, Mr.
+Knightley, she is really very sorry to lose poor Miss Taylor, and I am
+sure she _will_ miss her more than she thinks for."
+
+Emma turned away her head, divided between tears and smiles. "It
+is impossible that Emma should not miss such a companion," said Mr.
+Knightley. "We should not like her so well as we do, sir, if we could
+suppose it; but she knows how much the marriage is to Miss Taylor's
+advantage; she knows how very acceptable it must be, at Miss Taylor's
+time of life, to be settled in a home of her own, and how important to
+her to be secure of a comfortable provision, and therefore cannot allow
+herself to feel so much pain as pleasure. Every friend of Miss Taylor
+must be glad to have her so happily married."
+
+"And you have forgotten one matter of joy to me," said Emma, "and a very
+considerable one--that I made the match myself. I made the match, you
+know, four years ago; and to have it take place, and be proved in the
+right, when so many people said Mr. Weston would never marry again, may
+comfort me for any thing."
+
+Mr. Knightley shook his head at her. Her father fondly replied, "Ah!
+my dear, I wish you would not make matches and foretell things, for
+whatever you say always comes to pass. Pray do not make any more
+matches."
+
+"I promise you to make none for myself, papa; but I must, indeed, for
+other people. It is the greatest amusement in the world! And after such
+success, you know!--Every body said that Mr. Weston would never marry
+again. Oh dear, no! Mr. Weston, who had been a widower so long, and who
+seemed so perfectly comfortable without a wife, so constantly occupied
+either in his business in town or among his friends here, always
+acceptable wherever he went, always cheerful--Mr. Weston need not spend
+a single evening in the year alone if he did not like it. Oh no! Mr.
+Weston certainly would never marry again. Some people even talked of a
+promise to his wife on her deathbed, and others of the son and the
+uncle not letting him. All manner of solemn nonsense was talked on the
+subject, but I believed none of it.
+
+"Ever since the day--about four years ago--that Miss Taylor and I met
+with him in Broadway Lane, when, because it began to drizzle, he darted
+away with so much gallantry, and borrowed two umbrellas for us from
+Farmer Mitchell's, I made up my mind on the subject. I planned the match
+from that hour; and when such success has blessed me in this instance,
+dear papa, you cannot think that I shall leave off match-making."
+
+"I do not understand what you mean by 'success,'" said Mr. Knightley.
+"Success supposes endeavour. Your time has been properly and delicately
+spent, if you have been endeavouring for the last four years to bring
+about this marriage. A worthy employment for a young lady's mind! But
+if, which I rather imagine, your making the match, as you call it, means
+only your planning it, your saying to yourself one idle day, 'I think it
+would be a very good thing for Miss Taylor if Mr. Weston were to marry
+her,' and saying it again to yourself every now and then afterwards, why
+do you talk of success? Where is your merit? What are you proud of? You
+made a lucky guess; and _that_ is all that can be said."
+
+"And have you never known the pleasure and triumph of a lucky guess?--I
+pity you.--I thought you cleverer--for, depend upon it a lucky guess is
+never merely luck. There is always some talent in it. And as to my
+poor word 'success,' which you quarrel with, I do not know that I am so
+entirely without any claim to it. You have drawn two pretty pictures;
+but I think there may be a third--a something between the do-nothing and
+the do-all. If I had not promoted Mr. Weston's visits here, and given
+many little encouragements, and smoothed many little matters, it might
+not have come to any thing after all. I think you must know Hartfield
+enough to comprehend that."
+
+"A straightforward, open-hearted man like Weston, and a rational,
+unaffected woman like Miss Taylor, may be safely left to manage their
+own concerns. You are more likely to have done harm to yourself, than
+good to them, by interference."
+
+"Emma never thinks of herself, if she can do good to others," rejoined
+Mr. Woodhouse, understanding but in part. "But, my dear, pray do not
+make any more matches; they are silly things, and break up one's family
+circle grievously."
+
+"Only one more, papa; only for Mr. Elton. Poor Mr. Elton! You like Mr.
+Elton, papa,--I must look about for a wife for him. There is nobody in
+Highbury who deserves him--and he has been here a whole year, and has
+fitted up his house so comfortably, that it would be a shame to have him
+single any longer--and I thought when he was joining their hands to-day,
+he looked so very much as if he would like to have the same kind office
+done for him! I think very well of Mr. Elton, and this is the only way I
+have of doing him a service."
+
+"Mr. Elton is a very pretty young man, to be sure, and a very good young
+man, and I have a great regard for him. But if you want to shew him any
+attention, my dear, ask him to come and dine with us some day. That will
+be a much better thing. I dare say Mr. Knightley will be so kind as to
+meet him."
+
+"With a great deal of pleasure, sir, at any time," said Mr. Knightley,
+laughing, "and I agree with you entirely, that it will be a much better
+thing. Invite him to dinner, Emma, and help him to the best of the fish
+and the chicken, but leave him to chuse his own wife. Depend upon it, a
+man of six or seven-and-twenty can take care of himself."
+"""
+
+string = testText
+string = string.replace /\n/, ' '
+tokens = []
+count = 0
+
+matcher = /\w+/g
+while match = matcher.exec(string)
+  tokens.push match[0]
+
+timer = new NanoTimer()
+
+testTokens = (tokens, callback) ->
+  lookup = (token, done) ->
+    wordnet.lookup token, (err, result) -> done(err)
+  async.each tokens, lookup, callback
+
+testFunction = (tokens, callback) ->
+  itemFn = (item, done) ->
+    count = count + 1
+    testTokens tokens.slice(), done
+  async.each [1..1000], itemFn, () ->
+    callback()
+
+console.log "Starting run"
+timer.time testFunction, [tokens], 'u', (time) ->
+  console.log("It took " + time + " microseconds to process #{tokens.length} tokens #{count} times")


[FIX] Do not try to remove <select> option if no <select> is defined

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/saijim/Multipleter.git/'


Wrote tests for the check JSON function

Wrote tests for the check JSON function

error: pathspec 'test/utils.test.coffee' did not match any file(s) known to git

--- test/utils.test.coffee
+++ test/utils.test.coffee
@@ -0,0 +1,24 @@
+expect = require('chai').expect
+
+process.env.NODE_ENV = 'test'
+
+streamTweets = require '../index'
+
+
+describe 'Check the private utility methods of the module', ()->
+
+  it 'Should be able to check is a string is valid JSON or not', ()->
+    isStrValidJson = streamTweets._private.isStrValidJson
+
+    expect(isStrValidJson("{}")).equal(true)
+    expect(isStrValidJson('[]')).equal(true)
+    expect(isStrValidJson('{"hello": "World"}')).equal(true)
+    expect(isStrValidJson('{"meaning_of_life": 42}')).equal(true)
+    expect(isStrValidJson('{"created_at":"Sat Sep 12 22:47:42 +0000 2015","id":642831981466652672,"id_str":"642831981466652672"}')).equal(true)
+
+    expect(isStrValidJson('')).equal(false)
+    expect(isStrValidJson('{hello}')).equal(false)
+    expect(isStrValidJson('{"hello":"world')).equal(false)
+    expect(isStrValidJson('{"dinosaurs":"are":"awesome"')).equal(false)
+
+


Client: Activity: Removed 'Notification Settings' menu item from private messages

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Starting the markdown editor.

Starting the markdown editor.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bmedx/modulestore.git/'


undefined test

undefined test

error: pathspec 'tests/undefined.coffee' did not match any file(s) known to git

--- tests/undefined.coffee
+++ tests/undefined.coffee
@@ -0,0 +1,14 @@
+
+describe "Undefined values behavior", () ->
+
+    el = document.createElement 'div'
+    $(el).append ''
+    data =
+        age: 22
+
+    beforeEach () ->
+        Smooth.render el, data
+
+    it "should remove the whole span", () ->
+        expect $(el).find '#s1'
+            .not.to.exist


Create sk.js.coffee

Create sk.js.coffee

Creating file for Slovak localisation.

error: pathspec 'app/assets/javascripts/uploadcare/locale/sk.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/uploadcare/locale/sk.js.coffee
+++ app/assets/javascripts/uploadcare/locale/sk.js.coffee
@@ -0,0 +1,150 @@
+##
+## Please, do not use this locale as a reference for new translations.
+## It could be outdated or incomplete. Always use the latest English versions:
+## https://github.com/uploadcare/uploadcare-widget/blob/master/app/assets/javascripts/uploadcare/locale/en.js.coffee
+##
+## Any fixes are welcome.
+##
+
+uploadcare.namespace 'locale.translations', (ns) ->
+  ns.sk =
+    uploading: 'Nahrávam... Prosím počkajte.'
+    loadingInfo: 'Nahrávam informácie...'
+    errors:
+      default: 'Chyba'
+      baddata: 'Nesprávna hodnota'
+      size: 'Súbor je príliš veľký'
+      upload: 'Nedá sa nahrať'
+      user: 'Nahrávanie bolo zrušené'
+      info: 'Informácie sa nedajú nahrať'
+      image: 'Povolené sú len obrázky'
+      createGroup: 'Nie je možné vytvoriť priečinok'
+      deleted: 'Súbor bol odstránený'
+    draghere: 'Sem presuňte súbor'
+    file:
+      one: '%1 súbor'
+      few: '%1 súbory'
+      other: '%1 súborov'
+    buttons:
+      cancel: 'Zrušiť'
+      remove: 'Odstrániť'
+      choose:
+        files:
+          one: 'Vyberte súbor'
+          other: 'Vyberte súbory'
+        images:
+          one: 'Vyberte obrázok'
+          other: 'Vyberte obrázky'
+    dialog:
+      close: 'Zavrieť'
+      openMenu: 'Otvoriť menu'
+      done: 'Hotovo'
+      showFiles: 'Ukázať súbory'
+      tabs:
+        names:
+          'empty-pubkey': 'Vitajte'
+          preview: 'Náhľad'
+          file: 'Z počítača'
+          url: 'Z internetu'
+          camera: 'Kamera'
+          facebook: 'Facebook'
+          dropbox: 'Dropbox'
+          gdrive: 'Disk Google'
+          gphotos: 'Google Obrázky'
+          instagram: 'Instagram'
+          vk: 'VK'
+          evernote: 'Evernote'
+          box: 'Box'
+          skydrive: 'OneDrive'
+          flickr: 'Flickr'
+          huddle: 'Huddle'
+        file:
+          drag: 'presuňte a vložte
akékoľvek súbory'
+          nodrop: 'Nahrajte súbory z vášho počítača'
+          cloudsTip: 'Cloud úložiská
a sociálne siete'
+          or: 'alebo'
+          button: 'Vyberte súbor z počítača'
+          also: 'alebo vyberte z'
+        url:
+          title: 'Súbory z internetu'
+          line1: 'Uložte akýkoľvek súbor z internetu.'
+          line2: 'Stačí pridať odkaz na neho.'
+          input: 'Vložte svoj odkaz sem...'
+          button: 'Nahrať'
+        camera:
+          title: 'Súbor z webkamery'
+          capture: 'Odfotiť'
+          mirror: 'Zrkadliť'
+          startRecord: 'Natočte video'
+          stopRecord: 'Prestať natáčať'
+          cancelRecord: 'Zrušiť'
+          retry: 'Znovu požiadať o prístup'
+          pleaseAllow:
+            title: 'Prosím povoľte prístup k vašej kamere'
+            text: 'Boli ste vyzvaní aby ste umožnili tejto stránke prístup ku kamere.
' +
+                  'Prístup musíte povolit aby ste mohli fotiť s vašou kamerou.'
+          notFound:
+            title: 'Kamera nebola nájdená'
+            text: 'Zdá sa, že k tomuto zariadeniu nemáte pripojenú kameru.'
+        preview:
+          unknownName: 'neznámy'
+          change: 'Zrušiť'
+          back: 'Späť'
+          done: 'Pridať'
+          unknown:
+            title: 'Nahráva sa... Prosím počkajte na náhľad.'
+            done: 'Preskočiť náhľad a nahrať'
+          regular:
+            title: 'Pridať tento súbor?'
+            line1: 'Chystáte sa pridať vyššie uvedený súbor.'
+            line2: 'Prosím potvrďte váš výber.'
+          image:
+            title: 'Pridať tento obrázok?'
+            change: 'Zrušiť'
+          crop:
+            title: 'Orezať a pridať túto fotku'
+            done: 'Hotovo'
+            free: 'obnoviť'
+          video:
+            title: 'Pridať toto video?'
+            change: 'Zrušiť'
+          error:
+            default:
+              title: 'Ejha!'
+              text: 'Pri nahrávaní sa vyskytla chyba.'
+              back: 'Skúste to znovu'
+            image:
+              title: 'Je možné nahrávať len obrázky'
+              text: 'Skúste to znovu s iným súborom.'
+              back: 'Vybrať obrázok'
+            size:
+              title: 'Súbor, ktorý ste vybrali presahuje povolenú veľkosť.'
+              text: 'Skúste to znovu s iným súborom.'
+            loadImage:
+              title: 'Chyba'
+              text: 'Obrázok nie je možné vyhľadať'
+          multiple:
+            title: 'Vybrali ste %files%.'
+            question: 'Pridať %files%?'
+            tooManyFiles: 'Vybrali ste príliš veľa súborov. Maximum je %max%.'
+            tooFewFiles: 'Vybrali ste %files%. Potrebných je aspoň %min%.'
+            clear: 'Odstrániť všetky'
+            done: 'Pridať'
+            file:
+              preview: 'Nahliadnuť %file%'
+              remove: 'Odstrániť %file%'
+      footer:
+        text: 'sprevádzkuje'
+        link: 'uploadcare'
+
+
+# Pluralization rules taken from:
+# http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+uploadcare.namespace 'locale.pluralize', (ns) ->
+  ns.sk = (n) ->
+    if n == 1
+      'one'
+    else if (2 <= n <= 4)
+      'few'
+    else
+      'many'


do not extend context passed to uploadcare.templates.tpl

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/prognostikos/uploadcare-widget.git/'


Drastically reduce the send email failure limit.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/philbooth/GitHubReminder.git/'