Add accordion-panel component.

Add accordion-panel component.

error: pathspec 'web-server/src/cljs/hatnik/web/client/components.cljs' did not match any file(s) known to git

--- web-server/src/cljs/hatnik/web/client/components.cljs
+++ web-server/src/cljs/hatnik/web/client/components.cljs
@@ -0,0 +1,22 @@
+(ns hatnik.web.client.components
+  (:require [om.core :as om :include-macros true]
+            [om.dom :as dom :include-macros true]))
+
+
+(defn accordion-panel [& {:keys [body-id header body open] :or {:open true}}]
+  (dom/div #js {:className "panel panel-default"}
+           (dom/div #js {:className "panel-heading"}
+                    (dom/div nil
+                             (dom/h4 #js {:className "panel-title"}
+                                     (dom/a #js
+                                            {:data-parent "#accrodion"
+                                             :data-toggle "collapse"
+                                             :href (str "#" body-id)} header))))
+           (dom/div #js {:className (if open
+                                      "panel-collapse collapse in"
+                                      "panel-collapse collapse")
+                         :id body-id}
+                    (dom/div #js {:className "panel-body"}
+                             body))))
+
+


(SERVER-874) Add protocol for VersionedCodeService

This commit merely adds a protocol for VersionedCodeService but not an
implementation. The implementation will follow in SERVER-875.

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/briancain/puppet-server.git/'


Version 171

Version 171

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/tobias/clojars-web.git/'


Looks like templates doesn't support SNAPSHOT versions

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/artemyarulin/om-next-cross-platform-template.git/'


support uberjars

support uberjars

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


bump version to 2.8.3

bump version to 2.8.3

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/B2W-Digital/pdg-core.git/'


Update deps; including clojure to 1.8.0

Update deps; including clojure to 1.8.0

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/democracyworks/email-works.git/'


Version 1.6.0

Version 1.6.0

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/starcity-properties/odin.git/'


removed austin plugin

removed austin plugin

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


Update metosin libraries.

Update metosin libraries.

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


Version 0.16.2-SNAPSHOT

Version 0.16.2-SNAPSHOT

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject clojars-web "0.16.1"
+(defproject clojars-web "0.16.2-SNAPSHOT"
   :dependencies [[org.clojure/clojure "1.6.0"]
                  [org.clojure/tools.cli "0.2.1"]
                  [org.apache.maven/maven-model "3.0.4"


lortu-libuuak id jasotzen du

lortu-libuuak id jasotzen du

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/lnmnd/magnet.zer.git/'


Fix team/membership POST

Fix team/membership POST

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/physion/ovation-webapi.git/'


old comment

old comment

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/michaelsbradleyjr/shen.clj.git/'


Optimizing imports

Optimizing imports


make sure tests were found

make sure tests were found

--- dev-resources/insn/test.clj
+++ dev-resources/insn/test.clj
@@ -8,7 +8,8 @@
 (defmethod test/report :begin-test-ns [m])

 (defmethod test/report :summary [m]
-  (when-not (zero? (+ (:fail m) (:error m)))
+  (when-not (and (pos? (:test m))
+                 (zero? (+ (:fail m) (:error m))))
     (throw (ex-info "tests failed" m))))

 (defn -main []


all MGN nodes are parsed, going to explore the unknown SHT nodes now

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


added clojure soln

added clojure soln

error: pathspec 'solutions/day12/solution.clj' did not match any file(s) known to git

--- solutions/day12/solution.clj
+++ solutions/day12/solution.clj
@@ -0,0 +1,35 @@
+(require '[clojure.data.json :as json])
+(def input (json/read-str (slurp "input.txt")))
+
+(defn seqsum
+  "Returns the sum of all numbers in a sequence"
+  [s]
+  {:test (defn f [] (assert (= 6 (seqsum [1 2 "a" 3]))))}
+  (let [numbers (filter number? s)
+        seqs (filter sequential? s)
+        maps (filter map? s)
+        numsum (reduce + numbers)
+        ssum (reduce + (map seqsum seqs))
+        msum (reduce + (map mapsum maps))]
+    (+ numsum ssum msum)))
+
+(defn mapsum
+  [m]
+  (+ (seqsum (keys m))
+     (seqsum (vals m))))
+
+(defn filter-by-val
+  [v m]
+  (cond
+    (sequential? m) (map #(filter-by-val v %) m)
+    (map? m)
+      (when (not (some #{v} (vals m)))
+        (into {}
+           (map
+             (fn [[k, vv]]
+               [k, (filter-by-val v vv)])
+             m)))
+    :else m))
+
+(println "part 1: " (mapsum input))
+(println "part 2: " (mapsum (filter-by-val "red" input)))


added at least one test

added at least one test

error: pathspec 'test/org/domaindrivenarchitecture/pallet/crate/managed_vm_test.clj' did not match any file(s) known to git

--- test/org/domaindrivenarchitecture/pallet/crate/managed_vm_test.clj
+++ test/org/domaindrivenarchitecture/pallet/crate/managed_vm_test.clj
@@ -0,0 +1,27 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements. See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership. The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License. You may obtain a copy of the License at
+;
+; http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; See the License for the specific language governing permissions and
+; limitations under the License.
+
+
+(ns org.domaindrivenarchitecture.pallet.crate.managed-vm-test
+  (:require
+    [clojure.test :refer :all]
+    [org.domaindrivenarchitecture.pallet.crate.managed-vm :as sut]))
+
+(deftest plan-def
+  (testing
+    "test plan-def"
+    (is sut/with-dda-vm)
+    ))


Reformat whitespace in a couple of defs

Reformat whitespace in a couple of defs

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


Prevent prod_main from exiting

Prevent prod_main from exiting

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


adding a figwheel template in the src-cljs/bitfondue folder

error: pathspec 'src-cljs/bitfondue/core.cljs' did not match any file(s) known to git

--- src-cljs/bitfondue/core.cljs
+++ src-cljs/bitfondue/core.cljs
@@ -0,0 +1,24 @@
+(ns ^:figwheel-always bitfondue.core
+    (:require
+     [reagent.core :as reagent :refer [atom]]))
+
+(enable-console-print!)
+
+(println "Edits to this text should show up in your developer console.")
+
+;; define your app data so that it doesn't get over-written on reload
+
+(defonce app-state (atom {:text "Hello world!"}))
+
+(defn hello-world []
+  [:h1 (:text @app-state)])
+
+(reagent/render-component [hello-world]
+                          (. js/document (getElementById "app")))
+
+
+(defn on-js-reload []
+  ;; optionally touch your app-state to force rerendering depending on
+  ;; your application
+  ;; (swap! app-state update-in [:__figwheel_counter] inc)
+)


Add robinson fonts namespace

Add robinson fonts namespace

error: pathspec 'src/robinson/font.clj' did not match any file(s) known to git

--- src/robinson/font.clj
+++ src/robinson/font.clj
@@ -0,0 +1,50 @@
+(ns robinson.font
+  (:require [robinson.fs :as rfs]
+            [zaffre.font :as zfont]
+            [taoensso.timbre :as log]
+            clojure.edn))
+
+(defn make-font-fn [font platform]
+  (log/info "make-font-fn" font)
+  (case (get font :type :ttf)
+    :ttf
+      (zfont/->TTFFont
+        (rfs/cwd-path
+          (get font (case platform
+                      :linux   :linux-font
+                      :macosx  :macosx-font
+                      :windows :windows-font
+                      (assert false (str "Unknown platform requested" platform)))))
+        (get font :font-size)
+        true #_(get font :transparent))
+    :cp437
+      (zfont/->CP437Font
+          (let [{:keys [url path]} font]
+            (if url
+              url
+              (rfs/cwd-path path)))
+          (get font :alpha-channel :green)
+          (get font :scale 1)
+          true #_(get font :transparent))))
+
+(defn current-font
+  [state]
+  (let [font-key (-> state :settings deref :font)
+        font     (-> state :fonts font-key)]
+    font))
+
+(defn read-font-configs
+  []
+  (apply sorted-map
+    (mapcat (fn [file]
+              (let [file-name (.getName file)
+                    map-key   (if (re-find #".edn$" file-name)
+                                (keyword (clojure.string/replace-first file-name #".edn$" ""))
+                                (keyword file-name))
+                    map-value (->> (.getPath file)
+                                (slurp)
+                                (clojure.edn/read-string))]
+              [map-key
+               map-value]))
+            (.listFiles (rfs/cwd-file "config/fonts")))))
+


new lang

new lang

error: pathspec 'src/ysmiraak/lang.clj' did not match any file(s) known to git

--- src/ysmiraak/lang.clj
+++ src/ysmiraak/lang.clj
@@ -0,0 +1,183 @@
+(ns ysmiraak.lang)
+
+(comment
+
+  ;; let
+  ;; - A B C be types
+  ;; - a b c be variables
+  ;; - x y z be values
+
+  ;; types all the way down
+  ($ Type A x nil)
+
+  ;; A -> B
+  ($ Type
+     (%'   A       B)
+     (% ($ A a) ($ B (... a ...)))
+     nil)
+
+  ;; forall (a : A) . C(a)
+  ($ Type
+     (%'   A       Type)
+     (% ($ A a)    (C a))
+     (% ($ A a) ($ (C a) (... a ...)))
+     nil)
+
+  ;; forall (a : A , b : B) . C(a)
+  ($ Type
+     (%'   A       Type    Type)
+     (% ($ A a)    B       (C a))
+     (% ($ A a) ($ B b) ($ (C a) (... a ... b ...)))
+     nil)
+
+  ;; exists (a : A , b : B) . C(a)
+  ($ Type
+     (&'   A       Type    Type)
+     (& ($ A a)    B       (C a))
+     (& ($ A x) ($ B y) ($ (C x) (... x ... y ...)))
+     nil)
+
+  ;; exists (a : A) . C(a)
+  ($ Type
+     (&'   A       Type)
+     (& ($ A a)    (C a))
+     (& ($ A x) ($ (C x) (... x ...)))
+     nil)
+
+  ;; (A, B)
+  ($ Type
+     (&    A       B)
+     (& ($ A x) ($ B y))
+     nil)
+
+  )
+
+;; goal
+;; - unify terms and types (basic constructors shared by types and data)
+;; - compositional lambda calculus (variables and their evaluation rules)
+;; - no closure (asap beta reduction)
+;; - unify composition and application (????)
+
+(defrecord Term [form vars])
+
+(defn ! []
+  (as-> (gensym "!") v
+    (Term. v #{v})))
+
+(defrecord Forall [form args])
+
+(defn % [term & args]
+  (let [term (if (instance? Term term) term (Term. term #{}))
+        {:keys [form vars]} term
+        args (map :form args)]
+    (Term.
+     (if (instance? Forall form)
+       (Forall. (:form form) (concat args (:args form)))
+       (Forall.        form          args))
+     (clojure.set/difference vars (set args)))))
+
+(defn subst [env form]
+  (if (seq? form)
+    (map (partial subst env) form)
+    (if (instance? Forall form)
+      (assoc form :form (subst (apply dissoc env (:args form)) (:form form)))
+      (get env form form))))
+
+(defn ? [& expr]
+  ;; val = anything that evaluates to itself
+  ;; expr = val | [val] | term
+  ;; term = form & vars
+  ;; form = val | var | [form]
+  ;; vars = set var
+  ;; var = symbol (or any val, currently)
+  (let [[[head & vals] vars] ; build compound form & collect free vars
+        , (loop [expr (seq expr)  form []  vars #{}]
+            (if-let [[x & expr] expr]
+              (if (instance? Term x)
+                (recur expr  (conj form (:form x))  (into vars (:vars x)))
+                (recur expr  (conj form        x)         vars))
+              [form vars]))
+        [form vars] ; beta reduction
+        , (if (instance? Forall head)
+            (let [{:keys [form args]} head]
+              (loop [args' (seq args) vals' (seq vals)  env {}]
+                (if-let   [[a & rgs] args']
+                  (if-let [[v & als] vals']
+                    (recur rgs als (assoc env a v))
+                    [(Forall. (subst env form) args') (clojure.set/difference vars (set (keys env)))])
+                  (if vals'
+                    (throw (ex-info "arity error" {:args args :vals vals}))
+                    [(subst env form) (clojure.set/difference vars (set (keys env)))]))))
+            [(cons head vals) vars])]
+    (if (seq vars)
+      (Term. form vars)
+      (eval form))))
+
+(comment
+
+  (def a (!))
+  (def b (!))
+  (def c (!))
+
+  (? inc 0)
+  ;; 1
+  (? inc a)
+  ;; Term {
+  ;;  :form (inc a)
+  ;;  :vars #{a}
+  ;; }
+  (? + (inc 0) a)
+  ;; Term {
+  ;;   :form (+ 1 a)
+  ;;   :vars #{a}
+  ;; }
+  (? inc (? inc a))
+  ;; Term {
+  ;;   :form (inc (inc a))
+  ;;   :vars #{a}
+  ;; }
+
+  (def phi (? + a b))
+  ;; Term {
+  ;;   :form (+ a b)
+  ;;   :vars #{a b}
+  ;; }
+  (def chi (% phi b))
+  ;; Term {
+  ;;   :form Forall {
+  ;;           :term (+ a b)
+  ;;           :args [b]
+  ;;         }
+  ;;   :vars #{a}
+  ;; }
+  (def psi (% chi a))
+  ;; Term {
+  ;;   :form Forall {
+  ;;           :term (+ a b)
+  ;;           :args [a b]
+  ;;         }
+  ;;   :vars #{}
+  ;; }
+
+  ;; binding
+  (= (-> phi (% b) (% a))
+     (-> phi (% a b)))
+
+  ;; currying
+  (= 4 (? psi 2 2))
+  (= 4 (? (? psi 2) 2))
+
+  ;; partial eval
+  (=    (? + a 2)          (? chi 2))
+  (= (% (? + a 2) a)    (% (? chi 2) a))
+  (=    (? + 2 2)    (? (% (? chi 2) a) 2))
+
+  (= 1 (? (% (? (% a a) 1) a) 0))
+  (= 4 (? (% (? apply ? chi [2]) a) 2))
+
+  ;; non-terminating form
+  (? (% (? ? a a) a) (% (? ? a a) a))
+
+  ;; todo test recursion
+
+  )


jdbc url

jdbc url

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


Add improved version of schema.core/defschema that provides data needed by Rook's swagger support

error: pathspec 'src/io/aviso/rook/schema.clj' did not match any file(s) known to git

--- src/io/aviso/rook/schema.clj
+++ src/io/aviso/rook/schema.clj
@@ -0,0 +1,28 @@
+(ns io.aviso.rook.schema
+  "Some small enhancements to Prismatic Schema that are valuable to, or needed by, the Swagger support."
+  {:added "0.1.27"})
+
+(defmacro schema
+  "Creates a named schema, which includes metadata as per [[defschema]]. This is useful for one-off
+  schemas, such as those used in responses."
+  ([name form]
+   `(schema ~name "" ~form))
+  ([name docstring form]
+   `(-> ~form
+        (vary-meta merge ~(-> &form second meta))
+        ;; The second form is the name (the first is the 'schema symbol itself) and we want its metadata
+        (vary-meta assoc :name '~name :ns *ns* :doc ~docstring))))
+
+(defmacro defschema
+  "Convenience macro to make it clear to reader that body is meant to be used as a schema, and to provide
+  extra data needed for generating Swagger descriptions.
+
+  This extends schema.core/defschema to merge the symbol's metadata with keys :name (the unqualified
+  symbol being defined), :ns (the namespace), :doc (the docstring) plus any custom metdata
+   from the name.  Normally, much of that data is only available to the Var created by the underlying def."
+  ([name form]
+   `(defschema ~name "" ~form))
+  ([name docstring form]
+   `(def ~name ~docstring (schema ~name ~docstring ~form))))
+
+


remove early-termination-fee generation logic

early termination fees are deducted from security deposit, rather than charged outright.


clean up logs

clean up logs


Remove the manual window hiding code

Remove the manual window hiding code

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/bsmr-clojure/Nightcode.git/'


is it system/getenv which is slow?

is it system/getenv which is slow?


Actually get reading `bytes` primitive working.

--- src/clojure/abracad/avro/read.clj
+++ src/clojure/abracad/avro/read.clj
@@ -64,4 +64,4 @@

 (defn read-bytes
   [^ClojureDatumReader reader ^Schema expected ^Decoder in]
-  (.readBytes in))
+  (.readBytes in nil))


adding mockito

adding mockito

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


bump turbovote-admin-specs to 0.1.3

bump turbovote-admin-specs to 0.1.3

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/democracyworks/voter-registration-works.git/'


Comment.

Comment.

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


Update to 1.3.0-alpha3.

Update to 1.3.0-alpha3.

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/croeder/clojure-koans-work.git/'


bump 0.9.0-wip15f-scala292

bump 0.9.0-wip15f-scala292

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject storm/storm-kafka "0.9.0-wip15e-scala292"
+(defproject storm/storm-kafka "0.9.0-wip15f-scala292"
   :java-source-paths ["src/jvm"]
   :repositories {"scala-tools" "http://scala-tools.org/repo-releases"
                   "conjars" "http://conjars.org/repo/"}


:new: adding support for lein licenses

:new: adding support for lein licenses

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/maoo/bot-unfurl.git/'


dependencies

dependencies

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


Update austin

Update austin

--- project.clj
+++ project.clj
@@ -46,10 +46,10 @@
   :prep-tasks [["cljx" "once"]]
   :profiles {:dev {:dependencies [[crate "0.2.5"]
                                   [hickory "0.5.4"]
+                                  [org.clojure/tools.nrepl "0.2.7"]
                                   [reagent "0.4.3"]]
                    :plugins [[com.keminglabs/cljx "0.5.0"]
-                             [com.cemerick/austin "0.1.6"]
-                             [com.cemerick/piggieback "0.1.5-SNAPSHOT"]
+                             [com.cemerick/austin "0.1.7-SNAPSHOT"]
                              [com.cemerick/clojurescript.test "0.3.3"]
                              [lein-cljsbuild "1.0.4"]]
                    :repl-options {:nrepl-middleware [cljx.repl-middleware/wrap-cljx]}


Version 0.7.2-SNAPSHOT

Version 0.7.2-SNAPSHOT

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject sablono "0.7.1"
+(defproject sablono "0.7.2-SNAPSHOT"
   :description "Lisp style templating for Facebook's React."
   :url "http://github.com/r0man/sablono"
   :author "r0man"


fix alias

fix alias

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


fix version number

fix version number

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/mprokopov/privat24-manager.git/'


Update deps

Update deps

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/democracyworks/partner-http-api.git/'


bump blueprints to fix accounts query

bump blueprints to fix accounts 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/starcity-properties/odin.git/'


more work on dispatch

more work on dispatch

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


test: stop waiting requests (#91)

test: stop waiting requests (#91)

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/B2W-Digital/pdg-core.git/'


Remove obsolete debug-print.

Remove obsolete debug-print.

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/lshift/event-framework.git/'


Optimize requires. Cleanup code.

Optimize requires. Cleanup code.

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


Eliminate local-authority & electorate from context

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/democracyworks/election-notification-works.git/'


[DG] Removed repetition

[DG] Removed repetition

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/democracyworks/notification-works.git/'


Fix typo

Fix typo

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


Paper v. computer-mediated editing post draft

error: pathspec 'resources/fragments/are-editors-good.clj' did not match any file(s) known to git

--- resources/fragments/are-editors-good.clj
+++ resources/fragments/are-editors-good.clj
@@ -0,0 +1,9 @@
+[:article
+ [:h1 "Is using a blog as a technical journal even a good idea?"]
+ [:h2 "Current web editors offer only a tiny fraction of the freedom of ink & paper"]
+ [:p [:span.newthought "As I type, pages from Leonardo Da Vinci's Notebooks "] [:a {:href "http://www.nationalgallery.ie/en/aboutus/pressroom/2015_Press_Releases/Leonardo.aspx"} "are on display in the National Gallery."] " If you get the chance, they're worth seeing, and they're all easily viewable in under an hour."]
+ [:p "These are technical notes, not works of art. They're sketches and sentences assembled together to help develop projects, both commercial and creative."]
+ [:p "Da Vinci freely mixed text and illustration, adding new thoughts and additions where and when they best fit, given the constraints of the page. The page itself formed the frame for his thoughts, an unchangeable limit that resolved a ton of decisions todays editors force you to make: what typeface? What colour? And if you're the type to build your own layout, where does everything go, and how should that change from phone to laptop to desktop?"]
+ [:p "Maybe different times have different contraints; paper was precious in da Vinci's time, laboriously hand made from cloth rags, not pulverised wood fibres. You erased & reworked and patched as you went, & became adept at handcrafting per-page layouts pleasing to the eye. That free-form space to generate and develop ideas isn't available in any computer-mediated space, let alone online." (make-side-note "I can see an environment like Adobe Illustrator, combined with a pen pad like a Wacom Intuos, getting you most of the way there. But the responsiveness of ink & paper, combined with how readily it can be used wherever you are, still win out." "side-note")]]
+
+


Port information globals

Port information globals

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/michaelsbradleyjr/shen.clj.git/'


Inline usage of gen-add-key-from-url

Inline usage of gen-add-key-from-url

--- src/clj/comic_reader/sites/manga_fox.clj
+++ src/clj/comic_reader/sites/manga_fox.clj
@@ -84,23 +84,31 @@
                          (page-list-selector)
                          normalize)))

-(def ^:private chapter-link-normalize
-  (comp
-   (util/gen-add-key-from-url :ch-num
-                              (chapter-number-match-pattern)
-                              safe-read-string)
-   link->map))
+(defn chapter-link-add-ch-num [{:keys [url]
+                            :as comic-map}]
+  (let [[_ data] (re-find (chapter-number-match-pattern) url)]
+    (assoc comic-map
+           :ch-num (safe-read-string data))))
+
+(defn chapter-link-normalize [link]
+  (-> link
+      link->map
+      chapter-link-add-ch-num))

 (defn extract-chapters-list [html comic-url]
   (scrape/extract-list html
                        (chapter-list-selector)
                        chapter-link-normalize))

-(def ^:private comic-link-normalize
-  (comp
-   (util/gen-add-key-from-url :id
-                              (manga-pattern))
-   link->map))
+(defn comic-link-add-id [{:keys [url] :as comic-map}]
+  (let [[_ data] (re-find (manga-pattern) url)]
+    (assoc comic-map
+           :id data)))
+
+(defn comic-link-normalize [link]
+  (-> link
+      link->map
+      comic-link-add-id))

 (defn extract-comics-list [html]
   (scrape/extract-list html


log files

log files

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/jchli/jepsen-aurora.git/'


more short benchmark setting changes

more short benchmark setting changes

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


removed extra appkeys (#2)

removed extra appkeys (#2)

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/Yleisradio/yle-api-template.git/'


Use proper aleph byte decoding in netchan

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


do not downcase path

do not downcase path

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


added boot

added boot

- keep replify as a jar, no main

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

--- build.boot
+++ build.boot
@@ -0,0 +1,56 @@
+(def +version+ "0.1.0")
+
+(task-options!
+  pom {:project     'replify
+       :version     +version+
+       :description "A fast Clojurescript REPL and minimalist build tool "
+       :url         "https://github.com/priyatam/replify"
+       :scm         {:url "https://github.com/priyatam/replify"}
+       :license     {"Eclipse Public License"
+                     "http://www.eclipse.org/legal/epl-v10.html"}})
+
+(set-env!
+  :source-paths #{"src"}
+  :resource-paths #{"src"}
+  :dependencies '[[org.clojure/clojure       "1.7.0"          :scope "provided"]
+                  [org.clojure/clojurescript "1.7.28"         :scope "provided"]
+                  [org.clojure/core.async    "0.1.346.0-17112a-alpha" :scope "provided"]
+                  [org.clojure/tools.cli     "0.3.1"]
+                  [me.raynes/fs              "1.4.6"]
+                  [alembic                   "0.3.2"]
+                  [adzerk/boot-cljs          "0.0-3308-0"     :scope "test"]
+                  [adzerk/boot-reload        "0.3.1"          :scope "test"]
+                  [adzerk/boot-cljs-repl     "0.1.9"          :scope "test"]
+                  [pandeiro/boot-http        "0.6.3-SNAPSHOT" :scope "test"]
+                  [adzerk/bootlaces          "0.1.11"         :scope "test"]])
+
+(require '[adzerk.boot-cljs      :refer [cljs]]
+         '[adzerk.boot-reload    :refer [reload]]
+         '[adzerk.boot-cljs-repl :refer [cljs-repl start-repl]]
+         '[pandeiro.boot-http    :refer [serve]]
+         '[adzerk.bootlaces      :refer :all])
+
+(bootlaces! +version+)
+
+(defn docs-env! []
+  (merge-env!
+    :source-paths #{"docs"}
+    :resource-paths #{"docs"}
+    :dependencies '[[org.clojure/core.match "0.3.0-alpha4"]]))
+
+(deftask docs []
+  (docs-env!)
+  (comp (serve :dir ".")
+        (watch)
+        (reload :on-jsload 'combo-demo.core/main)
+        (cljs-repl)
+        (cljs :optimizations :none
+              :source-map    true
+              :unified-mode  true)))
+
+(deftask clojars-release []
+  (comp (build-jar) (push-release)))
+
+(deftask gh-pages []
+  (docs-env!)
+  (cljs :optimizations :advanced))


update state-ocd-id function to be simpler, take DC into account


CMR-375: Put in placeholder MENDS ISO granule in UMM.

error: pathspec 'src/cmr/umm/iso_mends/granule.clj' did not match any file(s) known to git

--- src/cmr/umm/iso_mends/granule.clj
+++ src/cmr/umm/iso_mends/granule.clj
@@ -0,0 +1,27 @@
+(ns cmr.umm.iso-mends.granule
+  "Contains functions for parsing and generating the MENDS ISO dialect."
+  (:require [clojure.data.xml :as x]
+            [clojure.java.io :as io]
+            [cmr.common.xml :as cx]
+            [cmr.umm.iso-mends.core :as core]
+            [cmr.umm.granule :as c]
+            [cmr.common.xml :as v])
+  (:import cmr.umm.granule.UmmGranule))
+
+
+(extend-protocol cmr.umm.iso-mends.core/UmmToIsoMendsXml
+  UmmGranule
+  (umm->iso-mends-xml
+    ([granule]
+     (cmr.umm.iso-mends.core/umm->iso-mends-xml granule false))
+    ([granule indent?]
+     (let [emit-fn (if indent? x/indent-str x/emit-str)]
+       (emit-fn
+         (x/element :granule {} "UMM granule for MENDS ISO is not supported."))))))
+
+(defn validate-xml
+  "Validates the XML against the ISO schema."
+  [xml]
+  (v/validate-xml (io/resource "schema/iso_mends/schema/1.0/ISO19115-2_EOS.xsd") xml))
+
+


This also needs to return

This also needs to return

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


Add a test for vote-by-mail service

Add a test for vote-by-mail service

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/democracyworks/turbovote-http-api.git/'


Module commits_stat & functions to read basic statistics about commits

error: pathspec 'src/arachnida/commits_stat.clj' did not match any file(s) known to git

--- src/arachnida/commits_stat.clj
+++ src/arachnida/commits_stat.clj
@@ -0,0 +1,67 @@
+(ns arachnida.commits-stat)
+
+(require '[clj-jgit.porcelain :as jgit])
+(require '[clj-jgit.querying  :as jgit-query])
+(require '[clj-jgit.internal  :as jgit-internal])
+
+(require '[arachnida.exec     :as exec])
+
+(defn parse-sha
+    [input-text]
+    (re-find #"[a-zA-Z0-9]+" input-text))
+
+(defn parse-files-changed
+    [input-text]
+    (or (second (re-find #" (\d+) file" input-text)) "0"))
+
+(defn parse-insertions
+    [input-text]
+    (or (second (re-find #" (\d+) insertions" input-text)) "0"))
+
+(defn parse-deletions
+    [input-text]
+    (or (second (re-find #" (\d+) deletions" input-text)) "0"))
+
+(defn parse-commit-stat
+    [stat]
+    {:files-changed (Integer. (parse-files-changed stat))
+     :insertions    (Integer. (parse-insertions    stat))
+     :deletions     (Integer. (parse-deletions     stat))})
+
+(defn parse-commits-stat
+    []
+    (let [input (clojure.string/split-lines (slurp "stats"))
+          shas (take-nth 2 input)           ; all odd lines
+          stats (take-nth 2 (rest input))   ; all even lines
+          ]
+          (zipmap
+              (for [sha shas]
+                   (parse-sha sha))
+              (for [stat stats]
+                   (parse-commit-stat stat)))))
+
+(defn get-commits-stat-for-branch
+    [directory-name branch]
+    (exec/exec "./scripts/get-commits-stat.sh" directory-name branch)
+    (parse-commits-stat))
+
+(defn update-branch-name
+    [branch-name]
+    (subs branch-name (inc (.lastIndexOf branch-name "/"))))
+
+(defn branch->name
+    [branch]
+    (update-branch-name (.getName branch)))
+
+(defn get-local-branches
+    [repo]
+    (for [branch (jgit/git-branch-list repo)]
+        (branch->name branch)))
+
+(defn get-commits-stat-for-all-branches
+    [repo directory-name]
+    (let [branches (get-local-branches repo)]
+        (apply conj
+            (for [branch branches]
+                 (get-commits-stat-for-branch directory-name branch)))))
+


Remove duplicate namespace require

Remove duplicate namespace require

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/tobias/clojars-web.git/'


Improved maybe? predicate implementation.

--- src/cljx/cats/monad/maybe.cljx
+++ src/cljx/cats/monad/maybe.cljx
@@ -114,10 +114,12 @@
 (alter-meta! #'->Just assoc :private true)

 (defn maybe?
+  "Return true in case of `v` is instance
+  of Maybe monad."
   [v]
-  (or (instance? Just v)
-      (instance? Nothing v)
-      (nil? v)))
+  (if (satisfies? proto/Context v)
+    (identical? (proto/get-context v) maybe-monad)
+    false))

 (defn just
   ([v]


added clojure solution

added clojure solution

error: pathspec 'solutions/day09/solution.clj' did not match any file(s) known to git

--- solutions/day09/solution.clj
+++ solutions/day09/solution.clj
@@ -0,0 +1,72 @@
+(use '[leiningen.exec :only (deps)])
+(deps '[[org.clojure/data.priority-map "0.0.7"]]
+      :repositories {"priority-map" "https://github.com/clojure/data.priority-map"})
+(require '[clojure.data.priority-map :as pm])
+(require '[clojure.string :as str])
+
+(defn line->city-pair
+  [string]
+  (let [[cities dist] (str/split string #" = ")
+        dist (read-string dist)
+        [c1 c2] (str/split cities #" to ")]
+    {{c1 c2} dist {c2 c1} dist}))
+
+(def distance-map (->> (slurp "input.txt")
+                       (str/split-lines)
+                       (map line->city-pair)
+                       (reduce conj)))
+
+(def cities (->> (keys distance-map)
+                 (map seq)
+                 (flatten)
+                 (set)))
+
+(defn path->cost-so-far
+  [path distance-map]
+  (->> (map hash-map path (next path))
+       (map distance-map)
+       (reduce +)))
+
+(defn path->heuristic
+  [path distance-map cities]
+  (let [min-dist (apply min (vals distance-map))]
+    (* min-dist (- (count cities) (count path)))))
+
+(defn path->cost
+  [path distance-map cities]
+  (+ (path->cost-so-far path distance-map)
+     (path->heuristic path distance-map cities)))
+
+(defn path->children
+  [path distance-map cities]
+  (->> cities
+       (filter (complement (set path)))
+       (map #(conj path %))
+       (map #(vector % (path->cost % distance-map cities)))
+       (reduce concat)))
+
+(defn a-star
+  [distance-map cities]
+  (loop [q (apply pm/priority-map (path->children [] distance-map cities))
+         best-cost nil]
+    (if-let [[path cost] (peek q)]
+      (if (and best-cost (< best-cost cost))
+        best-cost
+        (let [children (path->children path distance-map cities)
+              q (pop q)]
+          (if (empty? children)
+            (recur q cost)
+            (recur (apply assoc q children) best-cost)))))))
+
+(defn part1
+  [distance-map cities]
+  (a-star distance-map cities))
+
+(defn part2
+  [distance-map cities]
+  (let [neg-distances (map #(* -1 %) (vals distance-map))
+        neg-distance-map (zipmap (keys distance-map) neg-distances) ]
+    (* -1 (a-star neg-distance-map cities))))
+
+(println "part 1:" (part1 distance-map cities))
+(println "part 2:" (part2 distance-map cities))


Use async put

Use async put

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/leif47/immutabledb-experimental.git/'


refreshing mixin

refreshing mixin

error: pathspec 'src/cljs/material/mixin.cljs' did not match any file(s) known to git

--- src/cljs/material/mixin.cljs
+++ src/cljs/material/mixin.cljs
@@ -0,0 +1,14 @@
+(ns material.mixin
+  (:require [rum.core :as rum]))
+
+(defn list-refresh-mixin
+  [handler]
+  {:did-mount    (fn [state]
+                   (let [comp (:rum/react-component state)
+                         callback #(do (handler)
+                                       (rum/request-render comp))
+                         interval (js/setInterval callback 2000)]
+                     (assoc state ::interval interval)))
+   :will-unmount (fn [state]
+                   (js/clearInterval (::interval state))
+                   (dissoc state ::interval))})


bump version to 2.8.11

bump version to 2.8.11

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/B2W-BIT/restQL-server.git/'


Golf/OCD.

Golf/OCD.

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


comment out generator

comment out generator


Remove unnecessary format parameters from defapi

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/physion/ovation-webapi.git/'


Complete tasks

Complete tasks

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


First working example of a filesystem poller

error: pathspec 'src/main/clojure/clojure/tools/namespace/poll.clj' did not match any file(s) known to git

--- src/main/clojure/clojure/tools/namespace/poll.clj
+++ src/main/clojure/clojure/tools/namespace/poll.clj
@@ -0,0 +1,87 @@
+(ns clojure.tools.namespace.poll
+  (:require [clojure.tools.namespace.tracker :as tracker]
+            [clojure.java.io :as io]
+            [clojure.set :as set])
+  (:import (java.util.concurrent Executors ThreadFactory TimeUnit)))
+
+(defn before [state]
+  (let [{:keys [error time load unload time]} state
+        date (doto (java.util.GregorianCalendar.)
+               (.setTimeInMillis time))]
+    (prn (array-map :unload unload :reload load :time date))))
+
+(defn after [state]
+  (let [{:keys [error load]} state]
+    (when error
+      (prn (array-map :error error :pending load)))))
+
+(defn clojure-file? [file]
+  (and (.isFile file)
+       (.endsWith (.getName file) ".clj")))
+
+(defn find-files [state]
+  (->> (:dirs state)
+       (map io/file)
+       (filter #(.exists %))
+       (mapcat file-seq)
+       (filter clojure-file?)
+       (map #(.getCanonicalFile %))))
+
+(defn modified-files [state files]
+  (filter #(< (:time state) (.lastModified %)) files))
+
+(defn deleted-files [state files]
+  (set/difference (:files state) (set files)))
+
+(defn watcher [& options]
+  (merge {:dirs ["src" "test"]
+          :time 0
+          :files #{}}
+         (tracker/tracker)
+         (apply hash-map options)))
+
+(defn update-reload [state deleted modified]
+  (let [now (System/currentTimeMillis)]
+    (-> state
+        (update-in [:files] #(apply disj % deleted))
+        (tracker/remove-files deleted)
+        (update-in [:files] into modified)
+        (tracker/add-files modified)
+        (assoc :time now)
+        (doto before)
+        tracker/reload
+        (doto after))))
+
+(defn poll-reload [state]
+  (let [files (find-files state)
+        deleted (seq (deleted-files state files))
+        modified (seq (modified-files state files))]
+    (if (or deleted modified)
+      (update-reload state deleted modified)
+      state)))
+
+(def default-delay 500)
+
+(let [a (atom -1)]
+  (defn- default-executor []
+    (Executors/newSingleThreadScheduledExecutor
+     (reify ThreadFactory
+       (newThread [this r]
+         (Thread. r (str "clojure.tools.namespace.watch executor "
+                         (swap! a inc))))))))
+
+(defn poll [& options]
+  (let [{:keys [watcher delay executor]
+         :or {watcher (watcher)
+              delay default-delay
+              executor (default-executor)}} options
+        a (atom watcher)
+        f (bound-fn []
+            (try (reset! a (poll-reload @a))
+                 (catch Throwable t
+                   (binding [*out* (java.io.PrintWriter. *err*)]
+                     (println "ERROR in scheduled task"
+                              "from clojure.tools.namespace.watch")
+                     (.printStackTrace t *out*)))))]
+    (.scheduleWithFixedDelay executor f
+                             0 delay TimeUnit/MILLISECONDS)))


util/hadoop/SeqFileTextToFiles.clj: added

error: pathspec 'src/org/altlaw/util/hadoop/SeqFileTextToFiles.clj' did not match any file(s) known to git

--- src/org/altlaw/util/hadoop/SeqFileTextToFiles.clj
+++ src/org/altlaw/util/hadoop/SeqFileTextToFiles.clj
@@ -0,0 +1,33 @@
+(ns org.altlaw.jobs.util.hadoop.SeqFileTextToFiles
+  (:gen-class)
+  (:import (org.altlaw.util.hadoop LocalSetup)
+           (org.apache.hadoop.io Text SequenceFile$Reader)
+           (org.apache.hadoop.fs Path)
+           (org.apache.commons.io FileUtils)
+           (java.io File)))
+
+(defn exit-with-usage []
+  (println "Usage: SeqFileTextToFiles sequence_files... output_dir")
+  (System/exit 1))
+
+(defn -main [& args]
+  (when (zero? (count args)) (exit-with-usage))
+  (let [local (LocalSetup.)
+        conf (.getConf local)
+        fs (.getLocalFileSystem local)
+        text-name (Text.)
+        text-content (Text.)
+        output-dir (File. (last args))]
+    (when-not (.isDirectory output-dir)
+      (println "Last argument must be a directory.")
+      (exit-with-usage))
+    (doseq [infile (butlast args)]
+      (println "Expanding sequence file " infile)
+      (let [seqfile-rdr (SequenceFile$Reader. fs (Path. infile) conf)]
+        (loop []
+          (when (.next seqfile-rdr text-name text-content)
+            (let [outfile (File. output-dir (str text-name))
+                  content (str text-content)]
+              (when-not (.exists outfile)
+                (FileUtils/writeStringToFile outfile content "UTF-8")))
+            (recur)))))))


Test name clobbering another test

Test name clobbering another test

--- test/clj_http/test/core.clj
+++ test/clj_http/test/core.clj
@@ -477,7 +477,7 @@

 ;; If you set a :cookie-policy, the name of the policy is registered
 ;; as (str (type cookie-policy))
-(deftest t-add-client-params-default-cookie-policy
+(deftest t-add-client-params-cookie-policy
   (testing "Using add-client-params! to get an explicitly set :cookie-policy"
     (let [setps (.getParams (doto (DefaultHttpClient.)
                               (core/add-client-params!


Expand merge-update tests

Expand merge-update tests

Fix/expand merge-update tests to test for string usage


Adding unit tests for the persistence namespace - work in progress

error: pathspec 'test/onix/unit/persistence.clj' did not match any file(s) known to git

--- test/onix/unit/persistence.clj
+++ test/onix/unit/persistence.clj
@@ -0,0 +1,29 @@
+(ns onix.unit.persistence
+  (:require [onix.persistence :as persistence])
+
+  (:use midje.sweet)
+
+  )
+
+(fact-group :unit
+
+            (facts "About getting an application from store"
+
+                   (fact "Fetching a app which does not exist returns nil")
+
+                   (future-fact "Fetching an app which does exist gets the app including its metadata")
+
+                   )
+
+            (facts "About updating an existing application"
+
+                   (future-fact "Adding a metadata item to an existing app completes correctly")
+
+                   (future-fact "Updating a metadata item in an existing app overwrites the previous value")
+
+                   (future-fact "Updating a metadata item in an app which doesn't exist returns nil")
+
+                   )
+
+            )
+


Some basic list comprehension

Some basic list comprehension

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


update unit testing helper functions to use new password salting method when creating new users.

--- test/metabase/test_data.clj
+++ test/metabase/test_data.clj
@@ -215,12 +215,14 @@
          (or (= admin true)
              (= admin false))]}
   (or (sel :one User :email email)
-      (let [org (load/test-org)
+      (let [salt (.toString (java.util.UUID/randomUUID))
+            org (load/test-org)
             user (ins User
                    :email email
                    :first_name first
                    :last_name last
-                   :password (creds/hash-bcrypt password))]
+                   :password_salt salt
+                   :password (creds/hash-bcrypt (str salt password)))]
         (or (exists? OrgPerm :organization_id (:id org) :user_id (:id user))
             (ins OrgPerm :organization_id (:id org) :user_id (:id user) :admin admin))
         user)))


better forced lazy loading for test data

--- test/metabase/test_data.clj
+++ test/metabase/test_data.clj
@@ -164,12 +164,12 @@
     :private true}
   tables
   (delay
+   @test-db ; force lazy evaluation of Test DB
    (binding [*log-db-calls* false]
-     (letfn [(table-kw->table-id [table-kw]
-               (->> (-> table-kw name .toUpperCase)
-                    (sel :one [Table :id] :db_id @db-id :name)
-                    :id))]
-       (map-table-kws table-kw->table-id)))))
+     (map-table-kws (fn [table-kw]
+                      (->> (-> table-kw name .toUpperCase)
+                           (sel :one [Table :id] :db_id @db-id :name)
+                           :id))))))

 (def
   ^{:doc "A map of Table name keywords -> map of Field name keywords -> Field IDs.
@@ -180,16 +180,16 @@
     :private true}
   table-fields
   (delay
+   @test-db ; force lazy evaluation of Test DB
    (binding [*log-db-calls* false]
-     (letfn [(table-kw->fields [table-kw]
-               (->> (sel :many [Field :name :id] :table_id (@tables table-kw))
-                    (map (fn [{:keys [^String name id]}]
-                           {:pre [(string? name)
-                                  (integer? id)
-                                  (not (zero? id))]}
-                           {(keyword (.toLowerCase name)) id}))
-                    (reduce merge {})))]
-       (map-table-kws table-kw->fields)))))
+     (map-table-kws (fn [table-kw]
+                      (->> (sel :many [Field :name :id] :table_id (@tables table-kw))
+                           (map (fn [{:keys [^String name id]}]
+                                  {:pre [(string? name)
+                                         (integer? id)
+                                         (not (zero? id))]}
+                                  {(keyword (.toLowerCase name)) id}))
+                           (reduce merge {})))))))

 ;; ## Users


Add initial vault.data.signature ns.

Add initial vault.data.signature ns.

error: pathspec 'src/vault/data/signature.clj' did not match any file(s) known to git

--- src/vault/data/signature.clj
+++ src/vault/data/signature.clj
@@ -0,0 +1,108 @@
+(ns vault.data.signature
+  "Signature handling functions."
+  (:require
+    [puget.data :refer [TaggedValue]]
+    [vault.blob.core :as blob]
+    [vault.data.format :as fmt]
+    [vault.util.pgp :as pgp])
+  (:import
+    (org.bouncycastle.openpgp
+      PGPPrivateKey
+      PGPPublicKey
+      PGPSecretKey
+      PGPSignature)))
+
+
+; Loaded key map:
+; {:public-key #<PGPPublicKey org.bouncycastle.openpgp.PGPPublicKey@47df68e4>
+;  :private-key #<PGPPrivateKey org.bouncycastle.openpgp.PGPPrivateKey@47df68e4>
+;  :secret-key #<PGPSecretKey org.bouncycastle.openpgp.PGPPrivateKey@47df68e4>
+;  :public-key-blob "ascii-armored-string"
+;  :public-key-hash #vault/ref "sha256:1234567890abcdef"}
+
+
+(defprotocol KeyProvider
+  "A protocol for finding PGP keys by their id."
+
+  (unlock-private-key [this id]
+    "Obtains an unlocked private key."))
+
+
+
+;; SIGNATURE RECORD
+
+;#vault/signature
+;{:key #vault/ref "sha256:461566632203729fe8e1c6f373e53b5618069817f00f916cceb451853e0b9f75"
+; :signature #pgp/signature #bin "iQIcBAABAgAGBQJSeHKNAAoJEAadbp3eATs56ckP/2W5QsCPH5SMrV61su7iGPQsdXvZqBb2LKUhGku6ZQxqBYOvDdXaTmYIZJBY0CtAOlTe3NXn0kvnTuaPoA6fe6Ji1mndYUudKPpWWld9vzxIYpqnxL/ZtjgjWqkDf02q7M8ogSZ7dp09D1+P5mNnS4UOBTgpQuBNPWzoQ84QP/N0TaDMYYCyMuZaSsjZsSjZ0CcCm3GMIfTCkrkaBXOIMsHk4eddb3V7cswMGUjLY72k/NKhRQzmt5N/4jw/kI5gl1sN9+RSdp9caYkAumc1see44fJ1m+nOPfF8G79bpCQTKklnMhgdTOMJsCLZPdOuLxyxDJ2yte1lHKN/nlAOZiHFX4WXr0eYXV7NqjH4adA5LN0tkC5yMg86IRIY9B3QpkDPr5oQhlzfQZ+iAHX1MyfmhQCp8kmWiVsX8x/mZBLS0kHq6dJs//C1DoWEmvwyP7iIEPwEYFwMNQinOedu6ys0hQE0AN68WH9RgTfubKqRxeDi4+peNmg2jX/ws39C5YyaeJW7tO+1TslKhgoQFa61Ke9lMkcakHZeldZMaKu4Vg19OLAMFSiVBvmijZKuANJgmddpw0qr+hwAhVJBflB/txq8DylHvJJdyoezHTpRnPzkCSbNyalOxEtFZ8k6KX3i+JTYgpc2FLrn1Fa0zLGac7dIb88MMV8+Wt4H2d1c"
+; :target #vault/ref "sha256:97df3588b5a3f24babc3851b372f0ba71a9dcdded43b14b9d06961bfc1707d9d"}
+
+(defrecord Signature
+  [key ^PGPSignature signature target])
+
+
+(extend-type Signature
+  TaggedValue
+
+  (tag [this] 'vault/signature)
+
+  (value [this]
+    (select-keys this #{:key :signature :target})))
+
+
+(defn read-signature
+  "Reads an encoded signature map."
+  [value]
+  (-> value
+      (select-keys #{:key :signature :target})
+      map->Signature))
+
+
+
+;; XXXX
+
+(defn- load-public-key
+  "Loads a public key from a blob-store by its hash-id."
+  [store hash-id]
+  (let [encoded-pubkey (:content (blob/get store hash-id))]
+    (when-not encoded-pubkey
+      (throw (IllegalStateException.
+               (str "No public key blob stored for " hash-id))))
+    (let [pubkey (pgp/decode-public-key encoded-pubkey)]
+      (when-not (instance? PGPPublicKey pubkey)
+        (throw (IllegalStateException.
+                 (str "Blob " hash-id " is not a PGP public key"))))
+      pubkey)))
+
+
+(defn- load-private-key
+  "Obtains a private key for the given id."
+  [provider key-id]
+  (let [privkey (unlock-private-key provider key-id)]
+    (when-not (instance? PGPPrivateKey privkey)
+      (throw (IllegalStateException.
+               (str "Private key " (Long/toHexString key-id) " is not available"))))
+    privkey))
+
+
+(defn sign-value
+  "Signs a clojure value with pgp private keys. Returns the constructed
+  string holding the canonical value and signature."
+  [blob-store
+   key-provider
+   pubkey-hash
+   value]
+  (let [pubkey (load-public-key blob-store pubkey-hash)
+        privkey (load-private-key key-provider (pgp/key-id pubkey))
+        value-bytes (fmt/value-bytes value)
+        pgp-sig (pgp/sign value-bytes privkey)
+        sig (map->Signature {:key pubkey-hash
+                             :signature pgp-sig})]
+    (fmt/print-data-str value sig)))
+
+
+(defn verify-blob
+  "Verifies that the inline signatures in a sequence of blob values is valid."
+  [blob-store
+   blob-values]
+  ; TODO: implement
+  nil)


fix dom structure

fix dom structure

--- labs/architecture-examples/om/src/todomvc/item.cljs
+++ labs/architecture-examples/om/src/todomvc/item.cljs
@@ -22,9 +22,9 @@
     false))

 (defn handle-edit [e todo {:keys [owner comm]}]
-  (go
-    (>! comm [:edit todo])
-    (let [node (dom/get-node owner "editField")]
+  (let [node (dom/get-node owner "editField")]
+    (go
+      (>! comm [:edit todo])
       (.focus node)
       (.setSelectionRange node (.. node -value -length) (.. node -value -length))))
   (om/replace! todo [:edit-text] (:title todo)))
@@ -52,8 +52,8 @@
                             :onChange (fn [_] (put! comm [:toggle todo]))})
             (dom/label #js {:onDoubleClick #(handle-edit % todo m)} (:title todo))
             (dom/button #js {:className "destroy"
-                             :onClick (fn [_] (put! comm [:destroy todo]))})
-            (dom/input #js {:ref "editField" :className "edit" :value (:edit-text todo)
-                            :onBlur #(handle-submit % todo m)
-                            :onChange #(handle-change % todo)
-                            :onKeyDown #(handle-key-down % todo m)})))))))
+                             :onClick (fn [_] (put! comm [:destroy todo]))}))
+          (dom/input #js {:ref "editField" :className "edit" :value (:edit-text todo)
+                          :onBlur #(handle-submit % todo m)
+                          :onChange #(handle-change % todo)
+                          :onKeyDown #(handle-key-down % todo m)}))))))


Make sure vote-tomorrows have an [:election :id]

A hack that can be removed once current vote-tomorrows have all been
sent, since we've added election id to the context by default:
democracyworks/election-notification-works#210

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/democracyworks/scheduled-message-works.git/'


first cut

first cut

error: pathspec 'dada2-core/src/test/clojure/org/dada2/test_versioned_map.clj' did not match any file(s) known to git

--- dada2-core/src/test/clojure/org/dada2/test_versioned_map.clj
+++ dada2-core/src/test/clojure/org/dada2/test_versioned_map.clj
@@ -0,0 +1,74 @@
+(ns org.dada2.test-versioned-map
+    (:use
+     [clojure test]
+     [clojure.tools logging]
+     [org.dada2 utils]
+     [org.dada2 core]
+     [org.dada2 test-core]
+     )
+    )
+
+;; need to inject comparator fn
+;; what if we already have (vk-fn new-value) in our hand ?
+;; what about deletion ?
+(defn versioned-map-optimistic-assoc [old-map pk vk-fn new-value]
+  (let [new-map (assoc old-map pk new-value)]
+    (if (identical? old-map new-map)
+      old-map
+      (let [old-value (old-map pk)]
+        (if (and old-value (>= (vk-fn old-value) (vk-fn new-value)))
+          old-map
+          new-map)))))
+
+(defn versioned-map-optimistic-dissoc [old-map pk vk-fn new-version]
+  (let [new-map (dissoc old-map pk)]
+    (if (identical? old-map new-map)
+      old-map
+      (let [old-value (old-map pk)]
+        (if (and old-value (> (vk-fn old-value) new-version ))
+          old-map
+          new-map)))))
+
+(defn versioned-map-pessimistic-assoc [old-map pk vk-fn new-value]
+  (let [old-value (old-map pk)]
+    (if (and old-value (>= (vk-fn old-value) (vk-fn new-value)))
+      old-map
+      (assoc old-map pk new-value))))
+
+(defn versioned-map-pessimistic-dissoc [old-map pk vk-fn new-version]
+  (let [old-value (old-map pk)]
+    (if (and old-value (> (vk-fn old-value) new-version))
+      old-map
+      (dissoc old-map pk))))
+
+(defn versioned-map-dissoc [old-map pk]
+  (dissoc old-map pk))
+
+(defn versioned-map-get [vm pk]
+  (vm pk))
+
+;; some aliases
+(def vm:opt-assoc versioned-map-optimistic-assoc)
+(def vm:opt-dissoc versioned-map-optimistic-dissoc)
+(def vm:pess-assoc versioned-map-pessimistic-assoc)
+(def vm:pess-dissoc versioned-map-pessimistic-dissoc)
+(def vm:get versioned-map-get)
+
+(deftest test-versioned-map
+
+  (is (= (vm:opt-assoc {} :a first [0 "a"]) {:a [0 "a"]}))
+  (is (= (vm:opt-assoc (vm:opt-assoc {} :a first [0 "a"]) :a first [1 "a"]) {:a [1 "a"]}))
+  (is (= (vm:opt-assoc (vm:opt-assoc {} :a first [0 "a"]) :a first [-1 "a"]) {:a [0 "a"]}))
+  (is (= (vm:get (vm:opt-assoc {} :a first [0 "a"]) :a) [0 "a"]))
+  (is (= (vm:opt-dissoc (vm:opt-assoc {} :a first [0 "a"]) :a first -1) {:a [0 "a"]}))
+  (is (= (vm:opt-dissoc (vm:opt-assoc {} :a first [0 "a"]) :a first 0) {}))
+  (is (= (vm:opt-dissoc (vm:opt-assoc {} :a first [0 "a"]) :a first 1) {}))
+
+  (is (= (vm:pess-assoc {} :a first [0 "a"]) {:a [0 "a"]}))
+  (is (= (vm:pess-assoc (vm:pess-assoc {} :a first [0 "a"]) :a first [1 "a"]) {:a [1 "a"]}))
+  (is (= (vm:pess-assoc (vm:pess-assoc {} :a first [0 "a"]) :a first [-1 "a"]) {:a [0 "a"]}))
+  (is (= (vm:get (vm:pess-assoc {} :a first [0 "a"]) :a) [0 "a"]))
+  (is (= (vm:pess-dissoc (vm:pess-assoc {} :a first [0 "a"]) :a first -1) {:a [0 "a"]}))
+  (is (= (vm:pess-dissoc (vm:pess-assoc {} :a first [0 "a"]) :a first 0) {}))
+  (is (= (vm:pess-dissoc (vm:pess-assoc {} :a first [0 "a"]) :a first 1) {}))
+  )


Add snippets for Output category. Issue #87.

error: pathspec 'test/snippets/output.clj' did not match any file(s) known to git

--- test/snippets/output.clj
+++ test/snippets/output.clj
@@ -0,0 +1,22 @@
+(ns snippets.output
+  (:require [quil.snippet :refer [defsnippet]]
+            [quil.core :refer :all]))
+
+(defsnippet begin-raw-end-raw-s {:renderer :p3d}
+  (begin-raw :dxf "dxf.txt")
+  (camera 150 150 150 0 0 0 0 0 1)
+  (box 100)
+  (end-raw))
+
+(defsnippet save-s {:renderer :p3d}
+  (camera 150 150 150 0 0 0 0 0 1)
+  (box 100)
+  (save "box.png"))
+
+(defsnippet save-frame-s {:renderer :p3d}
+  (camera 150 150 150 0 0 0 0 0 1)
+  (background 127)
+  (with-rotation [(/ (frame-count) 10)]
+   (box 100))
+  (save-frame)
+  (save-frame "rotating-box-####.png"))


CMR-346: Added test for searching browse_only

error: pathspec 'test/cmr/system_int_test/search/granule_search_browse_only_test.clj' did not match any file(s) known to git

--- test/cmr/system_int_test/search/granule_search_browse_only_test.clj
+++ test/cmr/system_int_test/search/granule_search_browse_only_test.clj
@@ -0,0 +1,68 @@
+(ns cmr.system-int-test.search.granule-search-browse-only-test
+  "Integration tests for searching by browse_only"
+  (:require [clojure.test :refer :all]
+            [cmr.system-int-test.utils.ingest-util :as ingest]
+            [cmr.system-int-test.utils.search-util :as search]
+            [cmr.system-int-test.utils.index-util :as index]
+            [cmr.system-int-test.data2.collection :as dc]
+            [cmr.system-int-test.data2.granule :as dg]
+            [cmr.system-int-test.data2.core :as d]))
+
+(use-fixtures :each (ingest/reset-fixture {"provguid1" "PROV1"}))
+
+(deftest search-granule-by-browse-only
+  (let [ru1 (dc/related-url "GET DATA")
+        ru2 (dc/related-url "GET RELATED VISUALIZATION")
+        ru3 (dc/related-url nil)
+        coll (d/ingest "PROV1" (dc/collection {}))
+        g1 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru1]}))
+        g2 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru2]}))
+        g3 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru3]}))
+        g4 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru2 ru3]}))
+        g5 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru1 ru2]}))
+        g6 (d/ingest "PROV1" (dg/granule coll {}))]
+
+    (index/refresh-elastic-index)
+
+    (are [value items]
+         (d/refs-match? items
+                              (search/find-refs :granule {:browse-only value}))
+
+         true [g2 g4 g5]
+         false [g1 g3 g6])))
+
+(deftest search-granule-by-online-only
+  (let [ru1 (dc/related-url "GET DATA")
+        ru2 (dc/related-url "GET RELATED VISUALIZATION")
+        ru3 (dc/related-url nil)
+        coll (d/ingest "PROV1" (dc/collection {}))
+        gran1 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru1]}))
+        gran2 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru2]}))
+        gran3 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru3]}))
+        gran4 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru2 ru3]}))
+        gran5 (d/ingest "PROV1" (dg/granule coll {:related-urls [ru1 ru2]}))
+        gran6 (d/ingest "PROV1" (dg/granule coll {}))]
+
+    (index/refresh-elastic-index)
+
+    (testing "search by online only true."
+      (is (d/refs-match? [gran1 gran5]
+                         (search/find-refs :granule {:online-only true}))))
+    (testing "search by online only false."
+      (is (d/refs-match? [gran2 gran3 gran4 gran6]
+                         (search/find-refs :granule {:online-only false}))))
+    (testing "search by online only unset."
+      (is (d/refs-match? [gran1 gran2 gran3 gran4 gran5 gran6]
+                         (search/find-refs :granule {:online-only "unset"}))))
+    (testing "search by online only wrong value"
+      (is (= {:status 422 :errors ["Parameter :downloadable must take value of true, false, or unset, but was wrong"]}
+             (search/find-refs :granule {:online-only "wrong"}))))
+
+    (testing "search granule by online only with aql"
+      (are [items value]
+           (d/refs-match? items
+                          (search/find-refs-with-aql :granule [{:onlineOnly value}]))
+
+           ;; it is not possible to search onlineOnly false in AQL, so we don't have a test for that
+           [gran1 gran5] true
+           [gran1 gran5] nil))))


fix but with samples = none

fix but with samples = none

--- src/clj/collect_earth_online/db/projects.clj
+++ src/clj/collect_earth_online/db/projects.clj
@@ -181,7 +181,7 @@
                                              sample-distribution
                                              samples-per-plot
                                              sample-resolution))]
-    (p-insert-rows! "samples" samples)
+    (when (seq samples) (p-insert-rows! "samples" samples))
     (if allow-drawn-samples?
       (when (#{"csv" "shp"} sample-distribution)
         (p-insert-rows! "ext_samples" samples))


Robot.clj - first working version

Robot.clj - first working version

error: pathspec 'clojure/robot-name/robot.clj' did not match any file(s) known to git

--- clojure/robot-name/robot.clj
+++ clojure/robot-name/robot.clj
@@ -0,0 +1,23 @@
+(def name-chars  "ABCDEFGHIJKLMNOPQRSTUVWXYZW")
+(def name-digits "0123456789")
+(def names {})
+
+(defn- random-chars [count collection]
+  (repeatedly count #(rand-nth collection)))
+
+(defn- new-name [& more]
+  (apply str (concat
+    (random-chars 2 name-chars)
+    (random-chars 3 name-digits))))
+
+(defn robot []
+  (let [name (new-name)]
+    (def names (assoc names name name))
+    {:id name}))
+
+(defn robot-name [robot]
+  (names (robot :id)))
+
+(defn reset-name [robot]
+  (def names (update-in names [(robot :id)] new-name))
+  robot)


Stub for new module: metadata-exporter

Stub for new module: metadata-exporter

error: pathspec 'src/emender_jenkins/metadata_exporter.clj' did not match any file(s) known to git

--- src/emender_jenkins/metadata_exporter.clj
+++ src/emender_jenkins/metadata_exporter.clj
@@ -0,0 +1,14 @@
+;
+;  (C) Copyright 2016  Pavel Tisnovsky
+;
+;  All rights reserved. This program and the accompanying materials
+;  are made available under the terms of the Eclipse Public License v1.0
+;  which accompanies this distribution, and is available at
+;  http://www.eclipse.org/legal/epl-v10.html
+;
+;  Contributors:
+;      Pavel Tisnovsky
+;
+
+(ns emender-jenkins.metadata-exporter)
+


revert accidentally committed code

revert accidentally committed code

git-svn-id: 03a8048b5ee8463be5048a3801110fb50f378627@11146 d0ab736e-dc22-4aeb-8dc9-08def0aa14fd

--- acqEngine/src/org/micromanager/acq_engine.clj
+++ acqEngine/src/org/micromanager/acq_engine.clj
@@ -156,8 +156,7 @@
       {"AttachedTasks" (JSONArray. (map str runnables))})))

 (defn annotate-image [img event state elapsed-time-ms]
-  {:direct-buffer (:direct-buffer img)
-   :bytes-per-pixel (:bytes-per-pixel img)
+  {:pix (:pix img)
    :tags
    (merge
      (generate-metadata event state)
@@ -166,9 +165,7 @@
      )}) ;; include any existing metadata

 (defn make-TaggedImage [annotated-img]
-  (TaggedImage. (:direct-buffer annotated-img)
-                (:bytes-per-pixel annotated-img)
-                (JSONObject. (:tags annotated-img))))
+  (TaggedImage. (:pix annotated-img) (JSONObject. (:tags annotated-img))))

 ;; hardware error handling

@@ -379,9 +376,8 @@
 (defn pop-burst-image
   [timeout-ms]
   (let [tagged-image (pop-tagged-image-timeout timeout-ms)]
-    {:direct-buffer (.getDirectBuffer tagged-image)
-     :bytes-per-pixel (.getBytesPerPixel tagged-image)
-     :tags (json-to-data (.getTags tagged-image))}))
+    {:pix (.pix tagged-image)
+     :tags (json-to-data (.tags tagged-image))}))

 (defn pop-burst-images
   [n timeout-ms]


Improved the docstring on run-jetty

Improved the docstring on run-jetty

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


added tests for json decoration

added tests for json decoration

error: pathspec 'test/statuses/views/test/json.clj' did not match any file(s) known to git

--- test/statuses/views/test/json.clj
+++ test/statuses/views/test/json.clj
@@ -0,0 +1,56 @@
+(ns statuses.views.test.json
+  (:require [clojure.test :refer [deftest is]]
+            [clj-time.core :refer [date-time]]
+            [statuses.routes :refer [avatar-path profile-path update-path]]
+            [statuses.views.json :refer [decorate]]))
+
+(defn- item [can-delete? id time author text]
+  {:can-delete? can-delete? :id id :time time :author author :text text})
+
+(defn- test-item [item ref-item]
+
+        (is (= (:id item)
+               (:id ref-item))
+            "id is unchanged")
+
+        (is (= (:can-delete? item)
+               (:can-delete? ref-item))
+            "can-delete? matches")
+
+        (is (= (:author  item)
+               (:author ref-item))
+            "author is unchanged")
+
+        (is (= (:time item)
+               (:time ref-item))
+            "time is unchanged")
+
+        (is (= (:text  item)
+               (:text ref-item))
+            "text is unchanged")
+
+        (is (= (:self  item)
+               (update-path (:id ref-item)))
+            "self reference is set")
+
+        (is (= (:avatar  item)
+               (avatar-path (:author ref-item)))
+            "avatar is set")
+
+        (is (= (:profile  item)
+               (profile-path (:author ref-item)))
+            "profile is set"))
+
+(deftest test-decorate
+  (let [item1 (item false 42 (date-time 2015 2 20 0 0 0 0) "hein" "Irgendwann wird auch mal jemand verstehen, was Phillip hier meint.")
+        item2 (item true 41 (date-time 2015 2 20 0 0 0 0) "hein" "We know some foreign languages, too, so let's throw in an English text.")
+        item3 (item false 40 (date-time 2015 2 20 0 0 0 0) "uiui" "Hoffentlich sieht das hier nie irgend jemand.")
+
+        items [item1 item2 item3]
+
+        decorated (decorate items)]
+
+        ;; could be more "functional" but for the sake of readability
+        (test-item (first decorated) item1)
+        (test-item (second decorated) item2)
+        (test-item (nth decorated 2) item3)))


pepa.selection: Generic selection handling code.

error: pathspec 'src-cljs/pepa/selection.cljs' did not match any file(s) known to git

--- src-cljs/pepa/selection.cljs
+++ src-cljs/pepa/selection.cljs
@@ -0,0 +1,117 @@
+(ns pepa.selection)
+
+(defrecord Selection [elements selected last-clicked])
+(defrecord Click [element modifiers])
+
+(def shift ::shift)
+(def control ::control)
+(def alt ::alt)
+
+(defn make-click [element modifiers]
+  {:pre [element (every? #{shift control alt} modifiers)]}
+  (map->Click {:element element
+               :modifiers (set modifiers)}))
+
+(defn event->click [element e]
+  (make-click element
+              (->> [(when e.shiftKey shift)
+                    (when e.ctrlKey  control)
+                    (when e.altKey   alt)]
+                   (remove nil?)
+                   (into #{}))))
+
+(defn make-selection [elements]
+  (->Selection elements #{} nil))
+
+(defn ^:private toggle-selection [selection element]
+  (let [selected (:selected selection)]
+    (update selection :selected
+            (comp set (if (contains? selected element) disj conj))
+            element)))
+
+(defn ^:private range-selection [selection element]
+  (let [{:keys [selected elements]} selection
+        first-element (some (conj selected element) elements)
+        last-element  (some (conj selected element) (reverse elements))
+        new-selected (->> elements
+                          (drop-while #(not= first-element %))
+                          (take-while #(not=  last-element %))
+                          (into #{first-element last-element}))]
+    (update selection :selected into new-selected)))
+
+(defn click [selection click]
+  {:pre [(contains? (set (:elements selection)) (:element click))]}
+  (let [{:keys [element modifiers]} click]
+    (cond
+      (and (empty? modifiers)
+           (nil? element))
+      (assoc selection
+             :selected #{}
+             :last-clicked nil)
+
+      (empty? modifiers)
+      (assoc selection
+             :selected #{element}
+             :last-clicked element)
+
+      (control modifiers)
+      (-> selection
+          (toggle-selection element)
+          (assoc :last-clicked element))
+
+      (shift modifiers)
+      (-> selection
+          (range-selection element)
+          (assoc :last-clicked element)))))
+
+;;; No modifiers
+
+(let [s (-> (->Selection (range 10) nil nil)
+            (click (make-click 3 [])))]
+  (assert (= #{3} (:selected s)))
+  (assert (= 3 (:last-clicked s))))
+
+(let [s (-> (->Selection (range 10) nil nil)
+            (click (make-click 3 []))
+            (click (make-click 5 [])))]
+  (assert (= #{5} (:selected s)))
+  (assert (= 5 (:last-clicked s))))
+
+;;; Control Selection
+
+(let [s (-> (->Selection (range 10) nil nil)
+            (click (make-click 3 [control])))]
+  (assert (= #{3} (:selected s)))
+  (assert (= 3 (:last-clicked s))))
+
+(let [s (-> (->Selection (range 10) nil nil)
+            (click (make-click 3 [control]))
+            (click (make-click 3 [control])))]
+  (assert (= #{} (:selected s)))
+  (assert (= 3 (:last-clicked s))))
+
+(let [s (-> (->Selection (range 10) nil nil)
+            (click (make-click 3 [control]))
+            (click (make-click 5 [control])))]
+  (assert (= #{3 5} (:selected s)))
+  (assert (= 5 (:last-clicked s))))
+
+;;; Shift Selection
+
+(let [s (-> (->Selection (range 10) nil nil)
+            (click (make-click 3 []))
+            (click (make-click 7 [shift])))]
+  (assert (= #{3 4 5 6 7} (:selected s)))
+  (assert (= 7 (:last-clicked s))))
+
+(let [s (-> (->Selection (range 10) nil nil)
+            (click (make-click 7 []))
+            (click (make-click 3 [shift])))]
+  (assert (= #{3 4 5 6 7} (:selected s)))
+  (assert (= 3 (:last-clicked s))))
+
+(let [s (-> (->Selection (range 10) nil nil)
+            (click (make-click 7 []))
+            (click (make-click 7 [shift])))]
+  (assert (= #{7} (:selected s)))
+  (assert (= 7 (:last-clicked s))))


Unbreak build.

Unbreak build.

--- src-clj/acha/achievement.clj
+++ src-clj/acha/achievement.clj
@@ -129,7 +129,7 @@
 (def mark-of-the-beast
   (make-sha-scanner
     :mark-of-the-beast
-    #(.contains sha "666")))
+    #(.contains % "666")))

 ; LOC achievements
 (defn make-loc-scanner [achievement-id loc-predicate]


need :styles key for css import

need :styles key for css import

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


update catalogs to only include misc when there are misc items

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/starcity-properties/odin.git/'


Re-add aggregation-state-test in prep for jepsenisation

error: pathspec 'onyx-peers/test/onyx_peers/jobs/aggregation_state_test.clj' did not match any file(s) known to git


Implemented Middle Character

Implemented Middle Character

error: pathspec 'src/clojush/problems/software/benchmarks_v2/middle_character.clj' did not match any file(s) known to git

--- src/clojush/problems/software/benchmarks_v2/middle_character.clj
+++ src/clojush/problems/software/benchmarks_v2/middle_character.clj
@@ -0,0 +1,172 @@
+;; middle_character.clj
+;; Tom Helmuth, thelmuth@hamilton.edu
+;;
+;; Problem inspired by: https://www.codewars.com/kata/56747fd5cb988479af000028
+
+(ns clojush.problems.software.benchmarks-v2.middle-character
+  (:use clojush.pushgp.pushgp
+        [clojush pushstate interpreter random util globals]
+        clojush.instructions.tag)
+  (:require [clojure.math.numeric-tower :as nt]))
+
+; Atom generators
+(def atom-generators
+  (make-proportional-atom-generators
+   (concat
+    (registered-for-stacks [:string :char :integer :boolean :exec])
+    (list (tag-instruction-erc [:string :char :integer :boolean :exec] 1000) ; tags
+          (tagged-instruction-erc 1000)))
+   (list 'in1) ; inputs
+   (list 0
+         1
+         2
+         (fn [] (- (lrand-int 201) 100)) ;Integer ERC
+         ""
+         ) ; constants
+   {:proportion-inputs 0.15
+    :proportion-constants 0.05}))
+
+(def middle-character-chars (map char (range 32 127)))
+
+(defn middle-character-input
+  "Creates a string of length len."
+  [len]
+  (apply str
+         (repeatedly len
+                     #(lrand-nth middle-character-chars))))
+
+;; A list of data domains. Each domain is a vector containing
+;; a "set" of inputs and two integers representing how many cases from the set
+;; should be used as training and testing cases respectively. Each "set" of
+;; inputs is either a list or a function that, when called, will create a
+;; random element of the set.
+(def data-domains
+  [[(list "Q"
+          " "
+          "$"
+          "E9"
+          ")b"
+          "DOG"
+          "OGD"
+          "test"
+          "$3^:1"
+          "middle"
+          "testing"
+          "      "
+          "hi  ~1"
+          "  hi~1"
+          "hi~1  ") 15 0] ; fixed strings
+   [(fn [] (middle-character-input (inc (lrand-int 100)))) 185 2000] ; random strings, length [1, 100]
+   ])
+
+(defn solve-middle-character
+  "Solves the problem given the input."
+  [input]
+  (let [len (count input)]
+    (if (zero? (mod len 2))
+      (let [middle-left (dec (quot len 2))]
+        (subs input middle-left (+ 2 middle-left)))
+      (let [middle (quot len 2)]
+        (str (nth input middle))))))
+
+; Helper function for error function
+(defn test-cases
+  "Takes a sequence of inputs and gives IO test cases of the form
+   [[input1 input2] output]."
+  [inputs]
+  (map (fn [in]
+         (vector in
+                 (solve-middle-character in)))
+       (sort-by count inputs)))
+
+(defn make-error-function-from-cases
+  "Creates and returns the error function based on the train/test cases."
+  [train-cases test-cases]
+  (fn the-actual-error-function
+    ([individual]
+     (the-actual-error-function individual :train))
+    ([individual data-cases] ;; data-cases should be :train or :test
+     (the-actual-error-function individual data-cases false))
+    ([individual data-cases print-outputs]
+     (let [behavior (atom '())
+           errors (doall
+                   (for [[input1 correct-output] (case data-cases
+                                                   :train train-cases
+                                                   :test test-cases
+                                                   [])]
+                     (let [final-state (run-push (:program individual)
+                                                 (->> (make-push-state)
+                                                      (push-item input1 :input)))
+                           result (top-item :string final-state)]
+                       (when print-outputs
+                         (println (format "Correct output: %s | Program output: %s" correct-output (str result))))
+                         ; Record the behavior
+                       (swap! behavior conj result)
+                         ; Error is Levenshtein distance
+                       (if (string? result)
+                         (levenshtein-distance correct-output result)
+                         1000) ; penalty for no return value
+                       )))]
+       (if (= data-cases :train)
+         (assoc individual :behaviors @behavior :errors errors)
+         (assoc individual :test-errors errors))))))
+
+(defn get-train-and-test
+  "Returns the train and test cases."
+  [data-domains]
+  (map test-cases
+       (test-and-train-data-from-domains data-domains)))
+
+; Define train and test cases
+(def train-and-test-cases
+  (get-train-and-test data-domains))
+
+(defn initial-report
+  [argmap]
+  (println "Train and test cases:")
+  (doseq [[i case] (map vector (range) (first train-and-test-cases))]
+    (println (format "Train Case: %3d | Input/Output: %s" i (str case))))
+  (doseq [[i case] (map vector (range) (second train-and-test-cases))]
+    (println (format "Test Case: %3d | Input/Output: %s" i (str case))))
+  (println ";;******************************"))
+
+(defn custom-report
+  "Custom generational report."
+  [best population generation error-function report-simplifications]
+  (let [best-test-errors (:test-errors (error-function best :test))
+        best-total-test-error (apply +' best-test-errors)]
+    (println ";;******************************")
+    (printf ";; -*- Find Pair problem report - generation %s\n" generation) (flush)
+    (println "Test total error for best:" best-total-test-error)
+    (println (format "Test mean error for best: %.5f" (double (/ best-total-test-error (count best-test-errors)))))
+    (when (zero? (:total-error best))
+      (doseq [[i error] (map vector
+                             (range)
+                             best-test-errors)]
+        (println (format "Test Case  %3d | Error: %s" i (str error)))))
+    (println ";;------------------------------")
+    (println "Outputs of best individual on training cases:")
+    (error-function best :train true)
+    (println ";;******************************"))) ;; To do validation, could have this function return an altered best individual
+       ;; with total-error > 0 if it had error of zero on train but not on validation
+       ;; set. Would need a third category of data cases, or a defined split of training cases.
+
+
+; Define the argmap
+(def argmap
+  {:error-function (make-error-function-from-cases (first train-and-test-cases)
+                                                   (second train-and-test-cases))
+   :atom-generators atom-generators
+   :max-points 2000
+   :max-genome-size-in-initial-program 250
+   :evalpush-limit 2000
+   :population-size 1000
+   :max-generations 300
+   :parent-selection :lexicase
+   :genetic-operator-probabilities {:uniform-addition-and-deletion 1.0}
+   :uniform-addition-and-deletion-rate 0.09
+   :problem-specific-report custom-report
+   :problem-specific-initial-report initial-report
+   :report-simplifications 0
+   :final-report-simplifications 5000
+   :max-error 1000})


formu-zuzena laguntzailea

formu-zuzena laguntzailea

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/lnmnd/magnet.bez.git/'


Add stub for roman-numerals

Add stub for roman-numerals

error: pathspec 'exercises/roman-numerals/src/roman_numerals.clj' did not match any file(s) known to git

--- exercises/roman-numerals/src/roman_numerals.clj
+++ exercises/roman-numerals/src/roman_numerals.clj
@@ -0,0 +1,5 @@
+(ns roman-numerals)
+
+(defn numerals [] ;; <- Arglist goes here
+      ;; your code goes here
+      )


Add writter spec tests.

Add writter spec tests.

error: pathspec 'spec/cats/monad/writer_spec.cljx' did not match any file(s) known to git

--- spec/cats/monad/writer_spec.cljx
+++ spec/cats/monad/writer_spec.cljx
@@ -0,0 +1,110 @@
+(ns cats.monad.writer-spec
+  #+cljs
+  (:require [speclj.core :as s :include-macros true]
+            [cats.builtin :as b]
+            [cats.protocols :as p]
+            [cats.data :as d]
+            [cats.monad.writer :as writer]
+            [cats.monad.maybe :as maybe]
+            [cats.core :as m :include-macros true])
+  #+clj
+  (:require [speclj.core :as s]
+            [cats.builtin :as b]
+            [cats.protocols :as p]
+            [cats.data :as d]
+            [cats.monad.writer :as writer]
+            [cats.monad.maybe :as maybe]
+            [cats.core :as m]))
+
+
+(s/describe "writer-monad"
+  (s/it "Putting a value in a writer context yields an empty log"
+    (s/should= 42
+               (writer/value (p/mreturn writer/writer-monad 42)))
+    (s/should= []
+               (writer/log (p/mreturn writer/writer-monad 42))))
+
+  (s/it "The `tell` function adds the given value to the log"
+    (s/should= ["Hello" "world"]
+               (m/with-monad writer/writer-monad
+                 (writer/log (m/>> (writer/tell "Hello")
+                                   (writer/tell "world"))))))
+
+  (s/it "The `listen` function yields a pair with the value and the log"
+    (let [w (m/with-monad writer/writer-monad
+              (m/>> (writer/tell "Hello")
+                    (writer/tell "world")
+                    (m/return 42)))
+          w (writer/listen w)]
+      (s/should= (d/pair 42 ["Hello" "world"])
+                 (first w))
+      (s/should= ["Hello" "world"]
+                 (second w))))
+
+  (s/it "The `pass` function can be used to apply a function to the log"
+    (let [w (m/with-monad writer/writer-monad
+              (m/>> (writer/tell "Hello")
+                    (writer/tell "world")
+                    (m/return [42 reverse])))
+          w (writer/listen (writer/pass w))]
+        (s/should= (d/pair 42 ["world" "Hello"])
+                   (first w))
+        (s/should= ["world" "Hello"]
+                   (second w)))))
+
+
+(def maybe-writer (writer/writer-transformer maybe/maybe-monad))
+
+(s/describe "writer-transformerformer"
+  (s/it "Putting a value in a writer transformer context yields an empty log"
+    (let [w (m/with-monad maybe-writer
+              (m/return 42))]
+      (s/should= 42
+                 (writer/value (maybe/from-maybe w)))
+      (s/should= []
+                 (writer/log (maybe/from-maybe w)))))
+
+  (s/it "The `tell` function adds the given value to the log"
+    (let [w (m/with-monad maybe-writer
+              (m/>> (writer/tell "Hello")
+                    (writer/tell "world")))]
+      (s/should= ["Hello" "world"]
+                 (writer/log (maybe/from-maybe w)))))
+
+  (s/it "The `listen` function yields a pair with the value and the log"
+    (let [w (m/with-monad maybe-writer
+              (m/>> (writer/tell "Hello")
+                    (writer/tell "world")
+                    (m/return 42)))
+          w (m/with-monad maybe-writer
+              (writer/listen w))]
+      (s/should= (d/pair 42 ["Hello" "world"])
+                 (first (maybe/from-maybe w)))
+      (s/should= ["Hello" "world"]
+                 (second (maybe/from-maybe w)))))
+
+  (s/it "The `pass` function can be used to apply a function to the log"
+    (let [w (m/with-monad maybe-writer
+              (m/>> (writer/tell "Hello")
+                    (writer/tell "world")
+                    (m/return [42 reverse])))
+          w (m/with-monad maybe-writer
+              (writer/listen (writer/pass w)))]
+      (s/should= (d/pair 42 ["world" "Hello"])
+                 (first (maybe/from-maybe w)))
+      (s/should= ["world" "Hello"]
+                 (second (maybe/from-maybe w)))))
+
+  (s/it "Inner monad values can be lifted into the transformer"
+    (let [lifted-just (m/with-monad maybe-writer
+                        (m/lift (maybe/just 3)))
+          lifted-nothing (m/with-monad maybe-writer
+                           (m/lift (maybe/nothing)))]
+      (s/should= (maybe/just (d/pair 3 ["Hello"]))
+                 (m/with-monad maybe-writer
+                   (m/>> (writer/tell "Hello")
+                         lifted-just)))
+      (s/should= (maybe/nothing)
+                 (m/with-monad maybe-writer
+                   (m/>> (writer/tell "Hello")
+                         lifted-nothing))))))


clojure libs functions

clojure libs functions

error: pathspec 'src/hackerrank/clojure_libs.clj' did not match any file(s) known to git

--- src/hackerrank/clojure_libs.clj
+++ src/hackerrank/clojure_libs.clj
@@ -0,0 +1,10 @@
+;; https://8thlight.com/blog/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html
+;; Clojure Libs and Namespaces: require, use, import, and ns
+
+;;; The baseline: require
+;; witout require it should throw Exception
+;; (clojure.string/split "name,address,city,state,zip,email,phone" #",")
+
+;; now should work
+(require 'clojure.string)
+(clojure.string/split "name,address,city,state,zip,email,phone" #",")


Add cider to global lein profile

Add cider to global lein profile

fatal: unable to access 'https://github.com/Wolfy87/dotfiles.git/': The requested URL returned error: 403


Add html (identity) parser.

Add html (identity) parser.

error: pathspec 'src/incise/parsers/impl/html.clj' did not match any file(s) known to git

--- src/incise/parsers/impl/html.clj
+++ src/incise/parsers/impl/html.clj
@@ -0,0 +1,5 @@
+(ns incise.parsers.impl.html
+  (:require (incise.parsers [core :as pc]
+                            [html :refer [html-parser]])))
+
+(pc/register [:html :htm] (html-parser identity))


Refactor public namespace so docs are clearer and fix docstrings

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


[WM] make more attrs optional for states

We don't have these for the state authorities (yet), so let's just make
them optional for now. It's still useful to store other things about how
election are run in a state w/o this data (such as voting ID instructions).

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/democracyworks/election-authority-works.git/'