change phrasing of watch help text

change phrasing of watch help text

--- src/command.coffee
+++ src/command.coffee
@@ -30,7 +30,7 @@
   ['-i', '--interactive',     'run an interactive CoffeeScript REPL']
   ['-o', '--output [DIR]',    'set the directory for compiled JavaScript']
   ['-j', '--join [FILE]',     'concatenate the scripts before compiling']
-  ['-w', '--watch',           'watch scripts, and apply current command to any that change']
+  ['-w', '--watch',           'watch scripts, and repeat enabled task(s) for any that change']
   ['-p', '--print',           'print the compiled JavaScript to stdout']
   ['-l', '--lint',            'pipe the compiled JavaScript through JavaScript Lint']
   ['-s', '--stdio',           'listen for and compile scripts over stdio']


 Merge branch 'master.Lightweight.404Fixes' into 'master'

Server: Redirected develop to terminal, /w/members/username to /username

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/'


toggle sleep

toggle sleep

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/jencka/2001-A-SPACE-SACRIFICE.git/'


Adds modernizer checks

Adds modernizer checks

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

--- src/modernize.coffee
+++ src/modernize.coffee
@@ -0,0 +1,22 @@
+$.getScript('polyfills/flexie.js') if not Modernizr.flexbox
+
+if not Modernizr.input.required
+  $.getScript('polyfills/jquery.h5validate.js').done ->
+    $(document).ready ->
+      $('form').h5Validate()
+
+if not (Modernizr.input.placeholder and Modernizr.input.autofocus)
+  $.getScript('polyfills/jquery.html5support.js').done ->
+    $(document).ready ->
+      $.placeholder() if not Modernizr.input.placeholder
+      $.autofocus() if not Modernizr.input.autofocus
+
+
+if  not (Modernizr.csstransforms and Modernizr.csstransforms3d)
+  $.getScript('polyfills/transform/sylvester.js').done ->
+    $.getScript('polyfills/transform/transformie.js')
+
+if not Modernizr.testProp 'pointerEvents'
+  $.getScript('polyfills/pointer_events_polyfill.js').done ->
+    $(document).ready ->
+      PointerEventsPolyfill.initialize {}


credentials: add placeholder invisible recaptcha credentials

Signed-off-by: Umut Sirin <4055abbc0e40a1254e715b952ccd414607e0b365@gmail.com>

--- config/credentials.default.coffee
+++ config/credentials.default.coffee
@@ -158,6 +158,8 @@
   recaptcha =
     secret: ''
     public: ''
+    invisible_secret: ''
+    invisible_public: ''
   segment = ''
   kontrol =
     publicKey: '$KONFIG_PROJECTROOT/generated/private_keys/kontrol/kontrol.pub'


Webtermview: fix reconnection after getting `close` event from kite


client: add new cookie names

client: add new cookie names

--- client/app/lib/util/cleanup.coffee
+++ client/app/lib/util/cleanup.coffee
@@ -3,16 +3,62 @@

 toBeDeleted = [
   'clientIPAddress' # an old cookie set by koding backend.
+  'kdproxy-preferred-domain' # old koding cookie
   'connect.sid'     # express cookie - infact this is session cookie, here for just in case.
   'pnctest'         # set by PubNub for testing.
-  'hubspotutk'      # hubspot
-  'hsfirstvisit'    # hubspot
   '__ssid'          # google map
+  'gsScrollPos'     # session cookie, wont be cleaned, not necessary

-  # 'ajs_anonymous_id' # font?
-  # 'ajs_group_id'     # font?
-  # 'ajs_user_id'      # font?
   # 'koding-teams'     # set by koding client, should be moved to session storage.
+
+  # hubspot
+  '__hstc'
+  '__hssrc'
+  '__hssc'
+  'hsPagesViewedThisSession'
+  'hubspotutk'
+  'hubspot.hub.id'
+  'hsfirstvisit'
+  'hubspotauth'
+  'hubspotauthcms'
+  'hubspotauthremember'
+  'hubspotutktzo'
+  '_hs_opt_out'
+  '__hluid'
+
+  # kissmetrics
+  'km_ai'
+  'km_lv'
+  'km_ni'
+  'km_uq'
+  'km_vs'
+  'kvcd'
+
+  # font?
+  'ajs_anonymous_id'
+  'ajs_group_id'
+  'ajs_user_id'
+
+  # olark
+  'hblid'
+  'wcsid'
+  'olfsk'
+  '_okbk'
+  '_ok'
+  '_oklv'
+  '_okla'
+  '_okgid'
+  '_okac'
+  '_okck'
+
+  'olsfk'  # unknown origin
+  'hbild'  # unknown origin
+]
+
+startsWith = [
+  '_hp2_id'         # heap analytics - we dont use anymore.
+  '_hp2_ses_props'  # heap analytics - we dont use anymore.
+  '_ob_pub'  # unknow origin
 ]

 hostname = location.host


Hide Event details on outside click

Hide Event details on outside click

That took way too fucking long…

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/ESWAT/ottawa.git/'


Creates a new collection specific to this component with the correct comparator

error: pathspec 'components/connect_v2/collections/connectable_channels.coffee' did not match any file(s) known to git

--- components/connect_v2/collections/connectable_channels.coffee
+++ components/connect_v2/collections/connectable_channels.coffee
@@ -0,0 +1,8 @@
+ConnectionBlocks = require '../../../collections/connection_blocks.coffee'
+
+module.exports = class ConnectableChannels extends ConnectionBlocks
+  comparator: (model) ->
+    if model.has '__timestamp__'
+      -(model.get '__timestamp__')
+    else
+      super model


added state mock

added state mock

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/vtanathip/vCommerce.git/'


Add commonly used Editor methods to Editor View

Mini-editors use these methods very often, but really we shouldn't need to do
this.

--- src/editor-view.coffee
+++ src/editor-view.coffee
@@ -220,6 +220,18 @@
   getEditor: ->
     @editor

+  # {Delegates to: Editor.getText}
+  getText: ->
+    @editor.getText()
+
+  # {Delegates to: Editor.setText}
+  setText: (text) ->
+    @editor.setText(text)
+
+  # {Delegates to: Editor.insertText}
+  insertText: (text, options) ->
+    @editor.insertText(text, options)
+
   # Private:
   setHeightInLines: (heightInLines)->
     heightInLines ?= @calculateHeightInLines()


first tests for run function

first tests for run function

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

--- test/run.coffee
+++ test/run.coffee
@@ -0,0 +1,61 @@
+{Graph, Set, run} = require('../src/zuvor')
+
+module.exports =
+
+  'orderless': (test) ->
+    run(
+      ids: ['a', 'b', 'c']
+      graph: new Graph
+      callback: (id) ->
+        console.log id
+        id
+    ).then (result) ->
+      console.log result
+      test.done()
+
+  'values from parents are passed to children': (test) ->
+    table =
+      a: (values) ->
+        test.ok not values
+        1
+      b: (values) ->
+        test.deepEqual values,
+          a: 1
+        2
+      c: (values) ->
+        test.deepEqual values,
+          b: 2
+          d: 4
+        3
+      d: (values) ->
+        test.ok not values
+        4
+      e: (values) ->
+        test.ok not values
+        5
+      f: (values) ->
+        test.ok not values
+        6
+      g: (values) ->
+        test.ok not values
+        7
+
+    graph = new Graph()
+      .add('a', 'b')
+      .add('b', 'c')
+      .add('d', 'c')
+
+    run(
+      ids: ['a', 'b', 'c', 'd', 'e', 'f', 'g']
+      graph: graph
+      callback: (id, values) -> table[id](values)
+    ).then (result) ->
+      test.deepEqual result,
+        a: 1
+        b: 2
+        c: 3
+        d: 4
+        e: 5
+        f: 6
+        g: 7
+      test.done()


shortening window

shortening window

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/'


bug fix

bug fix


test basic setters

test basic setters

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

--- test/setter.coffee
+++ test/setter.coffee
@@ -0,0 +1,38 @@
+{ EventEmitter }      = require "events"
+{ LiveDocument
+, LiveDocumentMongo } = require "../index.coffee"
+assert                = require "assert"
+Mongolian             = require "mongolian"
+
+db = new Mongolian("localhost/LiveDocumentTestDB")
+
+
+class Thing extends LiveDocument
+
+  @socket = new EventEmitter
+
+  @key "title", { length: [3...24] }
+  @key "description", { max: 140, required: true }
+
+liveDocumentMongo = new LiveDocumentMongo(new EventEmitter, db)
+
+describe "LiveDocument", ->
+  beforeEach ->
+    # clean out all of the old listeners from previous tests
+    socket = new EventEmitter
+    Thing.socket = socket
+    liveDocumentMongo.setSocket(socket)
+    db.collection("things").remove {}, (err) ->
+      done()
+
+  describe "instances", ->
+    describe ".set", ->
+      it "should update the value", ->
+        thing = Thing.create({title: "w00t", description: "woo hooo"})
+        thing.set("title", "b00t")
+        thing.get("title").should.equal "b00t"
+
+
+      # This test brings up the interesting world of merging!
+      it "should not get its value overwritten by an incoming update"
+      it "should be saved when save is called"


forgot to take scope into account

forgot to take scope into account

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/0xenvision/negotiator-inator.git/'


dragged widgets are added to current tab

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/leonidas/qa-dashboard.git/'


Stacks: Define StackAppController

Stacks: Define StackAppController

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

--- client/stacks/lib/index.coffee
+++ client/stacks/lib/index.coffee
@@ -0,0 +1,86 @@
+kd                         = require 'kd'
+AppController              = require 'app/appcontroller'
+StackCatalogModalView      = require './views/customviews/stackcatalogmodalview'
+
+YourStacksView             = require 'app/environment/yourstacksview'
+MyStackTemplatesView       = require './views/stacks/my/mystacktemplatesview'
+GroupStackTemplatesView    = require './views/stacks/group/groupstacktemplatesview'
+
+require('./routehandler')()
+
+module.exports = class StacksAppController extends AppController
+
+  @options     =
+    name       : 'Stacks'
+    background : yes
+
+  NAV_ITEMS    =
+    teams      :
+      title    : 'Stack Catalog'
+      items    : [
+        { slug : 'Your-Stacks',   title : 'Your Stacks',            viewClass : YourStacksView }
+        { slug : 'My-Stacks',     title : 'My Stack Templates',     viewClass : MyStackTemplatesView }
+        { slug : 'Group-Stacks',  title : 'Group Stack Templates',  viewClass : GroupStackTemplatesView }
+      ]
+
+
+  constructor: (options = {}, data) ->
+
+    data         or= kd.singletons.groupsController.getCurrentGroup()
+    options.view   = new StackCatalogModalView
+      title        : 'Stack Catalog'
+      cssClass     : 'AppModal AppModal--admin StackCatalogModal team-settings'
+      width        : 1000
+      height       : '90%'
+      overlay      : yes
+      overlayClick : no
+      tabData      : NAV_ITEMS
+    , data
+
+    super options, data
+
+
+  openSection: (section, query, action, identifier) ->
+
+    targetPane = null
+
+    @mainView.ready =>
+      @mainView.tabs.panes.forEach (pane) ->
+        paneAction = pane.getOption 'action'
+        paneSlug   = pane.getOption 'slug'
+
+        if identifier and action is paneAction
+          targetPane = pane
+        else if paneSlug is section
+          targetPane = pane
+
+      if targetPane
+        @mainView.tabs.showPane targetPane
+        targetPaneView = targetPane.getMainView()
+        if identifier
+          targetPaneView.handleIdentifier? identifier, action
+        else
+          targetPaneView.handleAction? action
+
+        if identifier or action
+          targetPaneView.emit 'SubTabRequested', action, identifier
+          { parentTabTitle } = targetPane.getOptions()
+
+          if parentTabTitle
+            for handle in @getView().tabs.handles
+              if handle.getOption('title') is parentTabTitle
+                handle.setClass 'active'
+      else
+        kd.singletons.router.handleRoute '/Stacks'
+
+
+  loadView: (modal) ->
+
+    modal.once 'KDObjectWillBeDestroyed', ->
+      { router } = kd.singletons
+      previousRoutes = router.visitedRoutes.filter (route) -> not /^\/Stacks.*/.test(route)
+      if previousRoutes.length > 0
+      then router.handleRoute previousRoutes.last
+      else router.handleRoute router.getDefaultRoute()
+
+  fetchNavItems: (cb) -> cb NAV_ITEMS


Fix ESC key in chrome

Fix ESC key in chrome

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/sybis/nodectl.git/'


Improve graph data management.

Improve graph data management.

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/skitazaki/django-access-dashboard.git/'


Fixed a couple of the bugs with marks.

Fixed a couple of the bugs with marks.

--- app/lib/surface/CocoSprite.coffee
+++ app/lib/surface/CocoSprite.coffee
@@ -410,13 +410,14 @@
       @effectInterval = setInterval @rotateEffect, 1500

     else if @effectInterval and @thang.effectNames.length <= 1
-      @clearInterval @effectInterval
+      clearInterval @effectInterval
       @effectInterval = null

     @previousEffectNames = @thang.effectNames

   rotateEffect: =>
     effects = (m.name for m in _.values(@marks) when m.on and m.statusEffect and m.mark)
+    return unless effects.length
     effects.sort()
     @effectIndex ?= 0
     @effectIndex = (@effectIndex + 1) % effects.length


accept valid JS function name (simple test)

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/ceros/ShareJS.git/'


Add file

Add file

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

--- init.coffee
+++ init.coffee
@@ -0,0 +1,87 @@
+Meteor.startup ->
+
+  settings = Meteor.settings?.public?.usercycle
+
+  g = if Meteor.isServer then global else window
+
+  if settings.segment
+    g.analytics.load settings.segment.writeKey
+  else
+    throw new Error "Your Segment write key is not defined. Did you forget the --settings flag?"
+
+  # Debug logger
+  log = (msg) ->
+    if settings?.debug
+      console.log "Usercycle: " + msg
+
+
+  # Go ahead and identify if a user is already logged in or logs in
+  if Meteor.isClient
+    Tracker.autorun ->
+      userId = Meteor.userId()
+      if userId
+        log "Identifying #{userId}"
+        g.analytics.identify userId
+
+
+  #
+  # Override createUser
+  #
+  signupEvent = ->
+    settings?.signup?.name or "Signed Up"
+
+  # Wrap createUser so we can modify the callback
+  createUser = Accounts.createUser
+
+  if Meteor.isClient
+    # Send Signed Up event to segment if a user was created
+    trackSignup = (error) ->
+      unless error
+        user = Meteor.user()
+
+        log "Identifying #{user._id}"
+        g.analytics.identify user._id,
+          email: user.emails?[0]?.address
+          createdAt: new Date()
+
+        log "Tracking #{signupEvent()} for #{user._id}"
+        g.analytics.track signupEvent()
+
+    Accounts.createUser = ->
+      args = _.values arguments
+      callback = args[args.length-1]
+
+      if _.isFunction callback
+        args[args.length-1] = (error) ->
+          trackSignup error
+          callback error
+      else
+        args.push (error) ->
+          trackSignup error
+
+      createUser.apply @, args
+
+  else if Meteor.isServer
+    Accounts.createUser = ->
+      userId = createUser.apply @, _.values(arguments)
+      log "Tracking #{signupEvent()} for #{userId}"
+      g.analytics.track
+        userId: userId
+        event: signupEvent()
+        properties:
+          user:
+            userId: userId
+            email: options?.email
+            createdAt: new Date()
+      userId
+
+
+  # Itegration with IR
+  Router.onRun ->
+    name = @route.getName()
+    retentionRoutes = _.compact _.flatten [settings?.retention?.routes]
+    if Meteor.userId() and _.contains retentionRoutes, name
+      eventName = settings?.retention?.name or name
+      log "Tracking #{eventName} for #{Meteor.userId()}"
+      g.analytics.track eventName
+    @next()


Use new Model superclass in TextEditor

Use new Model superclass in TextEditor

--- src/text-editor.coffee
+++ src/text-editor.coffee
@@ -3,13 +3,13 @@
 Serializable = require 'serializable'
 Delegator = require 'delegato'
 {includeDeprecatedAPIs, deprecate} = require 'grim'
-{Model} = require 'theorist'
 EmitterMixin = require('emissary').Emitter
 {CompositeDisposable, Emitter} = require 'event-kit'
 {Point, Range} = TextBuffer = require 'text-buffer'
 LanguageMode = require './language-mode'
 DisplayBuffer = require './display-buffer'
 Cursor = require './cursor'
+Model = require './model'
 Selection = require './selection'
 TextMateScopeSelector = require('first-mate').ScopeSelector
 {Directory} = require "pathwatcher"
@@ -129,16 +129,16 @@

   subscribeToBuffer: ->
     @buffer.retain()
-    @subscribe @buffer.onDidChangePath =>
+    @disposables.add @buffer.onDidChangePath =>
       unless atom.project.getPaths().length > 0
         atom.project.setPaths([path.dirname(@getPath())])
       @emit "title-changed" if includeDeprecatedAPIs
       @emitter.emit 'did-change-title', @getTitle()
       @emit "path-changed" if includeDeprecatedAPIs
       @emitter.emit 'did-change-path', @getPath()
-    @subscribe @buffer.onDidChangeEncoding =>
+    @disposables.add @buffer.onDidChangeEncoding =>
       @emitter.emit 'did-change-encoding', @getEncoding()
-    @subscribe @buffer.onDidDestroy => @destroy()
+    @disposables.add @buffer.onDidDestroy => @destroy()

     # TODO: remove these when we remove the deprecations. They are old events.
     if includeDeprecatedAPIs
@@ -149,18 +149,19 @@
     @preserveCursorPositionOnBufferReload()

   subscribeToDisplayBuffer: ->
-    @subscribe @displayBuffer.onDidCreateMarker @handleMarkerCreated
-    @subscribe @displayBuffer.onDidUpdateMarkers => @mergeIntersectingSelections()
-    @subscribe @displayBuffer.onDidChangeGrammar => @handleGrammarChange()
-    @subscribe @displayBuffer.onDidTokenize => @handleTokenization()
-    @subscribe @displayBuffer.onDidChange (e) =>
-      @emit 'screen-lines-changed', e
+    @disposables.add @displayBuffer.onDidCreateMarker @handleMarkerCreated
+    @disposables.add @displayBuffer.onDidUpdateMarkers => @mergeIntersectingSelections()
+    @disposables.add @displayBuffer.onDidChangeGrammar => @handleGrammarChange()
+    @disposables.add @displayBuffer.onDidTokenize => @handleTokenization()
+    @disposables.add @displayBuffer.onDidChange (e) =>
+      @emit 'screen-lines-changed', e if includeDeprecatedAPIs
       @emitter.emit 'did-change', e

     # TODO: remove these when we remove the deprecations. Though, no one is likely using them
-    @subscribe @displayBuffer.onDidChangeSoftWrapped (softWrapped) => @emit 'soft-wrap-changed', softWrapped
-    @subscribe @displayBuffer.onDidAddDecoration (decoration) => @emit 'decoration-added', decoration
-    @subscribe @displayBuffer.onDidRemoveDecoration (decoration) => @emit 'decoration-removed', decoration
+    if includeDeprecatedAPIs
+      @subscribe @displayBuffer.onDidChangeSoftWrapped (softWrapped) => @emit 'soft-wrap-changed', softWrapped
+      @subscribe @displayBuffer.onDidAddDecoration (decoration) => @emit 'decoration-added', decoration
+      @subscribe @displayBuffer.onDidRemoveDecoration (decoration) => @emit 'decoration-removed', decoration

     @subscribeToScopedConfigSettings()

@@ -174,7 +175,7 @@
     subscriptions.add atom.config.onDidChange 'editor.invisibles', scope: scopeDescriptor, => @updateInvisibles()

   destroyed: ->
-    @unsubscribe()
+    @unsubscribe() if includeDeprecatedAPIs
     @disposables.dispose()
     @scopedConfigSubscriptions.dispose()
     selection.destroy() for selection in @getSelections()
@@ -719,7 +720,7 @@
     willInsert = true
     cancel = -> willInsert = false
     willInsertEvent = {cancel, text}
-    @emit('will-insert-text', willInsertEvent)
+    @emit('will-insert-text', willInsertEvent) if includeDeprecatedAPIs
     @emitter.emit 'will-insert-text', willInsertEvent

     if willInsert
@@ -728,7 +729,7 @@
       @mutateSelectedText (selection) =>
         range = selection.insertText(text, options)
         didInsertEvent = {text, range}
-        @emit('did-insert-text', didInsertEvent)
+        @emit('did-insert-text', didInsertEvent) if includeDeprecatedAPIs
         @emitter.emit 'did-insert-text', didInsertEvent
         range
     else
@@ -1661,9 +1662,9 @@

   preserveCursorPositionOnBufferReload: ->
     cursorPosition = null
-    @subscribe @buffer.onWillReload =>
+    @disposables.add @buffer.onWillReload =>
       cursorPosition = @getCursorBufferPosition()
-    @subscribe @buffer.onDidReload =>
+    @disposables.add @buffer.onDidReload =>
       @setCursorBufferPosition(cursorPosition) if cursorPosition
       cursorPosition = null


Trimmed tape title.

Trimmed tape title.

error: pathspec 'tests/Make' did not match any file(s) known to git
error: pathspec 'Key' did not match any file(s) known to git
error: pathspec 'Pair' did not match any file(s) known to git
error: pathspec 'Tests.coffee' did not match any file(s) known to git


let's expose levels to api :D

let's expose levels to api :D

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/'


Display browser validation bubbles

Display browser validation bubbles

--- components/contact/view.coffee
+++ components/contact/view.coffee
@@ -65,10 +65,10 @@
     @$('#contact-form').html @formTemplate(@templateData)

   submit: (e) ->
-    e.preventDefault()
-
     return unless @validateForm()
     return if @formIsSubmitting()
+
+    e.preventDefault()

     @$submit ?= @$('#contact-submit')
     @$errors ?= @$('#contact-errors')


Don't tokenize on NullGrammar

Don't tokenize on NullGrammar

For file format that Atom doesn't recognize as a
programming language, such as log files,
skip Tokenization since no syntax highlighting should be done.

--- src/tokenized-buffer.coffee
+++ src/tokenized-buffer.coffee
@@ -138,6 +138,7 @@

   tokenizeInBackground: ->
     return if not @visible or @pendingChunk or not @isAlive()
+    return if @grammar is @grammar.registry.nullGrammar
     @pendingChunk = true
     _.defer =>
       @pendingChunk = false


Added limit parameter to allow restricting the number of c3mls imported. Changed groupSelect to false by default in Atlas. Fixed bug caused by calling addEntity() on features. Grouped entity/show and entity/hide into ids if we need them in the future.

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/urbanetic/bismuth-schema.git/'


Created Canvas, with size updating and clear methods.

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

--- Canvas.coffee
+++ Canvas.coffee
@@ -0,0 +1,39 @@
+# The coordinate system looks like this (after transformations in setSize):
+
+#        y
+#        ^
+# height-|
+#        |
+#        |
+#      0-+-------> x
+#        |      |
+#        0    width
+
+class drawjs.Canvas
+
+	constructor: (@canvas, @width, @height, @color) ->
+		@setSize()
+		@clear()
+
+	# This method should be called when the canvas element is resized.
+	# The resize event isn't executed on elements (only the window object),
+	# otherwise it would be optimal to listen for that event instead.
+	setSize: () ->
+
+		@canvas.setAttribute('width',  @canvas.clientWidth)
+		@canvas.setAttribute('height', @canvas.clientHeight)
+
+		@context = @canvas.getContext("2d")
+
+		# Transform it.
+		scaleX =  @canvas.clientWidth /@width
+		scaleY = -@canvas.clientHeight/@height
+		@context.scale(scaleX, scaleY)
+		@context.translate(0, -@height)
+
+		# Make it look like one draws with a pen.
+		@context.lineCap = "round"
+
+	clear: () ->
+		@context.fillStyle = @color
+		@context.fillRect(0, 0, @width, @height)


finished gulp rebuild and cleanup, tiny fixes

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/Bit18/cyoab_modular_repo.git/'


client: simplify trial charge info

client: simplify trial charge info

--- client/component-lab/TrialChargeInfo/TrialChargeInfo.coffee
+++ client/component-lab/TrialChargeInfo/TrialChargeInfo.coffee
@@ -1,53 +1,19 @@
 kd = require 'kd'
 { PropTypes } = React = require 'react'
-generateClassName = require 'classnames'
 pluralize = require 'pluralize'
-{ Grid, Row, Col } = require 'react-flexbox-grid'
-dateDiffInDays = require 'app/util/dateDiffInDays'
+{ Row, Col } = require 'react-flexbox-grid'
 formatNumber = require 'app/util/formatNumber'

-classes = require './TrialChargeInfo.stylus'
 textStyles = require 'lab/Text/Text.stylus'

 Box = require 'lab/Box'
 Label = require 'lab/Text/Label'

-ExpirationMessage = ({ daysLeft }) ->
-
-  daysLeft ?= 100
-
-  title = if daysLeft >= 0
-  then "Your trial period is about to expire"
-  else "Your trial period has expired"
-
-  <Row>
-    <Col xs={12}>
-
-        {title}
-
-    </Col>
-    <Col xs={12}>
-
-        Please add a credit card below to continue to use Koding. You will be
-        charged based on your team size. If you have free credit,  it will be
-        deducted from your bill after you enter a credit card. Click below for
-        pricing details.
-
-    </Col>
-  </Row>
-

 TrialChargeInfo = ({ teamSize, pricePerSeat, daysLeft }) ->

-  isDanger = daysLeft < 4
-
-  <Box border={1} type={if isDanger then 'danger' else 'secondary'}>
+  <Box border={1} type='secondary'>
     <Row>
-      {if daysLeft < 4
-        <Col xs={12} className={classes['expiration']}>
-          <ExpirationMessage daysLeft={daysLeft} />
-        </Col>
-      }
       <Col xs={5}>

           Team Size: {pluralize 'Developer', teamSize, yes}
@@ -72,4 +38,3 @@
   pricePerSeat: 49.977777777777776

 module.exports = TrialChargeInfo
-


perf: added simple performance test

perf: added simple performance test

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

--- tests/perftest_simulation.coffee
+++ tests/perftest_simulation.coffee
@@ -0,0 +1,75 @@
+#Performance testing
+#
+#
+
+{randomFillFixedNum} = require "../src/core/field.coffee"
+{ChainMap} = require "../src/core/chain_map.coffee"
+{RegularTiling} = require "../src/core/regular_tiling.coffee"
+{parseTransitionFunction} = require "../src/core/rule.coffee"
+{evaluateTotalisticAutomaton} = require "../src/core/cellular_automata.coffee"
+{unity} = require "../src/core/vondyck_chain.coffee"
+class RandomGenerator
+  #From here: http://stackoverflow.com/questions/424292/seedable-javascript-random-number-generator
+  constructor: (seed)->
+    @m = 0x80000000 # 2**31
+    @a = 1103515245
+    @c = 12345
+    @state = seed ? (Math.floor(Math.random() * (@m-1)))
+
+  nextInt: ->
+    this.state = (this.a * this.state + this.c) % this.m
+
+  # returns in range [0,1]
+  nextFloat: -> @nextInt() / (@m - 1)
+
+  # returns in range [start, end): including start, excluding end
+  # can't modulu nextInt because of weak randomness in lower bits
+  nextRange: (start, end) ->
+    rangeSize = end - start
+    randomUnder1 = @nextInt() / @m
+    start + Math.floor(randomUnder1 * rangeSize)
+
+  choice: (array) -> array[@nextRange(0, array.length)]
+
+#Fill randomly, visiting numCells cells around the origin
+randomFillBlob = (field, tiling, numCells, randomState ) ->
+  visited = 0
+  tiling.forFarNeighborhood unity, (cell, _)->
+    #Time to stop iteration?
+    return false if visited >= numCells
+    if (state = randomState()) isnt 0
+      field.put cell, state
+    visited+=1
+    #Continue
+    return true
+  return
+
+
+
+runTestMildGrowing = (seed) ->
+  rng = new RandomGenerator seed
+
+  tiling = new RegularTiling 3, 8
+  rule = parseTransitionFunction "B 3 S 2 6", tiling.n, tiling.m
+  density = 0.4
+  newState = -> if rng.nextFloat() < density then 1 else 0
+  maxCells = 4000
+  steps = 1000
+  maxPop = 20000
+  field = new ChainMap()
+  randomFillBlob field, tiling, maxCells, newState
+
+  console.log "Rule is: #{rule}"
+  generation = 0
+
+  console.time "eval"
+  while (field.count < maxPop) and ((generation+=1) < steps)
+    field = evaluateTotalisticAutomaton field, tiling, rule.evaluate.bind(rule), rule.plus, rule.plusInitial
+    #console.log "g: #{generation}, pop: #{field.count}"
+  console.timeEnd "eval"
+
+
+
+runTestMildGrowing 100
+runTestMildGrowing 101
+runTestMildGrowing 102


Tests:Helpers:Added selector parameter to create file helper.

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/'


debugging cancel command

debugging cancel command


add methods for reading url from remote tag

error: pathspec 'client/skr/remote.coffee' did not match any file(s) known to git

--- client/skr/remote.coffee
+++ client/skr/remote.coffee
@@ -0,0 +1,30 @@
+readLoadUrl = (matchRegex) ->
+    for tag in document.querySelectorAll('script')
+        if tag.src.match matchRegex
+            Lanes.config.api_host = tag.src.replace(SCRIPT_PATH, '')
+            Lanes.config.api_path = Lanes.config.api_host + "/api"
+            break
+    if Lanes.config.api_host
+        css = Lanes.config.api_host + "/assets/skr/api.css"
+        new Lanes.lib.AssetLoader([css], Lanes.emptyFn)
+    else
+        console.error("Unable to find script tag that Stockor was loaded from")
+
+Skr.Remote = {
+
+    onDocumentReady: (fn) ->
+        if document.readyState isnt 'loading'
+            fn()
+        else if document.addEventListener
+            document.addEventListener 'DOMContentLoaded', fn
+        else
+            document.attachEvent 'onreadystatechange', ->
+                fn() if document.readyState != 'loading'
+
+    configFromScriptTag: (matchRegex = /\/assets\/skr\/api\.js$/) ->
+        new _.Promise (resolve) ->
+            @onDocumentReady ->
+                readLoadUrl()
+                resolve(Lanes.config)
+
+}


Add test coffee file

Add test coffee file

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

--- coffee/someScript.coffee
+++ coffee/someScript.coffee
@@ -0,0 +1,5 @@
+number = 42
+
+opposite = true
+
+number = -42 if opposite


Create icescrum.coffee

Create icescrum.coffee

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

--- icescrum.coffee
+++ icescrum.coffee
@@ -0,0 +1,15 @@
+
+class Dashing.Icescrum extends Dashing.Widget
+
+  @accessor 'value', Dashing.AnimatedValue
+
+  constructor: ->
+    super
+    @observe 'value', (value) ->
+      $(@node).find(".meter").val(value).trigger('change')
+
+  ready: ->
+    meter = $(@node).find(".meter")
+    meter.attr("data-bgcolor", meter.css("background-color"))
+    meter.attr("data-fgcolor", meter.css("color"))
+    meter.knob()


Create Candy.coffee

Create Candy.coffee

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

--- Candy.coffee
+++ Candy.coffee
@@ -0,0 +1,118 @@
+###
+Candy JS
+###
+
+Candy = @Candy = {}
+
+Candy.httpGet = (url) ->
+  xmlhttp = undefined
+  @url = url
+  if window.XMLHttpRequest
+    xmlhttp = new XMLHttpRequest
+  else
+    xmlhttp = new ActiveXObject('Microsoft.XMLHTTP')
+
+  xmlhttp.onreadystatechange = ->
+    if xmlhttp.readyState == XMLHttpRequest.DONE
+      if xmlhttp.status == 200
+        document.getElementById('myDiv').innerHTML = xmlhttp.responseText
+      else if xmlhttp.status == 400
+        alert 'There was an error 400'
+      else
+        console.log 'Error something else other than 200 was returned'
+    return
+
+  output = xmlhttp.open('GET', @url, true)
+  xmlhttp.send()
+  output
+
+# Candy.httpGet( URL )
+
+Candy.shuffle = (contents) ->
+  @contents = contents
+  output = @contents[Math.floor(Math.random() * @contents.length)]
+  output
+
+# Candy.shuffle( Array )
+
+Candy.rand = (arg, arg_2) ->
+  output = Math.floor(Math.random() * (arg - arg_2 + 1)) + arg_2
+  output
+
+# Candy.rand( First Number, Second Number
+
+Candy.toVar = (arg, contains) ->
+  arg = @arg
+  contains = @contains
+  window[arg] = contains
+  return
+
+Candy.write = (arg, arg2) ->
+  `var w`
+  if @arg2 == true
+    console.log @arg
+  else if @arg2 == undefined
+    w = document.createElement('div')
+    w.textContent = @arg
+    document.body.appendChild w
+  else
+    w = document.createElement('div')
+    w.textContent = @arg
+    document.body.appendChild w
+  return
+
+Candy.time = ->
+  d = new Date
+  hour = if d.getHours() == 0 then 12 else if d.getHours() > 12 then d.getHours() - 12 else d.getHours()
+  min = if d.getMinutes() < 10 then '0' + d.getMinutes() else d.getMinutes()
+  ampm = if d.getHours() < 12 then 'AM' else 'PM'
+  candy_time = hour + ':' + min + ' ' + ampm
+  candy_time
+
+# Candy.time()
+
+Candy.contains = (array, value) ->
+  @array = array
+  @value = value
+  if @array.indexOf(@value) != -1
+    true
+  else
+    false
+
+Candy.newList = (items, tags) ->
+  @tags = tags
+  @items = items
+  # Establish the array which acts as a data source for the list
+  listData = @items
+  # Make a container element for the list - which is a

+  # You don't actually need this container to make it work
+  listContainer = document.createElement('div')
+  # add it to the page
+  document.getElementsByTagName('body')[0].appendChild listContainer
+  # Make the list itself which is a

+  listElement = document.createElement(@tags[0])
+  # add it to the page
+  listContainer.appendChild listElement
+  # Set up a loop that goes through the items in listItems one at a time
+  numberOfListItems = listData.length
+  i = 0
+  while i < numberOfListItems
+    # create a
 for each one.
+    listItem = document.createElement(@tags[1])
+    # add the item text
+    listItem.innerHTML = listData[i]
+    # add listItem to the listElement
+    listElement.appendChild listItem
+    ++i
+  return
+
+# Only Works with HTML... Candy.newMenu(["JAN", "FEB"], ["ul", "li"])
+
+Candy.getIP = ->
+  ''
+
+console.log Candy.time()
+# Only Works with HTML... Candy.getIP()
+
+# ---
+# generated by js2coffee 2.1.0


Fixed bad filtering by refreshing selected items

[#74036168]

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/people.git/'


Update gulpfile.coffee

Update gulpfile.coffee

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/Hiroto-K/SaveTweet.git/'


Use plumber

Use plumber

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/Hiroto-K/MP3-Downloader.git/'


Created Gruntfile.

Created Gruntfile.

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

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -0,0 +1,17 @@
+module.exports = (grunt) ->
+
+  grunt.initConfig
+    pkg: grunt.file.readJSON "package.json"
+    coffee:
+      source:
+        options:
+          bare: true
+        expand: true
+        cwd: "src"
+        src: [ "**/*.coffee" ]
+        dest: "dist"
+        ext: ".js"
+
+  grunt.loadNpmTasks "grunt-contrib-coffee"
+
+  grunt.registerTask "default", ["coffee"]


Add images to deployment

Add images to deployment

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/Lionex/github-workshop.git/'


add gruntfile, initialize module

add gruntfile, initialize module

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -0,0 +1,7 @@
+module.exports = (grunt) ->
+
+  grunt.initConfig
+    "embark-framework":
+
+  grunt.loadTasks "tasks"
+


Fixed Catch Trial bug on line tasks report.

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/UCSFMemoryAndAging/tabcat.git/'


Add comments

Add comments

--- resources/assets/coffee/_classes/polyfills.coffee
+++ resources/assets/coffee/_classes/polyfills.coffee
@@ -55,6 +55,8 @@
       window.localStorage.__proto__ = localStorage

+  # For IE.
+  # Reference: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc
   mathTrunc: ->
     Math.trunc ?= (x) ->
       x - x % 1


Fixed camera single page being rendered twice

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/'


Force page reload when loading offline page in single doc mode

--- assets/javascripts/views/content/offline_page.coffee
+++ assets/javascripts/views/content/offline_page.coffee
@@ -41,8 +41,11 @@
   docEl: (doc) ->
     @find("[data-slug='#{doc.slug}']")

-  onRoute: ->
-    @render()
+  onRoute: (route) ->
+    if app.isSingleDoc()
+      window.location = "/#/#{route.path}"
+    else
+      @render()
     return

   onClick: (event) =>


Start of implementation of synchronized worksheets...

error: pathspec 'salvus/page/sync_worksheet.coffee' did not match any file(s) known to git

--- salvus/page/sync_worksheet.coffee
+++ salvus/page/sync_worksheet.coffee
@@ -0,0 +1,554 @@
+###
+Synchronized Worksheets (see also syncdoc.coffee for synchronized CodeMirror documents)
+
+###
+
+
+log = (s) -> console.log(s)
+
+diffsync = require('diffsync')
+
+misc     = require('misc')
+{defaults, required} = misc
+
+message  = require('message')
+
+{salvus_client} = require('salvus_client')
+{alert_message} = require('alerts')
+
+templates = $("#salvus-editor-templates")
+
+class DiffSyncDoc
+    # Define exactly one of cm or string.
+    #     cm     = a live codemirror editor
+    #     string = a string
+    constructor: (opts) ->
+        @opts = defaults opts,
+            cm     : undefined
+            string : undefined
+        if not ((opts.cm? and not opts.string?) or (opts.string? and not opts.cm?))
+            console.log("BUG -- exactly one of opts.cm and opts.string must be defined!")
+
+    copy: () =>
+        # always degrades to a string
+        if @opts.cm?
+            return new DiffSyncDoc(string:@opts.cm.getValue())
+        else
+            return new DiffSyncDoc(string:@opts.string)
+
+    string: () =>
+        if @opts.string?
+            return @opts.string
+        else
+            return @opts.cm.getValue()
+
+    diff: (v1) =>
+        # TODO: when either is a codemirror object, can use knowledge of where/if
+        # there were edits as an optimization
+        return diffsync.dmp.patch_make(@string(), v1.string())
+
+    patch: (p) =>
+        return new DiffSyncDoc(string: diffsync.dmp.patch_apply(p, @string())[0])
+
+    checksum: () =>
+        return @string().length
+
+    patch_in_place: (p) =>
+        if @opts.string
+            console.log("patching string in place")  # should never need to happen
+            @opts.string = diffsync.dmp.patch_apply(p, @string())[0]
+        else
+            cm = @opts.cm
+
+            # We maintain our cursor position using the following trick:
+            #    1. Insert a non-used unicode character where the cursor is.
+            #    2. Apply the patches.
+            #    3. Find the unicode character,, remove it, and put the cursor there.
+            #       If the unicode character vanished, just put the cursor at the coordinates
+            #       where it used to be (better than nothing).
+            # There is a more sophisticated approach described at http://neil.fraser.name/writing/cursor/
+            # but it is harder to implement given that we'll have to dive into the details of his
+            # patch_apply implementation.  This thing below took only a few minutes to implement.
+            scroll = cm.getScrollInfo()
+
+            cursor_anchor = cm.getCursor('anchor')
+            cursor_head   = cm.getCursor('head')
+            range = not (cursor_anchor.line == cursor_head.line and cursor_anchor.ch == cursor_head.ch)
+
+            c_anchor = "\uFE10"   # chosen from http://billposer.org/Linguistics/Computation/UnicodeRanges.html
+                                # since it is (1) undefined, and (2) looks like a cursor..
+            if range
+                c_head   = "\uFE11"
+
+            cm.replaceRange(c_anchor, cursor_anchor)
+            if range
+                # Have to put the other symbol on the *outside* of the selection, which depends on
+                # on whether anchor is before or after head.
+                if cursor_head.line > cursor_anchor.line or (cursor_head.line == cursor_anchor.line and cursor_head.ch >= cursor_anchor.ch)
+                    cm.replaceRange(c_head, {line:cursor_head.line, ch:cursor_head.ch+1})
+                else
+                    cm.replaceRange(c_head, {line:cursor_head.line, ch:cursor_head.ch})
+
+            s = @string()
+            new_value = diffsync.dmp.patch_apply(p, s)[0]
+            v = new_value.split('\n')
+
+            find_cursor = (pos0, chr) ->
+                line  = pos0.line
+                B = 5
+                # We first try an interval around the cursor, since that is where the cursor is most likely to be.
+                for k in [Math.max(0, line-B)...Math.max(0,Math.min(line-B, v.length))].concat([0...v.length])
+                    ch = v[k].indexOf(chr)
+                    if ch != -1
+                        return pos:{line:k, ch:ch}, marker:true
+                return pos:pos0, marker:false
+
+            anchor_pos = find_cursor(cursor_anchor, c_anchor)
+            if range
+                head_pos   = find_cursor(cursor_head, c_head)
+            else
+                head_pos = anchor_pos
+
+            s = v.join('\n')
+            # Benchmarking reveals that this line 'cm.setValue(s)' is by far the dominant time taker.
+            # This can be optimized by taking into account the patch itself (and maybe stuff returned
+            # when applying it) to instead only change a small range of the editor.  This is TODO
+            # for later though.  For reference, a 200,000 line doc on a Samsung chromebook takes < 1s still, and about .4 s
+            # on a fast intel laptop.
+            cm.setValue(s)
+            cm.setSelection(anchor_pos.pos, head_pos.pos)
+            # Remove the markers: complicated since can't remove both simultaneously, and
+            # removing one impacts position of the other, when in same line.
+            pos = undefined
+            if anchor_pos.marker
+                pos = anchor_pos.pos
+                cm.replaceRange("", pos, {line:pos.line, ch:pos.ch+1})
+            if range and head_pos.marker
+                pos1 = head_pos.pos
+                if pos? and pos1.line == pos.line
+                    if pos1.ch > pos.ch
+                        pos1.ch -= 1
+                cm.replaceRange("", pos1, {line:pos1.line, ch:pos1.ch+1})
+
+            cm.scrollTo(scroll.left, scroll.top)
+            cm.scrollIntoView(anchor_pos.pos)  # just in case
+
+
+codemirror_diffsync_client = (cm_session, content) ->
+    # This happens on initialization and reconnect.  On reconnect, we could be more
+    # clever regarding restoring the cursor and the scroll location.
+    cm_session.codemirror.setValueNoJump(content)
+
+    return new diffsync.CustomDiffSync
+        doc            : new DiffSyncDoc(cm:cm_session.codemirror)
+        copy           : (s) -> s.copy()
+        diff           : (v0,v1) -> v0.diff(v1)
+        patch          : (d, v0) -> v0.patch(d)
+        checksum       : (s) -> s.checksum()
+        patch_in_place : (p, v0) -> v0.patch_in_place(p)
+
+# The DiffSyncHub class represents a global hub viewed as a
+# remote server for this client.
+class DiffSyncHub
+    constructor: (@cm_session) ->
+
+    connect: (remote) =>
+        @remote = remote
+
+    recv_edits: (edit_stack, last_version_ack, cb) =>
+        @cm_session.call
+            message : message.codemirror_diffsync(edit_stack:edit_stack, last_version_ack:last_version_ack)
+            timeout : 30
+            cb      : (err, mesg) =>
+                if err
+                    cb(err)
+                else if mesg.event == 'error'
+                    cb(mesg.error)
+                else if mesg.event == 'codemirror_diffsync_retry_later'
+                    cb('retry')
+                else
+                    @remote.recv_edits(mesg.edit_stack, mesg.last_version_ack, cb)
+
+
+class SynchronizedDocument
+    constructor: (@editor, opts) ->
+        @opts = defaults opts,
+            cursor_interval : 150
+            sync_interval   : 150
+        @editor.save = @save
+        @codemirror = @editor.codemirror
+        @element    = @editor.element
+        @filename   = @editor.filename
+
+        @init_cursorActivity_event()
+        @init_chat()
+
+        @codemirror.setOption('readOnly', true)
+
+        @connect (err, resp) =>
+            if err
+                bootbox.alert "
Unable to open '#{@filename}'
", () =>
+                    @editor.editor.close(@filename)
+            else
+                @codemirror.setOption('readOnly', false)
+                @ui_synced(true)
+                @editor.init_autosave()
+                @sync_soon()  # do a first sync asap.
+                @codemirror.on 'change', (instance, changeObj) =>
+                    if changeObj.origin? and changeObj.origin != 'setValue'
+                        @ui_synced(false)
+                        @sync_soon()
+
+    _add_listeners: () =>
+        salvus_client.on 'codemirror_diffsync_ready', @_diffsync_ready
+        salvus_client.on 'codemirror_bcast', @_receive_broadcast
+
+    _remove_listeners: () =>
+        salvus_client.removeListener 'codemirror_diffsync_ready', @_diffsync_ready
+        salvus_client.removeListener 'codemirror_bcast', @_receive_broadcast
+
+    disconnect_from_session: (cb) =>
+        @_remove_listeners()
+        salvus_client.call
+            timeout : 10
+            message : message.codemirror_disconnect(session_uuid : @session_uuid)
+            cb      : cb
+
+        # store pref in localStorage to not auto-open this file next time
+        @editor.local_storage('auto_open', false)
+
+    connect: (cb) =>
+        @element.find(".salvus-editor-codemirror-loading").show()
+        @_remove_listeners()
+        salvus_client.call
+            timeout : 45     # a reasonable amount of time, since file could be *large*
+            message : message.codemirror_get_session
+                path         : @filename
+                project_id   : @editor.project_id
+            cb      : (err, resp) =>
+                @element.find(".salvus-editor-codemirror-loading").hide()
+                #console.log("new session: ", resp)
+                if err
+                    cb(err); return
+                if resp.event == 'error'
+                    cb(resp.event); return
+
+                @session_uuid = resp.session_uuid
+
+                # Render the chat
+                @element.find(".salvus-editor-codemirror-chat-output").html('')
+                for m in resp.chat
+                    @_receive_chat(m)
+                @new_chat_indicator(false)  # not necessarily new
+
+                # If our content is already set, we'll end up doing a merge.
+                resetting = @_previous_successful_set? and @_previous_successful_set
+
+                if not resetting
+                    # very easy
+                    @_previous_successful_set = true
+                    @editor._set(resp.content)
+                    live_content = resp.content
+                    # Reset the undo history here, since we do not want it to start with "empty document":
+                    @codemirror.clearHistory()
+                else
+                    # Doing a reset -- apply all the edits to the current version of the document.
+                    edit_stack = @dsync_client.edit_stack
+                    # Apply our offline edits to the new live version of the document.
+                    r = new DiffSyncDoc(string:resp.content)
+                    for p in edit_stack
+                        r = r.patch(p.edits)
+
+                    # Compute the patch comparing last known shadow
+                    # with our current live, and apply that patch to what the server
+                    # just sent us.  We declare that to be our new live.
+                    patch = @dsync_client.shadow.diff(@dsync_client.live)
+                    r2 = r.patch(patch)
+                    live_content = r2.string()
+
+
+                @dsync_client = codemirror_diffsync_client(@, resp.content)
+                @dsync_server = new DiffSyncHub(@)
+                @dsync_client.connect(@dsync_server)
+                @dsync_server.connect(@dsync_client)
+                @_add_listeners()
+
+                if resetting
+                    @codemirror.setValueNoJump(live_content)
+                    # Force a sync.
+                    @_syncing = false
+                    @sync()
+
+                if not resetting
+                    @editor.save_button.addClass('disabled')   # start with no unsaved changes
+
+                cb()
+
+    _diffsync_ready: (mesg) =>
+        if mesg.session_uuid == @session_uuid
+            @sync_soon()
+
+    call: (opts) =>
+        opts = defaults opts,
+            message     : required
+            timeout     : 45
+            cb          : undefined
+        opts.message.session_uuid = @session_uuid
+        salvus_client.call
+            message : opts.message
+            timeout : opts.timeout
+            cb      : (err, result) =>
+                if result? and result.event == 'reconnect'
+                    #console.log("codemirror sync session #{@session_uuid}: reconnecting ")
+                    do_reconnect = () =>
+                        @connect (err) =>
+                            if err
+                                #console.log("codemirror sync session #{@session_uuid}: failed to reconnect")
+                                opts.cb?(err)
+                            else
+                                #console.log("codemirror sync session #{@session_uuid}: successful reconnect")
+                                opts.cb?('reconnect')  # still an error condition
+                    setTimeout(do_reconnect, 1000)  # give server some room
+                else
+                    opts.cb?(err, result)
+
+    sync_soon: (wait) =>
+        if not wait?
+            wait = @opts.sync_interval
+        if @_sync_soon?
+            # We have already set a timer to do a sync soon.
+            #console.log("not sync_soon since -- We have already set a timer to do a sync soon.")
+            return
+        do_sync = () =>
+            delete @_sync_soon
+            @sync (didnt_sync) =>
+                if didnt_sync
+                    @sync_soon(Math.min(5000, wait*1.5))
+        @_sync_soon = setTimeout(do_sync, wait)
+
+    ui_synced: (synced) =>
+        if synced
+            if @_ui_synced_timer?
+                clearTimeout(@_ui_synced_timer)
+                delete @_ui_synced_timer
+            @element.find(".salvus-editor-codemirror-not-synced").hide()
+            @element.find(".salvus-editor-codemirror-synced").show()
+        else
+            if @_ui_synced_timer?
+                return
+            show_spinner = () =>
+                @element.find(".salvus-editor-codemirror-not-synced").show()
+                @element.find(".salvus-editor-codemirror-synced").hide()
+            @_ui_synced_timer = setTimeout(show_spinner, 1500)
+
+    sync: (cb) =>    # cb(false if a sync occured; true-ish if anything prevented a sync from happening)
+        if @_syncing? and @_syncing
+            # can only sync once a complete cycle is done, or declared failure.
+            cb?()
+            #console.log('skipping since already syncing')
+            return
+
+        @_syncing = true
+        if @_sync_soon?
+            clearTimeout(@_sync_soon)
+            delete @_sync_soon
+        before = @dsync_client.live.string()
+        @dsync_client.push_edits (err) =>
+            #console.log("dsync_client result: ", err)
+            if err
+                @_syncing = false
+                if not @_sync_failures?
+                    @_sync_failures = 1
+                else
+                    @_sync_failures += 1
+                if @_sync_failures % 6 == 0 and not err == 'retry'
+                    alert_message(type:"error", message:"Unable to synchronize '#{@filename}' with server; changes not saved until you next connect to the server.  Do not close your browser (offline mode not yet implemented).")
+
+                setTimeout(@sync, 30000)  # try again soon...
+                cb?(err)
+            else
+                @_sync_failures = 0
+                @_syncing = false
+                @ui_synced(true)
+                cb?()
+
+    init_cursorActivity_event: () =>
+        @codemirror.on 'cursorActivity', (instance) =>
+            if not @_syncing
+                @send_cursor_info_to_hub_soon()
+            @editor.local_storage('cursor', @codemirror.getCursor())
+
+    init_chat: () =>
+        chat = @element.find(".salvus-editor-codemirror-chat")
+        input = chat.find(".salvus-editor-codemirror-chat-input")
+        input.keydown (evt) =>
+            if evt.which == 13 # enter
+                content = $.trim(input.val())
+                if content != ""
+                    input.val("")
+                    @send_broadcast_message({event:'chat', content:content}, true)
+                return false
+
+        @init_chat_toggle()
+
+    init_chat_toggle: () =>
+        title = @element.find(".salvus-editor-chat-title")
+        title.click () =>
+            if @editor._chat_is_hidden? and @editor._chat_is_hidden
+                @show_chat_window()
+            else
+                @hide_chat_window()
+        @hide_chat_window()  #start hidden for now, until we have a way to save this.
+
+    show_chat_window: () =>
+        # SHOW the chat window
+        @editor._chat_is_hidden = false
+        @element.find(".salvus-editor-chat-show").hide()
+        @element.find(".salvus-editor-chat-hide").show()
+        @element.find(".salvus-editor-codemirror-input-box").removeClass('span12').addClass('span9')
+        @element.find(".salvus-editor-codemirror-chat-column").show()
+        # see http://stackoverflow.com/questions/4819518/jquery-ui-resizable-does-not-support-position-fixed-any-recommendations
+        # if you want to try to make this resizable
+        output = @element.find(".salvus-editor-codemirror-chat-output")
+        output.scrollTop(output[0].scrollHeight)
+        @new_chat_indicator(false)
+        @editor.show()  # updates editor width
+
+    hide_chat_window: () =>
+        # HIDE the chat window
+        @editor._chat_is_hidden = true
+        @element.find(".salvus-editor-chat-hide").hide()
+        @element.find(".salvus-editor-chat-show").show()
+        @element.find(".salvus-editor-codemirror-input-box").removeClass('span9').addClass('span12')
+        @element.find(".salvus-editor-codemirror-chat-column").hide()
+        @editor.show()  # update size/display of editor (especially the width)
+
+    new_chat_indicator: (new_chats) =>
+        # Show a new chat indicator of the chat window is closed.
+        # if new_chats, indicate that there are new chats
+        # if new_chats, don't indicate new chats.
+        elt = @element.find(".salvus-editor-chat-new-chats")
+        if new_chats and @editor._chat_is_hidden
+            elt.show()
+        else
+            elt.hide()
+
+    _receive_chat: (mesg) =>
+        @new_chat_indicator(true)
+        output = @element.find(".salvus-editor-codemirror-chat-output")
+        date = new Date(mesg.date)
+        entry = templates.find(".salvus-chat-entry").clone()
+        output.append(entry)
+        header = entry.find(".salvus-chat-header")
+        if (not @_last_chat_name?) or @_last_chat_name != mesg.name or ((date.getTime() - @_last_chat_time) > 60000)
+            header.find(".salvus-chat-header-name").text(mesg.name).css(color:"#"+mesg.color)
+            header.find(".salvus-chat-header-date").attr('title', date.toISOString()).timeago()
+        else
+            header.hide()
+        @_last_chat_name = mesg.name
+        @_last_chat_time = new Date(mesg.date).getTime()
+        entry.find(".salvus-chat-entry-content").text(mesg.mesg.content).mathjax()
+        output.scrollTop(output[0].scrollHeight)
+
+    send_broadcast_message: (mesg, self) ->
+        m = message.codemirror_bcast
+            session_uuid : @session_uuid
+            mesg         : mesg
+            self         : self    #if true, then also send include this client to receive message
+        salvus_client.send(m)
+
+    send_cursor_info_to_hub: () =>
+        delete @_waiting_to_send_cursor
+        if not @session_uuid # not yet connected to a session
+            return
+        @send_broadcast_message({event:'cursor', pos:@codemirror.getCursor()})
+
+    send_cursor_info_to_hub_soon: () =>
+        if @_waiting_to_send_cursor?
+            return
+        @_waiting_to_send_cursor = setTimeout(@send_cursor_info_to_hub, @opts.cursor_interval)
+
+    _receive_broadcast: (mesg) =>
+        if mesg.session_uuid != @session_uuid
+            return
+        switch mesg.mesg.event
+            when 'cursor'
+                @_receive_cursor(mesg)
+            when 'chat'
+                @_receive_chat(mesg)
+
+    _receive_cursor: (mesg) =>
+        # If the cursor has moved, draw it.  Don't bother if it hasn't moved, since it can get really
+        # annoying having a pointless indicator of another person.
+        if not @_last_cursor_pos?
+            @_last_cursor_pos = {}
+        else
+            pos = @_last_cursor_pos[mesg.color]
+            if pos? and pos.line == mesg.mesg.pos.line and pos.ch == mesg.mesg.pos.ch
+                return
+        # cursor moved.
+        @_last_cursor_pos[mesg.color] = mesg.mesg.pos   # record current position
+        @_draw_other_cursor(mesg.mesg.pos, '#' + mesg.color, mesg.name)
+
+    # Move the cursor with given color to the given pos.
+    _draw_other_cursor: (pos, color, name) =>
+        if not @codemirror?
+            return
+        if not @_cursors?
+            @_cursors = {}
+        id = color + name
+        cursor_data = @_cursors[id]
+        if not cursor_data?
+            cursor = templates.find(".salvus-editor-codemirror-cursor").clone().show()
+            inside = cursor.find(".salvus-editor-codemirror-cursor-inside")
+            inside.css
+                'background-color': color
+            label = cursor.find(".salvus-editor-codemirror-cursor-label")
+            label.css('color':color)
+            label.text(name)
+            cursor_data = {cursor: cursor, pos:pos}
+            @_cursors[id] = cursor_data
+        else
+            cursor_data.pos = pos
+
+        # first fade the label out
+        cursor_data.cursor.find(".salvus-editor-codemirror-cursor-label").stop().show().animate(opacity:100).fadeOut(duration:8000)
+        # Then fade the cursor out (a non-active cursor is a waste of space).
+        cursor_data.cursor.stop().show().animate(opacity:100).fadeOut(duration:60000)
+        #console.log("Draw #{name}'s #{color} cursor at position #{pos.line},#{pos.ch}", cursor_data.cursor)
+        @codemirror.addWidget(pos, cursor_data.cursor[0], false)
+
+    click_save_button: () =>
+        if not @save_button.hasClass('disabled')
+            @save_button.find('span').text("Saving...")
+            spin = setTimeout((() => @save_button.find(".spinner").show()), 100)
+            @save (err) =>
+                clearTimeout(spin)
+                @save_button.find(".spinner").hide()
+                @save_button.find('span').text('Save')
+                if not err
+                    @save_button.addClass('disabled')
+                    @has_unsaved_changes(false)
+                else
+                    alert_message(type:"error", message:"Error saving '#{@filename}' to disk -- #{err}")
+        return false
+
+    save: (cb) =>
+        if @editor.opts.delete_trailing_whitespace
+            @codemirror.delete_trailing_whitespace()
+        if @dsync_client?
+            @sync () =>
+                @call
+                    message: message.codemirror_write_to_disk()
+                    cb : cb
+        else
+            cb("Unable to save '#{@filename}' since it is not yet loaded.")
+
+    _apply_changeObj: (changeObj) =>
+        @codemirror.replaceRange(changeObj.text, changeObj.from, changeObj.to)
+        if changeObj.next?
+            @_apply_changeObj(changeObj.next)
+
+
+
+exports.SynchronizedDocument = SynchronizedDocument


Style tweaks for #2533. Fixed #1403.

Style tweaks for #2533. Fixed #1403.

--- app/lib/world/vector.coffee
+++ app/lib/world/vector.coffee
@@ -11,8 +11,8 @@
   apiProperties: ['x', 'y', 'z', 'magnitude', 'heading', 'distance', 'dot', 'equals', 'copy', 'distanceSquared', 'rotate']

   constructor: (x=0, y=0, z=0) ->
-    return new Vector(x,y,z) unless this instanceof Vector
-    [@x, @y, @z] = [x,y,z]
+    return new Vector x, y, z unless @ instanceof Vector
+    [@x, @y, @z] = [x, y, z]

   copy: ->
     new Vector(@x, @y, @z)


Simple fix for a race condition where the user schema might load after /auth/whoami, overwriting /auth/whoami's cookie.

--- app/models/CocoModel.coffee
+++ app/models/CocoModel.coffee
@@ -22,7 +22,8 @@
     if @constructor.schema?.loaded
       @addSchemaDefaults()
     else
-      @loadSchema()
+      {me} = require 'lib/auth'
+      @loadSchema() if me?.loaded
     @once 'sync', @onLoaded, @
     @saveBackup = _.debounce(@saveBackup, 500)


Assert snippet.cson is copied over

Assert snippet.cson is copied over

--- spec/config-spec.coffee
+++ spec/config-spec.coffee
@@ -218,7 +218,7 @@
         runs ->
           expect(fs.existsSync(atom.config.configDirPath)).toBeTruthy()
           expect(fs.existsSync(path.join(atom.config.configDirPath, 'packages'))).toBeTruthy()
-          expect(fs.existsSync(path.join(atom.config.configDirPath, 'snippets'))).toBeTruthy()
+          expect(fs.isFileSync(path.join(atom.config.configDirPath, 'snippets.cson'))).toBeTruthy()
           expect(fs.isFileSync(path.join(atom.config.configDirPath, 'config.cson'))).toBeTruthy()

   describe ".loadUserConfig()", ->


be paranoid about marks for a while

be paranoid about marks for a while

error: pathspec 'resource/Better' did not match any file(s) known to git
error: pathspec 'BibTeX.coffee' did not match any file(s) known to git


stub in a gruntfile

stub in a gruntfile

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -0,0 +1,18 @@
+module.exports = (grunt) ->
+
+  grunt.initConfig
+    pkg: grunt.file.readJSON 'package.json'
+    uglify:
+      options:
+        banner: '/* <%= pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %> */\n'
+      dist:
+        files:
+          'raphael-svg-import.min.js': ['raphael-svg-import.js']
+    # qunit:
+    #   all: ['tests/*.html']
+
+
+  grunt.loadNpmTasks 'grunt-contrib-uglify'
+  # grunt.loadNpmTasks 'grunt-contrib-qunit'
+
+  grunt.registerTask 'default', ['uglify']


Add build process

Add build process

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -0,0 +1,243 @@
+###
+  leaf-typography's Gruntfile
+  Author: Matheus R. Kautzmann
+  Description:
+    Build the project files, three main modes are available:
+
+    * grunt watch = while developing features or fixing bugs, keeps running
+    scss compilation with source maps to test with the demo HTML.
+
+    * grunt demo = Compiles everything with source maps and spins up a server
+    running the demo.
+
+    * grunt build = Builds for distribution and output to dist.
+
+    Also, there are some individual grunt tasks, for more info run `grunt help`
+
+  Attention contributors: check the CONTRIBUTING.md file before sending changes.
+###
+module.exports = (grunt) ->
+
+  require('load-grunt-tasks')(grunt)
+
+  grunt.initConfig({
+    pkg: grunt.file.readJSON('package.json')
+
+    # Lint all the CoffeeScript files
+    coffeelint: {
+      app: {
+        files: {
+          src: ['Gruntfile.coffee']
+        }
+      }
+      test: {
+        files: {
+          src: ['test/*.coffee']
+        }
+      }
+      options: {
+        configFile: 'coffeelint.json'
+      }
+    }
+
+    # Compile test code
+    coffee: {
+      test: {
+        options: {
+          bare: true
+          sourceMap: true
+        }
+        files: {
+          'test/testBundle.js': ['test/*.coffee']
+        }
+      }
+    }
+
+    # Lint SCSS files
+    scsslint: {
+      options: {
+        bundleExec: true
+        config: '.scss-lint.yml'
+      }
+      src: ['src/*.scss']
+    }
+
+    # Compile SCSS
+    sass: {
+      options: {
+        bundleExec: true
+      }
+      demo: {
+        files: {
+          'demo/leaf-typography.css': 'src/leaf-typography.scss'
+        }
+        options: {
+          style: 'expanded'
+        }
+      }
+      test: {
+        files: {
+          'test/leaf-typography.css': 'src/leaf-typography.scss'
+        }
+        options: {
+          style: 'expanded'
+        }
+      }
+      dist: {
+        files: {
+          'dist/leaf-typography.css': 'src/leaf-typography.scss'
+        }
+        options: {
+          style: 'expanded'
+          sourcemap: 'none'
+        }
+      }
+    }
+
+    # Run tests on PhantomJS
+    mocha: {
+      test: {
+        src: ['test/index.html']
+        options: {
+          run: true
+          reporter: 'Spec'
+        }
+      }
+    }
+
+    # Apply PostCSS transformations to generate complete distribution file
+    postcss: {
+      distProd: {
+        options: {
+          map: false
+          processors: [
+            require('cssnano')({autoprefixer: false, safe: true})
+          ]
+        }
+        src: 'dist/leaf-typography.css'
+        dest: 'dist/leaf-typography.min.css'
+      }
+      test: {
+        options: {
+          map: true
+          processors: [
+            require('cssnano')({autoprefixer: false, safe: true})
+          ]
+        }
+        src: 'test/leaf-typography.css'
+      }
+    }
+
+    # Put banner in dist files
+    usebanner: {
+      taskName: {
+        options: {
+          position: 'top',
+          banner: '/*<%=pkg.name %>@<%=pkg.version%>*/',
+          linebreak: true
+        },
+        files: {
+          src: ['dist/*.css']
+        }
+      }
+    }
+
+    # Generate docs
+    sassdoc: {
+      default: {
+        options: {
+          dest: 'docs'
+        }
+        src: 'src/leaf-typography.scss'
+      }
+    }
+
+    # Run connect server for testing purposes
+    connect: {
+      server: {
+        options: {
+          port: 8080
+          base: '.'
+        }
+      }
+    }
+
+    # Run demo server with auto CSS update
+    browserSync: {
+      bsFiles: {
+        src: ['demo/*.css', 'demo/*.html']
+      }
+      options: {
+        server: {
+          baseDir: './demo'
+        }
+      }
+    }
+
+    # Runs browser tests on Sauce Labs (only Circle CI must run it)
+    'saucelabs-mocha': {
+      all: {
+        options: {
+          username: process.env.SAUCE_USERNAME
+          key: process.env.SAUCE_ACCESSKEY
+          urls: ['localhost:8080/test/index.html']
+          testname: 'leaf-typography'
+          build: 'build-leaf-typography-' + process.env.CIRCLE_BUILD_NUM
+          pollInterval: 5000
+          'max-duration': 500
+          maxRetries: 1
+          browsers: grunt.file.readJSON('browserSupport.json').browsers
+        }
+      }
+    }
+
+    # Watch task while developing
+    watch: {
+      options: {
+        spawn: false
+      }
+      sass: {
+        files: ['src/*.scss']
+        tasks: ['lint', 'sass:demo']
+      }
+      test: {
+        files: ['test/*.coffee']
+        tasks: ['coffee']
+      }
+    }
+
+    # Take back to clone state
+    clean: [
+      'bower_components'
+      'node_modules'
+      'docs'
+      'test/leaf-typography.css'
+      'test/leaf-typography.css.map'
+      'test/testBundle.js'
+      'test/testBundle.js.map'
+    ]
+  })
+
+  grunt.registerTask('lint', ['coffeelint', 'scsslint'])
+  grunt.registerTask('test', [
+    'lint'
+    'coffee'
+    'sass:test'
+    'postcss:test'
+    'mocha'
+  ])
+  grunt.registerTask('docs', ['sassdoc'])
+  grunt.registerTask('demo', ['sass:demo', 'browserSync'])
+  grunt.registerTask('build', [
+    'test',
+    'sass:dist'
+    'postcss:distProd'
+    'docs'
+    'usebanner'
+  ])
+  if process.env.CI
+    grunt.registerTask('ci', [
+      'build'
+      'connect'
+      'saucelabs-mocha'
+    ])


Removed zoom to entities logic and used the version in Atlas.

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/urbanetic/meteor-atlas-util.git/'


Config cson

Config cson

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

--- atom.symlink/config.cson
+++ atom.symlink/config.cson
@@ -0,0 +1,35 @@
+"*":
+  editor:
+    showIndentGuide: true
+    fontFamily: "Menlo"
+    invisibles: {}
+    fontSize: 15
+    softWrapAtPreferredLineLength: true
+  core:
+    ignoredNames: [
+      ".bundle"
+      ".git"
+      "log"
+      "tmp"
+      "vendor"
+    ]
+    themes: [
+      "unity-ui"
+      "glacier-syntax"
+    ]
+    hideGitIgnoredFiles: true
+    disabledPackages: [
+      "background-tips"
+      "exception-reporting"
+      "metrics"
+    ]
+  "spell-check":
+    grammars: [
+      "text.plain"
+      "source.gfm"
+      "text.git-commit"
+    ]
+  welcome:
+    showOnStartup: false
+  "release-notes":
+    viewedVersion: "0.89.0"


install editorconfig

install editorconfig

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/ocrampete16/dotfiles.git/'


added board page parameter

added board page parameter

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/herrkris/bbphone-app.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/'


enable comment toggling for XQuery

enable comment toggling for XQuery

by adding a settings file

error: pathspec 'settings/language-jsoniq.cson' did not match any file(s) known to git

--- settings/language-jsoniq.cson
+++ settings/language-jsoniq.cson
@@ -0,0 +1,4 @@
+'.source.xq':
+  'editor':
+    'commentStart': '(: '
+    'commentEnd': ' :)'


Update build-client

Update build-client

--- build-client.coffee
+++ build-client.coffee
@@ -87,6 +87,8 @@
     .then (helper) =>
       spriteHelper = helper
       @buildClient options
+    .catch (e)->
+      console.log "SPRITE COMPILE FAILED >>", e

   buildExternals:->

@@ -115,6 +117,13 @@
           queue.next()
       ,
       ->
+        exec 'rm -rf client/landing/node_modules/gulp.spritesmith/node_modules/spritesmith/node_modules/canvassmith', (err)->
+          if err
+          then console.error err
+          else console.log "# canvassmith removed ---"
+          queue.next()
+      ,
+      ->
         exec 'cd client/landing && gulp build', (err, stdout, stderr)->
           if err
           then console.error err
@@ -125,7 +134,7 @@
           queue.next()
       ,
       ->
-        exec "cp -Rf #{__dirname}/client/landing/static/out #{__dirname}/website/a/out", (err, stdout, stderr)->
+        exec "cp -Rf #{__dirname}/client/landing/static/a/out #{__dirname}/website/a/out", (err, stdout, stderr)->
           if err
           then console.error err
           else console.log "# LANDING PAGE EXPORTED"


Added some snippets

Added some snippets

error: pathspec 'snippets/language-xquery.cson' did not match any file(s) known to git

--- snippets/language-xquery.cson
+++ snippets/language-xquery.cson
@@ -0,0 +1,61 @@
+'.source.xq':
+  'for':
+    'prefix': 'for'
+    'body': 'for $${1:item} in ${2:expr}${3}'
+  'return':
+    'prefix': 'return'
+    'body': 'return\n\t${1:expr}${2}'
+  'import':
+    'prefix': 'import'
+    'body': 'import module namespace ${1:ns} = "${2:http://www.example.com/}";\n${3}'
+  'if':
+    'prefix': 'if'
+    'body': 'if(${1:true}) then\n\t${2:expr}\nelse\n\t${3:true}${4}'
+  'switch':
+    'prefix': 'switch'
+    'body': 'switch(${1:"foo"})\ncase ${2:"foo"}\nreturn ${3:true}\ndefault return ${4:false}${5}'
+  'try':
+    'prefix': 'try'
+    'body': 'try {\n\t${1:expr}\n} catch ${2:*} {\n\t${3:expr}\n}${4}'
+  'let':
+    'prefix': 'let'
+    'body': 'let $${1:varname} := ${2:expr}${3}'
+  'group':
+    'prefix': 'group'
+    'body': 'group by $${1:varname} := ${2:expr}${3}'
+  'order':
+    'prefix': 'order'
+    'body': 'order by $${1:expr} ${2:descending}${3}'
+  'treat':
+    'prefix': 'treat'
+    'body': 'treat as ${1:expr}${2}'
+  'castable':
+    'prefix': 'castable'
+    'body': 'castable as ${1:atomicType}${2}'
+  'cast':
+    'prefix': 'cast'
+    'body': 'cast as ${1:atomicType}${2}'
+  'typeswitch':
+    'prefix': 'typeswitch'
+    'body': 'typeswitch(${1:expr})\n\tcase ${2:type} return ${3:expr}\n\tdefault return ${4:expr}${5}'
+  'var':
+    'prefix': 'var'
+    'body': 'declare variable $${1:varname} := ${2:expr};${3}'
+  'fun':
+    'prefix': 'fun'
+    'body': 'declare function ${1:ns}:${2:name}() {\n\t${3:expr}\n};\n\n${4}'
+  'tmpl':
+    'prefix': 'tmpl'
+    'body': 'declare\n\t%templates:wrap\nfunction ${1:ns}:${2:name}($node as node(), $model as map(*)) {\n\t${3:expr}\n};\n\n${4}'
+  'module':
+    'prefix': 'module'
+    'body': 'module namespace ${1:ns} = "${2:http://www.example.com}";\n\n${3}'
+  'xquery':
+    'prefix': 'xquery'
+    'body': 'xquery version "${1:3.0}";\n\n${2}'
+  'tei':
+    'prefix': 'tei'
+    'body': 'declare namespace tei="http://www.tei-c.org/ns/1.0";\n${2}'
+  'output':
+    'prefix': 'output'
+    'body': 'declare namespace output="http://www.w3.org/2010/xslt-xquery-serialization";\ndeclare option output:method "${1:xml}";\ndeclare option output:media-type "${2:application/xml}";'


Cleanup

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/urbanetic/bismuth-schema.git/'


extracting Engine.Clear module

extracting Engine.Clear module

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

--- src/engine_clear.coffee
+++ src/engine_clear.coffee
@@ -0,0 +1,24 @@
+###*
+This module clears or fills the canvas before drawing the scene.
+
+@name Clear
+@fieldOf Engine
+@module
+@param {Object} I Instance variables
+@param {Object} self Reference to the engine
+###
+
+Engine.Clear = (I, self) ->
+  Object.reverseMerge I,
+    backgroundColor: "#00010D"
+    clear: false
+
+  self.bind "beforeDraw", ->
+    if I.clear
+      I.canvas.clear()
+    else if I.backgroundColor
+      I.canvas.fill(I.backgroundColor)
+
+  # No public methods
+  return {}
+


YouTube HTML5 mode is used by default. Fix typo in video alpha template.

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/'


Update user visibility when for old projects

Resolves: [#107466380]

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/people.git/'


Fix "Cannot read property 'map' of undefined" error.

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/lonelyplanet/rizzo.git/'


set nearby_api_endpoint to prod url

set nearby_api_endpoint to prod url


tests

tests

error: pathspec 'apps/galleries_institutions2/components/partner_cell_carousel/test/fetch.coffee' did not match any file(s) known to git

--- apps/galleries_institutions2/components/partner_cell_carousel/test/fetch.coffee
+++ apps/galleries_institutions2/components/partner_cell_carousel/test/fetch.coffee
@@ -0,0 +1,125 @@
+benv = require 'benv'
+sinon = require 'sinon'
+Backbone = require 'backbone'
+_ = require 'underscore'
+{ fabricate } = require 'antigravity'
+CategoryCarousel = require '../fetch'
+PartnerCategory = require '../../../../../models/partner_category'
+Q = require 'bluebird-q'
+
+describe 'fetch', ->
+  before (done) ->
+    benv.setup ->
+      benv.expose $: benv.require 'jquery'
+      done()
+
+  after ->
+    benv.teardown()
+
+  afterEach ->
+    Backbone.sync.restore()
+
+  it 'fetches primary and secondary  buckets', ->
+    primary = [fabricate 'partner', id: 'primary_1']
+    secondary = [fabricate 'partner', id: 'secondary_1']
+    sinon.stub Backbone, 'sync'
+      .onCall 0
+      .yieldsTo 'success', primary
+      .returns Q.resolve primary
+      .onCall 1
+      .yieldsTo 'success', secondary
+      .returns Q.resolve secondary
+
+    carousel = new CategoryCarousel category: new PartnerCategory id: 'id', name: 'Category'
+    carousel.fetch().then ->
+      Backbone.sync.args[0][2].data.should.eql
+        eligible_for_primary_bucket: true
+        active: true
+        has_full_profile: true
+        size: 6
+        sort: '-random_score'
+        partner_categories: ['id']
+
+      Backbone.sync.args[1][2].data.should.eql
+        eligible_for_secondary_bucket: true
+        active: true
+        has_full_profile: true
+        size: 6
+        sort: '-random_score'
+        partner_categories: ['id']
+
+  it 'uses 3 primary and 3 secondary if available', ->
+    primary = [fabricate('partner', id: 'primary_1'), fabricate('partner', id: 'primary_2'), fabricate('partner', id: 'primary_3'), fabricate('partner', id: 'primary_4')]
+    secondary = [fabricate('partner', id: 'secondary_1'), fabricate('partner', id: 'secondary_2'), fabricate('partner', id: 'secondary_3'), fabricate('partner', id: 'secondary_4')]
+    sinon.stub Backbone, 'sync'
+      .onCall 0
+      .yieldsTo 'success', primary
+      .returns Q.resolve primary
+      .onCall 1
+      .yieldsTo 'success', secondary
+      .returns Q.resolve secondary
+
+    carousel = new CategoryCarousel category: new PartnerCategory id: 'id', name: 'Category'
+    carousel.fetch().then ->
+      carousel.partners.length.should.eql 6
+      _.each carousel.partners.slice(0, 3), (partner) ->
+        partner.id.should.containEql 'primary'
+      _.each carousel.partners.slice(3, 6), (partner) ->
+        partner.id.should.containEql 'secondary'
+
+  it 'uses more secondary if fewer primary are available', ->
+    primary = [fabricate('partner', id: 'primary_1'), fabricate('partner', id: 'primary_2')]
+    secondary = [fabricate('partner', id: 'secondary_1'), fabricate('partner', id: 'secondary_2'), fabricate('partner', id: 'secondary_3'), fabricate('partner', id: 'secondary_4')]
+    sinon.stub Backbone, 'sync'
+      .onCall 0
+      .yieldsTo 'success', primary
+      .returns Q.resolve primary
+      .onCall 1
+      .yieldsTo 'success', secondary
+      .returns Q.resolve secondary
+
+    carousel = new CategoryCarousel category: new PartnerCategory id: 'id', name: 'Category'
+    carousel.fetch().then ->
+      carousel.partners.length.should.eql 6
+      _.each carousel.partners.slice(0, 2), (partner) ->
+        partner.id.should.containEql 'primary'
+      _.each carousel.partners.slice(2, 6), (partner) ->
+        partner.id.should.containEql 'secondary'
+
+  it 'uses more primary if fewer secondary are available', ->
+    primary = [fabricate('partner', id: 'primary_1'), fabricate('partner', id: 'primary_2'), fabricate('partner', id: 'primary_3'), fabricate('partner', id: 'primary_4')]
+    secondary = [fabricate('partner', id: 'secondary_1'), fabricate('partner', id: 'secondary_2')]
+    sinon.stub Backbone, 'sync'
+      .onCall 0
+      .yieldsTo 'success', primary
+      .returns Q.resolve primary
+      .onCall 1
+      .yieldsTo 'success', secondary
+      .returns Q.resolve secondary
+
+    carousel = new CategoryCarousel category: new PartnerCategory id: 'id', name: 'Category'
+    carousel.fetch().then ->
+      carousel.partners.length.should.eql 6
+      _.each carousel.partners.slice(0, 4), (partner) ->
+        partner.id.should.containEql 'primary'
+      _.each carousel.partners.slice(4, 6), (partner) ->
+        partner.id.should.containEql 'secondary'
+
+  it 'uses all available partners if total partners < 6', ->
+    primary = [fabricate('partner', id: 'primary_1')]
+    secondary = [fabricate('partner', id: 'secondary_1'), fabricate('partner', id: 'secondary_2')]
+    sinon.stub Backbone, 'sync'
+      .onCall 0
+      .yieldsTo 'success', primary
+      .returns Q.resolve primary
+      .onCall 1
+      .yieldsTo 'success', secondary
+      .returns Q.resolve secondary
+
+    carousel = new CategoryCarousel category: new PartnerCategory id: 'id', name: 'Category'
+    carousel.fetch().then ->
+      carousel.partners.length.should.eql 3
+      _.each carousel.partners.slice(0, 1), (partner) ->
+        partner.id.should.containEql 'primary'
+      _.each carousel.partners.slice(1, 3), (partner) ->
+        partner.id.should.containEql 'secondary'


Dutch translation

Dutch translation

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

--- pivot.nl.coffee
+++ pivot.nl.coffee
@@ -0,0 +1,55 @@
+callWithJQuery = (pivotModule) ->
+    if typeof exports is "object" and typeof module is "object" # CommonJS
+        pivotModule require("jquery")
+    else if typeof define is "function" and define.amd # AMD
+        define ["jquery"], pivotModule
+    # Plain browser env
+    else
+        pivotModule jQuery
+
+callWithJQuery ($) ->
+    nf = $.pivotUtilities.numberFormat
+    tpl = $.pivotUtilities.aggregatorTemplates
+
+    frFmt =    nf(thousandsSep: " ", decimalSep: ",")
+    frFmtInt = nf(digitsAfterDecimal: 0, thousandsSep: " ", decimalSep: ",")
+    frFmtPct = nf(digitsAfterDecimal: 1, scaler: 100, suffix: "%", thousandsSep: " ", decimalSep: ",")
+
+    $.pivotUtilities.locales.fr =
+        localeStrings:
+            renderError: "Er is een fout opgetreden bij het renderen van de kruistabel.."
+            computeError: "Er is een fout opgetreden bij het berekenen van de kruistabel."
+            uiRenderError: "Er is een fout opgetreden bij het tekenen van de interface van de kruistabel."
+            selectAll: "Alles selecteren"
+            selectNone: "Niets selecteren"
+            tooMany: "(te veel waarden om weer te geven)"
+            filterResults: "Filter resultaten"
+            totals: "Totaal"
+            vs: "versus"
+            by: "per"
+
+        aggregators:
+            "Aantal":                              tpl.count(frFmtInt)
+            "Aantal unieke waarden":               tpl.countUnique(frFmtInt)
+            "Lijst unieke waarden":                tpl.listUnique(", ")
+            "Som":                                 tpl.sum(frFmt)
+            "Som van gehele getallen":             tpl.sum(frFmtInt)
+            "Gemiddelde":                          tpl.average(frFmt)
+            "Minimum":                             tpl.min(frFmt)
+            "Maximum":                             tpl.max(frFmt)
+            "Som over som":                        tpl.sumOverSum(frFmt)
+            "80% bovengrens":                      tpl.sumOverSumBound80(true, frFmt)
+            "80% ondergrens":        			   tpl.sumOverSumBound80(false, frFmt)
+            "Som in verhouding tot het totaal":    tpl.fractionOf(tpl.sum(),   "total", frFmtPct)
+            "Som in verhouding tot de rij":        tpl.fractionOf(tpl.sum(),   "row",   frFmtPct)
+            "Som in verhouding tot de kolom":      tpl.fractionOf(tpl.sum(),   "col",   frFmtPct)
+            "Aantal in verhouding tot het totaal": tpl.fractionOf(tpl.count(), "total", frFmtPct)
+            "Aantal in verhouding tot de rij":     tpl.fractionOf(tpl.count(), "row",   frFmtPct)
+            "Aantal in verhouding tot de kolom":   tpl.fractionOf(tpl.count(), "col",   frFmtPct)
+
+        renderers:
+            "Tabel":                           $.pivotUtilities.renderers["Table"]
+            "Tabel met staafdiagrammen":               $.pivotUtilities.renderers["Table Barchart"]
+            "Warmtekaart":                     $.pivotUtilities.renderers["Heatmap"]
+            "Warmtekaart per rij":             $.pivotUtilities.renderers["Row Heatmap"]
+            "Warmtekaart per kolom":           $.pivotUtilities.renderers["Col Heatmap"]


code style

code style

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/'


Fixed deprecated Express API usage

Fixed deprecated Express API usage

--- test/helpers.coffee
+++ test/helpers.coffee
@@ -40,19 +40,19 @@

 # Serve pages from localhost.
 server = express()
-server.use(bodyParser())
+server.use(bodyParser.urlencoded(extended: false))
 # Success page.
 server.get "/", (req, res)->
   res.send "Success!"
 # Not found
 server.get "/404", (req, res)->
-  res.send 404, "Not found"
+  res.status(404).send("Not found")
 # Internal error
 server.get "/500", (req, res)->
-  res.send 500, "Boom!"
+  res.status(500).send("Boom!")
 # Query string
 server.get "/query", (req, res)->
-  res.send 200, {name: req.param('name'), extra: req.param('extra')}
+  res.send {name: req.param('name'), extra: req.param('extra')}
 # Multiple set-cookie headers
 server.get "/set-cookie", (req, res)->
   res.cookie "c1", "v1"


preserve Palette when cloning a color

preserve Palette when cloning a color

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/aligerum/umbriel.git/'


Add comment about window.opener tweaks

Add comment about window.opener tweaks

--- atom/renderer/lib/override.coffee
+++ atom/renderer/lib/override.coffee
@@ -91,10 +91,10 @@
 window.prompt = ->
   throw new Error('prompt() is and will not be supported.')

-# Implement window.postMessage if current window is a guest window.
 guestId = ipcRenderer.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID'
 if guestId?
   window.opener = BrowserWindowProxy.getOrCreate(guestId)
+  # Remove BrowserWindowProxy API and give it a custom postMessage method
   Object.setPrototypeOf(window.opener, null)
   window.opener.postMessage = (message, targetOrigin='*') ->
     ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', guestId, message, targetOrigin, location.origin


Allow digits in JSX attribute names

Allow digits in JSX attribute names

It is valid JSX to have an attribute with a digit like:

    <example attr1="..." />

This diff adds digit support to the regex.

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


Correctly scrolls to the line when clicking

--- app/assets/javascripts/merge_request_tabs.js.coffee
+++ app/assets/javascripts/merge_request_tabs.js.coffee
@@ -88,7 +88,6 @@
       navBarHeight = $('.navbar-gitlab').outerHeight()

       $el = $("#{container} #{window.location.hash}")
-      $('body').scrollTo 0
       $.scrollTo("#{container} #{window.location.hash}", offset: -navBarHeight) if $el.length

   # Activate a tab based on the current action
@@ -163,8 +162,17 @@
         @scrollToElement("#diffs")
         @highlighSelectedLine()

+        $(document)
+          .off 'click', '.diff-content a'
+          .on 'click', '.diff-content a', (e) =>
+            e.preventDefault()
+            window.location.hash = $(e.currentTarget).attr 'href'
+            @highlighSelectedLine()
+            @scrollToElement("#diffs")
+
   highlighSelectedLine: ->
-    locationHash = location.hash
+    $('.hll').removeClass 'hll'
+    locationHash = window.location.hash

     if locationHash isnt ''
       hashClassString = ".#{locationHash.replace('#', '')}"


Fixed #64 (I hope; let's UX test.)

Fixed #64 (I hope; let's UX test.)

--- app/views/play/level/tome/problem_alert_view.coffee
+++ app/views/play/level/tome/problem_alert_view.coffee
@@ -24,7 +24,8 @@

   afterRender: ->
     super()
-    @$el.addClass('alert').addClass("alert-#{@problem.aetherProblem.level}")
+    @$el.addClass('alert').addClass("alert-#{@problem.aetherProblem.level}").hide().fadeIn('slow')
+    Backbone.Mediator.publish 'play-sound', trigger: 'error_appear', volume: 1.0

   onRemoveClicked: ->
     @$el.remove()


[codegen] Add ! as negation in type labels

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/demhydraz/cafe.git/'


OX-11 added ping strategy.coffee

OX-11 added ping strategy.coffee

error: pathspec 'app/assets/javascripts/oxalis/model/binary/ping_strategy.coffee' did not match any file(s) known to git

--- app/assets/javascripts/oxalis/model/binary/ping_strategy.coffee
+++ app/assets/javascripts/oxalis/model/binary/ping_strategy.coffee
@@ -0,0 +1,51 @@
+### define ###
+
+class PingStrategy
+
+  velocityRangeStart : 0
+  velocityRangeEnd : 0
+
+  roundTripTimeRangeStart : 0
+  roundTripTimeRangeEnd : 0
+
+
+  inVelocityRange : (value) ->
+
+    @velocityRangeStart <= value <= @velocityRangeEnd
+
+
+  inRoundTripTimeRange : (value) ->
+
+    @roundTripTimeRangeStart <= value <= @roundTripTimeRangeEnd
+
+
+  ping : ->
+
+    throw "Needs to be implemented in subclass"
+    {
+      pullQueue : [ x0, y0, z0, zoomStep0, x1, y1, z1, zoomStep1 ]
+      extent : { min_x, min_y, min_z, max_x, max_y, max_z }
+    }
+
+
+  getExtentObject : (poly0, poly1, zoom0, zoom1) ->
+
+    min_x : Math.min(poly0.min_x << zoom0, poly1.min_x << zoom1)
+    min_y : Math.min(poly0.min_y << zoom0, poly1.min_y << zoom1)
+    min_z : Math.min(poly0.min_z << zoom0, poly1.min_z << zoom1)
+    max_x : Math.max(poly0.max_x << zoom0, poly1.max_x << zoom1)
+    max_y : Math.max(poly0.max_y << zoom0, poly1.max_y << zoom1)
+    max_z : Math.max(poly0.max_z << zoom0, poly1.max_z << zoom1)
+
+
+  modifyMatrixForPoly : (matrix, zoomStep) ->
+
+    matrix[12] >>= (5 + zoomStep)
+    matrix[13] >>= (5 + zoomStep)
+    matrix[14] >>= (5 + zoomStep)
+    matrix[12] += 1
+    matrix[13] += 1
+    matrix[14] += 1
+
+
+PingStrategy


fix: delete  after delete

fix: delete  after delete

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/kruschid/angular-resource-controller.git/'