Updated pt-BR.coffee

Updated pt-BR.coffee

Translated a few things on the file~

I saw the clans and account_invoices section titles commented out and
was unsure about what to do with them. Translated the items related to
them but left them commented out.

--- app/locale/pt-BR.coffee
+++ app/locale/pt-BR.coffee
@@ -158,7 +158,7 @@
     unwatch: "Não Observar"
     submit_patch: "Enviar arranjo"
     submit_changes: "Enviar mudanças"
-#    save_changes: "Save Changes"
+    save_changes: "Salvar mudanças"

   general:
     and: "e"
@@ -262,9 +262,9 @@
     victory_hour_of_code_done_yes: "Sim, eu terminei minha Hora da Programação!"
     victory_experience_gained: "XP ganho"
     victory_gems_gained: "Gems ganhas"
-#    victory_new_item: "New Item"
-#    victory_viking_code_school: "Holy smokes, that was a hard level you just beat! If you aren't already a software developer, you should be. You just got fast-tracked for acceptance with Viking Code School, where you can take your skills to the next level and become a professional web developer in 14 weeks."
-#    victory_become_a_viking: "Become a Viking"
+    victory_new_item: "Novo item"
+	victory_viking_code_school: "Pelas barbas do profeta, esse foi um nível difícil! Se você ainda não é um desenvolvedor de software, você deveria ser. Você acaba de ser priorizado para aceitação na Viking Code School, onde você pode aprender mais e se tornar um desenvolvedor web profissional em 14 semanas."
+    victory_become_a_viking: "Torne-se um viking"
     guide_title: "Guia"
     tome_minion_spells: "Magias dos seus subordinados" # Only in old-style levels.
     tome_read_only_spells: "Magias não editáveis" # Only in old-style levels.
@@ -292,11 +292,11 @@
     time_current: "Agora:"
     time_total: "Máximo:"
     time_goto: "Ir para:"
-#    non_user_code_problem_title: "Unable to Load Level"
-#    infinite_loop_title: "Infinite Loop Detected"
-#    infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
-#    check_dev_console: "You can also open the developer console to see what might be going wrong."
-#    check_dev_console_link: "(instructions)"
+    non_user_code_problem_title: "Erro ao carregar o nível"
+    infinite_loop_title: "Loop Infinito Detectado"
+	infinite_loop_description: "O código inicial para construir o mundo nunca parou de rodar. Talvez seja muito lento ou tenha um loop infinito. Ou talvez tenha um bug. Você pode tentar rodar este código novamente ou resetá-lo para o estado inicial. Se isto não consertá-lo, avise-nos por favor."
+	check_dev_console: "Você também pode abrir o terminal do desenvolvedor para ver o que pode estar dando errado."
+    check_dev_console_link: "(instruções)"
     infinite_loop_try_again: "Tentar novamente"
     infinite_loop_reset_level: "Resetar nível"
     infinite_loop_comment_out: "Comentar Meu Código"
@@ -413,7 +413,7 @@
     feature4: "3500 gemas bônus todo mês!"
     feature5: "Vídeo tutorials"
     feature6: "Suporte via e-mail Premium"
-#    feature7: "Private Clans"
+    feature7: "Clãs Privados"
     free: "Grátis"
     month: "mês"
     subscribe_title: "Inscrever-se"
@@ -439,31 +439,31 @@
 #    parents_blurb1a: "Computer programming is an essential skill that your child will undoubtedly use as an adult. By 2020, basic software skills will be needed by 77% of jobs, and software engineers are in high demand across the world. Did you know that Computer Science is the highest-paid university degree?"
     parents_blurb2: "Apenas $9.99 USD/mês, eles recebem novos desafios todo mês e suporte no email pessoal de programadores profissionais." # {change}
     parents_blurb3: "Sem risco: 100% devolução do dinheiro garantida, basta um simples clique em desinscrever-se."
-#    payment_methods: "Payment Methods"
-#    payment_methods_title: "Accepted Payment Methods"
-#    payment_methods_blurb1: "We currently accept credit cards and Alipay."
-#    payment_methods_blurb2: "If you require an alternate form of payment, please contact"
+    payment_methods: "Formas de pagamento"
+    payment_methods_title: "Formas de pagamento aceitas"
+    payment_methods_blurb1: "Aceitamos cartões de crédito e Alipay no momento."
+    payment_methods_blurb2: "Se você precisa de outra forma de pagamento, por favor contate"
     stripe_description: "Inscrição Mensal"
     subscription_required_to_play: "Você precisará se inscrever para jogar este nível."
     unlock_help_videos: "Inscreva-se para desbloquear todos os vídeos tutoriais."
-#    personal_sub: "Personal Subscription" # Accounts Subscription View below
+    personal_sub: "Inscrição individual" # Accounts Subscription View below
 #    loading_info: "Loading subscription information..."
 #    managed_by: "Managed by"
-#    will_be_cancelled: "Will be cancelled on"
+    will_be_cancelled: "Será cancelada em"
 #    currently_free: "You currently have a free subscription"
 #    currently_free_until: "You currently have a free subscription until"
 #    was_free_until: "You had a free subscription until"
 #    managed_subs: "Managed Subscriptions"
 #    managed_subs_desc: "Add subscriptions for other players (students, children, etc.)"
 #    managed_subs_desc_2: "Recipients must have a CodeCombat account associated with the email address you provide."
-#    group_discounts: "Group discounts"
-#    group_discounts_1: "We also offer group discounts for bulk subscriptions."
+    group_discounts: "Descontos para grupos"
+    group_discounts_1: "Nós também oferecemos descontos para grupos para inscrições em grande quantidades."
 #    group_discounts_1st: "1st subscription"
-#    group_discounts_full: "Full price"
+    group_discounts_full: "Preço normal"
 #    group_discounts_2nd: "Subscriptions 2-11"
-#    group_discounts_20: "20% off"
+    group_discounts_20: "20% de desconto"
 #    group_discounts_12th: "Subscriptions 12+"
-#    group_discounts_40: "40% off"
+    group_discounts_40: "20% de desconto"
 #    subscribing: "Subscribing..."
 #    recipient_emails_placeholder: "Enter email address to subscribe, one per line."
 #    subscribe_users: "Subscribe Users"
@@ -592,29 +592,29 @@

   teachers:
     title: "CodeCombat para Professores" # {change}
-#    intro_1: "CodeCombat is an online game that teaches programming. Students write code in real programming languages."
-#    intro_2: "No experience required!"
-#    free_title: "How much does it cost?"
-#    cost_china: "CodeCombat in China is free for the first five levels, after which it costs $9.99 USD per month for access to our other 140+ levels on our exclusive China servers."
-#    free_1: "CodeCombat Basic is FREE! There are 80+ free levels which cover every concept."
-#    free_2: "A monthly subscription provides access to video tutorials and extra practice levels."
-#    teacher_subs_title: "Teachers get free subscriptions!"
-#    teacher_subs_1: "Please contact"
-#    teacher_subs_2: "to set up a free monthly subscription."
-#    sub_includes_title: "What is included in the subscription?"
-#    sub_includes_1: "In addition to the 80+ basic levels, students with a monthly subscription get access to these additional features:"
-#    sub_includes_2: "60+ practice levels"
-#    sub_includes_3: "Video tutorials"
-#    sub_includes_4: "Premium email support"
-#    sub_includes_5: "7 new heroes with unique skills to master"
-#    sub_includes_6: "3500 bonus gems every month"
-#    sub_includes_7: "Private Clans"
-#    monitor_progress_title: "How do I monitor student progress?"
-#    monitor_progress_1: "Student progress can be monitored by creating a"
-#    monitor_progress_2: "for your class."
-#    monitor_progress_3: "To add a student, send them the invite link for your Clan, which is on the"
-#    monitor_progress_4: "page."
-#    monitor_progress_5: "After they join, you will see a summary of the student's progress on your Clan's page."
+    intro_1: "CodeCombat é um jogo online que ensina programação. Estudantes criam código em linguagens de programação usadas na vida real."
+    intro_2: "Não é necessário ter experiência!"
+    free_title: "Quanto custa?"
+    cost_china: "CodeCombat na China é gratuito para os primeiros cinco níveis, depois disso o valor mensal para ter acesso a mais de 140 níveis nos nossos servidores exclusivos na China é de $9.99 dólares americanos."
+    free_1: "CodeCombat Basic é gratuito! Há mais de 80 níveis gratuitos que cobrem todos os conceitos."
+    free_2: "Uma assinatura mensal dá acesso aos vídeos tutoriais e mais níveis para praticar."
+    teacher_subs_title: "Professores recebem assinaturas gratuitas!"
+    teacher_subs_1: "Por favor contate"
+    teacher_subs_2: "para organizar uma assinatura mensal."
+    sub_includes_title: "O que está incluído na assinatura?"
+    sub_includes_1: "Além dos mais de 80 níveis básicos, estudantes com uma assinatura mensal têm acesso aos seguintes recursos:"
+    sub_includes_2: "Mais de 60 níveis para praticar"
+    sub_includes_3: "Vídeos tutoriais"
+    sub_includes_4: "Suporte premium por email"
+    sub_includes_5: "7 novos heróis com habilidades únicas a serem aprendidas"
+    sub_includes_6: "3500 gemas bônus todos os meses"
+    sub_includes_7: "Clãs Privados"
+    monitor_progress_title: "Como monitoro o progresso dos estudantes?"
+    monitor_progress_1: "O progresso dos estudantes pode ser monitorado ao criar"
+    monitor_progress_2: "para sua turma."
+    monitor_progress_3: "Para adicionar estudantes, envie-os o link de convite para seu clã, que está na"
+    monitor_progress_4: "página."
+    monitor_progress_5: "Depois que eles se juntarem ao seu Clã, você verá um resumo do progresso dos estudantes na página do seu Clã."
 #    private_clans_1: "Private Clans provide increased privacy and detailed progress information for each student."
 #    private_clans_2: "To create a private Clan, check the 'Make clan private' checkbox when creating a"
 #    private_clans_3: "."
@@ -748,48 +748,48 @@
     social_hipchat: "Converse conosco na sala pública do CodeCombat no HipChat"
     contribute_to_the_project: "Contribuir para o projeto"

-#  clans:
-#    clan: "Clan"
-#    clans: "Clans"
-#    new_name: "New clan name"
-#    new_description: "New clan description"
-#    make_private: "Make clan private"
-#    subs_only: "subscribers only"
-#    create_clan: "Create New Clan"
-#    public_clans: "Public Clans"
-#    my_clans: "My Clans"
-#    clan_name: "Clan Name"
-#    name: "Name"
-#    chieftain: "Chieftain"
-#    type: "Type"
-#    edit_clan_name: "Edit Clan Name"
-#    edit_clan_description: "Edit Clan Description"
-#    edit_name: "edit name"
-#    edit_description: "edit description"
-#    private: "(private)"
-#    summary: "Summary"
-#    average_level: "Average Level"
-#    average_achievements: "Average Achievements"
-#    delete_clan: "Delete Clan"
-#    leave_clan: "Leave Clan"
-#    join_clan: "Join Clan"
-#    invite_1: "Invite:"
-#    invite_2: "*Invite players to this Clan by sending them this link."
-#    members: "Members"
-#    progress: "Progress"
-#    not_started_1: "not started"
-#    started_1: "started"
-#    complete_1: "complete"
-#    exp_levels: "Expand levels"
-#    rem_hero: "Remove Hero"
-#    status: "Status"
-#    complete_2: "Complete"
-#    started_2: "Started"
-#    not_started_2: "Not Started"
-#    view_solution: "Click to view solution."
-#    latest_achievement: "Latest Achievement"
-#    playtime: "Playtime"
-#    last_played: "Last played"
+#  clans: # I have translated the following items, should they be uncommented? Saw the section title commented out and was unsure about it.
+#    clan: "Clã"
+#    clans: "Clãs"
+#    new_name: "Novo nome para o clã"
+#    new_description: "Nova descrição para o clã"
+#    make_private: "Tornar o clã privado"
+#    subs_only: "Apenas para assinantes"
+#    create_clan: "Criar novo clã"
+#    public_clans: "Clãs Públicos"
+#    my_clans: "Meus Clãs"
+#    clan_name: "Nome do Clã"
+#    name: "Nome"
+#    chieftain: "Chefe"
+#    type: "Tipo"
+#    edit_clan_name: "Editar o nome do Clã"
+#    edit_clan_description: "Editar a descrição do Clã"
+#    edit_name: "Editar nome"
+#    edit_description: "Editar descrição"
+#    private: "(privado)"
+#    summary: "Resumo"
+#    average_level: "Média de nível"
+#    average_achievements: "Médias de conquistas"
+#    delete_clan: "Deletar Clã"
+#    leave_clan: "Sair do Clã"
+#    join_clan: "Juntar-se ao Clã"
+#    invite_1: "Convidar:"
+#    invite_2: "*Convide jogadores para este Clã enviando-os este link."
+#    members: "Membros"
+#    progress: "Progresso"
+#    not_started_1: "Não iniciado"
+#    started_1: "Iniciado"
+#    complete_1: "Completado"
+#    exp_levels: "Mostrar níveis"
+#    rem_hero: "Remover herói"
+#    status: "Estado"
+#    complete_2: "Completado"
+#    started_2: "Iniciado"
+#    not_started_2: "Não Iniciado"
+#    view_solution: "Clique para ver a solução."
+#    latest_achievement: "Última Conquista"
+#    playtime: "Tempo de Jogo"
+#    last_played: "Último Jogo"

   classes:
     archmage_title: "Arquimago"
@@ -1039,7 +1039,7 @@
     no_achievements: "Nenhuma conquista ganha ainda."
     favorite_prefix: "Linguagem favorita é "
     favorite_postfix: "."
-#    not_member_of_clans: "Not a member of any clans yet."
+    not_member_of_clans: "Ainda não é membro de nenhum clã."

   achievements:
     last_earned: "Últimos Ganhos"
@@ -1065,7 +1065,7 @@
     payments: "Pagamentos"
     purchased: "Comprado"
     subscription: "Assinatura"
-#    invoices: "Invoices"
+    invoices: "Faturas"
     service_apple: "Apple"
     service_web: "Web"
     paid_on: "Pago"
@@ -1082,15 +1082,15 @@
     status_unsubscribed_active: "Você não é um assinante e não será cobrado, mas sua conta ainda está ativa."
     status_unsubscribed: "Ganhe acesso a novos níveis, heróis, itens, e gemas bônus com uma assinatura CodeCombat!"

-#  account_invoices:
-#    amount: "Amount in US dollars"
-#    declined: "Your card was declined"
-#    invalid_amount: "Please enter a US dollar amount."
-#    not_logged_in: "Log in or create an account to access invoices."
-#    pay: "Pay Invoice"
-#    purchasing: "Purchasing..."
-#    retrying: "Server error, retrying."
-#    success: "Successfully paid. Thanks!"
+#  account_invoices: # Also translated these ones but I am unsure if I should uncomment them.
+#    amount: "Valor em dólares americanos"
+#    declined: "Seu cartão foi recusado"
+#    invalid_amount: "Coloque o valor em dólares americanos."
+#    not_logged_in: "Entre no site com sua conta ou crie uma conta para acessar suas faturas."
+#    pay: "Pagar Faturas"
+#    purchasing: "Comprando..."
+#    retrying: "Erro de servidor, tentando novamente."
+#    success: "A transação foi completada com sucesso. Obrigado!"

   loading_error:
     could_not_load: "Erro ao carregar do servidor"
@@ -1145,7 +1145,7 @@
     user_remarks: "Observações do Usuário"
     versions: "Versões"
     items: "Itens"
-#    hero: "Hero"
+    hero: "Herói"
     heroes: "Heróis"
     achievement: "Conquista"
     clas: "CLAs"


Script for fetching extra info for repository

error: pathspec 'repo-extra-info.coffee' did not match any file(s) known to git

--- repo-extra-info.coffee
+++ repo-extra-info.coffee
@@ -0,0 +1,3 @@
+db = require './db'
+async = require 'async'
+mongoose = require 'mongoose'


old tests

old tests

--- apps/articles/test/client.coffee
+++ apps/articles/test/client.coffee
@@ -1,86 +0,0 @@
-_ = require 'underscore'
-benv = require 'benv'
-sinon = require 'sinon'
-Backbone = require 'backbone'
-Article = require '../../../models/article'
-Articles = require '../../../collections/articles'
-CurrentUser = require '../../../models/current_user'
-fixtures = require '../../../test/helpers/fixtures.coffee'
-{ resolve } = require 'path'
-{ fabricate } = require 'antigravity'
-{ stubChildClasses } = require '../../../test/helpers/stubs'
-
-describe 'ArticleView', ->
-
-  before (done) ->
-    benv.setup =>
-      benv.expose $: benv.require 'jquery'
-      $.fn.imagesLoaded = sinon.stub()
-      Backbone.$ = $
-      { @ArticleView } = mod = benv.requireWithJadeify(
-        resolve(__dirname, '../client/show')
-        ['artworkItemTemplate', 'editTemplate']
-      )
-      mod.__set__ 'CurrentUser', { orNull: ->
-        new CurrentUser _.extend( fabricate('user') , { 'id' : '4d8cd73191a5c50ce210002a' } ) }
-      mod.__set__ 'imagesLoaded', sinon.stub()
-      stubChildClasses mod, this,
-        ['initCarousel']
-        []
-      benv.render resolve(__dirname, '../templates/show.jade'), @locals = {
-        footerArticles: new Backbone.Collection
-        slideshowArtworks: null
-        article: @article = new Article _.extend fixtures.article,
-          sections: [
-            { type: 'text', body: 'Foo' }
-            {
-              type: 'artworks',
-              ids: ['5321b73dc9dc2458c4000196', '5321b71c275b24bcaa0001a5'],
-              layout: 'overflow_fillwidth'
-            }
-        ]
-        author: new Backbone.Model fabricate 'user'
-        sd: {}
-        asset: (->)
-        embedVideo: require('embed-video')
-        moment: require('moment')
-        resize: sinon.stub()
-      }, =>
-        done()
-
-  after ->
-    benv.teardown()
-
-  beforeEach ->
-    sinon.stub Backbone, 'sync'
-    @view = new @ArticleView el: $('body'), article: @article
-
-  afterEach ->
-    Backbone.sync.restore()
-
-  describe '#renderSlideshow', ->
-
-    it 'renders the slideshow', ->
-      @view.renderSlideshow()
-      @initCarousel.called.should.be.ok
-
-  describe '#renderArtworks', ->
-
-    it 'renders artworks from the article', ->
-      Backbone.sync.restore()
-      sinon.stub Backbone, 'sync'
-      @view.renderArtworks()
-      for arg in Backbone.sync.args
-        arg[2].success fabricate 'artwork',
-          title: 'Andy Foobar Flowers'
-          _id: '5321b73dc9dc2458c4000196'
-      @view.$el.html().should.containEql 'Andy Foobar Flowers'
-
-  describe '#checkEditable', ->
-
-    it 'shows the edit button when the author_id matches user and the user has \
-        partner access', ->
-      @view.user.set has_partner_access: true
-      @view.article.set author_id: @view.user.id
-      @view.checkEditable()
-      @view.renderedEditButton.should.be.ok


--- atom/browser/api/lib/menu.coffee
+++ atom/browser/api/lib/menu.coffee
@@ -1,6 +1,7 @@
 BrowserWindow = require 'browser-window'
 EventEmitter = require('events').EventEmitter
 MenuItem = require 'menu-item'
+v8Util = process.atomBinding 'v8_util'

 bindings = process.atomBinding 'menu'

@@ -51,13 +52,8 @@
         activeItem = @commandsMap[commandId]
         # Manually flip the checked flags when clicked.
         if activeItem?
-          switch activeItem.type
-            when 'checkbox'
-              activeItem.checked = !activeItem.checked
-            when 'radio'
-              for item in @groupsMap[activeItem.groupId]
-                item.checked = false
-              activeItem.checked = true
+          if activeItem.type in ['checkbox', 'radio']
+            activeItem.checked = !activeItem.checked
           activeItem.click()

   switch item.type
@@ -70,6 +66,17 @@
       item.groupId = generateGroupId(@items, pos)
       @groupsMap[item.groupId] ?= []
       @groupsMap[item.groupId].push item
+
+      # Setting a radio menu item should flip other items in the group.
+      v8Util.setHiddenValue item, 'checked', item.checked
+      Object.defineProperty item, 'checked',
+        enumerable: true
+        get: -> v8Util.getHiddenValue item, 'checked'
+        set: (val) =>
+          for otherItem in @groupsMap[item.groupId]
+            v8Util.setHiddenValue otherItem, 'checked', false
+          v8Util.setHiddenValue item, 'checked', true
+
       @insertRadioItem pos, item.commandId, item.label, item.groupId

   @setSublabel pos, item.sublabel if item.sublabel?


bug fix on isEmpty method

bug fix on isEmpty method

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/MicrosmartSA/ubiquity-ui.git/'


Add make_me.coffee

Add make_me.coffee

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

--- src/make_me.coffee
+++ src/make_me.coffee
@@ -0,0 +1,114 @@
+# Description
+#   Companion Hubot script for operating
+#   https://github.com/make-me/make-me/
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   The make-me HTTP server location, username and password
+#   can be configured from the enviornment with `$HUBOT_MAKE_ME_URL`,
+#   `$HUBOT_MAKE_ME_USER` and `$HUBOT_MAKE_ME_PASS`
+#
+# Commands:
+#   hubot 3d me <url..url_n> [options] - 3D Print the URLs
+#   hubot 3d?                          - Show some help
+#
+# Notes:
+#   None
+#
+# Author:
+#   @sshirokov and @skalnik
+util = require 'util'
+qs = require 'querystring'
+
+makeServer = process.env.HUBOT_MAKE_ME_URL or 'http://localhost:9393'
+[authUser, authPass] = [process.env.HUBOT_MAKE_ME_USER or 'hubot', process.env.HUBOT_MAKE_ME_PASS or 'isalive']
+auth64 = (new Buffer("#{authUser}:#{authPass}")).toString("base64")
+
+module.exports = (robot) ->
+  robot.respond /3d\??$/i, (msg) ->
+    response = "#{robot.name} 3d me [STL URLs] [[options]] - prints an STL file\n" +
+               "  You can list multiple URLs separated by spaces.\n" +
+               "\n" +
+               "  Options can follow the URL and are:\n" +
+               "    '(high|medium|low) quality' -- sets the quality of the print. Default: medium\n" +
+               "    'xN' (e.g. x2)              -- print more than one of a thing at once\n" +
+               "    'with supports'             -- adds supports to the model, for complex overhangs. Default: disabled\n" +
+               "    'xx% solid'                 -- changes how solid the object is on the inside. Default: 5%\n" +
+               "    'scale by X.Y' (e.g. 0.5)   -- scale the size of the model by a factor
+               "#{robot.name} 3d snapshot - takes a picture and tells you the locked status\n" +
+               "#{robot.name} 3d unlock - unlocks the printer after you clean up\n\n" +
+               "Only 1 print at a time is allowed, and you are required to tell\n" +
+               "#{robot.name} after you've cleaned your print off.\n\n" +
+               "The most current log is always available at #{makeServer}/log"
+    msg.send response
+
+  robot.respond /3d (snapshot|status)/i, (msg) ->
+    locked_msg = "unlocked"
+    msg.http(makeServer + "/lock")
+      .header("Authorization", "Basic #{auth64}")
+      .get() (err, res, body) =>
+        if res.statusCode is 423
+          locked_msg = "locked"
+    msg.http(makeServer).scope('photo')
+      .get() (err, res, body) =>
+        if res.statusCode is 302
+          msg.reply "I can't see anything, what does it look like to you? I hear the machine is #{locked_msg}."
+          msg.send res.headers.location
+        else
+          msg.reply "I can't seem to get a hold of a picture for you, but the internets tell me the machine is #{locked_msg}."
+
+  robot.respond /3d unlock( me)?/i, (msg) ->
+    msg.http(makeServer + "/lock")
+      .header("Authorization", "Basic #{auth64}")
+      .post(qs.encode({"_method": "DELETE"})) (err, res, body) =>
+        if res.statusCode is 200
+          msg.reply "Oh you finally decided to clean up?"
+        else if res.statusCode is 404
+          msg.reply "There's no lock. Go print something awesome!"
+        else
+          msg.reply "Unexpected status code #{res.statusCode}!"
+          msg.reply body
+
+  robot.respond /(3d|make)( me)?( a)? (http[^\s]+)\s*(.*)/i, (msg) ->
+    things = [msg.match[4]]
+    count = 1
+    scale = 1.0
+    config = 'default'
+    quality = 'medium'
+    density = 0.05
+    options = msg.match[5]
+
+    # Extract any extra urls
+    while url = /(http[^\s]+)\s?/.exec(options)
+      things.push url[1]
+      options = options.slice(url[1].length + 1)
+
+    if count_op = /x(\d+)/.exec(options)
+      count = parseInt(count_op[1])
+
+    if /with support/.exec(options)
+      config = 'support'
+
+    if quality_op = /(\w+) quality/.exec(options)
+      quality = quality_op[1]
+
+    if density_op = /(\d+)% solid/.exec(options)
+      density = parseFloat(density_op[1]) / 100.0
+
+    if scale_op = /scale by (\d+\.\d+)/.exec(options)
+      scale = parseFloat(scale_op[1])
+
+    msg.reply "Talking to the 3d printer to print #{things.length} models '#{options}'..."
+    msg.http(makeServer + "/print")
+      .header("Authorization", "Basic #{auth64}")
+      .post(JSON.stringify({url: things, count: count, scale: scale, quality: quality, density: density, config: config})) (err, res, body) =>
+        if res.statusCode is 200
+          msg.reply "Your thing is printin'! Check logs at #{makeServer}/log"
+        else if res.statusCode is 409
+          msg.reply "I couldn't process that pile of triangles."
+        else if res.statusCode is 423
+          msg.reply "Wait your turn, someone is already printing a thing. You can check progress at #{makeServer}/log"
+        else if err or res.statusCode is 500
+          msg.reply "Something broke!"


made the coffee file

made the coffee file

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

--- js/coffee.coffee
+++ js/coffee.coffee
@@ -0,0 +1 @@
+# Empty file to start with


Changes to fix infinite posting.

Changes to fix infinite posting.

--- server/users/user_handler.coffee
+++ server/users/user_handler.coffee
@@ -103,8 +103,8 @@

     # Name setting
     (req, user, callback) ->
-      return callback(null, req, user) unless req.body.name or user.get('name')
-      nameLower = req.body.name?.toLowerCase() or user.get('nameLower')
+      return callback(null, req, user) unless req.body.name
+      nameLower = req.body.name?.toLowerCase()
       # return callback(null, req, user) if nameLower is user.get('nameLower')
       User.findOne({nameLower:nameLower,anonymous:false}).exec (err, otherUser) ->
         log.error "Database error setting user name: #{err}" if err


pass more debug info to the client with errors

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/clochix/cozy-emails.git/'


:bug: Wait for connection end to get completed data;

--- src/browser/atom-application.coffee
+++ src/browser/atom-application.coffee
@@ -138,7 +138,11 @@
     return unless @socketPath?
     @deleteSocketFile()
     server = net.createServer (connection) =>
-      connection.on 'data', (data) =>
+      data = ''
+      connection.on 'data', (chunk) ->
+        data = data + chunk
+
+      connection.on 'end', =>
         options = JSON.parse(data)
         @openWithOptions(options)


removed max distance, allowed distractor stars to be closer

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


Fixed DragDropSelect Demo

Fixed DragDropSelect Demo

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/programmfabrik/coffeescript-ui-demo.git/'


browser utils refactoring

browser utils refactoring

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


fix code style, remove try/catch

fix code style, remove try/catch

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


Remove empty line

Remove empty line

--- server/methods/deleteMessage.coffee
+++ server/methods/deleteMessage.coffee
@@ -9,7 +9,6 @@

 		hasPermission = RocketChat.authz.hasPermission(Meteor.userId(), 'delete-message', originalMessage.rid)
 		deleteAllowed = RocketChat.settings.get 'Message_AllowDeleting'
-

 		deleteOwn = originalMessage?.u?._id is Meteor.userId()


add educast-bot

add educast-bot

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

--- scripts/educast.coffee
+++ scripts/educast.coffee
@@ -0,0 +1,4 @@
+
+module.export = (robot) ->
+        robot.respond /educast (.*)/i, (res) ->
+                res.send "https://beta.educast.pro/search/?q=#{res.match[1]}"


Changed respond to hear

Changed respond to hear

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


clio-26384 Fix failing tests

clio-26384 Fix failing tests

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/seanhealy/lib-themisui.git/'


Move out translation for validation errors

It should be done in the main application.
Because we never know what’s the best time to translate
  and if custom locale translations are loaded yet.

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


Fix double-quote lint error.

Fix double-quote lint 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/RobotSnacks/stout-server.git/'


router for new ember fronted

router for new ember fronted

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

--- review_front/app/router.coffee
+++ review_front/app/router.coffee
@@ -0,0 +1,12 @@
+`import Ember from 'ember';`
+`import config from './config/environment';`
+
+Router = Ember.Router.extend
+  location: config.locationType
+
+Router.map ->
+  @resource 'projects', ->
+    @resource 'project', path: '/:project_id'
+
+`export default Router;`
+


Question marks instead of sunglasses.

Question marks instead of sunglasses.

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/cganas/picoCTF-web.git/'


adding beerme script that will serve beer

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

--- scripts/beerme.coffee
+++ scripts/beerme.coffee
@@ -0,0 +1,38 @@
+# Description:
+#   None
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot beer me - Grab me a beer
+#
+# Author:
+#  houndbee
+
+beers = [
+  "http://organicxbenefits.com/wp-content/uploads/2011/11/organic-beer-health-benefits.jpg",
+  "http://www.beer100.com/images/beermug.jpg",
+  "http://www.bristolvantage.com/wp-content/uploads/2012/02/beer-calories1.jpg",
+  "http://blog.collegebars.net/uploads/10-beers-you-must-drink-this-summer/10-beers-you-must-drink-this-summer-sam-adams-summer-ale.jpg",
+  "http://media.treehugger.com/assets/images/2011/10/save-the-beers.jpg",
+  "http://poemsforkush.files.wordpress.com/2012/04/beer.jpg",
+  "http://www.wirtzbeveragegroup.com/wirtzbeveragenevada/wp-content/uploads/2010/06/Beer.jpg",
+  "http://www.walyou.com/blog/wp-content/uploads/2010/06/giant-beer-glass-fathers-day-beer-gadgets-2010.jpg",
+  "http://images.free-extras.com/pics/f/free_beer-911.jpg",
+  "http://images.seroundtable.com/android-beer-dispenser-1335181876.jpg",
+  "http://www.mediabistro.com/fishbowlDC/files/original/beer-will-change-the-world.jpg",
+  "http://www.gqindia.com/sites/default/files/imagecache/article-inner-image-341-354/article/slideshow/1289/beer.JPG",
+  "http://www.gqindia.com/sites/default/files/imagecache/article-inner-image-341-354/article/slideshow/1289/beer2.jpg",
+  "http://www.gqindia.com/sites/default/files/imagecache/article-inner-image-341-354/article/slideshow/1289/Beer3.jpg",
+  "http://365thingsaustin.com/wp-content/uploads/beer-flight1.jpg",
+  "http://i102.photobucket.com/albums/m109/beanbone/Austin_Amber_200.jpg",
+  "http://media.culturemap.com/crop/c8/a3/600x450/beer_tasting.jpg"
+]
+
+module.exports = (robot) ->
+  robot.hear /.*(beer me).*/i, (msg) ->
+    msg.send msg.random beers


add bootstrap/collapse js components

add bootstrap/collapse js components

--- app/assets/javascripts/admin.js.coffee
+++ app/assets/javascripts/admin.js.coffee
@@ -1,3 +1,4 @@
 #= require jquery
 #= require jquery_ujs
 #= require turbolinks
+#= require bootstrap/collapse


Add method to parse bootstrapped json data and initialize it in with a constructor

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


Remove height changes when manipulating nodes

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/robb-broome/jinglepie.git/'


bind selects in edit

bind selects in edit


Adds comment about event listener

Adds comment about event listener

--- app/assets/javascripts/notes.js.coffee
+++ app/assets/javascripts/notes.js.coffee
@@ -64,6 +64,7 @@
     # fetch notes when tab becomes visible
     $(document).on "visibilitychange", @visibilityChange

+    # when issue status changes, we need to refresh data
     $(document).on "issuable:change", @refresh

   cleanBinding: ->


Avoid double-escaping strings

Avoid double-escaping strings

--- app/assets/javascripts/backbone/views/show_activity.js.coffee
+++ app/assets/javascripts/backbone/views/show_activity.js.coffee
@@ -16,7 +16,7 @@
       if modified_message != false
         @compiled_template = modified_message
       else
-        @compiled_template = Kandan.Helpers.Activities.build_from_message_template $.extend(activity, {content: _.escape(activity.content)})
+        @compiled_template = Kandan.Helpers.Activities.build_from_message_template activity

     $(@el).data('activity_id', activity.id)
     $(@el).attr('id', "activity-#{activity.id}")


test(calculator): add tests for service

test(calculator): add tests for service

error: pathspec 'src/app/calculator/tests/service.tests.coffee' did not match any file(s) known to git

--- src/app/calculator/tests/service.tests.coffee
+++ src/app/calculator/tests/service.tests.coffee
@@ -0,0 +1,134 @@
+describe 'Service: calculator', ->
+  service = undefined
+
+  beforeEach module('calculator.service')
+
+  beforeEach inject((calculatorService) ->
+    service = calculatorService
+  )
+
+  it 'should calculate BMR for a male', ->
+    info =
+      gender: 'male'
+      weight: 70
+      height: 178
+      age: 25
+
+    expectedBMR = 1693
+    expect(service.calculateBMR(info)).to.equal expectedBMR
+
+  it 'should calculate BMR for a female', ->
+    info =
+      gender: 'female'
+      weight: 70
+      height: 178
+      age: 25
+
+    expectedBMR = 1527
+    expect(service.calculateBMR(info)).to.equal expectedBMR
+
+  it 'should calculate TDEE for a given activity level',  ->
+    activity = 1.2
+    bmr = 1693
+    expectedTDEE = 2032
+
+    expect(service.calculateTDEE(activity, bmr)).to.equal expectedTDEE
+
+
+  it "should calculate leangains data", ->
+    tdee = 2032
+
+    info =
+      weight: 70
+      units: 'metric'
+
+    diet =
+      calorieCycle: 'recomp'
+      protein: 3
+      carbFatSplit: 'half'
+
+    expectedResult =
+      restDayCalories: 1626
+      workoutDayCalories: 2438
+      macros:
+        proteins: 210
+        proteinsCalories: 840
+        rest:
+          carbs: 98
+          carbsCalories: 393
+          fat: 44
+          fatCalories: 393
+        workout:
+          carbs: 200
+          carbsCalories: 799
+          fat: 89
+          fatCalories: 799
+
+    result = service.calculateLeangains(tdee, diet, info)
+    expect(result).to.deep.equal expectedResult
+
+  it "should calculate leangains data with custom calorie split", ->
+    tdee = 2032
+
+    info =
+      weight: 70
+      units: 'metric'
+
+    diet =
+      calorieCycle: 'custom'
+      modifierRestDays: -20
+      modifierWorkoutDays: 20
+      protein: 3
+      carbFatSplit: 'half'
+
+    expectedResult =
+      restDayCalories: 1626
+      workoutDayCalories: 2438
+      macros:
+        proteins: 210
+        proteinsCalories: 840
+        rest:
+          carbs: 98
+          carbsCalories: 393
+          fat: 44
+          fatCalories: 393
+        workout:
+          carbs: 200
+          carbsCalories: 799
+          fat: 89
+          fatCalories: 799
+
+    result = service.calculateLeangains(tdee, diet, info)
+    expect(result).to.deep.equal expectedResult
+
+  it "should calculate leangains data with carbs/fat split", ->
+    tdee = 2032
+
+    info =
+      weight: 70
+      units: 'metric'
+
+    diet =
+      calorieCycle: 'recomp'
+      protein: 3
+      carbFatSplit: 'quarter'
+
+    expectedResult =
+      restDayCalories: 1626
+      workoutDayCalories: 2438
+      macros:
+        proteins: 210
+        proteinsCalories: 840
+        rest:
+          carbs: 49
+          carbsCalories: 197
+          fat: 66
+          fatCalories: 590
+        workout:
+          carbs: 300
+          carbsCalories: 1199
+          fat: 44
+          fatCalories: 400
+
+    result = service.calculateLeangains(tdee, diet, info)
+    expect(result).to.deep.equal expectedResult


Fix session issue.

Fix session issue.

--- lib/index.coffee
+++ lib/index.coffee
@@ -51,6 +51,7 @@
             rawCookie = data.cookies[sessionConfig.key]
             sessionId = connect.utils.parseSignedCookie rawCookie, sessionConfig.secret
             data.sessionID = sessionId
+            data.sessionStore = sessionConfig.store
             sessionConfig.store.get sessionId, (error, session) ->
                 return next error if error?
                 data.session = new connect.session.Session data, session


fix sockets

fix sockets

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/stevelacy/portal-rialu.git/'


Add git-you-sucka.coffee

Add git-you-sucka.coffee

Hubot will respond to whoever says 'git' with
'ima get you sucka'

You really shouldn't get on hir bad side.

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

--- src/scripts/git-you-sucka.coffee
+++ src/scripts/git-you-sucka.coffee
@@ -0,0 +1,18 @@
+# Description:
+#   I'm going to get you, sucka
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   git - hubot says 'ima git you sucka'
+#
+# Author:
+#   samn
+
+module.exports = (robot) ->
+  robot.hear /git/, (msg) ->
+    msg.reply 'ima git you sucka'


Update es-419.coffee

Update es-419.coffee

Translated a few more lines, mostly about player subscription benefits.

--- app/locale/es-419.coffee
+++ app/locale/es-419.coffee
@@ -580,26 +580,26 @@
     intro_1: "CodeCombat es un juego online que enseña a programar.Los estudiantes escriben código en idiomas de programación real."
     intro_2: "No se necesita experiencia previa!"
     free_title: "¿Cuanto cuesta?"
-#    cost_china: "CodeCombat in China is free for the first five levels, after which it costs $9.99 per month for access to our other 120+ levels on our exclusive China servers."
-#    free_1: "CodeCombat Basic is FREE! There are 70+ free levels which cover every concept."
-#    free_2: "A monthly subscription provides access to video tutorials and extra practice levels."
+    free_1: "CodeCombat Basic es GRATIS! Hay 70+ niveles gratis que cubren cada concepto."
+    cost_china: "CodeCombat es gratis en China por los primeros cinco niveles, despues cuesta $9.99(dólares) por mes para tener acceso a 120+ niveles que son exclusivos en nuestros servidores en China."
+    free_2: "Una suscripción mensual le da acceso a tutoriales en vídeo y niveles extra para practicar."
     teacher_subs_title: "¡Los amestros obtienen subscripciones gratuitas!"
-#    teacher_subs_1: "Please contact"
-#    teacher_subs_2: "to set up a free monthly subscription."
+    teacher_subs_1: "Por favor contacte"
+    teacher_subs_2: "para configurar una suscripción mensual gratis."
     sub_includes_title: "¿Qué se incluye en la suscripción?"
     sub_includes_1: "Adicionalmente a los más de 70 niveles básicos, los estudiantes con una suscripción mensual obtienen acceso a estas características adicionales:"
     sub_includes_2: "Más de 40 niveles de práctica"
     sub_includes_3: "Video tutoriales"
-#    sub_includes_4: "Premium email support"
+    sub_includes_4: "Soporte de correo electronico Premium"
     sub_includes_5: "7 heroes nuevos con habilidades unicas que dominar"
     sub_includes_6: "bonificación de 3500 gemas cada mes"
     who_for_title: "¿Para quienes es CodeCombat?"
-#    who_for_1: "We recommend CodeCombat for students aged 9 and up. No prior programming experience is needed."
-#    who_for_2: "We've designed CodeCombat to appeal to both boys and girls."
-#    material_title: "How much material is there?"
-#    material_china: "Approximately 22 hours of gameplay spread over 120+ subscriber-only levels so far, with 5 new levels every week."
-#    material_1: "Approximately 8 hours of free content and an additional 14 hours of subscriber content, with 5 new levels every week."
-#    concepts_title: "What concepts are covered?"
+    who_for_1: "Recomendamos CodeCombat para estudiantes de edades 9 y arriba. No se require experiencia en programación."
+    who_for_2: "Hemos diseñado a CodeCombat para atraer a niños y niñas."
+    material_title: "Cuánto material hay?"
+    material_china: "Aproximadamente 22 horas de juego repartidas en más de 120 niveles sólo para suscriptores, con cinco nueveos niveles cada semana."
+    material_1: "Aproximadamente 8 horas de contenido gratis y un adicional de 14 horas de contenido de suscriptores, con cinco nueveos niveles cada semana."
+    concepts_title: "What concepts are covered?"
     how_much_title: "¿Cuánto cuesta una subscripción mensual?"
     how_much_1: "una"
     how_much_2: "suscribción mensual"
@@ -947,7 +947,7 @@
     tournament_rules: "Reglas del Torneo"
     tournament_blurb: "Escribe código, recolecta oro, arma ejercitos, aplasta adversarios, gana premios, y asciende en tu carrera por $40,000 en el Torneo Codicia! Echa un vistazo a los detalles"
     tournament_blurb_criss_cross: "Gana apuestas, construye caminos, burla tus oponentes, agarra gemas, y asciende tu perfil en nuestro torneo Cruzado! Echa un vistazo a los detalles"
-#    tournament_blurb_zero_sum: "Unleash your coding creativity in both gold gathering and battle tactics in this alpine mirror match between red sorcerer and blue sorcerer. The tournament began on Friday, March 27 and will run until Monday, April 6 at 5PM PDT. Compete for fun and glory! Check out the details"
+    tournament_blurb_zero_sum: "Suelta tus habilidades de código en recolección de oro y tácticas de batalla en este partido espejo alpino entre el hechicero rojo y el hechicero azul. El torneo comenzó el Viernes, 27 de Marzo y se extenderá hasta el Lunes, 6 de Abril a las 5PM PDT. Compite por la diversión y la gloria ! Echa un vistazo a los detalles:"
     tournament_blurb_blog: "en nuestro blog"
     rules: "Reglas"
     winners: "Ganadores"


Update checkout HEAD keybinding to meta-Z

--- src/app/keymaps/git.coffee
+++ src/app/keymaps/git.coffee
@@ -1,2 +1,2 @@
 window.keymap.bindKeys '.editor',
-  'ctrl-Z': 'editor:checkout-head-revision'
+  'meta-Z': 'editor:checkout-head-revision'


TabCAT.UI.linkEmToPercentOfHeight() can now link to height of a different element

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


client: remove isMyChannel util

client: remove isMyChannel util

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

--- client/app/lib/util/isMyChannel.coffee
+++ client/app/lib/util/isMyChannel.coffee
@@ -1,4 +0,0 @@
-whoami = require './whoami'
-
-module.exports = (channel) ->
-  channel.creatorId is whoami().socialApiId


add helpers for common angular tasks

add helpers for common angular tasks

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

--- test/spec/support/helpers.coffee
+++ test/spec/support/helpers.coffee
@@ -0,0 +1,43 @@
+# This file contains several helper functions to make testing angular components
+# easier, more descriptive, less verbose, and less error prone.
+
+# Stubs a service by name such that whenever that service is injected, the stub
+# is injected instead.
+#
+# @example
+#   mockedHttp = {}
+#   stubService('$http', mockedHttp)
+stubService = (name, stub) ->
+  module ($provide) ->
+    $provide.value(name, stub)
+    # CoffeeScript's implicit return will cause an error. Returning null
+    # circumvents that.
+    null
+
+# Retrieves a service by name.
+#
+# @example
+#   $http = retrieveService('$http')
+retrieveService = (name) ->
+  service = null
+  inject [name, (injectedService) -> service = injectedService]
+  service
+
+# Retrieve a filter by name.
+#
+# @example
+#   retrieveFilter('uppercase')('foo') # => 'FOO'
+retrieveFilter = (name) ->
+  filter = null
+  inject ($filter) -> filter = $filter(name)
+  filter
+
+# Instantiates an angular controller. The dependencies can be specified by an
+# object where the key is the name of the service to inject and the value
+# is the object to be injected in lieu of that service.
+#
+# @example
+#   angular.module('app').controller('SomeController', ($http, $scope) -> ...)
+#   instantiateController('SomeController', $http: mockedHttp, $scope: scope)
+instantiateController = (name, injections) ->
+  retrieveService('$controller')(name, injections)


[IMPAC-750] Fix widgets templates rendering order

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/xaun/impac-angular.git/'


add `ComponentLoadCurrentUser`

add `ComponentLoadCurrentUser`

error: pathspec 'src/shared/component/load-current-user.coffee' did not match any file(s) known to git

--- src/shared/component/load-current-user.coffee
+++ src/shared/component/load-current-user.coffee
@@ -0,0 +1,24 @@
+# on mount
+# if a token is present
+# fetches current user from server
+# and writes it into `currentUser` cursor
+# effectively logging in the user for the rest of the application
+module.exports.ComponentLoadCurrentUser = (
+  React
+  reactKup
+  Cursors
+  getCurrentUser
+) ->
+  React.createClass
+    mixins: [Cursors]
+    componentDidMount: ->
+      that = this
+      getCurrentUser()
+        .then (data) ->
+          that.update {currentUser: {$set: data}}
+        .catch (error) ->
+          that.update {error: {$set: error}}
+    render: ->
+      reactKup (k) ->
+        k.div {className: 'ComponentLoadCurrentUser'}
+


:checkered_flag: Don't crash when closing spec window

Focusing the window during the blur event that fires when the
window is closed currently crashes the app on Windows.

Closes #2485

--- src/browser/atom-window.coffee
+++ src/browser/atom-window.coffee
@@ -114,9 +114,15 @@
       new ContextMenu(menuTemplate, this)

     if @isSpec
+      # Workaround for https://github.com/atom/atom-shell/issues/380
+      # Don't focus the window when it is being blurred during close or
+      # else the app will crash on Windows.
+      if process.platform is 'win32'
+        @browserWindow.on 'close', => @isWindowClosing = true
+
       # Spec window's web view should always have focus
       @browserWindow.on 'blur', =>
-        @browserWindow.focusOnWebView()
+        @browserWindow.focusOnWebView() unless @isWindowClosing

   openPath: (pathToOpen, initialLine, initialColumn) ->
     if @loaded


ProfilePage: remove redundant constructor

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/rremizov/github-notifier.git/'


Added clone module

Added clone module

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

--- src/core/clone.coffee
+++ src/core/clone.coffee
@@ -0,0 +1,26 @@
+define 'clone', ->
+
+  ###
+    Cloning objects
+  ###
+  clone = (obj) ->
+    unless obj? or typeof obj isnt 'object'
+      return obj
+
+    if obj instanceof Date
+      return new Date(obj.getTime())
+
+    if obj instanceof RegExp
+      flags = ''
+      flags += 'g' if obj.global?
+      flags += 'i' if obj.ignoreCase?
+      flags += 'm' if obj.multiline?
+      flags += 'y' if obj.sticky?
+      return new RegExp(obj.source, flags)
+
+    newInstance = new obj.constructor()
+
+    for key of obj
+      newInstance[key] = window.clone obj[key]
+
+    newInstance


enabled environment specific project config, add work setup

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

--- projects.wme03370.cson
+++ projects.wme03370.cson
@@ -0,0 +1,89 @@
+[
+  {
+    title: "LF Word Count"
+    group: "Atom"
+    paths: [
+      "/home/aflanagan/Devel/atom/lloyd-flanagan-word-count"
+    ]
+    icon: "atom-icon"
+  }
+  {
+    title: "Atom Configuration"
+    group: "Atom"
+    paths: [
+      "/home/aflanagan/Devel/atom/atom_configuration"
+    ]
+    icon: "icon-gear"
+  }
+  {
+    title: "Atom"
+    group: "Atom"
+    paths: [
+      "/home/aflanagan/github/atom"
+    ]
+    icon: "atom-icon"
+  }
+  {
+    title: "Svgmaps"
+    group: "BHMedia"
+    paths: [
+      "/home/aflanagan/Devel/svgmaps"
+    ]
+    icon: "icon-tools"
+  }
+  {
+    title: "Atom Language Utl"
+    group: "Atom"
+    paths: [
+      "/home/aflanagan/Devel/atom/atom-language-utl"
+    ]
+    icon: "atom-icon"
+  }
+  {
+    title: "Utl Indexer"
+    group: "BLOX"
+    paths: [
+      "/home/aflanagan/Devel/utl_indexer"
+    ]
+    icon: "fa-server"
+  }
+  {
+    title: "Townnews Reader"
+    group: "BLOX"
+    paths: [
+      "/home/aflanagan/Devel/townnews_reader"
+    ]
+    icon: "fa-server"
+  }
+  {
+    title: "Encoding Selector"
+    group: "Atom"
+    paths: [
+      "/home/aflanagan/Devel/atom/encoding-selector"
+    ]
+    icon: "icon-issue-opened"
+  }
+  {
+    title: "Styleguide"
+    group: "Atom"
+    paths: [
+      "/home/aflanagan/Devel/atom/styleguide"
+    ]
+    icon: "atom-icon"
+  }
+  {
+    title: "Shared Libraries"
+    group: "BH Media"
+    paths: [
+      "/home/aflanagan/Devel/shared_libraries"
+    ]
+    icon: "fa-server"
+  }
+  {
+    title: "Utl Lookup"
+    group: "BLOX"
+    paths: [
+      "/home/aflanagan/Devel/utl_lookup"
+    ]
+  }
+]


Add 'download_id.success()'

Add 'download_id.success()'

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


config version string

config version string

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/Boxee/cloudee-couch.git/'


Add a model object which handles maps zoom/center/fit changes.

error: pathspec 'src/map-state-model.coffee' did not match any file(s) known to git

--- src/map-state-model.coffee
+++ src/map-state-model.coffee
@@ -0,0 +1,62 @@
+define \
+[
+    'backbone'
+], (
+    Backbone
+) ->
+
+    class MapStateModel extends Backbone.Model
+        # Models map center, bounds and zoom in a unified way.
+        initialize: (@opts) ->
+            @userHasModifiedView = false
+            @wasAutomatic = false
+            @zoom = null
+            @bounds = null
+            @center = null
+
+            @listenTo @opts.selectedPosition, 'change:value', @onSelectPosition
+
+        setMap: (@map) ->
+            @map.mapState = @
+            @map.on 'moveend', _.bind(@onMoveEnd, @)
+
+        onSelectPosition: (position) =>
+            if position.isSet() then @setUserModified()
+
+        onMoveEnd: ->
+            unless @wasAutomatic
+                @setUserModified()
+            @wasAutomatic = false
+
+        setUserModified: ->
+            @userHasModifiedView = true
+
+        adaptToLayer: (layer) ->
+            @adaptToBounds layer.getBounds()
+
+        adaptToBounds: (bounds) ->
+            if (@map.getZoom() == @map.getBoundsZoom(bounds) and
+                @map.getBounds().contains bounds) then return
+
+            if @opts.route.has 'plan'
+                @map.fitBounds layer,
+                    paddingTopLeft: [20,20]
+                    paddingBottomRight: [20,20]
+
+        centerLatLng: (latLng) ->
+            if @map.getBounds().contains latLng
+                return
+            else
+                @map.setView latLng
+
+        adaptToLatLngs: (latLngs) ->
+            switch latLngs.length
+                when 0 then return
+                when 1 then @centerLatLng latLngs[0]
+                else @adaptToBounds L.latLngBounds latLngs
+
+        _minimumUsefulWidenedView: ->
+
+        zoomIn: ->
+            @wasAutomatic = true
+            @map.setZoom @map.getZoom() + 1


Add FifoBuffer class

Add FifoBuffer class

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

--- src/fifobuffer.coffee
+++ src/fifobuffer.coffee
@@ -0,0 +1,129 @@
+# Pre dependencies
+# (none)
+
+TR = ArrayBuffer.transfer or (oldBuffer, newByteLength = oldBuffer.byteLength) ->
+  oldByteLength = oldBuffer.byteLength
+  copyByteLength = Math.min(oldByteLength, newByteLength)
+  newBuffer = new ArrayBuffer(newByteLength)
+  new Uint8Array(newBuffer).set(new Uint8Array(oldBuffer, 0, copyByteLength))
+  return newBuffer
+
+SYM = Symbol or ((name) -> "__sym_#{name}__")
+
+MIN_CAPACITY = 256
+
+class FifoBuffer
+  SB = SYM("Buffer")
+  SF = SYM("FirstPart")
+  SS = SYM("SecondPart")
+
+  Object.defineProperty(@prototype, "byteLength", get: ->
+    return (@[SF]?.byteLength or 0) + (@[SS]?.byteLength or 0)
+  )
+
+  Object.defineProperty(@prototype, "capacity", get: ->
+    return @[SB].byteLength
+  )
+
+  constructor: ->
+    @[SB] = new ArrayBuffer(0)
+    @[SF] = null
+    @[SS] = null
+    return
+
+  push: (data) ->
+    data = new Uint8Array(data) unless data typeof Uint8Array
+    alen = data.byteLength
+    return if alen == 0
+
+    # Extend buffer size
+    @extend(@byteLength + alen)
+
+    foff = @[SF]?.byteOffset or 0
+    flen = @[SF]?.byteLength or 0
+    slen = @[SS]?.byteLength or 0
+    if slen > 0
+      # Extend second part only
+      (@[SS] = new Uint8Array(@[SB], 0, slen + alen)).set(data, slen)
+    else
+      # Extend first part
+      frem = @[SB].byteLength - (foff + flen)
+      fadd = Math.min(alen, frem)
+      (@[SF]= new Uint8Array(@[SB], foff, flen + fadd)).set(data, foff + flen)
+      alen -= fadd
+      if alen > 0
+        # Create second part
+        (@[SS] = new Uint8Array(@[SB], 0, alen)).set(data.subarray(fadd), 0)
+    return
+
+  pop: (byteLength) ->
+    if byteLength?
+      byteLength = Math.min(byteLength, @byteLength)
+    else
+      byteLength = @byteLength
+    array = new Uint8Array(byteLength)
+    if byteLength > 0
+      flen = @[SF].byteLength
+      fpop = Math.min(byteLength, flen)
+      # Copy from first part
+      array.set(@[SF].subarray(0, fpop), 0)
+      byteLength -= fpop
+      if byteLength > 0
+        # Switch to second part
+        array.set(@[SS].subarray(0, byteLength), fpop)
+        slen = @[SS].byteLength - byteLength
+        if slen > 0
+          @[SF] = @[SS].subarray(byteLength, slen)
+        else
+          @[SF] = null
+        @[SS] = null
+      else
+        flen -= fpop
+        if flen > 0
+          @[SF] = @[SF].subarray(fpop, flen)
+        else
+          @[SF] = null
+    return array.buffer
+
+  peek: (byteLength) ->
+    if byteLength?
+      byteLength = Math.max(0, Math.min(byteLength, @byteLength))
+    else
+      byteLength = @byteLength
+    array = new Uint8Array(byteLength)
+    if byteLength > 0
+      flen = @[SF].byteLength
+      fpek = Math.min(byteLength, flen)
+      # Copy from first part
+      array.set(@[SF].subarray(0, fpek), 0)
+      byteLength -= fpek
+      if byteLength > 0
+        # Copy from second part
+        array.set(@[SS].subarray(0, byteLength), fpek)
+    return array.buffer
+
+  extend: (byteLength) ->
+    newCapacity = @[SB].byteLength
+    return if byteLength <= newCapacity
+    newCapacity or= MIN_CAPACITY
+    newCapacity *= 2 while newCapacity < byteLength
+    foff = @[SF]?.byteOffset
+    flen = @[SF]?.byteLength or 0
+    slen = @[SS]?.byteLength or 0
+    @[SF] = null
+    @[SS] = null
+    @[SB] = TR(@[SB], newCapacity)
+    @[SF] = new Uint8Array(@[SB], foff, flen + slen) if flen > 0
+    @[SF].set(new Uint8Array(@[SB], 0, slen), foff + flen) if slen > 0
+    return
+
+  clear: ->
+    @[SB] = TR(@[SB], 0)
+    @[SF] = null
+    @[SS] = null
+    return
+
+module.exports = FifoBuffer
+
+# Post dependencies
+# (none)


Routes Snippets

Routes Snippets

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

--- snippets/routes.cson
+++ snippets/routes.cson
@@ -0,0 +1,20 @@
+# Routes
+'.source.php':
+
+    # Master route snippet
+    'Route':
+        'prefix': 'route'
+        'body': """
+            Route::$1('$2', '$3Controller@$4');
+        """
+
+    # Group
+    'Route Group':
+        'prefix': 'route:group'
+        'body': """
+            Route::group([
+                $1
+            ], function () {
+                $2
+            });
+        """


Completely untested parser for the Slack client.

error: pathspec 'src/parser/slack-client.coffee' did not match any file(s) known to git

--- src/parser/slack-client.coffee
+++ src/parser/slack-client.coffee
@@ -0,0 +1,35 @@
+# Strict quote parser for the format entered into the clipboard by the Slack thick client.
+
+moment = require 'moment'
+_ = require 'underscore'
+
+# RegExp snippets for reuse
+TS = '(\[\d{1,2}:\d{2}(?: [aApP][mM])\])' # [11:22 AM] *or* [16:00]
+
+# RegExps
+rxWs = /^\s*$/
+rxNickLine = new RegExp("^\s*(\S+)\s+#{TS}\s*$")
+rxTsLine = new RegExp("^\s*#{TS}\s*")
+
+parseTs = (ts) ->
+  parsed = moment(ts, ['h:mm a', 'H:mm'], true)
+  unless parsed.isValid()
+    throw new Error("Invalid date: [#{ts}]")
+  parsed
+
+module.exports = (lines) ->
+  [nick, ts] = []
+
+  result = []
+  for line in lines
+    switch
+      when rxWs.test(line)
+        # Entirely whitespace. Skip.
+      when m = rxNickLine.exec(line)
+        nick = m[1]
+        ts = parseTs(m[2])
+      when m = rxTsLine.exec(line)
+        ts = parseTs(m[1])
+      else
+        result.push "#{nick} [#{ts}] #{line}"
+  result


Fix the type value

Fix the type value


Moved authorize() method to bismuth-utilty.

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


layer.pop method to remove the topmost view

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


[update] add simple infinite scroll

[update] add simple infinite scroll

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


Added "h" as a extension to the C language This may cause problems with the CPP language, however

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/dvingo/atom-beautify.git/'


Fix for CSRF token issue with backbone

Fix for CSRF token issue with backbone

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

--- app/assets/javascripts/admin/xhr_fix.js.coffee
+++ app/assets/javascripts/admin/xhr_fix.js.coffee
@@ -0,0 +1,4 @@
+$.ajaxSetup
+  beforeSend: (xhr) ->
+      xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))
+


Remove unused variable from fixture.

Remove unused variable from fixture.

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/fulcrumapp/fulcrum-expressions.git/'


Fix xmodule jasmine tests so they stop trying to reload the page

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


Script to fetch a random cute picture from r/aww

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

--- src/scripts/aww.coffee
+++ src/scripts/aww.coffee
@@ -0,0 +1,23 @@
+# Hubot delivers a pic from Reddit's /r/aww frontpage.
+#
+# aww - aww
+#
+# Developed by One Mighty Roar - http://github.com/onemightyroar
+
+module.exports = (robot) ->
+  robot.respond /aww/i, (msg) ->
+    search = escape(msg.match[1])
+    msg.http('http://www.reddit.com/r/aww.json')
+      .get() (err, res, body) ->
+        result = JSON.parse(body)
+
+        if result.data.children.count <= 0
+          msg.send "Couldn't find anything cute..."
+          return
+
+        urls = [ ]
+        for child in result.data.children
+          urls.push(child.data.url)
+
+        rnd = Math.floor(Math.random()*urls.length)
+        msg.send urls[rnd]


Update gem charge statement descriptors

Update gem charge statement descriptors

Shown on bank statements and credit bills.

--- server/payments/payment_handler.coffee
+++ server/payments/payment_handler.coffee
@@ -266,6 +266,7 @@
         description: req.body.description
       }
       receipt_email: req.user.get('email')
+      statement_descriptor: 'CODECOMBAT.COM'
     }).then(
       # success case
       ((charge) => @recordStripeCharge(req, res, charge)),


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


bug fixes

bug fixes


assets pathes are hard code now to avoid the need of compiling an *.erb file

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/roseliux/CafeTownsend-Angular-Rails.git/'


Change time to be noon Arizona time

Change time to be noon Arizona time

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


Remove rebase artifact

Remove rebase artifact

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/UM-USElab/gradecraft-development.git/'


feat(app):enable instance for project #438

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/keboola/kbc-ui-sardine.git/'


AdminAppView: Temp hack to borrow tab styling from invitations tab.

should be implemented by refactoring stylus.

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


Let people can use AppStorage

Let people can use AppStorage

--- client/app/MainApp/AppStorage.coffee
+++ client/app/MainApp/AppStorage.coffee
@@ -55,3 +55,6 @@
     _key = group+'.'+key
     pack[_key] = value
     pack
+
+# Let people can use AppStorage
+KD.classes.AppStorage = AppStorage


Implement component to get a frame of a GIF

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

--- components/GetGIFFrame.coffee
+++ components/GetGIFFrame.coffee
@@ -0,0 +1,59 @@
+noflo = require 'noflo'
+gm = require 'gm'
+fileType = require 'file-type'
+readChunk = require 'read-chunk'
+temporary = require 'temporary'
+
+# @runtime noflo-nodejs
+# @name GetGIFFrame
+
+exports.getComponent = ->
+  c = new noflo.Component
+  c.icon = 'image'
+  c.description = 'Extract a frame of a given GIF filepath'
+
+  c.inPorts.add 'in',
+    datatype: 'all'
+    description: 'An image filepath'
+    required: true
+  c.inPorts.add 'frame',
+    datatype: 'number'
+    description: 'Frame to extract'
+    required: false
+  c.outPorts.add 'out',
+    datatype: 'all'
+  c.outPorts.add 'error',
+    datatype: 'object'
+    required: false
+
+  noflo.helpers.WirePattern c,
+    in: 'in'
+    params: 'frame'
+    out: 'out'
+    forwardGroups: true
+    async: true
+  , (payload, groups, out, callback) ->
+    chunk = readChunk payload, 0, 262
+    frame = if c.params.frame then c.params.frame else 0
+    chunk.then (buffer) ->
+      type = fileType buffer
+      unless type
+        return callback new Error 'Unsupported MIME type'
+      if type.ext is 'gif'
+        tmpFile = new temporary.File
+        gm payload
+        .selectFrame frame
+        .write tmpFile.path, (err) ->
+          if err
+            tmpFile.unlink()
+            return callback err
+          out.send tmpFile.path
+          do callback
+          return
+      else
+        # Not a GIF, just send the tempfile path along
+        out.send payload
+        do callback
+        return
+
+  c


fix test

fix test

--- components/main_layout/header/test/view.coffee
+++ components/main_layout/header/test/view.coffee
@@ -41,10 +41,9 @@
       @view.$welcomeHeader = height: (-> 50), remove: sinon.stub()

     it 'hides the welcome header when scrolling past the search bar', ->
-      @view.$welcomeHeader = height: (-> 50), remove: sinon.stub()
       @view.$window.scrollTop = -> 55
       @view.checkRemoveWelcomeHeader()
-      @view.$welcomeHeader.remove.called.should.be.ok
+      $('body').hasClass('body-header-fixed').should.be.ok
       @view.$window.off.called.should.be.ok

   describe '#openAuth', ->


Add cache-busting query param to doc file urls

--- assets/javascripts/models/doc.coffee
+++ assets/javascripts/models/doc.coffee
@@ -26,7 +26,7 @@
     "/#{@slug}#{path}"

   fileUrl: (path) ->
-    "#{app.config.docs_host}#{@fullPath(path)}"
+    "#{app.config.docs_host}#{@fullPath(path)}?#{@mtime}"

   dbUrl: ->
     "#{app.config.docs_host}/#{@db_path}?#{@mtime}"


Allow parentheses in custom syntax blocks, and make quotes optional in the syntax


I'm home message added. again.

I'm home message added. again.

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


Slack 변경에 따른 channel id 수정 및 welcome 스크립트 수정

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/opengallery/og-bot.git/'


Added USB module & service

Added USB module & service

error: pathspec 'app/coffee/modules/usb/service.coffee' did not match any file(s) known to git

--- app/coffee/modules/usb/service.coffee
+++ app/coffee/modules/usb/service.coffee
@@ -0,0 +1,33 @@
+# webusb.getDevices = function() {
+#   return navigator.usb.getDevices().then(devices => {
+#     return devices.map(device => findOrCreateDevice(device));
+#   });
+# };
+
+# webusb.requestDevice = function() {
+#   var filters = [
+#     { vendorId: 0x1209, productId: 0xa800 }
+#   ];
+#   return navigator.usb.requestDevice({filters: filters}).then(device => {
+#     return findOrCreateDevice(device);
+#   });
+# };
+
+
+
+# UsbService class definition
+# Responsible for managing USB devices
+# - fetch all devices
+class UsbService extends Marionette.Service
+
+  radioRequests:
+    'usb devices': 'getDevices'
+
+  getDevices: ->
+    return navigator.usb.getDevices().then (devices) =>
+      console.log('GOT DEVICES')
+      console.log(devices)
+
+# # # # #
+
+module.exports = new UsbService()


death

death

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


Try update

Try update


Fix device detection

Fix device detection

--- components/util/device.coffee
+++ components/util/device.coffee
@@ -6,4 +6,4 @@

   # http://stackoverflow.com/questions/4817029/whats-the-best-way-to-detect-a-touch-screen-device-using-javascript
   isTouchDevice: ->
-    'ontouchstart' in window or 'onmsgesturechange' in window
+    'ontouchstart' of window or 'onmsgesturechange' of window


Open first query

Open first query

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/keboola/kbc-ui-ex-google-bigquery.git/'


Use Coffeescript existential operator

Use Coffeescript existential operator


Adding the ability for javascript from problems to execute more intelligently; for example, errors from javascript included in the returned html will show up in the console when using this mechanism.


On menu based markdown conversion,  	be picky about x as marker for correct requiring it to be first non-whitespace char on line, followed by whitespace, followed eventually but another non-whitespace char  	strip trailing newline from selection.


bug fix

bug fix


added cache. needs testing

added cache. needs testing

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

--- src/facet/cache.coffee
+++ src/facet/cache.coffee
@@ -0,0 +1,184 @@
+class DriverCache
+  constructor: (@timeAttribute) ->
+    @hashmap = {} # { key: filter (non-time filter) + gran, value: { key: timestamp, value: { key: metric, value: value } } }
+
+  get: (query) ->
+    # Return format:
+    # {
+    #   <timestamp>: {
+    #     <metric>: <value>
+    #     <metric>: <value>
+    #   }
+    #   <timestamp>: {
+    #     <metric>: <value>
+    #     <metric>: <value>
+    #   }
+    # }
+    hash = @_generateHash(query)
+    cachedData = {}
+    hashValue = @hashmap[hash]
+    timestamps = @_timeCalculate(query)
+    for timestamp in timestamps
+      cachedData[timestamp] = hashValue[timestamp]
+    return cachedData
+
+  put: (query, root) ->
+    hash = @_generateHash(query)
+    hashValue = @hashmap[hash]
+
+    for split in root.splits
+      tempPiece = hashValue[split.prop[@timeAttribute]] or {}
+
+      for k, v of split.prop
+        continue if k is @timeAttribute
+        tempPiece[k] = v
+      hashValue[split.prop[@timeAttribute]] = tempPiece
+    return
+
+  _getFilter: (query) ->
+    return query.filter(({operation}) -> return operation is 'filter')[0]
+
+  _getSplit: (query) ->
+    return query.filter(({operation}) -> return operation is 'split')[0]
+
+  _generateHash: (query) ->
+    # Get Filter and Split
+    {filter, timeFilter} = @_separateTimeFilter(@_getFilter(query))
+    split = @_getSplit(query)
+    return @_filterToHash(filter) + '&' + @_timeFilterToHash(timeFilter) + '&' + @_splitToHash(split)
+
+  _timeFilterToHash: (timeFilter) ->
+    hash = []
+    for k, v of split
+      hash.push(k + ":" + v)
+    return hash.sort().join('|')
+
+  _filterToHash: (filter) ->
+    hash = []
+    if filter.filters?
+      for subFilter in filter.filters
+        hash.push @_filterToHash(filter)
+      return hash.sort().join(filter.type)
+    for k, v of split
+      hash.push(k + ":" + v)
+    return hash.sort().join('|')
+
+  _splitToHash: (split) ->
+    hash = []
+    for k, v of split
+      hash.push(k + ":" + v)
+
+    return hash.sort().join('|')
+
+  _separateTimeFilter: (filter) ->
+    if filter.filters?
+      self = this
+      timeFilter = filter.filters.filter(({attribute}) -> attribute is self.attribute)
+      filtersWithoutTime = filter.filters.filter(({attribute}) -> attribute isnt self.attribute)
+      if filtersWithoutTime.length is 1
+        return {
+          filter: filtersWithoutTime[0]
+          timeFilter
+        }
+      else
+        filter.filters = filtersWithoutTime
+        return {
+          filter
+          timeFilter
+        }
+    else # Only time filter exists
+      return {
+        filter: null
+        timeFilter: filter
+      }
+
+  _collectApply: (query) ->
+    splitLocation = query.map(({operation}) -> return operation is 'split').indexOf(true)
+    return query.filter((command, i) -> return i > splitLocation) # DONT DO SPLICE. It will change query
+
+  _timeCalculate: (query) ->
+    split = @_getSplit(query)
+    {timeFilter} = @_separateTimeFilter(@_getFilter(query))
+    timestamps = []
+    timestamp = new Date(timeFilter.range[0])
+    end = new Date(timeFilter.range[1])
+    if split.bucket is 'timeDuration'
+      duration = split.duration
+      while timestamp < end
+        timestamps.push(timestamp)
+        timestamp = new Date(timestamp.valueOf() + duration)
+    else
+      periodMap = {
+        'PT1S': 1000
+        'PT1M': 60 * 1000
+        'PT1H': 60 * 60 * 1000
+        'P1D' : 24 * 60 * 60 * 1000
+      }
+      period = periodMap[split.period]
+      while timestamp < end
+        timestamps.push(timestamp)
+        timestamp = new Date(timestamp.valueOf() + period)
+    return timestamps
+
+class CacheWrapper
+  constructor: (@maxTime, @driver, @timeAttribute) ->
+    @cache = new DriverCache(@timeAttribute)
+
+  getData: (query, callback) ->
+    # If there is more than one split, don't use cache
+    if query.filter(({operation}) -> return operation is 'split').length isnt 1
+      @driver query, callback
+      return
+    # If there is a split not for time, reject
+    if query.filter(({operation, attribute}) -> return operation is 'split' and attribute isnt @timeAttribute).length > 0
+      @driver query, callback
+      return
+
+    cachedData = @_getCachedData(query)
+    unknownQuery = @_getUnknownQuery(query, cachedData)
+    @driver @_getUnknownQuery(query), (err, root) =>
+      if err?
+        callback(err, null)
+        return
+      @cache.put(query, root)
+      callback(null, @_fillTree(root, cachedData, query))
+      return
+    return
+
+  _getCachedData: (query) ->
+    return @cache.get(query)
+
+  _fillTree: (root, cachedData, query) -> # Fill in the missing piece
+    splitOp = query.filter(({operation}) -> return operations is 'split')[0]
+    splitOpName = splitOp.name
+    # Handle 1 split for now
+    for split in root.splits
+      timestamp = split.prop[timeAttribute]
+      for k, v of cachedData[timestamp]
+        continue if k is timeAttribute
+        split.prop[k] = v
+    return root
+
+  _getUnknownQuery: (query, cachedData) ->
+    # Look at cache to see what we know
+    splitLocation = query.map(({operation}) -> return operation is 'split').indexOf(true)
+    # What we need from data
+    applysAfterSplit = query.filter((command, i) -> return i > splitLocation and command.operation is 'apply')
+                            .map((command) -> return command.name)
+
+    # Go through cachedData. See if we have need data for all time stamps
+
+    unknown = {}
+    for k, v of cachedData
+      for apply in applysAfterSplit
+        if not v[apply]?
+          unknown[apply] = true
+
+    return query.filter((command, i) ->
+        return true if i <= splitLocation
+        if command.operation is 'apply' and unknown[command.name]
+          return false
+        return true
+      )
+
+facet.DriverCache = DriverCache


router: wip separate histories for each app


shortcuts: add static helper getPlatformStorageKey

--- client/app/lib/shortcuts/index.coffee
+++ client/app/lib/shortcuts/index.coffee
@@ -8,7 +8,6 @@
 ShortcutsModal = require './views/modal'

 STORAGE_VERSION      = '1'
-STORAGE_BINDINGS_KEY = "bindings-#{os}"
 THROTTLE_WAIT        = 300

 module.exports =
@@ -69,7 +68,7 @@
       acc[model.name] = klass.getPlatformBindings model
     , {}

-    @_store.setValue STORAGE_BINDINGS_KEY, data
+    @_store.setValue klass.getPlatformStorageKey(), data

   , THROTTLE_WAIT,
     leading  : no
@@ -79,7 +78,7 @@
   _restore: ->
     throw 'not ready'  unless @_isStoreReady

-    bindings = @_store.getValue(STORAGE_BINDINGS_KEY) or {}
+    bindings = @_store.getValue(klass.getPlatformStorageKey()) or {}

   handleStoreReady: ->
@@ -119,3 +118,8 @@
   @getPlatformBindings: (model) ->

     return model[klass.bindingsGetterMethodName()]()
+
+
+  @getPlatformStorageKey: _.memoize ->
+
+    return "bindings-#{globals.keymapType}"


<view> SensorProfile - Created

<view> SensorProfile - Created

error: pathspec 'client/app/views/sensorProfile.coffee' did not match any file(s) known to git

--- client/app/views/sensorProfile.coffee
+++ client/app/views/sensorProfile.coffee
@@ -0,0 +1,16 @@
+BaseView = require '../lib/base_view'
+
+module.exports = class SensorProfile extends BaseView
+    className: 'device-profile'
+    template: require 'templates/sensorProfile'
+
+    initialize: ->
+        @listenTo @model, 'change', => @render()
+
+    getRenderData: ->
+        out =
+            name: @model.name
+            driverName: @model.driver.name
+            url: @model.getURL()
+			customId: @modeL.customId
+        return out


fix (Genymotion) Support new internal filepaths for Genymotion.app OS X bundle.

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


Hungarian translation.

Hungarian translation.

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

--- app/assets/javascripts/mercury/locales/hu.locale.js.coffee
+++ app/assets/javascripts/mercury/locales/hu.locale.js.coffee
@@ -0,0 +1,209 @@
+Mercury.I18n['hu'] =
+  # ## Javascript Strings
+
+  # ### Default Configuration
+  "Save": "Mentés"
+  "Save this page": "Az oldal elmentése"
+  "Preview": "Előnézet"
+  "Preview this page": "Az oldal előnézete"
+  "Undo": "Visszavonás"
+  "Undo your last action": "Utolsó visszavonása"
+  "Redo": "Ismétlés"
+  "Redo your last action": "Utolsó ismétlése"
+  "Link": "Hivatkozás"
+  "Insert Link": "Hivatkozás beszúrása"
+  "Media": "Média"
+  "Insert Media (images and videos)": "Képek és videók beszúrása"
+  "Table": "Táblázat"
+  "Insert Table": "Táblázat beszúrása"
+  "Character": "Karakter"
+  "Special Characters": "Különleges karakter"
+  "Snippet": "Darabka"
+  "Snippet Panel": "Darabkák"
+  "History": "Előzmények"
+  "Page Version History": "Oldal változatai"
+  "Notes": "Megjegyzések"
+  "Page Notes": "Oldal megjegyzései"
+  "Style": "Stílus"
+  "Block Format": "Bekezdés formázása"
+  "Background Color": "Háttérszín"
+  "Text Color": "Szövegszín"
+  "Bold": "Félkövér"
+  "Italicize": "Dőlt"
+  "Overline": "Föléhúzott"
+  "Strikethrough": "Áthúzott"
+  "Underline": "Aláhúzott"
+  "Subscript": "Alsó index"
+  "Superscript": "Felső index"
+  "Align Left": "Balra"
+  "Center": "Középre"
+  "Align Right": "Jobbra"
+  "Justify Full": "Sorkizárt"
+  "Unordered List": "Rendezetlen lista"
+  "Numbered List": "Számozott lista"
+  "Decrease Indentation": "Behúzás csökkentése"
+  "Increase Indentation": "Behúzás növelése"
+  "Insert Table Row": "Táblázat sor beszúrása"
+  "Insert a table row before the cursor": "Táblázat sor a kurzor elé"
+  "Insert a table row after the cursor": "Táblázat sor a kurzor mögé"
+  "Delete Table Row": "Táblázat sor törlése"
+  "Delete this table row": "Ennek a sornak a törlése"
+  "Insert Table Column": "Tábla oszlop beszúrása"
+  "Insert a table column before the cursor": "Tábla oszlop a kurzor elé"
+  "Insert a table column after the cursor": "Tábla oszlop a kurzor mögé"
+  "Delete Table Column": "Tábla oszlop törlése"
+  "Delete this table column": "Ennek az oszlopnak a törlése"
+  "Increase Cell Columns": "Cella oszlopok növelése"
+  "Decrease Cell Columns": "Cella oszlopok csökkentése"
+  "Increase Cell Rows": "Cella sorok növelése"
+  "Decrease Cell Rows": "Cella sorok csökkentése"
+  "Horizontal Rule": "Vízszintes vonal"
+  "Insert a horizontal rule": "Vízszintes vonal beszúrása"
+  "Remove Formatting": "Formázás eltávolítása"
+  "Remove formatting for the selection": "Formázás eltávolítása a kijelölésben"
+  "Edit HTML": "HTML szerkesztése"
+  "Edit the HTML content": "HTML tartalom szerkesztése"
+  "Edit Snippet Settings": "Darabkák beállításai"
+  "Remove Snippet": "Darabka törlése"
+
+  # ### General
+  # Error Messages
+  "Mercury.Regions.%s is unsupported in this client. Supported browsers are %s.": "Mercury.Regions.%s nem támogatott. Támogatott böngészők: %s."
+  "Mercury.PageEditor can only be instantiated once.": "Mercury.PageEditor can only be instantiated once."
+  "Opera isn't a fully supported browser, your results may not be optimal.": "Az Opera böngésző nem teljesen támogatott, az oldal hibásan működhet."
+  "Mercury.PageEditor failed to load: %s\n\nPlease try refreshing.": "A Mercury.PageEditor betöltése sikertelen: %s\n\nKérjük próbálja meg frissíteni az oldalt."
+  "Region type is malformed, no data-type provided, or \"%s\" is unknown for the \"%s\" region.": "Region type is malformed, no data-type provided, or \"%s\" is unknown for the \"%s\" region."
+  "Mercury was unable to save to the url: %s": "Nem tudtam menteni: %s"
+  "invalid": "érvénytelen"
+  "can't be blank": "nem lehet üres"
+  # Confirmations
+  "You have unsaved changes.  Are you sure you want to leave without saving them first?": "Nincs minden elmentve. Biztos benne, hogy elhaggya az oldalt mentés nélkül?"
+
+  # ### Toolbar / Buttons
+  # Error Messages
+  "Unknown button type \"%s\" used for the \"%s\" button.": "Ismeretlen gomb típus \"%s\" használata a \"%s\" gombhoz."
+  "Unknown button structure -- please provide an array, object, or string for \"%s\".": "Ismeretlen gomb struktúra -- tömböt, objektumot, vagy string-et adjon meg \"%s\"-nek."
+
+  # ### Modals / Dialogs / Etc.
+  # Error Messages
+  "Mercury was unable to load %s for the \"%s\" dialog.": "Mercury was unable to load %s for the \"%s\" dialog."
+  "Mercury was unable to load %s for the lightview.": "Mercury was unable to load %s for the lightview."
+  "Mercury was unable to load %s for the modal.": "Mercury was unable to load %s for the modal."
+
+  # ### Snippets
+  # Error Messages
+  "Error loading the preview for the \"%s\" snippet.": "Hiba történt a \"%s\" darabka előnézetének betöltésekor."
+  # Misc
+  "Snippet Options": "Darabka beállításai"
+
+  # ### Uploader
+  # Error Messages
+  "Unable to process response: %s": "Nem sikerült feldolgozni a választ: %s"
+  "Error: Unable to upload the file": "Hiba: Nem sikerült feltölteni a fájlt"
+  "Malformed response from server": "Hibás válasz a kiszolgálótól" # needs translation
+  "Too large": "Túl nagy"
+  "Unsupported format": "Nem támogatott formátum"
+  # Statuses
+  "Processing...": "Feldolgozás..."
+  "Uploading...": "Feltöltés..."
+  "Aborted": "Megszakadt"
+  "Successfully uploaded...": "Sikeresen feltöltve..."
+  "Name: %s": "Név: %s"
+  "Size: %s": "Méret: %s"
+  "Type: %s": "Type: %s"
+
+  # Inserting Media
+  "Error: The provided youtube share url was invalid.": "Hiba: A megadott youtube megosztott url érvénytelen."
+  "Error: The provided vimeo url was invalid.": "Hiba: A megadott vimeo url érvénytelen."
+
+  # Statusbar
+  "Path:": "Útvonal"
+
+
+  # ## HTML / Template Strings
+
+  # ### Modals
+  # Insert Link Modal (link.html)
+  "Link Content": "Hivatkozás leírása"
+  "Standard Links": "Egyszerű hivatkozás"
+  "URL": "URL"
+  "Lista / Könyvjelző hivatkozás": ""
+  "Existing Links": "Létező hivatkozások"
+  "Bookmark": "Könyvjelző"
+  "Options": "Beállítások"
+  "Link Target": "Hivatkozás célpontja"
+  "Self (the same window or tab)": "Önmaga (azonos ablakban vagy fülön)"
+  "Blank (a new window or tab)": "Új (egy új ablakban vagy fülön)"
+  "Top (removes any frames)": "Felső (eltűnteti a kereteket)"
+  "Popup Window (javascript new window popup)": "Felbukkanó ablak (javascript felbukkanó ablak)"
+  "Popup Width": "Szélesség"
+  "Popup Height": "Magasság"
+
+  # Insert Media Modal (media.html)
+  "Images": "Képek"
+  "Videos": "Videók"
+  "YouTube URL": "YouTube hivatkozás"
+  "Vimeo URL": "Vimeo hivatkozás"
+  "Alignment": "Elrendezés"
+  "None": "Nincs"
+  "Left": "Balra"
+  "Right": "Jobbra"
+  "Top": "Fel"
+  "Middle": "Középre"
+  "Bottom": "Le"
+  "Absolute Middle": "Abszolút középre"
+  "Absolute Bottom": "Abszolút alulra"
+  "Width": "Szélesség"
+  "Height": "Magasság"
+  "Insert Media": "Média beszúrása"
+
+  # Insert Table Modal (table.html)
+  "Rows": "Sorok"
+  "Add Before": "+ elé"
+  "Add After": "+ mögé"
+  "Remove": "Eltávolít"
+  "Columns": "Oszlopok"
+  "Row Span": "Sor összevonás"
+  "Column Span": "Oszlop összevonás"
+  "Border": "Keret"
+  "Spacing": "Elhelyezés"
+
+  # HTML Editor Modal (htmleditor.html)
+  "HTML Editor": "HTML szerkesztő"
+  "Save and Replace": "Mentés és csere"
+
+  # ### Dialogs / Etc.
+  # Color Palettes (forecolor.html, backcolor.html)
+  "Last Color Picked": "Utoljára választott szín"
+
+  # Block Format Select (formatblock.html)
+  "Heading 1": "Címsor 1"
+  "Heading 2": "Címsor 2"
+  "Heading 3": "Címsor 3"
+  "Heading 4": "Címsor 4"
+  "Heading 5": "Címsor 5"
+  "Heading 6": "Címsor 6"
+  "Paragraph": "Bekezdés"
+  "Blockquote": "Idézet"
+  "Formatted": "Formázott"
+
+  # About Mercury Panel (about.html)
+  "Project Home": "Projekt oldala"
+  "Project Source": "Projekt forrása"
+
+  # ### Demo / Placeholder / Defaults
+  "The history panel is expected to be implemented with a server back end.  Since this is a demo, we didn't include it.": "The history panel is expected to be implemented with a server back end.  Since this is a demo, we didn't include it."
+
+  "The notes panel is expected to be implemented with a server back end.  Since this is a demo, we didn't include it.": "The notes panel is expected to be implemented with a server back end.  Since this is a demo, we didn't include it."
+
+  "Snippet Name": "Darabka neve"
+  "A one or two line long description of what this snippet does.": "Egy 1-2 soros leírás, hogy mit is csinál ez a darabka."
+
+  "First Name": "Keresztnév"
+  "Favorite Beer": "Kedvenc sör"
+  "Insert Snippet": "Darabka beszúrása"
+
+
+  # ## Custom Regional Overrides (eg. en-US)
+  #_US_:
+  #  "Save": ""


handles updating the count when the collection is synced

error: pathspec 'components/filter2/count/view.coffee' did not match any file(s) known to git

--- components/filter2/count/view.coffee
+++ components/filter2/count/view.coffee
@@ -0,0 +1,20 @@
+_ = require 'underscore'
+_s = require 'underscore.string'
+Backbone = require 'backbone'
+
+module.exports = class CountView extends Backbone.View
+  initialize: ({@collection, @params}) ->
+    @listenTo @collection, 'sync', @updateMeta, @
+    @listenTo @collection, 'sync', @updateCounts, @
+
+  totalCount: ->
+    _s.numberFormat @collection.counts.total.value
+
+  updateCounts: ->
+    work = if @totalCount() is 1 then 'Work' else 'Works'
+    @$el.text "#{@totalCount()} #{work}"
+
+  updateMeta: ->
+    $('meta[name=description]').remove()
+    $('head').append("<meta name='description' content='Collect #{@totalCount()} artworks. Purchase online or connect with over 1,500 top galleries.'>")
+


Move model events and docs and to stout-orm package.

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/JoshuaToenyes/stout-core.git/'


Fixed raster image sprites to update their scales when they load, and to properly place themselves if matching world dimensions.

--- app/lib/surface/CocoSprite.coffee
+++ app/lib/surface/CocoSprite.coffee
@@ -91,6 +91,7 @@
   setUpRasterImage: ->
     raster = @thangType.get('raster')
     sprite = @imageObject = new createjs.Bitmap('/file/'+raster)
+    $(sprite.image).one 'load', => @updateScale?()
     @displayObject.addChild(sprite)
     @configureMouse()
     @originalScaleX = sprite.scaleX
@@ -271,9 +272,14 @@
     if @thangType.get('matchWorldDimensions') and @thang
       if @thang.width isnt @lastThangWidth or @thang.height isnt @lastThangHeight
         bounds = @imageObject.getBounds()
-        return unless bounds # TODO: remove this because it's a bandaid over the image sometimes not being loaded
+        return unless bounds
         @imageObject.scaleX = @thang.width * Camera.PPM / bounds.width
         @imageObject.scaleY = @thang.height * Camera.PPM * @options.camera.y2x / bounds.height
+        @imageObject.regX ?= 0
+        @imageObject.regX += bounds.width / 2
+        @imageObject.regY ?= 0
+        @imageObject.regY += bounds.height / 2
+
         unless @thang.spriteName is 'Beam'
           @imageObject.scaleX *= @thangType.get('scale') ? 1
           @imageObject.scaleY *= @thangType.get('scale') ? 1


add validator to scope variables on login controller

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/Bogdan-p/bookingbug-angular.git/'


Disable invalid analytics server tests

Disable invalid analytics server tests

--- test/server/unit/analytics.spec.coffee
+++ test/server/unit/analytics.spec.coffee
@@ -9,9 +9,12 @@
 # TODO: these tests have some rerun/cleanup issues
 # TODO: add tests for purchase, payment, subscribe, unsubscribe, and earned achievements

+# TODO: AnalyticsUsersActive collection isn't currently used.
+# TODO: Will remove these tests if we end up ripping out the disabled saveActiveUser calls.
+
 describe 'Analytics', ->

-  it 'registered user', (done) ->
+  xit 'registered user', (done) ->
     clearModels [AnalyticsUsersActive], (err) ->
       expect(err).toBeNull()
       user = new User
@@ -29,7 +32,7 @@
               expect(activeUsers[0]?.get('event')).toEqual('register')
               done()

-  it 'level completed', (done) ->
+  xit 'level completed', (done) ->
     clearModels [AnalyticsUsersActive], (err) ->
       expect(err).toBeNull()
       unittest.getNormalJoe (joe) ->
@@ -53,7 +56,7 @@
                 expect(activeUsers[0]?.get('event')).toEqual('level-completed/lotr')
                 done()

-  it 'level playtime', (done) ->
+  xit 'level playtime', (done) ->
     clearModels [AnalyticsUsersActive], (err) ->
       expect(err).toBeNull()
       unittest.getNormalJoe (joe) ->


Require index.coffee module

Require index.coffee module

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

--- test.coffee
+++ test.coffee
@@ -0,0 +1 @@
+require('./index.coffee')()