Repository: calmm-js/partial.lenses
Pull request #35 (2016-12-12 13:10:14)

Feature/trimming fat


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 83e96db..a433324 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,33 @@
 # Changelog
 
+## 6.0.0
+
+Removed `L.fromArrayBy`.  It was introduced as an experiment, but the use cases
+I had in mind didn't seem to benefit from it.  If you need it, you can use this:
+
+```js
+const fromArrayBy = id =>
+  iso(xs => {
+    if (R.is(Array, xs)) {
+      const o = {}, n=xs.length
+      for (let i=0; i<n; ++i) {
+        const x = xs[i]
+        o[x[id]] = x
+      }
+      return o
+    }
+  },
+  o => R.is(Object, o) ? R.values(o) : undefined)
+```
+
+The lens `L.nothing` and the traversal `L.skip` were merged into a single
+`L.zero` optic that works like `L.nothing` when being viewed, using `L.get`, and
+otherwise like `L.skip`.  The main benefit of this is that it allows "querying"
+combinators `L.chain`, `L.choice`, and `L.when` use the one and same `L.zero`
+and work without additional glue as traversals.
+
+Generalized the `L.sequence` traversal to also operate on the values of objects.
+
 ## 5.3.0
 
 Marked the default import for removal.  With the array shorthand for composition
diff --git a/README.md b/README.md
index e6259af..9374e14 100644
--- a/README.md
+++ b/README.md
@@ -26,10 +26,18 @@ parts.  [Try Lenses!](http://calmm-js.github.io/partial.lenses/)
       * [`L.modify(optic, maybeValue => maybeValue, maybeData)`](#L-modify "L.modify: POptic s a -> (Maybe a -> Maybe a) -> Maybe s -> Maybe s")
       * [`L.remove(optic, maybeData)`](#L-remove "L.remove: POptic s a -> Maybe s -> Maybe s")
       * [`L.set(optic, maybeValue, maybeData)`](#L-set "L.set: POptic s a -> Maybe a -> Maybe s -> Maybe s")
-    * [Combinators](#combinators)
+    * [Nesting](#nesting)
       * [`L.compose(...optics)`](#L-compose "L.compose: (POptic s s1, ...POptic sN a) -> POptic s a")
+    * [Querying](#querying)
+      * [`L.chain(value => optic, optic)`](#L-chain "L.chain: (a -> POptic s b) -> POptic s a -> POptic s b")
+      * [`L.choice(...lenses)`](#L-choice "L.choice: (...PLens s a) -> POptic s a")
       * [`L.choose(maybeValue => optic)`](#L-choose "L.choose: (Maybe s -> POptic s a) -> POptic s a")
+      * [`L.optional`](#L-optional "L.optional: POptic a a")
+      * [`L.when(maybeValue => testable)`](#L-when "L.when: (Maybe a -> Boolean) -> POptic a a")
+      * [`L.zero`](#L-zero "L.zero: POptic s a")
+    * [Recursing](#recursing)
       * [`L.lazy(optic => optic)`](#L-lazy "L.lazy: POptic s a -> POptic s a")
+    * [Debugging](#debugging)
       * [`L.log(...labels)`](#L-log "L.log: (...Any) -> POptic s s")
   * [Traversals](#traversals)
     * [Operations on traversals](#operations-on-traversals)
@@ -38,10 +46,7 @@ parts.  [Try Lenses!](http://calmm-js.github.io/partial.lenses/)
     * [Creating new traversals](#creating-new-traversals)
       * [`L.branch({prop: traversal, ...props})`](#L-branch "L.branch: {p1: PTraversal s a, ...pts} -> PTraversal s a")
     * [Traversals and combinators](#traversals-and-combinators)
-      * [`L.optional`](#L-optional "L.optional: PTraversal a a")
-      * [`L.sequence`](#L-sequence "L.sequence: PTraversal [a] a")
-      * [`L.skip`](#L-skip "L.skip: PTraversal a b")
-      * [`L.when(maybeValue => testable)`](#L-when "L.when: (Maybe a -> Boolean) -> PTraversal a a")
+      * [`L.sequence`](#L-sequence "L.sequence: PTraversal ([a] | {p: a, ...ps}) a")
   * [Lenses](#lenses)
     * [Operations on lenses](#operations-on-lenses)
       * [`L.get(lens, maybeData)`](#L-get "L.get: PLens s a -> Maybe s -> Maybe a")
@@ -66,12 +71,10 @@ parts.  [Try Lenses!](http://calmm-js.github.io/partial.lenses/)
       * [`L.props(...propNames)`](#L-props "L.props: (p1: a1, ...ps) -> PLens {p1: a1, ...ps, ...o} {p1: a1, ...ps}")
     * [Providing defaults](#providing-defaults)
       * [`L.valueOr(valueOut)`](#L-valueOr "L.valueOr: s -> PLens s s")
-    * [Querying and adapting to data](#querying-and-adapting-to-data)
-      * [`L.chain(value => lens, lens)`](#L-chain "L.chain: (a -> PLens s b) -> PLens s a -> PLens s b")
-      * [`L.choice(...lenses)`](#L-choice "L.choice: (...PLens s a) -> PLens s a")
-      * [`L.just(maybeValue)`](#L-just "L.just: Maybe a -> PLens s a")
-      * [`L.nothing`](#L-nothing "L.nothing: PLens s a")
+    * [Adapting to data](#adapting-to-data)
       * [`L.orElse(backupLens, primaryLens)`](#L-orElse "L.orElse: (PLens s a, PLens s a) -> PLens s a")
+    * [Read-only mapping](#read-only-mapping)
+      * [`L.just(maybeValue)`](#L-just "L.just: Maybe a -> PLens s a")
       * [`L.to(maybeValue => maybeValue)`](#L-to "L.to: (a -> b) -> PLens a b")
     * [Transforming data](#transforming-data)
       * [`L.pick({prop: lens, ...props})`](#L-pick "L.pick: {p1: PLens s a1, ...pls} -> PLens s {p1: a1, ...pls}")
@@ -82,7 +85,6 @@ parts.  [Try Lenses!](http://calmm-js.github.io/partial.lenses/)
     * [Creating new isomorphisms](#creating-new-isomorphisms)
       * [`L.iso(maybeData => maybeValue, maybeValue => maybeData)`](#L-iso "L.iso: (Maybe s -> Maybe a) -> (Maybe a -> Maybe s) -> PIso s a")
     * [Isomorphisms and combinators](#isomorphisms-and-combinators)
-      * [`L.fromArrayBy(idPropName)`](#L-fromArrayBy "L.fromArrayBy: (p: String) -> PIso [{p: String, ...ps}] {String: {p: String, ...ps}}")
       * [`L.identity`](#L-identity "L.identity: PIso s s")
       * [`L.inverse(isomorphism)`](#L-inverse "L.inverse: PIso a b -> PIso b a")
 * [Examples](#examples)
@@ -475,7 +477,7 @@ of a data structure.
 Note that `L.set(lens, maybeValue, maybeData)` is equivalent
 to [`L.modify(lens, R.always(maybeValue), maybeData)`](#L-modify).
 
-#### Combinators
+#### Nesting
 
 ##### <a name="L-compose"></a> [≡](#contents) [`L.compose(...optics)`](#L-compose "L.compose: (POptic s s1, ...POptic sN a) -> POptic s a")
 
@@ -514,6 +516,37 @@ L.get(["a", 1], {a: ["b", "c"]})
 Note that [`R.compose`](http://ramdajs.com/docs/#compose) is not the same as
 `L.compose`.
 
+#### Querying
+
+##### <a name="L-chain"></a> [≡](#contents) [`L.chain(value => optic, optic)`](#L-chain "L.chain: (a -> POptic s b) -> POptic s a -> POptic s b")
+
+`L.chain(toOptic, optic)` is equivalent to
+
+```jsx
+L.compose(optic, L.choose(maybeValue =>
+  maybeValue === undefined
+  ? L.zero
+  : toOptic(maybeValue)))
+```
+
+Note that with the [`L.just`](#L-just), `L.chain`, [`L.choice`](#L-choice)
+and [`L.zero`](#L-zero) combinators, one can consider optics as subsuming the
+maybe monad.
+
+##### <a name="L-choice"></a> [≡](#contents) [`L.choice(...lenses)`](#L-choice "L.choice: (...PLens s a) -> POptic s a")
+
+`L.choice` returns a partial optic that acts like the first of the given lenses
+whose view is not `undefined` on the given data structure.  When the views of
+all of the given lenses are `undefined`, the returned lens acts
+like [`L.zero`](#L-zero), which is the identity element of `L.choice`.
+
+For example:
+
+```js
+L.modify([L.sequence, L.choice("a", "d")], R.inc, [{R: 1}, {a: 1}, {d: 2}])
+// [ { R: 1 }, { a: 2 }, { d: 3 } ]
+```
+
 ##### <a name="L-choose"></a> [≡](#contents) [`L.choose(maybeValue => optic)`](#L-choose "L.choose: (Maybe s -> POptic s a) -> POptic s a")
 
 `L.choose` creates an optic whose operation is determined by the given function
@@ -543,19 +576,59 @@ L.modify(majorAxis, R.negate, {x: 2, y: -3})
 // { x: 2, y: 3 }
 ```
 
+##### <a name="L-optional"></a> [≡](#contents) [`L.optional`](#L-optional "L.optional: POptic a a")
+
+`L.optional` is an optic over an optional element.  When used as a traversal,
+and the focus is `undefined`, the traversal is empty.  When used as a lens, and
+the focus is `undefined`, the lens will be read-only.
+
+As an example, consider the difference between:
+
+```js
+L.set([L.sequence, "x"], 3, [{x: 1}, {y: 2}])
+// [ { x: 3 }, { y: 2, x: 3 } ]
+```
+
+and:
+
+```js
+L.set([L.sequence, "x", L.optional], 3, [{x: 1}, {y: 2}])
+// [ { x: 3 }, { y: 2 } ]
+```
+
+Note that `L.optional` is equivalent
+to [`L.when(x => x !== undefined)`](#L-when).
+
+##### <a name="L-when"></a> [≡](#contents) [`L.when(maybeValue => testable)`](#L-when "L.when: (Maybe a -> Boolean) -> POptic a a")
+
+`L.when` allows one to selectively skip elements within a traversal or to
+selectively turn a lens into a read-only lens whose view is `undefined`.
+
+For example:
+
+```js
+L.modify([L.sequence, L.when(x => x > 0)], R.negate, [0,-1,2,-3,4])
+// [ 0, -1, -2, -3, -4 ]
+```
+
+Note that `L.when(p)` is equivalent
+to [`L.choose(x => p(x) ? L.identity : L.zero)`](#L-choose).
+
+#### Recursing
+
 ##### <a name="L-lazy"></a> [≡](#contents) [`L.lazy(optic => optic)`](#L-lazy "L.lazy: POptic s a -> POptic s a")
 
 `L.lazy` can be used to construct optics lazily.  The function given to `L.lazy`
 is passed a forwarding proxy to its return value and can also make forward
 references to other optics and possibly construct a recursive optic.
 
-For example, here is a traversal that targets all the non-arrays in a data
-structure of nested arrays:
+For example, here is a traversal that targets all the primitive elements in a
+data structure of nested arrays and objects:
 
 ```js
 const flatten = L.lazy(rec => {
   const nest = [L.sequence, rec]
-  return L.choose(x => R.is(Array, x) ? nest : L.identity)
+  return L.choose(x => R.is(Object, x) ? nest : L.identity)
 })
 ```
 
@@ -564,18 +637,20 @@ Note that the above creates a cyclic representation of the traversal.
 Now, for example:
 
 ```js
-L.collect(flatten, [[[1], 2], 3, [4, [[5]], [6]]])
+L.collect(flatten, [[[1], 2], {y: 3}, [{l: 4, r: [5]}, {x: 6}]])
 // [ 1, 2, 3, 4, 5, 6 ]
 ```
 ```js
-L.modify(flatten, x => x+1, [[[1], 2], 3, [4, [[5]], [6]]])
-// [ [ [ 2 ], 3 ], 4, [ 5, [ [Object] ], [ 7 ] ] ]
+L.modify(flatten, x => x+1, [[[1], 2], {y: 3}, [{l: 4, r: [5]}, {x: 6}]])
+// [ [ [ 2 ], 3 ], { y: 4 }, [ { l: 5, r: [ 6 ] }, { x: 7 } ] ]
 ```
 ```js
-L.remove([flatten, L.when(x => 3 <= x && x <= 5)], [[[1], 2], 3, [4, [[5]], [6]]])
-// [ [ [ 1 ], 2 ], [ [ 6 ] ] ]
+L.remove([flatten, L.when(x => 3 <= x && x <= 4)], [[[1], 2], {y: 3}, [{l: 4, r: [5]}, {x: 6}]])
+// [ [ [ 1 ], 2 ], [ { r: [ 5 ] }, { x: 6 } ] ]
 ```
 
+#### Debugging
+
 ##### <a name="L-log"></a> [≡](#contents) [`L.log(...labels)`](#L-log "L.log: (...Any) -> POptic s s")
 
 `L.log(...labels)` is an identity optic that
@@ -606,6 +681,24 @@ L.set(["x", L.log("%s x: %j")], "11", {x: 10})
 // { x: '11' }
 ```
 
+#### <a name="L-zero"></a> [≡](#contents) [`L.zero`](#L-zero "L.zero: POptic s a")
+
+`L.zero` is the identity element of [`L.choice`](#L-choice)
+and [`L.chain`](L-chain).  As a traversal, `L.zero` is a traversal of no
+elements and as a lens, i.e. when used with [`L.get`](#L-get), `L.zero` is a
+read-only lens whose view is always `undefined`.
+
+For example:
+
+```js
+L.collect([L.sequence,
+           L.choose(x => (R.is(Array, x) ? L.sequence :
+                          R.is(Object, x) ? "x" :
+                          L.zero))],
+          [1, {x: 2}, [3,4]])
+// [ 2, 3, 4 ]
+```
+
 ### Traversals
 
 A traversal operates over a collection of focuses that can
@@ -687,71 +780,21 @@ See [BST traversal](#bst-traversal) for a more meaningful example.
 
 #### Traversals and combinators
 
-##### <a name="L-optional"></a> [≡](#contents) [`L.optional`](#L-optional "L.optional: PTraversal a a")
-
-`L.optional` is a traversal over an optional element.  When the focus of
-`L.optional` is `undefined`, the traversal is empty.  Otherwise the traversal is
-over the focused element.
-
-As an example, consider the difference between:
-
-```js
-L.set([L.sequence, "x"], 3, [{x: 1}, {y: 2}])
-// [ { x: 3 }, { y: 2, x: 3 } ]
-```
-
-and:
-
-```js
-L.set([L.sequence, "x", L.optional], 3, [{x: 1}, {y: 2}])
-// [ { x: 3 }, { y: 2 } ]
-```
-
-Note that `L.optional` is equivalent to `L.when(x => x !== undefined)`.
-
-##### <a name="L-sequence"></a> [≡](#contents) [`L.sequence`](#L-sequence "L.sequence: PTraversal [a] a")
+##### <a name="L-sequence"></a> [≡](#contents) [`L.sequence`](#L-sequence "L.sequence: PTraversal ([a] | {p: a, ...ps}) a")
 
-`L.sequence` is a traversal over an array.
+`L.sequence` is a traversal over the values of an array or object.
 
 For example:
 
 ```js
-L.modify(["xs", L.sequence, "x"], R.add(1), {xs: [{x: 1}, {x: 2}]})
+L.modify(["xs", L.sequence, "x"], R.inc, {xs: [{x: 1}, {x: 2}]})
 // { xs: [ { x: 2 }, { x: 3 } ] }
 ```
-
-##### <a name="L-skip"></a> [≡](#contents) [`L.skip`](#L-skip "L.skip: PTraversal a b")
-
-`L.skip` is a traversal of no elements.
-
-For example:
-
 ```js
-L.collect([L.sequence,
-           L.choose(x => (R.is(Array, x) ? L.sequence :
-                          R.is(Object, x) ? "x" :
-                          L.skip))],
-          [1, {x: 2}, [3,4]])
-// [ 2, 3, 4 ]
-```
-
-Note that the traversal `L.skip`, which traverses 0 elements, is not the same as
-the lens [`L.nothing`](#L-nothing), which traverses 1 element.
-
-##### <a name="L-when"></a> [≡](#contents) [`L.when(maybeValue => testable)`](#L-when "L.when: (Maybe a -> Boolean) -> PTraversal a a")
-
-`L.when` allows one to selectively skip elements within a traversal.
-
-For example:
-
-```js
-L.modify([L.sequence, L.when(x => x > 0)], R.negate, [0,-1,2,-3,4])
-// [ 0, -1, -2, -3, -4 ]
+L.modify(L.sequence, R.negate, {a:1, b:2, c:3})
+// { a: -1, b: -2, c: -3 }
 ```
 
-Note that `L.when(p)` is equivalent to `L.choose(x => x !== undefined ?
-L.identity : L.skip)`.
-
 ### Lenses
 
 Lenses always have a single focus which can be [viewed](#L-get) directly.
@@ -769,20 +812,7 @@ L.get("y", {x: 112, y: 101})
 // 101
 ```
 
-Note that `L.get` does not work on [traversals](#traversals).  However,
-using [`L.foldMapOf`](foldMapOf) we can define
-
-```js
-const Defined = {empty: () => {}, concat: (l, r) => l !== undefined ? l : r}
-const first = R.curry((t, s) => L.foldMapOf(Defined, t, R.identity, s))
-```
-
-which agrees with `L.get`.  For example:
-
-```js
-first("y", {x: 112, y: 101})
-// 101
-```
+Note that `L.get` does not work on [traversals](#traversals).
 
 #### Creating new lenses
 
@@ -1146,38 +1176,18 @@ L.remove(L.valueOr(0), 1)
 // undefined
 ```
 
-#### Querying and adapting to data
+#### Adapting to data
 
-##### <a name="L-chain"></a> [≡](#contents) [`L.chain(value => lens, lens)`](#L-chain "L.chain: (a -> PLens s b) -> PLens s a -> PLens s b")
-
-`L.chain(a2bPLens, aPLens)` is equivalent to
-
-```jsx
-L.compose(aPLens, L.choose(aMaybe =>
-  aMaybe === undefined
-  ? L.nothing
-  : a2bPLens(aMaybe)))
-```
-
-With the [`L.just`](#L-just), `L.chain`, [`L.choice`](#L-choice)
-and [`L.nothing`](#L-nothing) combinators, one can view partial lenses as
-subsuming the maybe monad.  Of course, the whole point of lenses is that they
-are bidirectional and read-only [`L.just`](#L-just)
-and [`L.nothing`](#L-nothing) are essentially degenerate.
-
-##### <a name="L-choice"></a> [≡](#contents) [`L.choice(...lenses)`](#L-choice "L.choice: (...PLens s a) -> PLens s a")
-
-`L.choice` returns a partial lens that acts like the first of the given lenses
-whose view is not `undefined` on the given data structure.  When the views of
-all of the given lenses are `undefined`, the returned lens acts
-like [`L.nothing`](#L-nothing), which is the identity element of `L.choice`.
+##### <a name="L-orElse"></a> [≡](#contents) [`L.orElse(backupLens, primaryLens)`](#L-orElse "L.orElse: (PLens s a, PLens s a) -> PLens s a")
 
-For example:
+`L.orElse(backupLens, primaryLens)` acts like `primaryLens` when its view is not
+`undefined` and otherwise like `backupLens`.  You can use `L.orElse` on its own
+with [`R.reduceRight`](http://ramdajs.com/docs/#reduceRight)
+(and [`R.reduce`](http://ramdajs.com/docs/#reduce)) to create an associative
+choice over lenses or use `L.orElse` to specify a default or backup lens
+for [`L.choice`](#L-choice), for example.
 
-```js
-L.modify([L.sequence, L.choice("a", "d"), L.optional], R.inc, [{R: 1}, {a: 1}, {d: 2}])
-// [ { R: 1 }, { a: 2 }, { d: 3 } ]
-```
+#### Read-only mapping
 
 ##### <a name="L-just"></a> [≡](#contents) [`L.just(maybeValue)`](#L-just "L.just: Maybe a -> PLens s a")
 
@@ -1194,29 +1204,6 @@ Note that `L.just(x)` is equivalent to [`L.to(_ => x)`](#L-to).
 `L.just` can be seen as the unit function of the monad formed
 with [`L.chain`](#L-chain).
 
-##### <a name="L-nothing"></a> [≡](#contents) [`L.nothing`](#L-nothing "L.nothing: PLens s a")
-
-`L.nothing` is a read-only lens whose view is always `undefined`.  In other
-words, for all `x` and `y`:
-
-```jsx
-   L.get(L.nothing, x) = undefined
-L.set(L.nothing, y, x) = x
-```
-
-Note that `L.nothing` is the identity element of [`L.choice`](#L-choice).  Also
-note that the lens `L.nothing`, which traverses 1 element, is not the same as
-the traversal [`L.skip`](#L-skip), which traverses 0 elements.
-
-##### <a name="L-orElse"></a> [≡](#contents) [`L.orElse(backupLens, primaryLens)`](#L-orElse "L.orElse: (PLens s a, PLens s a) -> PLens s a")
-
-`L.orElse(backupLens, primaryLens)` acts like `primaryLens` when its view is not
-`undefined` and otherwise like `backupLens`.  You can use `L.orElse` on its own
-with [`R.reduceRight`](http://ramdajs.com/docs/#reduceRight)
-(and [`R.reduce`](http://ramdajs.com/docs/#reduce)) to create an associative
-choice over lenses or use `L.orElse` to specify a default or backup lens
-for [`L.choice`](#L-choice), for example.
-
 ##### <a name="L-to"></a> [≡](#contents) [`L.to(maybeValue => maybeValue)`](#L-to "L.to: (a -> b) -> PLens a b")
 
 `L.to` creates a read-only lens whose view is determined by the given function.
@@ -1327,12 +1314,14 @@ undefined)` are inverses of each other.
 For example:
 
 ```js
-L.getInverse(L.fromArrayBy("id"), {'1': {id: 1, value: 2}, '3': {id: 3, value: 4}})
-// [ { id: 1, value: 2 }, { id: 3, value: 4 } ]
+const numeric = f => x => typeof x === "number" ? f(x) : undefined
+const offBy1 = L.iso(numeric(R.inc), numeric(R.dec))
+L.getInverse(offBy1, 1)
+// 0
 ```
 
-Note that `L.getInverse(iso, data)` is equivalent to `L.set(iso, data,
-undefined)`.
+Note that `L.getInverse(iso, data)` is equivalent
+to [`L.set(iso, data, undefined)`](#L-get).
 
 Also note that, while `L.getInverse` makes most sense when used with an
 isomorphism, it is valid to use `L.getInverse` with *partial* lenses in general.
@@ -1353,33 +1342,13 @@ L.getInverse("meaning", 42)
 For example:
 
 ```js
-const negate = L.iso(R.negate, R.negate)
+const negate = L.iso(numeric(R.negate), numeric(R.negate))
 L.get([negate, L.inverse(negate)], 112)
 // 112
 ```
 
 #### Isomorphisms and combinators
 
-##### <a name="L-fromArrayBy"></a> [≡](#contents) [`L.fromArrayBy(idPropName)`](#L-fromArrayBy "L.fromArrayBy: (p: String) -> PIso [{p: String, ...ps}] {String: {p: String, ...ps}}")
-
-**`L.fromArrayBy` is experimental and might be removed, renamed or changed
-semantically before next major release.**
-
-`L.fromArrayBy(id)` is an isomorphism that converts an array of objects
-containing `id` properties into an object with the `id`s as keys and the array
-elements as values.
-
-For example:
-
-```js
-L.get(L.fromArrayBy("id"), [{id: 1, value: 2}, {id: 3, value: 4}])
-// { '1': { id: 1, value: 2 }, '3': { id: 3, value: 4 } }
-```
-```js
-L.set([L.fromArrayBy("id"), "3", "value"], 5, [{id: 1, value: 2}, {id: 3, value: 4}])
-// [ { id: 1, value: 2 }, { id: 3, value: 5 } ]
-```
-
 ##### <a name="L-identity"></a> [≡](#contents) [`L.identity`](#L-identity "L.identity: PIso s s")
 
 `L.identity` is the identity element of lens composition and also the identity
@@ -1400,8 +1369,8 @@ operation only makes sense on isomorphisms.
 For example:
 
 ```js
-L.get(L.inverse(L.fromArrayBy('id')), {a: {id: "a", x: 1}, b: {id: "b", x: 2}})
-// [ { id: 'a', x: 1 }, { id: 'b', x: 2 } ]
+L.get(L.inverse(offBy1), 1)
+// 0
 ```
 
 ## Examples
diff --git a/docs/bundle.js b/docs/bundle.js
index 3894d34..bcaa045 100644
--- a/docs/bundle.js
+++ b/docs/bundle.js
@@ -1,5 +1,6 @@
 require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
 require("../../modules/core.regexp.escape"),module.exports=require("../../modules/_core").RegExp.escape;
+
 },{"../../modules/_core":22,"../../modules/core.regexp.escape":118}],2:[function(require,module,exports){
 module.exports=function(o){if("function"!=typeof o)throw TypeError(o+" is not a function!");return o};
 
@@ -82,7 +83,6 @@ var isObject=require("./_is-object"),document=require("./_global").document,is=i
 
 },{"./_global":37,"./_is-object":48}],29:[function(require,module,exports){
 module.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",");
-
 },{}],30:[function(require,module,exports){
 var getKeys=require("./_object-keys"),gOPS=require("./_object-gops"),pIE=require("./_object-pie");module.exports=function(e){var r=getKeys(e),t=gOPS.f;if(t)for(var o,u=t(e),g=pIE.f,i=0;u.length>i;)g.call(e,o=u[i++])&&r.push(o);return r};
 
@@ -106,7 +106,6 @@ var ctx=require("./_ctx"),call=require("./_iter-call"),isArrayIter=require("./_i
 
 },{"./_an-object":6,"./_ctx":24,"./_is-array-iter":45,"./_iter-call":50,"./_to-length":107,"./core.get-iterator-method":117}],37:[function(require,module,exports){
 var global=module.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=global);
-
 },{}],38:[function(require,module,exports){
 var hasOwnProperty={}.hasOwnProperty;module.exports=function(r,e){return hasOwnProperty.call(r,e)};
 
@@ -719,7 +718,6 @@ var $export=require("./_export");$export($export.P,"String",{repeat:require("./_
 
 },{"./_string-trim":101}],242:[function(require,module,exports){
 "use strict";var global=require("./_global"),has=require("./_has"),DESCRIPTORS=require("./_descriptors"),$export=require("./_export"),redefine=require("./_redefine"),META=require("./_meta").KEY,$fails=require("./_fails"),shared=require("./_shared"),setToStringTag=require("./_set-to-string-tag"),uid=require("./_uid"),wks=require("./_wks"),wksExt=require("./_wks-ext"),wksDefine=require("./_wks-define"),keyOf=require("./_keyof"),enumKeys=require("./_enum-keys"),isArray=require("./_is-array"),anObject=require("./_an-object"),toIObject=require("./_to-iobject"),toPrimitive=require("./_to-primitive"),createDesc=require("./_property-desc"),_create=require("./_object-create"),gOPNExt=require("./_object-gopn-ext"),$GOPD=require("./_object-gopd"),$DP=require("./_object-dp"),$keys=require("./_object-keys"),gOPD=$GOPD.f,dP=$DP.f,gOPN=gOPNExt.f,$Symbol=global.Symbol,$JSON=global.JSON,_stringify=$JSON&&$JSON.stringify,PROTOTYPE="prototype",HIDDEN=wks("_hidden"),TO_PRIMITIVE=wks("toPrimitive"),isEnum={}.propertyIsEnumerable,SymbolRegistry=shared("symbol-registry"),AllSymbols=shared("symbols"),OPSymbols=shared("op-symbols"),ObjectProto=Object[PROTOTYPE],USE_NATIVE="function"==typeof $Symbol,QObject=global.QObject,setter=!QObject||!QObject[PROTOTYPE]||!QObject[PROTOTYPE].findChild,setSymbolDesc=DESCRIPTORS&&$fails(function(){return 7!=_create(dP({},"a",{get:function(){return dP(this,"a",{value:7}).a}})).a})?function(e,r,t){var o=gOPD(ObjectProto,r);o&&delete ObjectProto[r],dP(e,r,t),o&&e!==ObjectProto&&dP(ObjectProto,r,o)}:dP,wrap=function(e){var r=AllSymbols[e]=_create($Symbol[PROTOTYPE]);return r._k=e,r},isSymbol=USE_NATIVE&&"symbol"==typeof $Symbol.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof $Symbol},$defineProperty=function(e,r,t){return e===ObjectProto&&$defineProperty(OPSymbols,r,t),anObject(e),r=toPrimitive(r,!0),anObject(t),has(AllSymbols,r)?(t.enumerable?(has(e,HIDDEN)&&e[HIDDEN][r]&&(e[HIDDEN][r]=!1),t=_create(t,{enumerable:createDesc(0,!1)})):(has(e,HIDDEN)||dP(e,HIDDEN,createDesc(1,{})),e[HIDDEN][r]=!0),setSymbolDesc(e,r,t)):dP(e,r,t)},$defineProperties=function(e,r){anObject(e);for(var t,o=enumKeys(r=toIObject(r)),i=0,s=o.length;s>i;)$defineProperty(e,t=o[i++],r[t]);return e},$create=function(e,r){return void 0===r?_create(e):$defineProperties(_create(e),r)},$propertyIsEnumerable=function(e){var r=isEnum.call(this,e=toPrimitive(e,!0));return!(this===ObjectProto&&has(AllSymbols,e)&&!has(OPSymbols,e))&&(!(r||!has(this,e)||!has(AllSymbols,e)||has(this,HIDDEN)&&this[HIDDEN][e])||r)},$getOwnPropertyDescriptor=function(e,r){if(e=toIObject(e),r=toPrimitive(r,!0),e!==ObjectProto||!has(AllSymbols,r)||has(OPSymbols,r)){var t=gOPD(e,r);return!t||!has(AllSymbols,r)||has(e,HIDDEN)&&e[HIDDEN][r]||(t.enumerable=!0),t}},$getOwnPropertyNames=function(e){for(var r,t=gOPN(toIObject(e)),o=[],i=0;t.length>i;)has(AllSymbols,r=t[i++])||r==HIDDEN||r==META||o.push(r);return o},$getOwnPropertySymbols=function(e){for(var r,t=e===ObjectProto,o=gOPN(t?OPSymbols:toIObject(e)),i=[],s=0;o.length>s;)!has(AllSymbols,r=o[s++])||t&&!has(ObjectProto,r)||i.push(AllSymbols[r]);return i};USE_NATIVE||($Symbol=function(){if(this instanceof $Symbol)throw TypeError("Symbol is not a constructor!");var e=uid(arguments.length>0?arguments[0]:void 0),r=function(t){this===ObjectProto&&r.call(OPSymbols,t),has(this,HIDDEN)&&has(this[HIDDEN],e)&&(this[HIDDEN][e]=!1),setSymbolDesc(this,e,createDesc(1,t))};return DESCRIPTORS&&setter&&setSymbolDesc(ObjectProto,e,{configurable:!0,set:r}),wrap(e)},redefine($Symbol[PROTOTYPE],"toString",function(){return this._k}),$GOPD.f=$getOwnPropertyDescriptor,$DP.f=$defineProperty,require("./_object-gopn").f=gOPNExt.f=$getOwnPropertyNames,require("./_object-pie").f=$propertyIsEnumerable,require("./_object-gops").f=$getOwnPropertySymbols,DESCRIPTORS&&!require("./_library")&&redefine(ObjectProto,"propertyIsEnumerable",$propertyIsEnumerable,!0),wksExt.f=function(e){return wrap(wks(e))}),$export($export.G+$export.W+$export.F*!USE_NATIVE,{Symbol:$Symbol});for(var symbols="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),i=0;symbols.length>i;)wks(symbols[i++]);for(var symbols=$keys(wks.store),i=0;symbols.length>i;)wksDefine(symbols[i++]);$export($export.S+$export.F*!USE_NATIVE,"Symbol",{for:function(e){return has(SymbolRegistry,e+="")?SymbolRegistry[e]:SymbolRegistry[e]=$Symbol(e)},keyFor:function(e){if(isSymbol(e))return keyOf(SymbolRegistry,e);throw TypeError(e+" is not a symbol!")},useSetter:function(){setter=!0},useSimple:function(){setter=!1}}),$export($export.S+$export.F*!USE_NATIVE,"Object",{create:$create,defineProperty:$defineProperty,defineProperties:$defineProperties,getOwnPropertyDescriptor:$getOwnPropertyDescriptor,getOwnPropertyNames:$getOwnPropertyNames,getOwnPropertySymbols:$getOwnPropertySymbols}),$JSON&&$export($export.S+$export.F*(!USE_NATIVE||$fails(function(){var e=$Symbol();return"[null]"!=_stringify([e])||"{}"!=_stringify({a:e})||"{}"!=_stringify(Object(e))})),"JSON",{stringify:function(e){if(void 0!==e&&!isSymbol(e)){for(var r,t,o=[e],i=1;arguments.length>i;)o.push(arguments[i++]);return r=o[1],"function"==typeof r&&(t=r),!t&&isArray(r)||(r=function(e,r){if(t&&(r=t.call(this,e,r)),!isSymbol(r))return r}),o[1]=r,_stringify.apply($JSON,o)}}}),$Symbol[PROTOTYPE][TO_PRIMITIVE]||require("./_hide")($Symbol[PROTOTYPE],TO_PRIMITIVE,$Symbol[PROTOTYPE].valueOf),setToStringTag($Symbol,"Symbol"),setToStringTag(Math,"Math",!0),setToStringTag(global.JSON,"JSON",!0);
-
 },{"./_an-object":6,"./_descriptors":27,"./_enum-keys":30,"./_export":31,"./_fails":33,"./_global":37,"./_has":38,"./_hide":39,"./_is-array":46,"./_keyof":56,"./_library":57,"./_meta":61,"./_object-create":65,"./_object-dp":66,"./_object-gopd":69,"./_object-gopn":71,"./_object-gopn-ext":70,"./_object-gops":72,"./_object-keys":75,"./_object-pie":76,"./_property-desc":84,"./_redefine":86,"./_set-to-string-tag":91,"./_shared":93,"./_to-iobject":106,"./_to-primitive":109,"./_uid":113,"./_wks":116,"./_wks-define":114,"./_wks-ext":115}],243:[function(require,module,exports){
 "use strict";var $export=require("./_export"),$typed=require("./_typed"),buffer=require("./_typed-buffer"),anObject=require("./_an-object"),toIndex=require("./_to-index"),toLength=require("./_to-length"),isObject=require("./_is-object"),ArrayBuffer=require("./_global").ArrayBuffer,speciesConstructor=require("./_species-constructor"),$ArrayBuffer=buffer.ArrayBuffer,$DataView=buffer.DataView,$isView=$typed.ABV&&ArrayBuffer.isView,$slice=$ArrayBuffer.prototype.slice,VIEW=$typed.VIEW,ARRAY_BUFFER="ArrayBuffer";$export($export.G+$export.W+$export.F*(ArrayBuffer!==$ArrayBuffer),{ArrayBuffer:$ArrayBuffer}),$export($export.S+$export.F*!$typed.CONSTR,ARRAY_BUFFER,{isView:function(e){return $isView&&$isView(e)||isObject(e)&&VIEW in e}}),$export($export.P+$export.U+$export.F*require("./_fails")(function(){return!new $ArrayBuffer(2).slice(1,void 0).byteLength}),ARRAY_BUFFER,{slice:function(e,r){if(void 0!==$slice&&void 0===r)return $slice.call(anObject(this),e);for(var t=anObject(this).byteLength,i=toIndex(e,t),f=toIndex(void 0===r?t:r,t),o=new(speciesConstructor(this,$ArrayBuffer))(toLength(f-i)),u=new $DataView(this),s=new $DataView(o),n=0;i<f;)s.setUint8(n++,u.getUint8(i++));return o}}),require("./_set-species")(ARRAY_BUFFER);
 
@@ -875,6 +873,7 @@ var global=require("./_global"),$export=require("./_export"),invoke=require("./_
 
 },{"./_export":31,"./_global":37,"./_invoke":43,"./_partial":82}],294:[function(require,module,exports){
 require("./modules/es6.symbol"),require("./modules/es6.object.create"),require("./modules/es6.object.define-property"),require("./modules/es6.object.define-properties"),require("./modules/es6.object.get-own-property-descriptor"),require("./modules/es6.object.get-prototype-of"),require("./modules/es6.object.keys"),require("./modules/es6.object.get-own-property-names"),require("./modules/es6.object.freeze"),require("./modules/es6.object.seal"),require("./modules/es6.object.prevent-extensions"),require("./modules/es6.object.is-frozen"),require("./modules/es6.object.is-sealed"),require("./modules/es6.object.is-extensible"),require("./modules/es6.object.assign"),require("./modules/es6.object.is"),require("./modules/es6.object.set-prototype-of"),require("./modules/es6.object.to-string"),require("./modules/es6.function.bind"),require("./modules/es6.function.name"),require("./modules/es6.function.has-instance"),require("./modules/es6.parse-int"),require("./modules/es6.parse-float"),require("./modules/es6.number.constructor"),require("./modules/es6.number.to-fixed"),require("./modules/es6.number.to-precision"),require("./modules/es6.number.epsilon"),require("./modules/es6.number.is-finite"),require("./modules/es6.number.is-integer"),require("./modules/es6.number.is-nan"),require("./modules/es6.number.is-safe-integer"),require("./modules/es6.number.max-safe-integer"),require("./modules/es6.number.min-safe-integer"),require("./modules/es6.number.parse-float"),require("./modules/es6.number.parse-int"),require("./modules/es6.math.acosh"),require("./modules/es6.math.asinh"),require("./modules/es6.math.atanh"),require("./modules/es6.math.cbrt"),require("./modules/es6.math.clz32"),require("./modules/es6.math.cosh"),require("./modules/es6.math.expm1"),require("./modules/es6.math.fround"),require("./modules/es6.math.hypot"),require("./modules/es6.math.imul"),require("./modules/es6.math.log10"),require("./modules/es6.math.log1p"),require("./modules/es6.math.log2"),require("./modules/es6.math.sign"),require("./modules/es6.math.sinh"),require("./modules/es6.math.tanh"),require("./modules/es6.math.trunc"),require("./modules/es6.string.from-code-point"),require("./modules/es6.string.raw"),require("./modules/es6.string.trim"),require("./modules/es6.string.iterator"),require("./modules/es6.string.code-point-at"),require("./modules/es6.string.ends-with"),require("./modules/es6.string.includes"),require("./modules/es6.string.repeat"),require("./modules/es6.string.starts-with"),require("./modules/es6.string.anchor"),require("./modules/es6.string.big"),require("./modules/es6.string.blink"),require("./modules/es6.string.bold"),require("./modules/es6.string.fixed"),require("./modules/es6.string.fontcolor"),require("./modules/es6.string.fontsize"),require("./modules/es6.string.italics"),require("./modules/es6.string.link"),require("./modules/es6.string.small"),require("./modules/es6.string.strike"),require("./modules/es6.string.sub"),require("./modules/es6.string.sup"),require("./modules/es6.date.now"),require("./modules/es6.date.to-json"),require("./modules/es6.date.to-iso-string"),require("./modules/es6.date.to-string"),require("./modules/es6.date.to-primitive"),require("./modules/es6.array.is-array"),require("./modules/es6.array.from"),require("./modules/es6.array.of"),require("./modules/es6.array.join"),require("./modules/es6.array.slice"),require("./modules/es6.array.sort"),require("./modules/es6.array.for-each"),require("./modules/es6.array.map"),require("./modules/es6.array.filter"),require("./modules/es6.array.some"),require("./modules/es6.array.every"),require("./modules/es6.array.reduce"),require("./modules/es6.array.reduce-right"),require("./modules/es6.array.index-of"),require("./modules/es6.array.last-index-of"),require("./modules/es6.array.copy-within"),require("./modules/es6.array.fill"),require("./modules/es6.array.find"),require("./modules/es6.array.find-index"),require("./modules/es6.array.species"),require("./modules/es6.array.iterator"),require("./modules/es6.regexp.constructor"),require("./modules/es6.regexp.to-string"),require("./modules/es6.regexp.flags"),require("./modules/es6.regexp.match"),require("./modules/es6.regexp.replace"),require("./modules/es6.regexp.search"),require("./modules/es6.regexp.split"),require("./modules/es6.promise"),require("./modules/es6.map"),require("./modules/es6.set"),require("./modules/es6.weak-map"),require("./modules/es6.weak-set"),require("./modules/es6.typed.array-buffer"),require("./modules/es6.typed.data-view"),require("./modules/es6.typed.int8-array"),require("./modules/es6.typed.uint8-array"),require("./modules/es6.typed.uint8-clamped-array"),require("./modules/es6.typed.int16-array"),require("./modules/es6.typed.uint16-array"),require("./modules/es6.typed.int32-array"),require("./modules/es6.typed.uint32-array"),require("./modules/es6.typed.float32-array"),require("./modules/es6.typed.float64-array"),require("./modules/es6.reflect.apply"),require("./modules/es6.reflect.construct"),require("./modules/es6.reflect.define-property"),require("./modules/es6.reflect.delete-property"),require("./modules/es6.reflect.enumerate"),require("./modules/es6.reflect.get"),require("./modules/es6.reflect.get-own-property-descriptor"),require("./modules/es6.reflect.get-prototype-of"),require("./modules/es6.reflect.has"),require("./modules/es6.reflect.is-extensible"),require("./modules/es6.reflect.own-keys"),require("./modules/es6.reflect.prevent-extensions"),require("./modules/es6.reflect.set"),require("./modules/es6.reflect.set-prototype-of"),require("./modules/es7.array.includes"),require("./modules/es7.string.at"),require("./modules/es7.string.pad-start"),require("./modules/es7.string.pad-end"),require("./modules/es7.string.trim-left"),require("./modules/es7.string.trim-right"),require("./modules/es7.string.match-all"),require("./modules/es7.symbol.async-iterator"),require("./modules/es7.symbol.observable"),require("./modules/es7.object.get-own-property-descriptors"),require("./modules/es7.object.values"),require("./modules/es7.object.entries"),require("./modules/es7.object.define-getter"),require("./modules/es7.object.define-setter"),require("./modules/es7.object.lookup-getter"),require("./modules/es7.object.lookup-setter"),require("./modules/es7.map.to-json"),require("./modules/es7.set.to-json"),require("./modules/es7.system.global"),require("./modules/es7.error.is-error"),require("./modules/es7.math.iaddh"),require("./modules/es7.math.isubh"),require("./modules/es7.math.imulh"),require("./modules/es7.math.umulh"),require("./modules/es7.reflect.define-metadata"),require("./modules/es7.reflect.delete-metadata"),require("./modules/es7.reflect.get-metadata"),require("./modules/es7.reflect.get-metadata-keys"),require("./modules/es7.reflect.get-own-metadata"),require("./modules/es7.reflect.get-own-metadata-keys"),require("./modules/es7.reflect.has-metadata"),require("./modules/es7.reflect.has-own-metadata"),require("./modules/es7.reflect.metadata"),require("./modules/es7.asap"),require("./modules/es7.observable"),require("./modules/web.timers"),require("./modules/web.immediate"),require("./modules/web.dom.iterable"),module.exports=require("./modules/_core");
+
 },{"./modules/_core":22,"./modules/es6.array.copy-within":119,"./modules/es6.array.every":120,"./modules/es6.array.fill":121,"./modules/es6.array.filter":122,"./modules/es6.array.find":124,"./modules/es6.array.find-index":123,"./modules/es6.array.for-each":125,"./modules/es6.array.from":126,"./modules/es6.array.index-of":127,"./modules/es6.array.is-array":128,"./modules/es6.array.iterator":129,"./modules/es6.array.join":130,"./modules/es6.array.last-index-of":131,"./modules/es6.array.map":132,"./modules/es6.array.of":133,"./modules/es6.array.reduce":135,"./modules/es6.array.reduce-right":134,"./modules/es6.array.slice":136,"./modules/es6.array.some":137,"./modules/es6.array.sort":138,"./modules/es6.array.species":139,"./modules/es6.date.now":140,"./modules/es6.date.to-iso-string":141,"./modules/es6.date.to-json":142,"./modules/es6.date.to-primitive":143,"./modules/es6.date.to-string":144,"./modules/es6.function.bind":145,"./modules/es6.function.has-instance":146,"./modules/es6.function.name":147,"./modules/es6.map":148,"./modules/es6.math.acosh":149,"./modules/es6.math.asinh":150,"./modules/es6.math.atanh":151,"./modules/es6.math.cbrt":152,"./modules/es6.math.clz32":153,"./modules/es6.math.cosh":154,"./modules/es6.math.expm1":155,"./modules/es6.math.fround":156,"./modules/es6.math.hypot":157,"./modules/es6.math.imul":158,"./modules/es6.math.log10":159,"./modules/es6.math.log1p":160,"./modules/es6.math.log2":161,"./modules/es6.math.sign":162,"./modules/es6.math.sinh":163,"./modules/es6.math.tanh":164,"./modules/es6.math.trunc":165,"./modules/es6.number.constructor":166,"./modules/es6.number.epsilon":167,"./modules/es6.number.is-finite":168,"./modules/es6.number.is-integer":169,"./modules/es6.number.is-nan":170,"./modules/es6.number.is-safe-integer":171,"./modules/es6.number.max-safe-integer":172,"./modules/es6.number.min-safe-integer":173,"./modules/es6.number.parse-float":174,"./modules/es6.number.parse-int":175,"./modules/es6.number.to-fixed":176,"./modules/es6.number.to-precision":177,"./modules/es6.object.assign":178,"./modules/es6.object.create":179,"./modules/es6.object.define-properties":180,"./modules/es6.object.define-property":181,"./modules/es6.object.freeze":182,"./modules/es6.object.get-own-property-descriptor":183,"./modules/es6.object.get-own-property-names":184,"./modules/es6.object.get-prototype-of":185,"./modules/es6.object.is":189,"./modules/es6.object.is-extensible":186,"./modules/es6.object.is-frozen":187,"./modules/es6.object.is-sealed":188,"./modules/es6.object.keys":190,"./modules/es6.object.prevent-extensions":191,"./modules/es6.object.seal":192,"./modules/es6.object.set-prototype-of":193,"./modules/es6.object.to-string":194,"./modules/es6.parse-float":195,"./modules/es6.parse-int":196,"./modules/es6.promise":197,"./modules/es6.reflect.apply":198,"./modules/es6.reflect.construct":199,"./modules/es6.reflect.define-property":200,"./modules/es6.reflect.delete-property":201,"./modules/es6.reflect.enumerate":202,"./modules/es6.reflect.get":205,"./modules/es6.reflect.get-own-property-descriptor":203,"./modules/es6.reflect.get-prototype-of":204,"./modules/es6.reflect.has":206,"./modules/es6.reflect.is-extensible":207,"./modules/es6.reflect.own-keys":208,"./modules/es6.reflect.prevent-extensions":209,"./modules/es6.reflect.set":211,"./modules/es6.reflect.set-prototype-of":210,"./modules/es6.regexp.constructor":212,"./modules/es6.regexp.flags":213,"./modules/es6.regexp.match":214,"./modules/es6.regexp.replace":215,"./modules/es6.regexp.search":216,"./modules/es6.regexp.split":217,"./modules/es6.regexp.to-string":218,"./modules/es6.set":219,"./modules/es6.string.anchor":220,"./modules/es6.string.big":221,"./modules/es6.string.blink":222,"./modules/es6.string.bold":223,"./modules/es6.string.code-point-at":224,"./modules/es6.string.ends-with":225,"./modules/es6.string.fixed":226,"./modules/es6.string.fontcolor":227,"./modules/es6.string.fontsize":228,"./modules/es6.string.from-code-point":229,"./modules/es6.string.includes":230,"./modules/es6.string.italics":231,"./modules/es6.string.iterator":232,"./modules/es6.string.link":233,"./modules/es6.string.raw":234,"./modules/es6.string.repeat":235,"./modules/es6.string.small":236,"./modules/es6.string.starts-with":237,"./modules/es6.string.strike":238,"./modules/es6.string.sub":239,"./modules/es6.string.sup":240,"./modules/es6.string.trim":241,"./modules/es6.symbol":242,"./modules/es6.typed.array-buffer":243,"./modules/es6.typed.data-view":244,"./modules/es6.typed.float32-array":245,"./modules/es6.typed.float64-array":246,"./modules/es6.typed.int16-array":247,"./modules/es6.typed.int32-array":248,"./modules/es6.typed.int8-array":249,"./modules/es6.typed.uint16-array":250,"./modules/es6.typed.uint32-array":251,"./modules/es6.typed.uint8-array":252,"./modules/es6.typed.uint8-clamped-array":253,"./modules/es6.weak-map":254,"./modules/es6.weak-set":255,"./modules/es7.array.includes":256,"./modules/es7.asap":257,"./modules/es7.error.is-error":258,"./modules/es7.map.to-json":259,"./modules/es7.math.iaddh":260,"./modules/es7.math.imulh":261,"./modules/es7.math.isubh":262,"./modules/es7.math.umulh":263,"./modules/es7.object.define-getter":264,"./modules/es7.object.define-setter":265,"./modules/es7.object.entries":266,"./modules/es7.object.get-own-property-descriptors":267,"./modules/es7.object.lookup-getter":268,"./modules/es7.object.lookup-setter":269,"./modules/es7.object.values":270,"./modules/es7.observable":271,"./modules/es7.reflect.define-metadata":272,"./modules/es7.reflect.delete-metadata":273,"./modules/es7.reflect.get-metadata":275,"./modules/es7.reflect.get-metadata-keys":274,"./modules/es7.reflect.get-own-metadata":277,"./modules/es7.reflect.get-own-metadata-keys":276,"./modules/es7.reflect.has-metadata":278,"./modules/es7.reflect.has-own-metadata":279,"./modules/es7.reflect.metadata":280,"./modules/es7.set.to-json":281,"./modules/es7.string.at":282,"./modules/es7.string.match-all":283,"./modules/es7.string.pad-end":284,"./modules/es7.string.pad-start":285,"./modules/es7.string.trim-left":286,"./modules/es7.string.trim-right":287,"./modules/es7.symbol.async-iterator":288,"./modules/es7.symbol.observable":289,"./modules/es7.system.global":290,"./modules/web.dom.iterable":291,"./modules/web.immediate":292,"./modules/web.timers":293}],295:[function(require,module,exports){
 function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(cachedSetTimeout===setTimeout)return setTimeout(e,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(e,0);try{return cachedSetTimeout(e,0)}catch(t){try{return cachedSetTimeout.call(null,e,0)}catch(t){return cachedSetTimeout.call(this,e,0)}}}function runClearTimeout(e){if(cachedClearTimeout===clearTimeout)return clearTimeout(e);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(e);try{return cachedClearTimeout(e)}catch(t){try{return cachedClearTimeout.call(null,e)}catch(t){return cachedClearTimeout.call(this,e)}}}function cleanUpNextTick(){draining&&currentQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var e=runTimeout(cleanUpNextTick);draining=!0;for(var t=queue.length;t;){for(currentQueue=queue,queue=[];++queueIndex<t;)currentQueue&&currentQueue[queueIndex].run();queueIndex=-1,t=queue.length}currentQueue=null,draining=!1,runClearTimeout(e)}}function Item(e,t){this.fun=e,this.array=t}function noop(){}var process=module.exports={},cachedSetTimeout,cachedClearTimeout;!function(){try{cachedSetTimeout="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(e){cachedSetTimeout=defaultSetTimout}try{cachedClearTimeout="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(e){cachedClearTimeout=defaultClearTimeout}}();var queue=[],draining=!1,currentQueue,queueIndex=-1;process.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var u=1;u<arguments.length;u++)t[u-1]=arguments[u];queue.push(new Item(e,t)),1!==queue.length||draining||runTimeout(drainQueue)},Item.prototype.run=function(){this.fun.apply(null,this.array)},process.title="browser",process.browser=!0,process.env={},process.argv=[],process.version="",process.versions={},process.on=noop,process.addListener=noop,process.once=noop,process.off=noop,process.removeListener=noop,process.removeAllListeners=noop,process.emit=noop,process.binding=function(e){throw new Error("process.binding is not supported")},process.cwd=function(){return"/"},process.chdir=function(e){throw new Error("process.chdir is not supported")},process.umask=function(){return 0};
 },{}],296:[function(require,module,exports){
@@ -898,7 +897,7 @@ return Zt(we(this,t))},ct.prototype.sortBy=function(t,e){return Zt(we(this,e,t))
 }function En(e,t,n,s){"boolean"==typeof e?(r(t)&&(n=t,t=void 0),t=t||""):(t=e,n=t,e=!1,r(t)&&(n=t,t=void 0),t=t||"");var i=tt(),a=e?i._week.dow:0;if(null!=n)return Nn(t,(n+a)%7,s,"day");var o,u=[];for(o=0;o<7;o++)u[o]=Nn(t,(o+a)%7,s,"day");return u}function In(e,t){return An(e,t,"months")}function zn(e,t){return An(e,t,"monthsShort")}function Zn(e,t,n){return En(e,t,n,"weekdays")}function $n(e,t,n){return En(e,t,n,"weekdaysShort")}function qn(e,t,n){return En(e,t,n,"weekdaysMin")}function Bn(){var e=this._data;return this._milliseconds=Xi(this._milliseconds),this._days=Xi(this._days),this._months=Xi(this._months),e.milliseconds=Xi(e.milliseconds),e.seconds=Xi(e.seconds),e.minutes=Xi(e.minutes),e.hours=Xi(e.hours),e.months=Xi(e.months),e.years=Xi(e.years),this}function Jn(e,t,n,s){var i=jt(t,n);return e._milliseconds+=s*i._milliseconds,e._days+=s*i._days,e._months+=s*i._months,e._bubble()}function Qn(e,t){return Jn(this,e,t,1)}function Xn(e,t){return Jn(this,e,t,-1)}function Kn(e){return e<0?Math.floor(e):Math.ceil(e)}function es(){var e,t,n,s,i,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return r>=0&&a>=0&&o>=0||r<=0&&a<=0&&o<=0||(r+=864e5*Kn(ns(o)+a),a=0,o=0),u.milliseconds=r%1e3,e=w(r/1e3),u.seconds=e%60,t=w(e/60),u.minutes=t%60,n=w(t/60),u.hours=n%24,a+=w(n/24),i=w(ts(a)),o+=i,a-=Kn(ns(i)),s=w(o/12),o%=12,u.days=a,u.months=o,u.years=s,this}function ts(e){return 4800*e/146097}function ns(e){return 146097*e/4800}function ss(e){var t,n,s=this._milliseconds;if(e=H(e),"month"===e||"year"===e)return t=this._days+s/864e5,n=this._months+ts(t),"month"===e?n:n/12;switch(t=this._days+Math.round(ns(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}}function is(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*v(this._months/12)}function rs(e){return function(){return this.as(e)}}function as(e){return e=H(e),this[e+"s"]()}function os(e){return function(){return this._data[e]}}function us(){return w(this.days()/7)}function ls(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}function ds(e,t,n){var s=jt(e).abs(),i=mr(s.as("s")),r=mr(s.as("m")),a=mr(s.as("h")),o=mr(s.as("d")),u=mr(s.as("M")),l=mr(s.as("y")),d=i<_r.s&&["s",i]||r<=1&&["m"]||r<_r.m&&["mm",r]||a<=1&&["h"]||a<_r.h&&["hh",a]||o<=1&&["d"]||o<_r.d&&["dd",o]||u<=1&&["M"]||u<_r.M&&["MM",u]||l<=1&&["y"]||["yy",l];return d[2]=t,d[3]=+e>0,d[4]=n,ls.apply(null,d)}function hs(e){return void 0===e?mr:"function"==typeof e&&(mr=e,!0)}function cs(e,t){return void 0!==_r[e]&&(void 0===t?_r[e]:(_r[e]=t,!0))}function fs(e){var t=this.localeData(),n=ds(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)}function ms(){var e,t,n,s=yr(this._milliseconds)/1e3,i=yr(this._days),r=yr(this._months);e=w(s/60),t=w(e/60),s%=60,e%=60,n=w(r/12),r%=12;var a=n,o=r,u=i,l=t,d=e,h=s,c=this.asSeconds();return c?(c<0?"-":"")+"P"+(a?a+"Y":"")+(o?o+"M":"")+(u?u+"D":"")+(l||d||h?"T":"")+(l?l+"H":"")+(d?d+"M":"")+(h?h+"S":""):"P0D"}var _s,ys;ys=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1};var gs=ys,ps=e.momentProperties=[],ws=!1,vs={};e.suppressDeprecationWarnings=!1,e.deprecationHandler=null;var Ss;Ss=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)u(e,t)&&n.push(t);return n};var Ms,ks=Ss,Ds={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Ys={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Os="Invalid date",xs="%d",Ts=/\d{1,2}/,bs={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Ps={},Ws={},Rs=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Us=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Cs={},Fs={},Hs=/\d/,Ls=/\d\d/,Gs=/\d{3}/,Vs=/\d{4}/,js=/[+-]?\d{6}/,Ns=/\d\d?/,As=/\d\d\d\d?/,Es=/\d\d\d\d\d\d?/,Is=/\d{1,3}/,zs=/\d{1,4}/,Zs=/[+-]?\d{1,6}/,$s=/\d+/,qs=/[+-]?\d+/,Bs=/Z|[+-]\d\d:?\d\d/gi,Js=/Z|[+-]\d\d(?::?\d\d)?/gi,Qs=/[+-]?\d+(\.\d{1,3})?/,Xs=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Ks={},ei={},ti=0,ni=1,si=2,ii=3,ri=4,ai=5,oi=6,ui=7,li=8;Ms=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1};var di=Ms;Z("M",["MM",2],"Mo",function(){return this.month()+1}),Z("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),Z("MMMM",0,0,function(e){return this.localeData().months(this,e)}),F("month","M"),G("month",8),Q("M",Ns),Q("MM",Ns,Ls),Q("MMM",function(e,t){return t.monthsShortRegex(e)}),Q("MMMM",function(e,t){return t.monthsRegex(e)}),te(["M","MM"],function(e,t){t[ni]=v(e)-1}),te(["MMM","MMMM"],function(e,t,n,s){var i=n._locale.monthsParse(e,s,n._strict);null!=i?t[ni]=i:c(n).invalidMonth=e});var hi=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,ci="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),fi="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),mi=Xs,_i=Xs;Z("Y",0,0,function(){var e=this.year();return e<=9999?""+e:"+"+e}),Z(0,["YY",2],0,function(){return this.year()%100}),Z(0,["YYYY",4],0,"year"),Z(0,["YYYYY",5],0,"year"),Z(0,["YYYYYY",6,!0],0,"year"),F("year","y"),G("year",1),Q("Y",qs),Q("YY",Ns,Ls),Q("YYYY",zs,Vs),Q("YYYYY",Zs,js),Q("YYYYYY",Zs,js),te(["YYYYY","YYYYYY"],ti),te("YYYY",function(t,n){n[ti]=2===t.length?e.parseTwoDigitYear(t):v(t)}),te("YY",function(t,n){n[ti]=e.parseTwoDigitYear(t)}),te("Y",function(e,t){t[ti]=parseInt(e,10)}),e.parseTwoDigitYear=function(e){return v(e)+(v(e)>68?1900:2e3)};var yi=j("FullYear",!0);Z("w",["ww",2],"wo","week"),Z("W",["WW",2],"Wo","isoWeek"),F("week","w"),F("isoWeek","W"),G("week",5),G("isoWeek",5),Q("w",Ns),Q("ww",Ns,Ls),Q("W",Ns),Q("WW",Ns,Ls),ne(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=v(e)});var gi={dow:0,doy:6};Z("d",0,"do","day"),Z("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),Z("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),Z("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),Z("e",0,0,"weekday"),Z("E",0,0,"isoWeekday"),F("day","d"),F("weekday","e"),F("isoWeekday","E"),G("day",11),G("weekday",11),G("isoWeekday",11),Q("d",Ns),Q("e",Ns),Q("E",Ns),Q("dd",function(e,t){return t.weekdaysMinRegex(e)}),Q("ddd",function(e,t){return t.weekdaysShortRegex(e)}),Q("dddd",function(e,t){return t.weekdaysRegex(e)}),ne(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:c(n).invalidWeekday=e}),ne(["d","e","E"],function(e,t,n,s){t[s]=v(e)});var pi="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),wi="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),vi="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Si=Xs,Mi=Xs,ki=Xs;Z("H",["HH",2],0,"hour"),Z("h",["hh",2],0,Ee),Z("k",["kk",2],0,Ie),Z("hmm",0,0,function(){return""+Ee.apply(this)+z(this.minutes(),2)}),Z("hmmss",0,0,function(){return""+Ee.apply(this)+z(this.minutes(),2)+z(this.seconds(),2)}),Z("Hmm",0,0,function(){return""+this.hours()+z(this.minutes(),2)}),Z("Hmmss",0,0,function(){return""+this.hours()+z(this.minutes(),2)+z(this.seconds(),2)}),ze("a",!0),ze("A",!1),F("hour","h"),G("hour",13),Q("a",Ze),Q("A",Ze),Q("H",Ns),Q("h",Ns),Q("HH",Ns,Ls),Q("hh",Ns,Ls),Q("hmm",As),Q("hmmss",Es),Q("Hmm",As),Q("Hmmss",Es),te(["H","HH"],ii),te(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),te(["h","hh"],function(e,t,n){t[ii]=v(e),c(n).bigHour=!0}),te("hmm",function(e,t,n){var s=e.length-2;t[ii]=v(e.substr(0,s)),t[ri]=v(e.substr(s)),c(n).bigHour=!0}),te("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ii]=v(e.substr(0,s)),t[ri]=v(e.substr(s,2)),t[ai]=v(e.substr(i)),c(n).bigHour=!0}),te("Hmm",function(e,t,n){var s=e.length-2;t[ii]=v(e.substr(0,s)),t[ri]=v(e.substr(s))}),te("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ii]=v(e.substr(0,s)),t[ri]=v(e.substr(s,2)),t[ai]=v(e.substr(i))});var Di,Yi=/[ap]\.?m?\.?/i,Oi=j("Hours",!0),xi={calendar:Ds,longDateFormat:Ys,invalidDate:Os,ordinal:xs,ordinalParse:Ts,relativeTime:bs,months:ci,monthsShort:fi,week:gi,weekdays:pi,weekdaysMin:vi,weekdaysShort:wi,meridiemParse:Yi},Ti={},bi={},Pi=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Wi=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ri=/Z|[+-]\d\d(?::?\d\d)?/,Ui=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Ci=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Fi=/^\/?Date\((\-?\d+)/i;e.createFromInputFallback=k("value provided is not in a recognized ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),e.ISO_8601=function(){};var Hi=k("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=pt.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:m()}),Li=k("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=pt.apply(null,arguments);return this.isValid()&&e.isValid()?e>this?this:e:m()}),Gi=function(){return Date.now?Date.now():+new Date};Yt("Z",":"),Yt("ZZ",""),Q("Z",Js),Q("ZZ",Js),te(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Ot(Js,e)});var Vi=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var ji=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Ni=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;jt.fn=Mt.prototype;var Ai=It(1,"add"),Ei=It(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Ii=k("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});Z(0,["gg",2],0,function(){return this.weekYear()%100}),Z(0,["GG",2],0,function(){return this.isoWeekYear()%100}),On("gggg","weekYear"),On("ggggg","weekYear"),On("GGGG","isoWeekYear"),On("GGGGG","isoWeekYear"),F("weekYear","gg"),F("isoWeekYear","GG"),G("weekYear",1),G("isoWeekYear",1),Q("G",qs),Q("g",qs),Q("GG",Ns,Ls),Q("gg",Ns,Ls),Q("GGGG",zs,Vs),Q("gggg",zs,Vs),Q("GGGGG",Zs,js),Q("ggggg",Zs,js),ne(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=v(e)}),ne(["gg","GG"],function(t,n,s,i){n[i]=e.parseTwoDigitYear(t)}),Z("Q",0,"Qo","quarter"),F("quarter","Q"),G("quarter",7),Q("Q",Hs),te("Q",function(e,t){t[ni]=3*(v(e)-1)}),Z("D",["DD",2],"Do","date"),F("date","D"),G("date",9),Q("D",Ns),Q("DD",Ns,Ls),Q("Do",function(e,t){return e?t._ordinalParse:t._ordinalParseLenient}),te(["D","DD"],si),te("Do",function(e,t){t[si]=v(e.match(Ns)[0],10)});var zi=j("Date",!0);Z("DDD",["DDDD",3],"DDDo","dayOfYear"),F("dayOfYear","DDD"),G("dayOfYear",4),Q("DDD",Is),Q("DDDD",Gs),te(["DDD","DDDD"],function(e,t,n){n._dayOfYear=v(e)}),Z("m",["mm",2],0,"minute"),F("minute","m"),G("minute",14),Q("m",Ns),Q("mm",Ns,Ls),te(["m","mm"],ri);var Zi=j("Minutes",!1);Z("s",["ss",2],0,"second"),F("second","s"),G("second",15),Q("s",Ns),Q("ss",Ns,Ls),te(["s","ss"],ai);var $i=j("Seconds",!1);Z("S",0,0,function(){return~~(this.millisecond()/100)}),Z(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),Z(0,["SSS",3],0,"millisecond"),Z(0,["SSSS",4],0,function(){return 10*this.millisecond()}),Z(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),Z(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),Z(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),Z(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),Z(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),F("millisecond","ms"),G("millisecond",16),Q("S",Is,Hs),Q("SS",Is,Ls),Q("SSS",Is,Gs);var qi;for(qi="SSSS";qi.length<=9;qi+="S")Q(qi,$s);for(qi="S";qi.length<=9;qi+="S")te(qi,Fn);var Bi=j("Milliseconds",!1);Z("z",0,0,"zoneAbbr"),Z("zz",0,0,"zoneName");var Ji=g.prototype;Ji.add=Ai,Ji.calendar=$t,Ji.clone=qt,Ji.diff=tn,Ji.endOf=_n,Ji.format=on,Ji.from=un,Ji.fromNow=ln,Ji.to=dn,Ji.toNow=hn,Ji.get=E,Ji.invalidAt=Dn,Ji.isAfter=Bt,Ji.isBefore=Jt,Ji.isBetween=Qt,Ji.isSame=Xt,Ji.isSameOrAfter=Kt,Ji.isSameOrBefore=en,Ji.isValid=Mn,Ji.lang=Ii,Ji.locale=cn,Ji.localeData=fn,Ji.max=Li,Ji.min=Hi,Ji.parsingFlags=kn,Ji.set=I,Ji.startOf=mn,Ji.subtract=Ei,Ji.toArray=wn,Ji.toObject=vn,Ji.toDate=pn,Ji.toISOString=rn,Ji.inspect=an,Ji.toJSON=Sn,Ji.toString=sn,Ji.unix=gn,Ji.valueOf=yn,Ji.creationData=Yn,Ji.year=yi,Ji.isLeapYear=ge,Ji.weekYear=xn,Ji.isoWeekYear=Tn,Ji.quarter=Ji.quarters=Un,Ji.month=de,Ji.daysInMonth=he,Ji.week=Ji.weeks=xe,Ji.isoWeek=Ji.isoWeeks=Te,Ji.weeksInYear=Pn,Ji.isoWeeksInYear=bn,Ji.date=zi,Ji.day=Ji.days=He,Ji.weekday=Le,Ji.isoWeekday=Ge,Ji.dayOfYear=Cn,Ji.hour=Ji.hours=Oi,Ji.minute=Ji.minutes=Zi,Ji.second=Ji.seconds=$i,Ji.millisecond=Ji.milliseconds=Bi,Ji.utcOffset=bt,Ji.utc=Wt,Ji.local=Rt,Ji.parseZone=Ut,Ji.hasAlignedHourOffset=Ct,Ji.isDST=Ft,Ji.isLocal=Lt,Ji.isUtcOffset=Gt,Ji.isUtc=Vt,Ji.isUTC=Vt,Ji.zoneAbbr=Hn,Ji.zoneName=Ln,Ji.dates=k("dates accessor is deprecated. Use date instead.",zi),Ji.months=k("months accessor is deprecated. Use month instead",de),Ji.years=k("years accessor is deprecated. Use year instead",yi),Ji.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Pt),Ji.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ht);var Qi=T.prototype;Qi.calendar=b,Qi.longDateFormat=P,Qi.invalidDate=W,Qi.ordinal=R,Qi.preparse=jn,Qi.postformat=jn,Qi.relativeTime=U,Qi.pastFuture=C,Qi.set=O,Qi.months=re,Qi.monthsShort=ae,Qi.monthsParse=ue,Qi.monthsRegex=fe,Qi.monthsShortRegex=ce,Qi.week=De,Qi.firstDayOfYear=Oe,Qi.firstDayOfWeek=Ye,Qi.weekdays=We,Qi.weekdaysMin=Ue,Qi.weekdaysShort=Re,Qi.weekdaysParse=Fe,Qi.weekdaysRegex=Ve,Qi.weekdaysShortRegex=je,Qi.weekdaysMinRegex=Ne,Qi.isPM=$e,Qi.meridiem=qe,Xe("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=1===v(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n}}),e.lang=k("moment.lang is deprecated. Use moment.locale instead.",Xe),e.langData=k("moment.langData is deprecated. Use moment.localeData instead.",tt);var Xi=Math.abs,Ki=rs("ms"),er=rs("s"),tr=rs("m"),nr=rs("h"),sr=rs("d"),ir=rs("w"),rr=rs("M"),ar=rs("y"),or=os("milliseconds"),ur=os("seconds"),lr=os("minutes"),dr=os("hours"),hr=os("days"),cr=os("months"),fr=os("years"),mr=Math.round,_r={s:45,m:45,h:22,d:26,M:11},yr=Math.abs,gr=Mt.prototype;return gr.abs=Bn,gr.add=Qn,gr.subtract=Xn,gr.as=ss,gr.asMilliseconds=Ki,gr.asSeconds=er,gr.asMinutes=tr,gr.asHours=nr,gr.asDays=sr,gr.asWeeks=ir,gr.asMonths=rr,gr.asYears=ar,gr.valueOf=is,gr._bubble=es,gr.get=as,gr.milliseconds=or,gr.seconds=ur,gr.minutes=lr,gr.hours=dr,gr.days=hr,gr.weeks=us,gr.months=cr,gr.years=fr,gr.humanize=fs,gr.toISOString=ms,gr.toString=ms,gr.toJSON=ms,gr.locale=cn,gr.localeData=fn,gr.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ms),gr.lang=Ii,Z("X",0,0,"unix"),Z("x",0,0,"valueOf"),Q("x",qs),Q("X",Qs),te("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),te("x",function(e,t,n){n._d=new Date(v(e))}),e.version="2.17.1",t(pt),e.fn=Ji,e.min=vt,e.max=St,e.now=Gi,e.utc=d,e.unix=Gn,e.months=In,e.isDate=a,e.locale=Xe,e.invalid=m,e.duration=jt,e.isMoment=p,e.weekdays=Zn,e.parseZone=Vn,e.localeData=tt,e.isDuration=kt,e.monthsShort=zn,e.weekdaysMin=qn,e.defineLocale=Ke,e.updateLocale=et,e.locales=nt,e.weekdaysShort=$n,e.normalizeUnits=H,e.relativeTimeRounding=hs,e.relativeTimeThreshold=cs,e.calendarFormat=Zt,e.prototype=Ji,e});
 
 },{}],"partial.lenses":[function(require,module,exports){
-"use strict";function ConstOf(e){var n=e.concat;return{map:snd,of:(0,_infestines.always)((0,e.empty)()),ap:function(e,t){return n(t,e)}}}function Concat(e,n){this.l=e,this.r=n}function pushTo(e,n){for(;isConcat(e);){var t=e.l;e=e.r,isConcat(t)?(pushTo(t.l,n),pushTo(t.r,n)):n.push(t)}n.push(e)}function toArray(e){var n=[];return(0,_infestines.isDefined)(e)&&pushTo(e,n),n}function traverse(e,n,t){for(var r=e.ap,i=e.map,o=(0,e.of)(void 0),s=t.length;s;)o=r(i(rconcat,o),n(t[--s]));return i(toArray,o)}function composed(e,n){switch(n.length-e){case 0:return identity;case 1:return lift(n[e]);default:return function(t,r,i){var o=n.length;for(r=close(lift(n[--o]),t,r);e<--o;)r=close(lift(n[o]),t,r);return lift(n[e])(t,r,i)}}}function lift(e){switch(typeof e){case"string":return liftProp(e);case"number":return liftIndex(e);case"function":return lifted(e);default:return composed(0,e)}}function compose(){switch(arguments.length){case 0:return identity;case 1:return arguments[0];default:for(var e=arguments.length,n=Array(e),t=0;t<e;++t)n[t]=arguments[t];return n}}function setU(e,n,t){switch(typeof e){case"string":return setProp(e,n,t);case"number":return setIndex(e,n,t);case"function":return lifted(e)(Ident,(0,_infestines.always)(n),t);default:return modifyComposed(e,(0,_infestines.always)(n),t)}}function getComposed(e,n){for(var t=0,r=e.length;t<r;++t)n=getU(e[t],n);return n}function getU(e,n){switch(typeof e){case"string":return getProp(e,n);case"number":return getIndex(e,n);case"function":return lifted(e)(Const,Const.of,n);default:return getComposed(e,n)}}function modifyComposed(e,n,t){for(var r=e.length,i=[],o=0;o<r;++o){i.push(t);var s=e[o];switch(typeof s){case"string":t=getProp(s,t);break;case"number":t=getIndex(s,t);break;default:t=composed(o,e)(Ident,n,t),r=o}}for(r===e.length&&(t=n(t));0<=--r;){var u=e[r];switch(typeof u){case"string":t=setProp(u,t,i[r]);break;case"number":t=setIndex(u,t,i[r])}}return t}function modifyU(e,n,t){switch(typeof e){case"string":return setProp(e,n(getProp(e,t)),t);case"number":return setIndex(e,n(getIndex(e,t)),t);case"function":return lifted(e)(Ident,n,t);default:return modifyComposed(e,n,t)}}function findWith(){var e=compose.apply(void 0,arguments);return[find(function(n){return(0,_infestines.isDefined)(getU(e,n))}),e]}function setIndex(e,n,t){if((0,_infestines.isDefined)(n)){if(!(0,_infestines.isArray)(t))return e<0?void 0:nulls(e).concat([n]);var r=t.length;if(r<=e)return t.concat(nulls(e-r),[n]);if(e<0)return r?t:void 0;for(var i=Array(r),o=0;o<r;++o)i[o]=t[o];return i[e]=n,i}if((0,_infestines.isArray)(t)){var s=t.length;if(!s)return;if(e<0||s<=e)return t;if(1===s)return;for(var u=Array(s-1),f=0;f<e;++f)u[f]=t[f];for(var c=e+1;c<s;++c)u[c-1]=t[c];return u}}function getPick(e,n){var t=void 0;for(var r in e){var i=getU(e[r],n);(0,_infestines.isDefined)(i)&&(t||(t={}),t[r]=i)}return t}function props(){for(var e=arguments.length,n={},t=0;t<e;++t){var r=arguments[t];n[r]=r}return pick(n)}function lazy(e){var n=function(r,i,o){return(n=lift(e(t)))(r,i,o)},t=function(e,t,r){return n(e,t,r)};return t}function branch(e){var n=[],t=[];for(var r in e)n.push(r),t.push(lift(e[r]));var i=n.length;return function(e,r,o){notGet(e);var s=e.ap,u=function e(t,r){return 0<=r?function(i){return e(setProp(n[r],i,t),r-1)}:t},f=(0,e.of)(u(o,i-1));(0,_infestines.isObject)(o)||(o=void 0);for(var c=i-1;0<=c;--c)f=s(f,t[c](e,r,o&&o[n[c]]));return f}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.fromArrayBy=exports.skip=exports.optional=exports.when=exports.sequence=exports.log=exports.identity=exports.pick=exports.augment=exports.filter=exports.append=exports.index=exports.find=exports.prop=exports.rewrite=exports.normalize=exports.valueOr=exports.define=exports.required=exports.defaults=exports.replace=exports.choice=exports.orElse=exports.choose=exports.nothing=exports.just=exports.to=exports.chain=exports.inverse=exports.foldMapOf=exports.collect=exports.getInverse=exports.get=exports.set=exports.modify=exports.lens=exports.iso=exports.remove=void 0,exports.lift=lift,exports.compose=compose,exports.findWith=findWith,exports.props=props,exports.lazy=lazy,exports.branch=branch;var _infestines=require("infestines"),emptyArray=[],apply=function(e,n){return e(n)},snd=function(e,n){return n},Ident={map:apply,of:_infestines.id,ap:apply},Const={map:snd,of:_infestines.id},isConcat=function(e){return e&&e.constructor===Concat},ap=function(e,n){return(0,_infestines.isDefined)(n)?(0,_infestines.isDefined)(e)?new Concat(n,e):n:e},rconcat=function(e){return function(n){return ap(e,n)}},Collect={map:snd,of:function(){},ap:ap},warn=function(){var e={};return function(n){n in e||(e[n]=n,console.warn("partial.lenses:",n))}}(),unArray=function(e){return(0,_infestines.isArray)(e)?e:void 0},mkArray=function(e){return(0,_infestines.isArray)(e)?e:emptyArray},assert=function(e,n,t){if(n(e))return e;throw new Error(t)},emptyArrayToUndefined=function(e){return e.length?e:void 0},toPartial=function(e){return function(n){return(0,_infestines.isDefined)(n)?e(n):n}},isntConst=function(e){return e!==Const},notGet=function(e){return assert(e,isntConst,"Traversals cannot be `get`. Consider `collect`.")},seemsLens=function(e){return"function"==typeof e&&3===e.length},lifted=function(e){return assert(e,seemsLens,"Expecting a lens.")},close=function(e,n,t){return function(r){return e(n,t,r)}},getInverseU=setU,isoU=function(e,n){return function(t,r,i){return(0,t.map)(n,r(e(i)))}},lensU=function(e,n){return function(t,r,i){return(0,t.map)(function(e){return n(e,i)},r(e(i)))}},collectU=function(e,n){return toArray(lift(e)(Collect,_infestines.id,n))},remove=exports.remove=(0,_infestines.curry2)(function(e,n){return setU(e,void 0,n)}),iso=exports.iso=(0,_infestines.curry2)(isoU),lens=exports.lens=(0,_infestines.curry2)(lensU),modify=exports.modify=(0,_infestines.curry3)(modifyU),set=exports.set=(0,_infestines.curry3)(setU),get=exports.get=(0,_infestines.curry2)(getU),getInverse=exports.getInverse=(0,_infestines.curry2)(getInverseU),collect=exports.collect=(0,_infestines.curry2)(collectU),foldMapOf=exports.foldMapOf=(0,_infestines.curry4)(function(e,n,t,r){return lift(n)(ConstOf(e),t,r)}),inverse=exports.inverse=function(e){return function(n,t,r){return(0,n.map)(function(n){return getU(e,n)},t(getInverseU(e,r)))}},chain=exports.chain=(0,_infestines.curry2)(function(e,n){return[n,choose(function(n){return(0,_infestines.isDefined)(n)?e(n):nothing})]}),to=exports.to=function(e){return function(n,t,r){return(0,n.map)((0,_infestines.always)(r),t(e(r)))}},just=exports.just=function(e){return to((0,_infestines.always)(e))},nothing=exports.nothing=just(void 0),choose=exports.choose=function(e){return function(n,t,r){return lift(e(r))(n,t,r)}},orElse=exports.orElse=(0,_infestines.curry2)(function(e,n){return choose(function(t){return(0,_infestines.isDefined)(getU(n,t))?n:e})}),choice=exports.choice=function(){for(var e=arguments.length,n=Array(e),t=0;t<e;t++)n[t]=arguments[t];return choose(function(e){var t=n.findIndex(function(n){return(0,_infestines.isDefined)(getU(n,e))});return t<0?nothing:n[t]})},replacer=function(e,n){return function(t){return(0,_infestines.acyclicEqualsU)(t,e)?n:t}},normalizer=function(e){return function(n,t,r){return(0,n.map)(e,t(e(r)))}},replace=exports.replace=(0,_infestines.curry2)(function(e,n){return function(t,r,i){return(0,t.map)(replacer(n,e),r(replacer(e,n)(i)))}}),defaults=exports.defaults=function(e){return function(n,t,r){return(0,n.map)(replacer(e,void 0),t((0,_infestines.isDefined)(r)?r:e))}},required=exports.required=function(e){return replace(e,void 0)},define=exports.define=function(e){return normalizer(function(n){return(0,_infestines.isDefined)(n)?n:e})},valueOr=exports.valueOr=function(e){return function(n,t,r){return t((0,_infestines.isDefined)(r)&&null!==r?r:e)}},normalize=exports.normalize=function(e){return normalizer(toPartial(e))},rewrite=exports.rewrite=function(e){return function(n,t,r){return(0,n.map)(toPartial(e),t(r))}},isProp=function(e){return"string"==typeof e},prop=exports.prop=function(e){return assert(e,isProp,"`prop` expects a string.")},getProp=function(e,n){return(0,_infestines.isObject)(n)?n[e]:void 0},setProp=function(e,n,t){return(0,_infestines.isDefined)(n)?(0,_infestines.assocPartialU)(e,n,t):(0,_infestines.dissocPartialU)(e,t)},liftProp=function(e){return function(n,t,r){return(0,n.map)(function(n){return setProp(e,n,r)},t(getProp(e,r)))}},find=exports.find=function(e){return choose(function(n){if(!(0,_infestines.isArray)(n))return 0;var t=n.findIndex(e);return t<0?append:t})},isIndex=function(e){return Number.isInteger(e)&&0<=e},index=exports.index=function(e){return assert(e,isIndex,"`index` expects a non-negative integer.")},nulls=function(e){return Array(e).fill(null)},getIndex=function(e,n){return(0,_infestines.isArray)(n)?n[e]:void 0},liftIndex=function(e){return function(n,t,r){return(0,n.map)(function(n){return setIndex(e,n,r)},t(getIndex(e,r)))}},append=exports.append=lensU(snd,function(e,n){return(0,_infestines.isDefined)(e)?(0,_infestines.isArray)(n)?n.concat([e]):[e]:unArray(n)}),filter=exports.filter=function(e){return lensU(function(n){return unArray(n)&&n.filter(e)},function(n,t){return emptyArrayToUndefined(mkArray(n).concat(mkArray(t).filter(function(n){return!e(n)})))})},augment=exports.augment=function(e){return lensU(function(n){var t=(0,_infestines.dissocPartialU)(0,n);if(t)for(var r in e)t[r]=e[r](t);return t},function(n,t){if((0,_infestines.isObject)(n)){var r=function(){(0,_infestines.isObject)(t)||(t=void 0);var r=void 0,i=function(e,n){r||(r={}),r[e]=n};for(var o in n)o in e?t&&o in t&&i(o,t[o]):i(o,n[o]);return{v:r}}();if("object"==typeof r)return r.v}})},setPick=function(e,n){return function(t){(0,_infestines.isObject)(t)||(t=void 0);for(var r in e)n=setU(e[r],t&&t[r],n);return n}},pick=exports.pick=function(e){return function(n,t,r){return(0,n.map)(setPick(e,r),t(getPick(e,r)))}},identity=exports.identity=function(e,n,t){return n(t)},show=function(e,n){return function(t){return console.log.apply(console,e.concat([n,t]))||t}},log=exports.log=function(){for(var e=arguments.length,n=Array(e),t=0;t<e;t++)n[t]=arguments[t];return isoU(show(n,"get"),show(n,"set"))},sequence=exports.sequence=function(e,n,t){return notGet(e)===Ident?emptyArrayToUndefined((0,_infestines.mapPartialU)(n,mkArray(t))):(0,e.map)(emptyArrayToUndefined,traverse(e,n,mkArray(t)))},when=exports.when=function(e){return function(n,t,r){return notGet(n),e(r)?t(r):(0,n.of)(r)}},optional=exports.optional=when(_infestines.isDefined),skip=exports.skip=when((0,_infestines.always)(!1)),fromArrayBy=exports.fromArrayBy=function(e){return warn("`fromArrayBy` is experimental and might be removed, renamed or changed semantically before next major release")||isoU(function(n){if((0,_infestines.isArray)(n)){for(var t={},r=n.length,i=0;i<r;++i){var o=n[i];t[o[e]]=o}return t}},function(e){return(0,_infestines.isObject)(e)?(0,_infestines.values)(e):void 0})};exports.default=function(){return warn("default import will be removed. Use `compose` or array notation `[...]`.")||compose.apply(void 0,arguments)};
+"use strict";function ConstOf(e){var n=e.concat;return{map:snd,of:(0,_infestines.always)((0,e.empty)()),ap:function(e,t){return n(t,e)}}}function Concat(e,n){this.l=e,this.r=n}function pushTo(e,n){for(;isConcat(e);){var t=e.l;e=e.r,isConcat(t)?(pushTo(t.l,n),pushTo(t.r,n)):n.push(t)}n.push(e)}function toArray(e){var n=[];return(0,_infestines.isDefined)(e)&&pushTo(e,n),n}function traverse(e,n,t){for(var r=e.ap,i=e.map,o=(0,e.of)(void 0),s=t.length;s;)o=r(i(rconcat,o),n(t[--s]));return i(toArray,o)}function composed(e,n){switch(n.length-e){case 0:return identity;case 1:return lift(n[e]);default:return function(t,r,i){var o=n.length;for(r=close(lift(n[--o]),t,r);e<--o;)r=close(lift(n[o]),t,r);return lift(n[e])(t,r,i)}}}function lift(e){switch(typeof e){case"string":return liftProp(e);case"number":return liftIndex(e);case"function":return lifted(e);default:return composed(0,e)}}function compose(){switch(arguments.length){case 0:return identity;case 1:return arguments[0];default:for(var e=arguments.length,n=Array(e),t=0;t<e;++t)n[t]=arguments[t];return n}}function setU(e,n,t){switch(typeof e){case"string":return setProp(e,n,t);case"number":return setIndex(e,n,t);case"function":return lifted(e)(Ident,(0,_infestines.always)(n),t);default:return modifyComposed(e,(0,_infestines.always)(n),t)}}function getComposed(e,n){for(var t=0,r=e.length;t<r;++t)n=getU(e[t],n);return n}function getU(e,n){switch(typeof e){case"string":return getProp(e,n);case"number":return getIndex(e,n);case"function":return lifted(e)(Const,_infestines.id,n);default:return getComposed(e,n)}}function modifyComposed(e,n,t){for(var r=e.length,i=[],o=0;o<r;++o){i.push(t);var s=e[o];switch(typeof s){case"string":t=getProp(s,t);break;case"number":t=getIndex(s,t);break;default:t=composed(o,e)(Ident,n,t),r=o}}for(r===e.length&&(t=n(t));0<=--r;){var u=e[r];switch(typeof u){case"string":t=setProp(u,t,i[r]);break;case"number":t=setIndex(u,t,i[r])}}return t}function modifyU(e,n,t){switch(typeof e){case"string":return setProp(e,n(getProp(e,t)),t);case"number":return setIndex(e,n(getIndex(e,t)),t);case"function":return lifted(e)(Ident,n,t);default:return modifyComposed(e,n,t)}}function findWith(){var e=compose.apply(void 0,arguments);return[find(function(n){return(0,_infestines.isDefined)(getU(e,n))}),e]}function setIndex(e,n,t){if((0,_infestines.isDefined)(n)){if(!(0,_infestines.isArray)(t))return e<0?void 0:nulls(e).concat([n]);var r=t.length;if(r<=e)return t.concat(nulls(e-r),[n]);if(e<0)return r?t:void 0;for(var i=Array(r),o=0;o<r;++o)i[o]=t[o];return i[e]=n,i}if((0,_infestines.isArray)(t)){var s=t.length;if(!s)return;if(e<0||s<=e)return t;if(1===s)return;for(var u=Array(s-1),f=0;f<e;++f)u[f]=t[f];for(var c=e+1;c<s;++c)u[c-1]=t[c];return u}}function getPick(e,n){var t=void 0;for(var r in e){var i=getU(e[r],n);(0,_infestines.isDefined)(i)&&(t||(t={}),t[r]=i)}return t}function props(){for(var e=arguments.length,n={},t=0;t<e;++t){var r=arguments[t];n[r]=r}return pick(n)}function lazy(e){var n=function(r,i,o){return(n=lift(e(t)))(r,i,o)},t=function(e,t,r){return n(e,t,r)};return t}function branchOn(e,n){var t=e.length;return function(r,i,o){notGet(r);var s=r.ap,u=function n(t,r){return 0<=r?function(i){return n(setProp(e[r],i,t),r-1)}:t},f=(0,r.of)(u(o,t-1));(0,_infestines.isObject)(o)||(o=void 0);for(var c=t-1;0<=c;--c){var a=o&&o[e[c]];f=s(f,n?n[c](r,i,a):i(a))}return(0,r.map)(emptyObjectToUndefined,f)}}function sequence(e,n,t){return notGet(e),(0,_infestines.isArray)(t)?e===Ident?emptyArrayToUndefined((0,_infestines.mapPartialU)(n,t)):(0,e.map)(emptyArrayToUndefined,traverse(e,n,t)):(0,_infestines.isObject)(t)?branchOn((0,_infestines.keys)(t))(e,n,t):(0,e.of)(t)}function branch(e){var n=[],t=[];for(var r in e)n.push(r),t.push(lift(e[r]));return branchOn(n,t)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.optional=exports.when=exports.log=exports.identity=exports.pick=exports.augment=exports.filter=exports.append=exports.index=exports.find=exports.prop=exports.rewrite=exports.normalize=exports.valueOr=exports.define=exports.required=exports.defaults=exports.replace=exports.choice=exports.orElse=exports.choose=exports.just=exports.to=exports.chain=exports.zero=exports.inverse=exports.foldMapOf=exports.collect=exports.getInverse=exports.get=exports.set=exports.modify=exports.lens=exports.iso=exports.remove=void 0,exports.lift=lift,exports.compose=compose,exports.findWith=findWith,exports.props=props,exports.lazy=lazy,exports.sequence=sequence,exports.branch=branch;var _infestines=require("infestines"),emptyArray=[],apply=function(e,n){return e(n)},snd=function(e,n){return n},Ident={map:apply,of:_infestines.id,ap:apply},Const={map:snd},isConcat=function(e){return e&&e.constructor===Concat},ap=function(e,n){return(0,_infestines.isDefined)(n)?(0,_infestines.isDefined)(e)?new Concat(n,e):n:e},rconcat=function(e){return function(n){return ap(e,n)}},Collect={map:snd,of:function(){},ap:ap},unArray=function(e){return(0,_infestines.isArray)(e)?e:void 0},mkArray=function(e){return(0,_infestines.isArray)(e)?e:emptyArray},assert=function(e,n,t){if(n(e))return e;throw new Error(t)},emptyArrayToUndefined=function(e){return e.length?e:void 0},emptyObjectToUndefined=function(e){if(!(0,_infestines.isObject)(e))return e;for(var n in e)return e},toPartial=function(e){return function(n){return(0,_infestines.isDefined)(n)?e(n):n}},isntConst=function(e){return e!==Const},notGet=function(e){return assert(e,isntConst,"Traversals cannot be `get`. Consider `collect`.")},seemsLens=function(e){return"function"==typeof e&&3===e.length},lifted=function(e){return assert(e,seemsLens,"Expecting a lens.")},close=function(e,n,t){return function(r){return e(n,t,r)}},getInverseU=setU,isoU=function(e,n){return function(t,r,i){return(0,t.map)(n,r(e(i)))}},lensU=function(e,n){return function(t,r,i){return(0,t.map)(function(e){return n(e,i)},r(e(i)))}},collectU=function(e,n){return toArray(lift(e)(Collect,_infestines.id,n))},remove=exports.remove=(0,_infestines.curry2)(function(e,n){return setU(e,void 0,n)}),iso=exports.iso=(0,_infestines.curry2)(isoU),lens=exports.lens=(0,_infestines.curry2)(lensU),modify=exports.modify=(0,_infestines.curry3)(modifyU),set=exports.set=(0,_infestines.curry3)(setU),get=exports.get=(0,_infestines.curry2)(getU),getInverse=exports.getInverse=(0,_infestines.curry2)(getInverseU),collect=exports.collect=(0,_infestines.curry2)(collectU),foldMapOf=exports.foldMapOf=(0,_infestines.curry4)(function(e,n,t,r){return lift(n)(ConstOf(e),t,r)}),inverse=exports.inverse=function(e){return function(n,t,r){return(0,n.map)(function(n){return getU(e,n)},t(getInverseU(e,r)))}},zero=exports.zero=function(e,n,t){var r=e.of;return r?r(t):(0,e.map)((0,_infestines.always)(t),n(void 0))},chain=exports.chain=(0,_infestines.curry2)(function(e,n){return[n,choose(function(n){return(0,_infestines.isDefined)(n)?e(n):zero})]}),to=exports.to=function(e){return function(n,t,r){return(0,n.map)((0,_infestines.always)(r),t(e(r)))}},just=exports.just=function(e){return to((0,_infestines.always)(e))},choose=exports.choose=function(e){return function(n,t,r){return lift(e(r))(n,t,r)}},orElse=exports.orElse=(0,_infestines.curry2)(function(e,n){return choose(function(t){return(0,_infestines.isDefined)(getU(n,t))?n:e})}),choice=exports.choice=function(){for(var e=arguments.length,n=Array(e),t=0;t<e;t++)n[t]=arguments[t];return choose(function(e){var t=n.findIndex(function(n){return(0,_infestines.isDefined)(getU(n,e))});return t<0?zero:n[t]})},replacer=function(e,n){return function(t){return(0,_infestines.acyclicEqualsU)(t,e)?n:t}},normalizer=function(e){return function(n,t,r){return(0,n.map)(e,t(e(r)))}},replace=exports.replace=(0,_infestines.curry2)(function(e,n){return function(t,r,i){return(0,t.map)(replacer(n,e),r(replacer(e,n)(i)))}}),defaults=exports.defaults=function(e){return function(n,t,r){return(0,n.map)(replacer(e,void 0),t((0,_infestines.isDefined)(r)?r:e))}},required=exports.required=function(e){return replace(e,void 0)},define=exports.define=function(e){return normalizer(function(n){return(0,_infestines.isDefined)(n)?n:e})},valueOr=exports.valueOr=function(e){return function(n,t,r){return t((0,_infestines.isDefined)(r)&&null!==r?r:e)}},normalize=exports.normalize=function(e){return normalizer(toPartial(e))},rewrite=exports.rewrite=function(e){return function(n,t,r){return(0,n.map)(toPartial(e),t(r))}},isProp=function(e){return"string"==typeof e},prop=exports.prop=function(e){return assert(e,isProp,"`prop` expects a string.")},getProp=function(e,n){return(0,_infestines.isObject)(n)?n[e]:void 0},setProp=function(e,n,t){return(0,_infestines.isDefined)(n)?(0,_infestines.assocPartialU)(e,n,t):(0,_infestines.dissocPartialU)(e,t)},liftProp=function(e){return function(n,t,r){return(0,n.map)(function(n){return setProp(e,n,r)},t(getProp(e,r)))}},find=exports.find=function(e){return choose(function(n){if(!(0,_infestines.isArray)(n))return 0;var t=n.findIndex(e);return t<0?append:t})},isIndex=function(e){return Number.isInteger(e)&&0<=e},index=exports.index=function(e){return assert(e,isIndex,"`index` expects a non-negative integer.")},nulls=function(e){return Array(e).fill(null)},getIndex=function(e,n){return(0,_infestines.isArray)(n)?n[e]:void 0},liftIndex=function(e){return function(n,t,r){return(0,n.map)(function(n){return setIndex(e,n,r)},t(getIndex(e,r)))}},append=exports.append=lensU(snd,function(e,n){return(0,_infestines.isDefined)(e)?(0,_infestines.isArray)(n)?n.concat([e]):[e]:unArray(n)}),filter=exports.filter=function(e){return lensU(function(n){return unArray(n)&&n.filter(e)},function(n,t){return emptyArrayToUndefined(mkArray(n).concat(mkArray(t).filter(function(n){return!e(n)})))})},augment=exports.augment=function(e){return lensU(function(n){var t=(0,_infestines.dissocPartialU)(0,n);if(t)for(var r in e)t[r]=e[r](t);return t},function(n,t){if((0,_infestines.isObject)(n)){var r=function(){(0,_infestines.isObject)(t)||(t=void 0);var r=void 0,i=function(e,n){r||(r={}),r[e]=n};for(var o in n)o in e?t&&o in t&&i(o,t[o]):i(o,n[o]);return{v:r}}();if("object"==typeof r)return r.v}})},setPick=function(e,n){return function(t){(0,_infestines.isObject)(t)||(t=void 0);for(var r in e)n=setU(e[r],t&&t[r],n);return n}},pick=exports.pick=function(e){return function(n,t,r){return(0,n.map)(setPick(e,r),t(getPick(e,r)))}},identity=exports.identity=function(e,n,t){return n(t)},show=function(e,n){return function(t){return console.log.apply(console,e.concat([n,t]))||t}},log=exports.log=function(){for(var e=arguments.length,n=Array(e),t=0;t<e;t++)n[t]=arguments[t];return isoU(show(n,"get"),show(n,"set"))},when=exports.when=function(e){return function(n,t,r){return e(r)?t(r):zero(n,t,r)}},optional=exports.optional=when(_infestines.isDefined);
 
 },{"infestines":"infestines"}],"ramda":[function(require,module,exports){
 (function(){"use strict";var t={"@@functional/placeholder":!0},n=function(t,n){switch(t){case 0:return function(){return n.apply(this,arguments)};case 1:return function(t){return n.apply(this,arguments)};case 2:return function(t,r){return n.apply(this,arguments)};case 3:return function(t,r,e){return n.apply(this,arguments)};case 4:return function(t,r,e,u){return n.apply(this,arguments)};case 5:return function(t,r,e,u,i){return n.apply(this,arguments)};case 6:return function(t,r,e,u,i,o){return n.apply(this,arguments)};case 7:return function(t,r,e,u,i,o,c){return n.apply(this,arguments)};case 8:return function(t,r,e,u,i,o,c,f){return n.apply(this,arguments)};case 9:return function(t,r,e,u,i,o,c,f,s){return n.apply(this,arguments)};case 10:return function(t,r,e,u,i,o,c,f,s,a){return n.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}},r=function(t){for(var n,r=[];!(n=t.next()).done;)r.push(n.value);return r},e=function(){return Array.prototype.slice.call(arguments)},u=function(t){return new RegExp(t.source,(t.global?"g":"")+(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.sticky?"y":"")+(t.unicode?"u":""))},i=function(t){return function(){return!t.apply(this,arguments)}},o=function(t,n){t=t||[],n=n||[];var r,e=t.length,u=n.length,i=[];for(r=0;r<e;)i[i.length]=t[r],r+=1;for(r=0;r<u;)i[i.length]=n[r],r+=1;return i},c=function(t,n,r){for(var e=0,u=r.length;e<u;){if(t(n,r[e]))return!0;e+=1}return!1},f=function(t,n){for(var r=0,e=n.length,u=[];r<e;)t(n[r])&&(u[u.length]=n[r]),r+=1;return u},s=function(t){return{"@@transducer/value":t,"@@transducer/reduced":!0}},a=function(t){var n=String(t).match(/^function (\w*)/);return null==n?"":n[1]},l=function(t,n){return Object.prototype.hasOwnProperty.call(n,t)},p=function(t){return t},h=function(){var t=Object.prototype.toString;return"[object Arguments]"===t.call(arguments)?function(n){return"[object Arguments]"===t.call(n)}:function(t){return l("callee",t)}}(),d=Array.isArray||function(t){return null!=t&&t.length>=0&&"[object Array]"===Object.prototype.toString.call(t)},y=function(t){return"[object Function]"===Object.prototype.toString.call(t)},g=Number.isInteger||function(t){return t<<0===t},v=function(t){return"[object Number]"===Object.prototype.toString.call(t)},m=function(t){return"[object Object]"===Object.prototype.toString.call(t)},w=function(t){return null!=t&&"object"==typeof t&&t["@@functional/placeholder"]===!0},b=function(t){return"[object RegExp]"===Object.prototype.toString.call(t)},x=function(t){return"[object String]"===Object.prototype.toString.call(t)},j=function(t){return"function"==typeof t["@@transducer/step"]},O=function(t,n){for(var r=0,e=n.length,u=Array(e);r<e;)u[r]=t(n[r]),r+=1;return u},S=function(t){if(null==t)throw new TypeError("Cannot convert undefined or null to object");for(var n=Object(t),r=1,e=arguments.length;r<e;){var u=arguments[r];if(null!=u)for(var i in u)l(i,u)&&(n[i]=u[i]);r+=1}return n},A=function(t){return[t]},E=function(t,n){return function(){return n.call(this,t.apply(this,arguments))}},_=function(t,n){return function(){var r=this;return t.apply(r,arguments).then(function(t){return n.call(r,t)})}},k=function(t){var n=t.replace(/\\/g,"\\\\").replace(/[\b]/g,"\\b").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0");return'"'+n.replace(/"/g,'\\"')+'"'},N=function(t){return t&&t["@@transducer/reduced"]?t:{"@@transducer/value":t,"@@transducer/reduced":!0}},I=function t(n,r,e){switch(arguments.length){case 1:return t(n,0,n.length);case 2:return t(n,r,n.length);default:for(var u=[],i=0,o=Math.max(0,Math.min(n.length,e)-r);i<o;)u[i]=n[r+i],i+=1;return u}},q=function(){var t=function(t){return(t<10?"0":"")+t};return"function"==typeof Date.prototype.toISOString?function(t){return t.toISOString()}:function(n){return n.getUTCFullYear()+"-"+t(n.getUTCMonth()+1)+"-"+t(n.getUTCDate())+"T"+t(n.getUTCHours())+":"+t(n.getUTCMinutes())+":"+t(n.getUTCSeconds())+"."+(n.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z"}}(),W={init:function(){return this.xf["@@transducer/init"]()},result:function(t){return this.xf["@@transducer/result"](t)}},C=function(){function t(t){this.f=t}return t.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},t.prototype["@@transducer/result"]=function(t){return t},t.prototype["@@transducer/step"]=function(t,n){return this.f(t,n)},function(n){return new t(n)}}(),P=function(t,n){for(var r=0,e=n.length-(t-1),u=new Array(e>=0?e:0);r<e;)u[r]=I(n,r,r+t),r+=1;return u},T="function"==typeof Object.assign?Object.assign:S,B=function(t,n){return function(){var r=arguments.length;if(0===r)return n();var e=arguments[r-1];return d(e)||"function"!=typeof e[t]?n.apply(this,arguments):e[t].apply(e,I(arguments,0,r-1))}},F=function(t){return function n(r){return 0===arguments.length||w(r)?n:t.apply(this,arguments)}},R=function(t){return function n(r,e){switch(arguments.length){case 0:return n;case 1:return w(r)?n:F(function(n){return t(r,n)});default:return w(r)&&w(e)?n:w(r)?F(function(n){return t(n,e)}):w(e)?F(function(n){return t(r,n)}):t(r,e)}}},M=function(t){return function n(r,e,u){switch(arguments.length){case 0:return n;case 1:return w(r)?n:R(function(n,e){return t(r,n,e)});case 2:return w(r)&&w(e)?n:w(r)?R(function(n,r){return t(n,e,r)}):w(e)?R(function(n,e){return t(r,n,e)}):F(function(n){return t(r,e,n)});default:return w(r)&&w(e)&&w(u)?n:w(r)&&w(e)?R(function(n,r){return t(n,r,u)}):w(r)&&w(u)?R(function(n,r){return t(n,e,r)}):w(e)&&w(u)?R(function(n,e){return t(r,n,e)}):w(r)?F(function(n){return t(n,e,u)}):w(e)?F(function(n){return t(r,n,u)}):w(u)?F(function(n){return t(r,e,n)}):t(r,e,u)}}},U=function t(r,e,u){return function(){for(var i=[],o=0,c=r,f=0;f<e.length||o<arguments.length;){var s;f<e.length&&(!w(e[f])||o>=arguments.length)?s=e[f]:(s=arguments[o],o+=1),i[f]=s,w(s)||(c-=1),f+=1}return c<=0?u.apply(this,i):n(c,t(r,i,u))}},L=function(t,n,r){return function(){var e=arguments.length;if(0===e)return r();var u=arguments[e-1];if(!d(u)){var i=I(arguments,0,e-1);if("function"==typeof u[t])return u[t].apply(u,i);if(j(u)){var o=n.apply(null,i);return o(u)}}return r.apply(this,arguments)}},D=function(t,n){for(var r=n.length-1;r>=0&&t(n[r]);)r-=1;return I(n,0,r+1)},z=function(){function t(t,n){this.xf=n,this.f=t,this.all=!0}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){return this.all&&(t=this.xf["@@transducer/step"](t,!0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,n){return this.f(n)||(this.all=!1,t=N(this.xf["@@transducer/step"](t,!1))),t},R(function(n,r){return new t(n,r)})}(),V=function(){function t(t,n){this.xf=n,this.f=t,this.any=!1}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){return this.any||(t=this.xf["@@transducer/step"](t,!1)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,n){return this.f(n)&&(this.any=!0,t=N(this.xf["@@transducer/step"](t,!0))),t},R(function(n,r){return new t(n,r)})}(),K=function(){function t(t,n){this.xf=n,this.pos=0,this.full=!1,this.acc=new Array(t)}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){return this.acc=null,this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,n){return this.store(n),this.full?this.xf["@@transducer/step"](t,this.getCopy()):t},t.prototype.store=function(t){this.acc[this.pos]=t,this.pos+=1,this.pos===this.acc.length&&(this.pos=0,this.full=!0)},t.prototype.getCopy=function(){return o(I(this.acc,this.pos),I(this.acc,0,this.pos))},R(function(n,r){return new t(n,r)})}(),$=function(){function t(t,n){this.xf=n,this.n=t}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=W.result,t.prototype["@@transducer/step"]=function(t,n){return this.n>0?(this.n-=1,t):this.xf["@@transducer/step"](t,n)},R(function(n,r){return new t(n,r)})}(),H=function(){function t(t,n){this.xf=n,this.pos=0,this.full=!1,this.acc=new Array(t)}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){return this.acc=null,this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,n){return this.full&&(t=this.xf["@@transducer/step"](t,this.acc[this.pos])),this.store(n),t},t.prototype.store=function(t){this.acc[this.pos]=t,this.pos+=1,this.pos===this.acc.length&&(this.pos=0,this.full=!0)},R(function(n,r){return new t(n,r)})}(),X=function(){function t(t,n){this.xf=n,this.pred=t,this.lastValue=void 0,this.seenFirstValue=!1}return t.prototype["@@transducer/init"]=function(){return this.xf["@@transducer/init"]()},t.prototype["@@transducer/result"]=function(t){return this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,n){var r=!1;return this.seenFirstValue?this.pred(this.lastValue,n)&&(r=!0):this.seenFirstValue=!0,this.lastValue=n,r?t:this.xf["@@transducer/step"](t,n)},R(function(n,r){return new t(n,r)})}(),Y=function(){function t(t,n){this.xf=n,this.f=t}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=W.result,t.prototype["@@transducer/step"]=function(t,n){if(this.f){if(this.f(n))return t;this.f=null}return this.xf["@@transducer/step"](t,n)},R(function(n,r){return new t(n,r)})}(),Z=function(){function t(t,n){this.xf=n,this.f=t}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=W.result,t.prototype["@@transducer/step"]=function(t,n){return this.f(n)?this.xf["@@transducer/step"](t,n):t},R(function(n,r){return new t(n,r)})}(),G=function(){function t(t,n){this.xf=n,this.f=t,this.found=!1}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,void 0)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,n){return this.f(n)&&(this.found=!0,t=N(this.xf["@@transducer/step"](t,n))),t},R(function(n,r){return new t(n,r)})}(),J=function(){function t(t,n){this.xf=n,this.f=t,this.idx=-1,this.found=!1}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){return this.found||(t=this.xf["@@transducer/step"](t,-1)),this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,n){return this.idx+=1,this.f(n)&&(this.found=!0,t=N(this.xf["@@transducer/step"](t,this.idx))),t},R(function(n,r){return new t(n,r)})}(),Q=function(){function t(t,n){this.xf=n,this.f=t}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){return this.xf["@@transducer/result"](this.xf["@@transducer/step"](t,this.last))},t.prototype["@@transducer/step"]=function(t,n){return this.f(n)&&(this.last=n),t},R(function(n,r){return new t(n,r)})}(),tt=function(){function t(t,n){this.xf=n,this.f=t,this.idx=-1,this.lastIdx=-1}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){return this.xf["@@transducer/result"](this.xf["@@transducer/step"](t,this.lastIdx))},t.prototype["@@transducer/step"]=function(t,n){return this.idx+=1,this.f(n)&&(this.lastIdx=this.idx),t},R(function(n,r){return new t(n,r)})}(),nt=function(){function t(t,n){this.xf=n,this.f=t}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=W.result,t.prototype["@@transducer/step"]=function(t,n){return this.xf["@@transducer/step"](t,this.f(n))},R(function(n,r){return new t(n,r)})}(),rt=function(){function t(t,n,r,e){this.valueFn=t,this.valueAcc=n,this.keyFn=r,this.xf=e,this.inputs={}}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){var n;for(n in this.inputs)if(l(n,this.inputs)&&(t=this.xf["@@transducer/step"](t,this.inputs[n]),t["@@transducer/reduced"])){t=t["@@transducer/value"];break}return this.inputs=null,this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,n){var r=this.keyFn(n);return this.inputs[r]=this.inputs[r]||[r,this.valueAcc],this.inputs[r][1]=this.valueFn(this.inputs[r][1],n),t},U(4,[],function(n,r,e,u){return new t(n,r,e,u)})}(),et=function(){function t(t,n){this.xf=n,this.n=t,this.i=0}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=W.result,t.prototype["@@transducer/step"]=function(t,n){this.i+=1;var r=0===this.n?t:this.xf["@@transducer/step"](t,n);return this.i>=this.n?N(r):r},R(function(n,r){return new t(n,r)})}(),ut=function(){function t(t,n){this.xf=n,this.f=t}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=W.result,t.prototype["@@transducer/step"]=function(t,n){return this.f(n)?this.xf["@@transducer/step"](t,n):N(t)},R(function(n,r){return new t(n,r)})}(),it=R(function(t,n){return Number(t)+Number(n)}),ot=M(function(t,n,r){if(n>=r.length||n<-r.length)return r;var e=n<0?r.length:0,u=e+n,i=o(r);return i[u]=t(r[u]),i}),ct=R(L("all",z,function(t,n){for(var r=0;r<n.length;){if(!t(n[r]))return!1;r+=1}return!0})),ft=F(function(t){return function(){return t}}),st=R(function(t,n){return t&&n}),at=R(L("any",V,function(t,n){for(var r=0;r<n.length;){if(t(n[r]))return!0;r+=1}return!1})),lt=R(L("aperture",K,P)),pt=R(function(t,n){return o(n,[t])}),ht=R(function(t,n){return t.apply(this,n)}),dt=M(function(t,n,r){var e={};for(var u in r)e[u]=r[u];return e[t]=n,e}),yt=M(function t(n,r,e){switch(n.length){case 0:return r;case 1:return dt(n[0],r,e);default:return dt(n[0],t(I(n,1),r,Object(e[n[0]])),e)}}),gt=R(function(t,r){return n(t.length,function(){return t.apply(r,arguments)})}),vt=M(function(t,n,r){if(t>n)throw new Error("min must not be greater than max in clamp(min, max, value)");return r<t?t:r>n?n:r}),mt=F(function(t){return function(n,r){return t(n,r)?-1:t(r,n)?1:0}}),wt=R(function(t,r){return 1===t?F(r):n(t,U(t,[],r))}),bt=it(-1),xt=R(function(t,n){return null==n||n!==n?t:n}),jt=M(function(t,n,r){for(var e=[],u=0,i=n.length;u<i;)c(t,n[u],r)||c(t,n[u],e)||e.push(n[u]),u+=1;return e}),Ot=R(function(t,n){var r={};for(var e in n)e!==t&&(r[e]=n[e]);return r}),St=R(function t(n,r){switch(n.length){case 0:return r;case 1:return Ot(n[0],r);default:var e=n[0],u=I(n,1);return null==r[e]?r:dt(e,t(u,r[e]),r)}}),At=R(function(t,n){return t/n}),Et=R(L("dropWhile",Y,function(t,n){for(var r=0,e=n.length;r<e&&t(n[r]);)r+=1;return I(n,r)})),_t=F(function(t){return null!=t&&"function"==typeof t.empty?t.empty():null!=t&&null!=t.constructor&&"function"==typeof t.constructor.empty?t.constructor.empty():d(t)?[]:x(t)?"":m(t)?{}:h(t)?function(){return arguments}():void 0}),kt=R(function t(n,r){var e,u,i,o={};for(u in r)e=n[u],i=typeof e,o[u]="function"===i?e(r[u]):"object"===i?t(n[u],r[u]):r[u];return o}),Nt=R(L("find",G,function(t,n){for(var r=0,e=n.length;r<e;){if(t(n[r]))return n[r];r+=1}})),It=R(L("findIndex",J,function(t,n){for(var r=0,e=n.length;r<e;){if(t(n[r]))return r;r+=1}return-1})),qt=R(L("findLast",Q,function(t,n){for(var r=n.length-1;r>=0;){if(t(n[r]))return n[r];r-=1}})),Wt=R(L("findLastIndex",tt,function(t,n){for(var r=n.length-1;r>=0;){if(t(n[r]))return r;r-=1}return-1})),Ct=R(B("forEach",function(t,n){for(var r=n.length,e=0;e<r;)t(n[e]),e+=1;return n})),Pt=F(function(t){for(var n={},r=0;r<t.length;)n[t[r][0]]=t[r][1],r+=1;return n}),Tt=R(function(t,n){for(var r=[],e=0,u=n.length;e<u;){for(var i=e+1;i<u&&t(n[e],n[i]);)i+=1;r.push(n.slice(e,i)),e=i}return r}),Bt=R(function(t,n){return t>n}),Ft=R(function(t,n){return t>=n}),Rt=R(l),Mt=R(function(t,n){return t in n}),Ut=R(function(t,n){return t===n?0!==t||1/t===1/n:t!==t&&n!==n}),Lt=F(p),Dt=M(function(t,n,r){return wt(Math.max(t.length,n.length,r.length),function(){return t.apply(this,arguments)?n.apply(this,arguments):r.apply(this,arguments)})}),zt=it(1),Vt=M(function(t,n,r){t=t<r.length&&t>=0?t:r.length;var e=I(r);return e.splice(t,0,n),e}),Kt=M(function(t,n,r){return t=t<r.length&&t>=0?t:r.length,o(o(I(r,0,t),n),I(r,t))}),$t=R(B("intersperse",function(t,n){for(var r=[],e=0,u=n.length;e<u;)e===u-1?r.push(n[e]):r.push(n[e],t),e+=1;return r})),Ht=R(function(t,n){return null!=n&&n.constructor===t||n instanceof t}),Xt=F(function(t){return!!d(t)||!!t&&("object"==typeof t&&(!x(t)&&(1===t.nodeType?!!t.length:0===t.length||t.length>0&&(t.hasOwnProperty(0)&&t.hasOwnProperty(t.length-1)))))}),Yt=F(function(t){return null==t}),Zt=function(){var t=!{toString:null}.propertyIsEnumerable("toString"),n=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],r=function(){return arguments.propertyIsEnumerable("length")}(),e=function(t,n){for(var r=0;r<t.length;){if(t[r]===n)return!0;r+=1}return!1};return F("function"!=typeof Object.keys||r?function(u){if(Object(u)!==u)return[];var i,o,c=[],f=r&&h(u);for(i in u)!l(i,u)||f&&"length"===i||(c[c.length]=i);if(t)for(o=n.length-1;o>=0;)i=n[o],l(i,u)&&!e(c,i)&&(c[c.length]=i),o-=1;return c}:function(t){return Object(t)!==t?[]:Object.keys(t)})}(),Gt=F(function(t){var n,r=[];for(n in t)r[r.length]=n;return r}),Jt=F(function(t){return null!=t&&v(t.length)?t.length:NaN}),Qt=R(function(t,n){return t<n}),tn=R(function(t,n){return t<=n}),nn=M(function(t,n,r){for(var e=0,u=r.length,i=[],o=[n];e<u;)o=t(o[0],r[e]),i[e]=o[1],e+=1;return[o[0],i]}),rn=M(function(t,n,r){for(var e=r.length-1,u=[],i=[n];e>=0;)i=t(i[0],r[e]),u[e]=i[1],e-=1;return[i[0],u]}),en=R(function(t,n){return n.match(t)||[]}),un=R(function(t,n){return g(t)?!g(n)||n<1?NaN:(t%n+n)%n:NaN}),on=R(function(t,n){return n>t?n:t}),cn=M(function(t,n,r){return t(r)>t(n)?r:n}),fn=R(function(t,n){return T({},t,n)}),sn=F(function(t){return T.apply(null,[{}].concat(t))}),an=M(function(t,n,r){var e,u={};for(e in n)l(e,n)&&(u[e]=l(e,r)?t(e,n[e],r[e]):n[e]);for(e in r)l(e,r)&&!l(e,u)&&(u[e]=r[e]);return u}),ln=R(function(t,n){return n<t?n:t}),pn=M(function(t,n,r){return t(r)<t(n)?r:n}),hn=R(function(t,n){return t%n}),dn=R(function(t,n){return t*n}),yn=R(function(t,n){switch(t){case 0:return function(){return n.call(this)};case 1:return function(t){return n.call(this,t)};case 2:return function(t,r){return n.call(this,t,r)};case 3:return function(t,r,e){return n.call(this,t,r,e)};case 4:return function(t,r,e,u){return n.call(this,t,r,e,u)};case 5:return function(t,r,e,u,i){return n.call(this,t,r,e,u,i)};case 6:return function(t,r,e,u,i,o){return n.call(this,t,r,e,u,i,o)};case 7:return function(t,r,e,u,i,o,c){return n.call(this,t,r,e,u,i,o,c)};case 8:return function(t,r,e,u,i,o,c,f){return n.call(this,t,r,e,u,i,o,c,f)};case 9:return function(t,r,e,u,i,o,c,f,s){return n.call(this,t,r,e,u,i,o,c,f,s)};case 10:return function(t,r,e,u,i,o,c,f,s,a){return n.call(this,t,r,e,u,i,o,c,f,s,a)};default:throw new Error("First argument to nAry must be a non-negative integer no greater than ten")}}),gn=F(function(t){return-t}),vn=R(i(L("any",V,at))),mn=F(function(t){return!t}),wn=R(function(t,n){var r=t<0?n.length+t:t;return x(n)?n.charAt(r):n[r]}),bn=F(function(t){var n=t<0?1:t+1;return wt(n,function(){return wn(t,arguments)})}),xn=R(function(t,n){var r={};return r[t]=n,r}),jn=F(A),On=F(function(t){var r,e=!1;return n(t.length,function(){return e?r:(e=!0,r=t.apply(this,arguments))})}),Sn=R(function(t,n){return t||n}),An=function(){var t=function(n){return{value:n,map:function(r){return t(r(n))}}};return M(function(n,r,e){return n(function(n){return t(r(n))})(e).value})}(),En=R(function(t,n){return[t,n]}),_n=R(function(t,n){for(var r=n,e=0;e<t.length;){if(null==r)return;r=r[t[e]],e+=1}return r}),kn=M(function(t,n,r){return xt(t,_n(n,r))}),Nn=M(function(t,n,r){return n.length>0&&t(_n(n,r))}),In=R(function(t,n){for(var r={},e=0;e<t.length;)t[e]in n&&(r[t[e]]=n[t[e]]),e+=1;return r}),qn=R(function(t,n){for(var r={},e=0,u=t.length;e<u;){var i=t[e];r[i]=n[i],e+=1}return r}),Wn=R(function(t,n){var r={};for(var e in n)t(n[e],e,n)&&(r[e]=n[e]);return r}),Cn=R(function(t,n){return o([t],n)}),Pn=R(function(t,n){return n[t]}),Tn=M(function(t,n,r){return Ht(t,r[n])}),Bn=M(function(t,n,r){return null!=r&&l(n,r)?r[n]:t}),Fn=M(function(t,n,r){return t(r[n])}),Rn=R(function(t,n){for(var r=t.length,e=[],u=0;u<r;)e[u]=n[t[u]],u+=1;return e}),Mn=R(function(t,n){if(!v(t)||!v(n))throw new TypeError("Both arguments to range must be numbers");for(var r=[],e=t;e<n;)r.push(e),e+=1;return r}),Un=M(function(t,n,r){for(var e=r.length-1;e>=0;)n=t(n,r[e]),e-=1;return n}),Ln=F(N),Dn=M(function(t,n,r){return o(I(r,0,Math.min(t,r.length)),I(r,Math.min(r.length,t+n)))}),zn=M(function(t,n,r){return r.replace(t,n)}),Vn=F(function(t){return x(t)?t.split("").reverse().join(""):I(t).reverse()}),Kn=M(function(t,n,r){for(var e=0,u=r.length,i=[n];e<u;)n=t(n,r[e]),i[e+1]=n,e+=1;return i}),$n=M(function(t,n,r){return An(t,ft(n),r)}),Hn=M(B("slice",function(t,n,r){return Array.prototype.slice.call(r,t,n)})),Xn=R(function(t,n){return I(n).sort(t)}),Yn=R(function(t,n){return I(n).sort(function(n,r){var e=t(n),u=t(r);return e<u?-1:e>u?1:0})}),Zn=R(function(t,n){return[Hn(0,t,n),Hn(t,Jt(n),n)]}),Gn=R(function(t,n){if(t<=0)throw new Error("First argument to splitEvery must be a positive integer");for(var r=[],e=0;e<n.length;)r.push(Hn(e,e+=t,n));return r}),Jn=R(function(t,n){for(var r=0,e=n.length,u=[];r<e&&!t(n[r]);)u.push(n[r]),r+=1;return[u,I(n,r)]}),Qn=R(function(t,n){return Number(t)-Number(n)}),tr=B("tail",Hn(1,1/0)),nr=R(L("take",et,function(t,n){return Hn(0,t<0?1/0:t,n)})),rr=R(function(t,n){for(var r=n.length-1;r>=0&&t(n[r]);)r-=1;return I(n,r+1,1/0)}),er=R(L("takeWhile",ut,function(t,n){for(var r=0,e=n.length;r<e&&t(n[r]);)r+=1;return I(n,0,r)})),ur=R(function(t,n){return t(n),n}),ir=R(function(t,n){var r,e=Number(n),u=0;if(e<0||isNaN(e))throw new RangeError("n must be a non-negative number");for(r=new Array(e);u<e;)r[u]=t(u),u+=1;return r}),or=F(function(t){var n=[];for(var r in t)l(r,t)&&(n[n.length]=[r,t[r]]);return n}),cr=F(function(t){var n=[];for(var r in t)n[n.length]=[r,t[r]];return n}),fr=F(function(t){for(var n=0,r=[];n<t.length;){for(var e=t[n],u=0;u<e.length;)"undefined"==typeof r[u]&&(r[u]=[]),r[u].push(e[u]),u+=1;n+=1}return r}),sr=function(){var t="\t\n\v\f\r   ᠎             　\u2028\u2029\ufeff",n="​",r="function"==typeof String.prototype.trim;return F(r&&!t.trim()&&n.trim()?function(t){return t.trim()}:function(n){var r=new RegExp("^["+t+"]["+t+"]*"),e=new RegExp("["+t+"]["+t+"]*$");return n.replace(r,"").replace(e,"")})}(),ar=R(function(t,r){return n(t.length,function(){try{return t.apply(this,arguments)}catch(t){return r.apply(this,o([t],arguments))}})}),lr=F(function(t){return null===t?"Null":void 0===t?"Undefined":Object.prototype.toString.call(t).slice(8,-1)}),pr=F(function(t){return function(){return t(I(arguments))}}),hr=F(function(t){return yn(1,t)}),dr=R(function(t,n){return wt(t,function(){for(var r,e=1,u=n,i=0;e<=t&&"function"==typeof u;)r=e===t?arguments.length:i+u.length,u=u.apply(this,I(arguments,i,r)),e+=1,i=r;return u})}),yr=R(function(t,n){for(var r=t(n),e=[];r&&r.length;)e[e.length]=r[0],r=t(r[1]);return e}),gr=R(function(t,n){for(var r,e=0,u=n.length,i=[];e<u;)r=n[e],c(t,r,i)||(i[i.length]=r),e+=1;return i}),vr=M(function(t,n,r){return t(r)?r:n(r)}),mr=M(function(t,n,r){for(var e=r;!t(e);)e=n(e);return e}),wr=M(function(t,n,r){return ot(ft(n),t,r)}),br=R(function(t,n){return wt(n.length,function(){for(var r=[],e=0;e<n.length;)r.push(n[e].call(this,arguments[e])),e+=1;return t.apply(this,r.concat(I(arguments,n.length)))})}),xr=F(function(t){for(var n=Zt(t),r=n.length,e=[],u=0;u<r;)e[u]=t[n[u]],u+=1;return e}),jr=F(function(t){var n,r=[];for(n in t)r[r.length]=t[n];return r}),Or=function(){var t=function(t){return{value:t,map:function(){return this}}};return R(function(n,r){return n(t)(r).value})}(),Sr=M(function(t,n,r){return t(r)?n(r):r}),Ar=R(function(t,n){for(var r in t)if(l(r,t)&&!t[r](n[r]))return!1;return!0}),Er=R(function(t,n){return wt(t.length,function(){return n.apply(this,o([t],arguments))})}),_r=R(function(t,n){for(var r,e=0,u=t.length,i=n.length,o=[];e<u;){for(r=0;r<i;)o[o.length]=[t[e],n[r]],r+=1;e+=1}return o}),kr=R(function(t,n){for(var r=[],e=0,u=Math.min(t.length,n.length);e<u;)r[e]=[t[e],n[e]],e+=1;return r}),Nr=R(function(t,n){for(var r=0,e=Math.min(t.length,n.length),u={};r<e;)u[t[r]]=n[r],r+=1;return u}),Ir=M(function(t,n,r){for(var e=[],u=0,i=Math.min(n.length,r.length);u<i;)e[u]=t(n[u],r[u]),u+=1;return e}),qr=ft(!1),Wr=ft(!0),Cr=function t(n,r,e,i){var o=function(u){for(var o=r.length,c=0;c<o;){if(n===r[c])return e[c];c+=1}r[c+1]=n,e[c+1]=u;for(var f in n)u[f]=i?t(n[f],r,e,!0):n[f];return u};switch(lr(n)){case"Object":return o({});case"Array":return o([]);case"Date":return new Date(n.valueOf());case"RegExp":return u(n);default:return n}},Pr=function(t){return R(function(r,e){return n(Math.max(0,r.length-e.length),function(){return r.apply(this,t(e,arguments))})})},Tr=function(t,n){return nr(t<n.length?n.length-t:0,n)},Br=function t(n,e,u,i){if(Ut(n,e))return!0;if(lr(n)!==lr(e))return!1;if(null==n||null==e)return!1;if("function"==typeof n.equals||"function"==typeof e.equals)return"function"==typeof n.equals&&n.equals(e)&&"function"==typeof e.equals&&e.equals(n);switch(lr(n)){case"Arguments":case"Array":case"Object":if("function"==typeof n.constructor&&"Promise"===a(n.constructor))return n===e;break;case"Boolean":case"Number":case"String":if(typeof n!=typeof e||!Ut(n.valueOf(),e.valueOf()))return!1;break;case"Date":if(!Ut(n.valueOf(),e.valueOf()))return!1;break;case"Error":return n.name===e.name&&n.message===e.message;case"RegExp":if(n.source!==e.source||n.global!==e.global||n.ignoreCase!==e.ignoreCase||n.multiline!==e.multiline||n.sticky!==e.sticky||n.unicode!==e.unicode)return!1;break;case"Map":case"Set":if(!t(r(n.entries()),r(e.entries()),u,i))return!1;break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":break;case"ArrayBuffer":break;default:return!1}var o=Zt(n);if(o.length!==Zt(e).length)return!1;for(var c=u.length-1;c>=0;){if(u[c]===n)return i[c]===e;c-=1}for(u.push(n),i.push(e),c=o.length-1;c>=0;){var f=o[c];if(!l(f,e)||!t(e[f],n[f],u,i))return!1;c-=1}return u.pop(),i.pop(),!0},Fr=function(t){return function n(r){for(var e,u,i,o=[],c=0,f=r.length;c<f;){if(Xt(r[c]))for(e=t?n(r[c]):r[c],i=0,u=e.length;i<u;)o[o.length]=e[i],i+=1;else o[o.length]=r[c];c+=1}return o}},Rr=function(){function t(t,n,r){for(var e=0,u=r.length;e<u;){if(n=t["@@transducer/step"](n,r[e]),n&&n["@@transducer/reduced"]){n=n["@@transducer/value"];break}e+=1}return t["@@transducer/result"](n)}function n(t,n,r){for(var e=r.next();!e.done;){if(n=t["@@transducer/step"](n,e.value),n&&n["@@transducer/reduced"]){n=n["@@transducer/value"];break}e=r.next()}return t["@@transducer/result"](n)}function r(t,n,r){return t["@@transducer/result"](r.reduce(gt(t["@@transducer/step"],t),n))}var e="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";return function(u,i,o){if("function"==typeof u&&(u=C(u)),Xt(o))return t(u,i,o);if("function"==typeof o.reduce)return r(u,i,o);if(null!=o[e])return n(u,i,o[e]());if("function"==typeof o.next)return n(u,i,o);throw new TypeError("reduce: list must be array or iterable")}}(),Mr=function(){var t={"@@transducer/init":Array,"@@transducer/step":function(t,n){return t.push(n),t},"@@transducer/result":p},n={"@@transducer/init":String,"@@transducer/step":function(t,n){return t+n},"@@transducer/result":p},r={"@@transducer/init":Object,"@@transducer/step":function(t,n){return T(t,Xt(n)?xn(n[0],n[1]):n)},"@@transducer/result":p};return function(e){if(j(e))return e;if(Xt(e))return t;if("string"==typeof e)return n;if("object"==typeof e)return r;throw new Error("Cannot create transformer for "+e)}}(),Ur=function(){function t(t,n){this.f=t,this.retained=[],this.xf=n}return t.prototype["@@transducer/init"]=W.init,t.prototype["@@transducer/result"]=function(t){return this.retained=null,this.xf["@@transducer/result"](t)},t.prototype["@@transducer/step"]=function(t,n){return this.f(n)?this.retain(t,n):this.flush(t,n)},t.prototype.flush=function(t,n){return t=Rr(this.xf["@@transducer/step"],t,this.retained),this.retained=[],this.xf["@@transducer/step"](t,n)},t.prototype.retain=function(t,n){return this.retained.push(n),t},R(function(n,r){return new t(n,r)})}(),Lr=F(function(t){return wt(t.length,function(){var n=0,r=arguments[0],e=arguments[arguments.length-1],u=I(arguments);return u[0]=function(){var t=r.apply(this,o(arguments,[n,e]));return n+=1,t},t.apply(this,u)})}),Dr=F(function(t){return yn(2,t)}),zr=F(function(t){return null!=t&&"function"==typeof t.clone?t.clone():Cr(t,[],[],!0)}),Vr=F(function(t){return wt(t.length,t)}),Kr=R(L("drop",$,function(t,n){return Hn(Math.max(0,t),1/0,n)})),$r=R(L("dropLast",H,Tr)),Hr=R(L("dropLastWhile",Ur,D)),Xr=R(function(t,n){return Br(t,n,[],[])}),Yr=R(L("filter",Z,function(t,n){return m(n)?Rr(function(r,e){return t(n[e])&&(r[e]=n[e]),r},{},Zt(n)):f(t,n)})),Zr=F(Fr(!0)),Gr=F(function(t){return Vr(function(n,r){var e=I(arguments);return e[0]=r,e[1]=n,t.apply(this,e)})}),Jr=wn(0),Qr=Hn(0,-1),te=M(function(t,n,r){var e,u;n.length>r.length?(e=n,u=r):(e=r,u=n);for(var i=[],o=0;o<u.length;)c(t,u[o],e)&&(i[i.length]=u[o]),o+=1;return gr(t,i)}),ne=M(function(t,n,r){return j(t)?Rr(n(t),t["@@transducer/init"](),r):Rr(n(Mr(t)),Cr(t,[],[],!1),r)}),re=F(function(t){for(var n=Zt(t),r=n.length,e=0,u={};e<r;){var i=n[e],o=t[i],c=l(o,u)?u[o]:u[o]=[];c[c.length]=i,e+=1}return u}),ee=F(function(t){for(var n=Zt(t),r=n.length,e=0,u={};e<r;){var i=n[e];u[t[i]]=i,e+=1}return u}),ue=F(function(t){return null!=t&&Xr(t,_t(t))}),ie=wn(-1),oe=R(function(t,n){if("function"!=typeof n.lastIndexOf||d(n)){for(var r=n.length-1;r>=0;){if(Xr(n[r],t))return r;r-=1}return-1}return n.lastIndexOf(t)}),ce=R(L("map",nt,function(t,n){switch(Object.prototype.toString.call(n)){case"[object Function]":return wt(n.length,function(){return t.call(this,n.apply(this,arguments))});case"[object Object]":return Rr(function(r,e){return r[e]=t(n[e]),r},{},Zt(n));default:return O(t,n)}})),fe=R(function(t,n){return Rr(function(r,e){return r[e]=t(n[e],e,n),r},{},Zt(n))}),se=M(function(t,n,r){return an(function(n,r,e){return t(r,e)},n,r)}),ae=Pr(o),le=Pr(Gr(o)),pe=M(function(t,n,r){return Xr(_n(t,r),n)}),he=R(function(t,n){return ce(Pn(t),n)}),de=br(O,[qn,Lt]),ye=M(function(t,n,r){return Xr(n,r[t])}),ge=M(Rr),ve=U(4,[],L("reduceBy",rt,function(t,n,r,e){return Rr(function(e,u){var i=r(u);return e[i]=t(l(i,e)?e[i]:n,u),e},{},e)})),me=U(4,[],function(t,n,r,e){return Rr(function(r,e){return t(r,e)?n(r,e):N(r)},r,e)}),we=R(function(t,n){return Yr(i(t),n)}),be=R(function(t,n){return ir(ft(t),n)}),xe=ge(it,0),je=R(function(t,n){return Kr(t>=0?n.length-t:0,n)}),Oe=wt(4,function(t,n,r,e){return Rr(t("function"==typeof n?C(n):n),r,e)}),Se=M(function(t,n,r){return gr(t,o(n,r))}),Ae=R(function(t,n){return Ar(ce(Xr,t),n)}),Ee=function(){var t=function(t){return{"@@transducer/init":W.init,"@@transducer/result":function(n){return t["@@transducer/result"](n)},"@@transducer/step":function(n,r){var e=t["@@transducer/step"](n,r);return e["@@transducer/reduced"]?s(e):e}}};return function(n){var r=t(n);return{"@@transducer/init":W.init,"@@transducer/result":function(t){return r["@@transducer/result"](t)},"@@transducer/step":function(t,n){return Xt(n)?Rr(r,t,n):Rr(r,t,[n])}}}}(),_e=function(t,n,r){var e,u;if("function"==typeof t.indexOf)switch(typeof n){case"number":if(0===n){for(e=1/n;r<t.length;){if(u=t[r],0===u&&1/u===e)return r;r+=1}return-1}if(n!==n){for(;r<t.length;){if(u=t[r],"number"==typeof u&&u!==u)return r;r+=1}return-1}return t.indexOf(n,r);case"string":case"boolean":case"function":case"undefined":return t.indexOf(n,r);case"object":if(null===n)return t.indexOf(n,r)}for(;r<t.length;){if(Xr(t[r],n))return r;r+=1}return-1},ke=R(function(t,n){return ce(t,Ee(n))}),Ne=F(function(t){return wt(ge(on,0,he("length",t)),function(){for(var n=0,r=t.length;n<r;){if(!t[n].apply(this,arguments))return!1;n+=1}return!0})}),Ie=F(function(t){return wt(ge(on,0,he("length",t)),function(){
diff --git a/docs/index.html b/docs/index.html
index f4276ca..e17c26b 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -43,10 +43,24 @@ parts.  <a href="http://calmm-js.github.io/partial.lenses/">Try Lenses!</a></p>
 <li><a href="#L-set" title="L.set: POptic s a -&gt; Maybe a -&gt; Maybe s -&gt; Maybe s"><code>L.set(optic, maybeValue, maybeData)</code></a></li>
 </ul>
 </li>
-<li><a href="#combinators">Combinators</a><ul>
+<li><a href="#nesting">Nesting</a><ul>
 <li><a href="#L-compose" title="L.compose: (POptic s s1, ...POptic sN a) -&gt; POptic s a"><code>L.compose(...optics)</code></a></li>
+</ul>
+</li>
+<li><a href="#querying">Querying</a><ul>
+<li><a href="#L-chain" title="L.chain: (a -&gt; POptic s b) -&gt; POptic s a -&gt; POptic s b"><code>L.chain(value =&gt; optic, optic)</code></a></li>
+<li><a href="#L-choice" title="L.choice: (...PLens s a) -&gt; POptic s a"><code>L.choice(...lenses)</code></a></li>
 <li><a href="#L-choose" title="L.choose: (Maybe s -&gt; POptic s a) -&gt; POptic s a"><code>L.choose(maybeValue =&gt; optic)</code></a></li>
+<li><a href="#L-optional" title="L.optional: POptic a a"><code>L.optional</code></a></li>
+<li><a href="#L-when" title="L.when: (Maybe a -&gt; Boolean) -&gt; POptic a a"><code>L.when(maybeValue =&gt; testable)</code></a></li>
+<li><a href="#L-zero" title="L.zero: POptic s a"><code>L.zero</code></a></li>
+</ul>
+</li>
+<li><a href="#recursing">Recursing</a><ul>
 <li><a href="#L-lazy" title="L.lazy: POptic s a -&gt; POptic s a"><code>L.lazy(optic =&gt; optic)</code></a></li>
+</ul>
+</li>
+<li><a href="#debugging">Debugging</a><ul>
 <li><a href="#L-log" title="L.log: (...Any) -&gt; POptic s s"><code>L.log(...labels)</code></a></li>
 </ul>
 </li>
@@ -63,10 +77,7 @@ parts.  <a href="http://calmm-js.github.io/partial.lenses/">Try Lenses!</a></p>
 </ul>
 </li>
 <li><a href="#traversals-and-combinators">Traversals and combinators</a><ul>
-<li><a href="#L-optional" title="L.optional: PTraversal a a"><code>L.optional</code></a></li>
-<li><a href="#L-sequence" title="L.sequence: PTraversal [a] a"><code>L.sequence</code></a></li>
-<li><a href="#L-skip" title="L.skip: PTraversal a b"><code>L.skip</code></a></li>
-<li><a href="#L-when" title="L.when: (Maybe a -&gt; Boolean) -&gt; PTraversal a a"><code>L.when(maybeValue =&gt; testable)</code></a></li>
+<li><a href="#L-sequence" title="L.sequence: PTraversal ([a] | {p: a, ...ps}) a"><code>L.sequence</code></a></li>
 </ul>
 </li>
 </ul>
@@ -109,12 +120,12 @@ parts.  <a href="http://calmm-js.github.io/partial.lenses/">Try Lenses!</a></p>
 <li><a href="#L-valueOr" title="L.valueOr: s -&gt; PLens s s"><code>L.valueOr(valueOut)</code></a></li>
 </ul>
 </li>
-<li><a href="#querying-and-adapting-to-data">Querying and adapting to data</a><ul>
-<li><a href="#L-chain" title="L.chain: (a -&gt; PLens s b) -&gt; PLens s a -&gt; PLens s b"><code>L.chain(value =&gt; lens, lens)</code></a></li>
-<li><a href="#L-choice" title="L.choice: (...PLens s a) -&gt; PLens s a"><code>L.choice(...lenses)</code></a></li>
-<li><a href="#L-just" title="L.just: Maybe a -&gt; PLens s a"><code>L.just(maybeValue)</code></a></li>
-<li><a href="#L-nothing" title="L.nothing: PLens s a"><code>L.nothing</code></a></li>
+<li><a href="#adapting-to-data">Adapting to data</a><ul>
 <li><a href="#L-orElse" title="L.orElse: (PLens s a, PLens s a) -&gt; PLens s a"><code>L.orElse(backupLens, primaryLens)</code></a></li>
+</ul>
+</li>
+<li><a href="#read-only-mapping">Read-only mapping</a><ul>
+<li><a href="#L-just" title="L.just: Maybe a -&gt; PLens s a"><code>L.just(maybeValue)</code></a></li>
 <li><a href="#L-to" title="L.to: (a -&gt; b) -&gt; PLens a b"><code>L.to(maybeValue =&gt; maybeValue)</code></a></li>
 </ul>
 </li>
@@ -135,7 +146,6 @@ parts.  <a href="http://calmm-js.github.io/partial.lenses/">Try Lenses!</a></p>
 </ul>
 </li>
 <li><a href="#isomorphisms-and-combinators">Isomorphisms and combinators</a><ul>
-<li><a href="#L-fromArrayBy" title="L.fromArrayBy: (p: String) -&gt; PIso [{p: String, ...ps}] {String: {p: String, ...ps}}"><code>L.fromArrayBy(idPropName)</code></a></li>
 <li><a href="#L-identity" title="L.identity: PIso s s"><code>L.identity</code></a></li>
 <li><a href="#L-inverse" title="L.inverse: PIso a b -&gt; PIso b a"><code>L.inverse(isomorphism)</code></a></li>
 </ul>
@@ -402,7 +412,7 @@ setting to <code>undefined</code> typically has the effect of removing the focus
 <p>of a data structure.</p>
 <p>Note that <code>L.set(lens, maybeValue, maybeData)</code> is equivalent
 to <a href="#L-modify"><code>L.modify(lens, R.always(maybeValue), maybeData)</code></a>.</p>
-<h4 id="combinators">Combinators</h4>
+<h4 id="nesting">Nesting</h4>
 <h5 id="-a-name-l-compose-a-contents-l-compose-optics-l-compose-l-compose-poptic-s-s1-poptic-sn-a-poptic-s-a-"><a name="L-compose"></a> <a href="#contents">≡</a> <a href="#L-compose" title="L.compose: (POptic s s1, ...POptic sN a) -&gt; POptic s a"><code>L.compose(...optics)</code></a></h5>
 <p><code>L.compose</code> performs composition of optics.  The following equations
 characterize composition:</p>
@@ -426,6 +436,25 @@ L.modify([o, ...os]) = R.compose(L.modify(o), ...os.map(L.modify))
 </code></pre>
 <p>Note that <a href="http://ramdajs.com/docs/#compose"><code>R.compose</code></a> is not the same as
 <code>L.compose</code>.</p>
+<h4 id="querying">Querying</h4>
+<h5 id="-a-name-l-chain-a-contents-l-chain-value-optic-optic-l-chain-l-chain-a-poptic-s-b-poptic-s-a-poptic-s-b-"><a name="L-chain"></a> <a href="#contents">≡</a> <a href="#L-chain" title="L.chain: (a -&gt; POptic s b) -&gt; POptic s a -&gt; POptic s b"><code>L.chain(value =&gt; optic, optic)</code></a></h5>
+<p><code>L.chain(toOptic, optic)</code> is equivalent to</p>
+<pre><code class="hljs lang-jsx">L.compose(optic, L.choose(maybeValue =&gt;
+  maybeValue === undefined
+  ? L.zero
+  : toOptic(maybeValue)))
+</code></pre>
+<p>Note that with the <a href="#L-just"><code>L.just</code></a>, <code>L.chain</code>, <a href="#L-choice"><code>L.choice</code></a>
+and <a href="#L-zero"><code>L.zero</code></a> combinators, one can consider optics as subsuming the
+maybe monad.</p>
+<h5 id="-a-name-l-choice-a-contents-l-choice-lenses-l-choice-l-choice-plens-s-a-poptic-s-a-"><a name="L-choice"></a> <a href="#contents">≡</a> <a href="#L-choice" title="L.choice: (...PLens s a) -&gt; POptic s a"><code>L.choice(...lenses)</code></a></h5>
+<p><code>L.choice</code> returns a partial optic that acts like the first of the given lenses
+whose view is not <code>undefined</code> on the given data structure.  When the views of
+all of the given lenses are <code>undefined</code>, the returned lens acts
+like <a href="#L-zero"><code>L.zero</code></a>, which is the identity element of <code>L.choice</code>.</p>
+<p>For example:</p>
+<pre><code class="hljs lang-js">L.modify([L.sequence, L.choice(&quot;a&quot;, &quot;d&quot;)], R.inc, [{R: 1}, {a: 1}, {d: 2}])
+</code></pre>
 <h5 id="-a-name-l-choose-a-contents-l-choose-maybevalue-optic-l-choose-l-choose-maybe-s-poptic-s-a-poptic-s-a-"><a name="L-choose"></a> <a href="#contents">≡</a> <a href="#L-choose" title="L.choose: (Maybe s -&gt; POptic s a) -&gt; POptic s a"><code>L.choose(maybeValue =&gt; optic)</code></a></h5>
 <p><code>L.choose</code> creates an optic whose operation is determined by the given function
 that maps the underlying view, which can be <code>undefined</code>, to an optic.  In other
@@ -442,25 +471,47 @@ examining the data structure being manipulated.</p>
 </code></pre>
 <pre><code class="hljs lang-js">L.modify(majorAxis, R.negate, {x: 2, y: -3})
 </code></pre>
+<h5 id="-a-name-l-optional-a-contents-l-optional-l-optional-l-optional-poptic-a-a-"><a name="L-optional"></a> <a href="#contents">≡</a> <a href="#L-optional" title="L.optional: POptic a a"><code>L.optional</code></a></h5>
+<p><code>L.optional</code> is an optic over an optional element.  When used as a traversal,
+and the focus is <code>undefined</code>, the traversal is empty.  When used as a lens, and
+the focus is <code>undefined</code>, the lens will be read-only.</p>
+<p>As an example, consider the difference between:</p>
+<pre><code class="hljs lang-js">L.set([L.sequence, &quot;x&quot;], 3, [{x: 1}, {y: 2}])
+</code></pre>
+<p>and:</p>
+<pre><code class="hljs lang-js">L.set([L.sequence, &quot;x&quot;, L.optional], 3, [{x: 1}, {y: 2}])
+</code></pre>
+<p>Note that <code>L.optional</code> is equivalent
+to <a href="#L-when"><code>L.when(x =&gt; x !== undefined)</code></a>.</p>
+<h5 id="-a-name-l-when-a-contents-l-when-maybevalue-testable-l-when-l-when-maybe-a-boolean-poptic-a-a-"><a name="L-when"></a> <a href="#contents">≡</a> <a href="#L-when" title="L.when: (Maybe a -&gt; Boolean) -&gt; POptic a a"><code>L.when(maybeValue =&gt; testable)</code></a></h5>
+<p><code>L.when</code> allows one to selectively skip elements within a traversal or to
+selectively turn a lens into a read-only lens whose view is <code>undefined</code>.</p>
+<p>For example:</p>
+<pre><code class="hljs lang-js">L.modify([L.sequence, L.when(x =&gt; x &gt; 0)], R.negate, [0,-1,2,-3,4])
+</code></pre>
+<p>Note that <code>L.when(p)</code> is equivalent
+to <a href="#L-choose"><code>L.choose(x =&gt; p(x) ? L.identity : L.zero)</code></a>.</p>
+<h4 id="recursing">Recursing</h4>
 <h5 id="-a-name-l-lazy-a-contents-l-lazy-optic-optic-l-lazy-l-lazy-poptic-s-a-poptic-s-a-"><a name="L-lazy"></a> <a href="#contents">≡</a> <a href="#L-lazy" title="L.lazy: POptic s a -&gt; POptic s a"><code>L.lazy(optic =&gt; optic)</code></a></h5>
 <p><code>L.lazy</code> can be used to construct optics lazily.  The function given to <code>L.lazy</code>
 is passed a forwarding proxy to its return value and can also make forward
 references to other optics and possibly construct a recursive optic.</p>
-<p>For example, here is a traversal that targets all the non-arrays in a data
-structure of nested arrays:</p>
+<p>For example, here is a traversal that targets all the primitive elements in a
+data structure of nested arrays and objects:</p>
 <pre><code class="hljs lang-js">var flatten = L.lazy(rec =&gt; {
   const nest = [L.sequence, rec]
-  return L.choose(x =&gt; R.is(Array, x) ? nest : L.identity)
+  return L.choose(x =&gt; R.is(Object, x) ? nest : L.identity)
 })
 </code></pre>
 <p>Note that the above creates a cyclic representation of the traversal.</p>
 <p>Now, for example:</p>
-<pre><code class="hljs lang-js">L.collect(flatten, [[[1], 2], 3, [4, [[5]], [6]]])
+<pre><code class="hljs lang-js">L.collect(flatten, [[[1], 2], {y: 3}, [{l: 4, r: [5]}, {x: 6}]])
 </code></pre>
-<pre><code class="hljs lang-js">L.modify(flatten, x =&gt; x+1, [[[1], 2], 3, [4, [[5]], [6]]])
+<pre><code class="hljs lang-js">L.modify(flatten, x =&gt; x+1, [[[1], 2], {y: 3}, [{l: 4, r: [5]}, {x: 6}]])
 </code></pre>
-<pre><code class="hljs lang-js">L.remove([flatten, L.when(x =&gt; 3 &lt;= x &amp;&amp; x &lt;= 5)], [[[1], 2], 3, [4, [[5]], [6]]])
+<pre><code class="hljs lang-js">L.remove([flatten, L.when(x =&gt; 3 &lt;= x &amp;&amp; x &lt;= 4)], [[[1], 2], {y: 3}, [{l: 4, r: [5]}, {x: 6}]])
 </code></pre>
+<h4 id="debugging">Debugging</h4>
 <h5 id="-a-name-l-log-a-contents-l-log-labels-l-log-l-log-any-poptic-s-s-"><a name="L-log"></a> <a href="#contents">≡</a> <a href="#L-log" title="L.log: (...Any) -&gt; POptic s s"><code>L.log(...labels)</code></a></h5>
 <p><code>L.log(...labels)</code> is an identity optic that
 outputs
@@ -476,6 +527,18 @@ when data flows in either direction, <code>get</code> or <code>set</code>, throu
 </code></pre>
 <pre><code class="hljs lang-js">L.set([&quot;x&quot;, L.log(&quot;%s x: %j&quot;)], &quot;11&quot;, {x: 10})
 </code></pre>
+<h4 id="-a-name-l-zero-a-contents-l-zero-l-zero-l-zero-poptic-s-a-"><a name="L-zero"></a> <a href="#contents">≡</a> <a href="#L-zero" title="L.zero: POptic s a"><code>L.zero</code></a></h4>
+<p><code>L.zero</code> is the identity element of <a href="#L-choice"><code>L.choice</code></a>
+and <a href="L-chain"><code>L.chain</code></a>.  As a traversal, <code>L.zero</code> is a traversal of no
+elements and as a lens, i.e. when used with <a href="#L-get"><code>L.get</code></a>, <code>L.zero</code> is a
+read-only lens whose view is always <code>undefined</code>.</p>
+<p>For example:</p>
+<pre><code class="hljs lang-js">L.collect([L.sequence,
+           L.choose(x =&gt; (R.is(Array, x) ? L.sequence :
+                          R.is(Object, x) ? &quot;x&quot; :
+                          L.zero))],
+          [1, {x: 2}, [3,4]])
+</code></pre>
 <h3 id="traversals">Traversals</h3>
 <p>A traversal operates over a collection of focuses that can
 be
@@ -525,40 +588,13 @@ visits all the properties of an object according to the template.</p>
 </code></pre>
 <p>See <a href="#bst-traversal">BST traversal</a> for a more meaningful example.</p>
 <h4 id="traversals-and-combinators">Traversals and combinators</h4>
-<h5 id="-a-name-l-optional-a-contents-l-optional-l-optional-l-optional-ptraversal-a-a-"><a name="L-optional"></a> <a href="#contents">≡</a> <a href="#L-optional" title="L.optional: PTraversal a a"><code>L.optional</code></a></h5>
-<p><code>L.optional</code> is a traversal over an optional element.  When the focus of
-<code>L.optional</code> is <code>undefined</code>, the traversal is empty.  Otherwise the traversal is
-over the focused element.</p>
-<p>As an example, consider the difference between:</p>
-<pre><code class="hljs lang-js">L.set([L.sequence, &quot;x&quot;], 3, [{x: 1}, {y: 2}])
-</code></pre>
-<p>and:</p>
-<pre><code class="hljs lang-js">L.set([L.sequence, &quot;x&quot;, L.optional], 3, [{x: 1}, {y: 2}])
-</code></pre>
-<p>Note that <code>L.optional</code> is equivalent to <code>L.when(x =&gt; x !== undefined)</code>.</p>
-<h5 id="-a-name-l-sequence-a-contents-l-sequence-l-sequence-l-sequence-ptraversal-a-a-"><a name="L-sequence"></a> <a href="#contents">≡</a> <a href="#L-sequence" title="L.sequence: PTraversal [a] a"><code>L.sequence</code></a></h5>
-<p><code>L.sequence</code> is a traversal over an array.</p>
+<h5 id="-a-name-l-sequence-a-contents-l-sequence-l-sequence-l-sequence-ptraversal-a-p-a-ps-a-"><a name="L-sequence"></a> <a href="#contents">≡</a> <a href="#L-sequence" title="L.sequence: PTraversal ([a] | {p: a, ...ps}) a"><code>L.sequence</code></a></h5>
+<p><code>L.sequence</code> is a traversal over the values of an array or object.</p>
 <p>For example:</p>
-<pre><code class="hljs lang-js">L.modify([&quot;xs&quot;, L.sequence, &quot;x&quot;], R.add(1), {xs: [{x: 1}, {x: 2}]})
+<pre><code class="hljs lang-js">L.modify([&quot;xs&quot;, L.sequence, &quot;x&quot;], R.inc, {xs: [{x: 1}, {x: 2}]})
 </code></pre>
-<h5 id="-a-name-l-skip-a-contents-l-skip-l-skip-l-skip-ptraversal-a-b-"><a name="L-skip"></a> <a href="#contents">≡</a> <a href="#L-skip" title="L.skip: PTraversal a b"><code>L.skip</code></a></h5>
-<p><code>L.skip</code> is a traversal of no elements.</p>
-<p>For example:</p>
-<pre><code class="hljs lang-js">L.collect([L.sequence,
-           L.choose(x =&gt; (R.is(Array, x) ? L.sequence :
-                          R.is(Object, x) ? &quot;x&quot; :
-                          L.skip))],
-          [1, {x: 2}, [3,4]])
+<pre><code class="hljs lang-js">L.modify(L.sequence, R.negate, {a:1, b:2, c:3})
 </code></pre>
-<p>Note that the traversal <code>L.skip</code>, which traverses 0 elements, is not the same as
-the lens <a href="#L-nothing"><code>L.nothing</code></a>, which traverses 1 element.</p>
-<h5 id="-a-name-l-when-a-contents-l-when-maybevalue-testable-l-when-l-when-maybe-a-boolean-ptraversal-a-a-"><a name="L-when"></a> <a href="#contents">≡</a> <a href="#L-when" title="L.when: (Maybe a -&gt; Boolean) -&gt; PTraversal a a"><code>L.when(maybeValue =&gt; testable)</code></a></h5>
-<p><code>L.when</code> allows one to selectively skip elements within a traversal.</p>
-<p>For example:</p>
-<pre><code class="hljs lang-js">L.modify([L.sequence, L.when(x =&gt; x &gt; 0)], R.negate, [0,-1,2,-3,4])
-</code></pre>
-<p>Note that <code>L.when(p)</code> is equivalent to <code>L.choose(x =&gt; x !== undefined ?
-L.identity : L.skip)</code>.</p>
 <h3 id="lenses">Lenses</h3>
 <p>Lenses always have a single focus which can be <a href="#L-get">viewed</a> directly.</p>
 <h4 id="operations-on-lenses">Operations on lenses</h4>
@@ -567,14 +603,7 @@ L.identity : L.skip)</code>.</p>
 <p>For example:</p>
 <pre><code class="hljs lang-js">L.get(&quot;y&quot;, {x: 112, y: 101})
 </code></pre>
-<p>Note that <code>L.get</code> does not work on <a href="#traversals">traversals</a>.  However,
-using <a href="foldMapOf"><code>L.foldMapOf</code></a> we can define</p>
-<pre><code class="hljs lang-js">var Defined = {empty: () =&gt; {}, concat: (l, r) =&gt; l !== undefined ? l : r}
-var first = R.curry((t, s) =&gt; L.foldMapOf(Defined, t, R.identity, s))
-</code></pre>
-<p>which agrees with <code>L.get</code>.  For example:</p>
-<pre><code class="hljs lang-js">first(&quot;y&quot;, {x: 112, y: 101})
-</code></pre>
+<p>Note that <code>L.get</code> does not work on <a href="#traversals">traversals</a>.</p>
 <h4 id="creating-new-lenses">Creating new lenses</h4>
 <h5 id="-a-name-l-lens-a-contents-l-lens-maybedata-maybevalue-maybevalue-maybedata-maybedata-l-lens-l-lens-maybe-s-maybe-a-maybe-a-maybe-s-maybe-s-plens-s-a-"><a name="L-lens"></a> <a href="#contents">≡</a> <a href="#L-lens" title="L.lens: (Maybe s -&gt; Maybe a) -&gt; ((Maybe a, Maybe s) -&gt; Maybe s) -&gt; PLens s a"><code>L.lens(maybeData =&gt; maybeValue, (maybeValue, maybeData) =&gt; maybeData)</code></a></h5>
 <p><code>L.lens</code> creates a new primitive lens.  The first parameter is the <em>getter</em> and
@@ -797,27 +826,15 @@ lens.</p>
 </code></pre>
 <pre><code class="hljs lang-js">L.remove(L.valueOr(0), 1)
 </code></pre>
-<h4 id="querying-and-adapting-to-data">Querying and adapting to data</h4>
-<h5 id="-a-name-l-chain-a-contents-l-chain-value-lens-lens-l-chain-l-chain-a-plens-s-b-plens-s-a-plens-s-b-"><a name="L-chain"></a> <a href="#contents">≡</a> <a href="#L-chain" title="L.chain: (a -&gt; PLens s b) -&gt; PLens s a -&gt; PLens s b"><code>L.chain(value =&gt; lens, lens)</code></a></h5>
-<p><code>L.chain(a2bPLens, aPLens)</code> is equivalent to</p>
-<pre><code class="hljs lang-jsx">L.compose(aPLens, L.choose(aMaybe =&gt;
-  aMaybe === undefined
-  ? L.nothing
-  : a2bPLens(aMaybe)))
-</code></pre>
-<p>With the <a href="#L-just"><code>L.just</code></a>, <code>L.chain</code>, <a href="#L-choice"><code>L.choice</code></a>
-and <a href="#L-nothing"><code>L.nothing</code></a> combinators, one can view partial lenses as
-subsuming the maybe monad.  Of course, the whole point of lenses is that they
-are bidirectional and read-only <a href="#L-just"><code>L.just</code></a>
-and <a href="#L-nothing"><code>L.nothing</code></a> are essentially degenerate.</p>
-<h5 id="-a-name-l-choice-a-contents-l-choice-lenses-l-choice-l-choice-plens-s-a-plens-s-a-"><a name="L-choice"></a> <a href="#contents">≡</a> <a href="#L-choice" title="L.choice: (...PLens s a) -&gt; PLens s a"><code>L.choice(...lenses)</code></a></h5>
-<p><code>L.choice</code> returns a partial lens that acts like the first of the given lenses
-whose view is not <code>undefined</code> on the given data structure.  When the views of
-all of the given lenses are <code>undefined</code>, the returned lens acts
-like <a href="#L-nothing"><code>L.nothing</code></a>, which is the identity element of <code>L.choice</code>.</p>
-<p>For example:</p>
-<pre><code class="hljs lang-js">L.modify([L.sequence, L.choice(&quot;a&quot;, &quot;d&quot;), L.optional], R.inc, [{R: 1}, {a: 1}, {d: 2}])
-</code></pre>
+<h4 id="adapting-to-data">Adapting to data</h4>
+<h5 id="-a-name-l-orelse-a-contents-l-orelse-backuplens-primarylens-l-orelse-l-orelse-plens-s-a-plens-s-a-plens-s-a-"><a name="L-orElse"></a> <a href="#contents">≡</a> <a href="#L-orElse" title="L.orElse: (PLens s a, PLens s a) -&gt; PLens s a"><code>L.orElse(backupLens, primaryLens)</code></a></h5>
+<p><code>L.orElse(backupLens, primaryLens)</code> acts like <code>primaryLens</code> when its view is not
+<code>undefined</code> and otherwise like <code>backupLens</code>.  You can use <code>L.orElse</code> on its own
+with <a href="http://ramdajs.com/docs/#reduceRight"><code>R.reduceRight</code></a>
+(and <a href="http://ramdajs.com/docs/#reduce"><code>R.reduce</code></a>) to create an associative
+choice over lenses or use <code>L.orElse</code> to specify a default or backup lens
+for <a href="#L-choice"><code>L.choice</code></a>, for example.</p>
+<h4 id="read-only-mapping">Read-only mapping</h4>
 <h5 id="-a-name-l-just-a-contents-l-just-maybevalue-l-just-l-just-maybe-a-plens-s-a-"><a name="L-just"></a> <a href="#contents">≡</a> <a href="#L-just" title="L.just: Maybe a -&gt; PLens s a"><code>L.just(maybeValue)</code></a></h5>
 <p><code>L.just</code> returns a read-only lens whose view is always the given value.  In
 other words, for all <code>x</code>, <code>y</code> and <code>z</code>:</p>
@@ -827,22 +844,6 @@ L.set(L.just(z), y, x) = x
 <p>Note that <code>L.just(x)</code> is equivalent to <a href="#L-to"><code>L.to(_ =&gt; x)</code></a>.</p>
 <p><code>L.just</code> can be seen as the unit function of the monad formed
 with <a href="#L-chain"><code>L.chain</code></a>.</p>
-<h5 id="-a-name-l-nothing-a-contents-l-nothing-l-nothing-l-nothing-plens-s-a-"><a name="L-nothing"></a> <a href="#contents">≡</a> <a href="#L-nothing" title="L.nothing: PLens s a"><code>L.nothing</code></a></h5>
-<p><code>L.nothing</code> is a read-only lens whose view is always <code>undefined</code>.  In other
-words, for all <code>x</code> and <code>y</code>:</p>
-<pre><code class="hljs lang-jsx">   L.get(L.nothing, x) = undefined
-L.set(L.nothing, y, x) = x
-</code></pre>
-<p>Note that <code>L.nothing</code> is the identity element of <a href="#L-choice"><code>L.choice</code></a>.  Also
-note that the lens <code>L.nothing</code>, which traverses 1 element, is not the same as
-the traversal <a href="#L-skip"><code>L.skip</code></a>, which traverses 0 elements.</p>
-<h5 id="-a-name-l-orelse-a-contents-l-orelse-backuplens-primarylens-l-orelse-l-orelse-plens-s-a-plens-s-a-plens-s-a-"><a name="L-orElse"></a> <a href="#contents">≡</a> <a href="#L-orElse" title="L.orElse: (PLens s a, PLens s a) -&gt; PLens s a"><code>L.orElse(backupLens, primaryLens)</code></a></h5>
-<p><code>L.orElse(backupLens, primaryLens)</code> acts like <code>primaryLens</code> when its view is not
-<code>undefined</code> and otherwise like <code>backupLens</code>.  You can use <code>L.orElse</code> on its own
-with <a href="http://ramdajs.com/docs/#reduceRight"><code>R.reduceRight</code></a>
-(and <a href="http://ramdajs.com/docs/#reduce"><code>R.reduce</code></a>) to create an associative
-choice over lenses or use <code>L.orElse</code> to specify a default or backup lens
-for <a href="#L-choice"><code>L.choice</code></a>, for example.</p>
 <h5 id="-a-name-l-to-a-contents-l-to-maybevalue-maybevalue-l-to-l-to-a-b-plens-a-b-"><a name="L-to"></a> <a href="#contents">≡</a> <a href="#L-to" title="L.to: (a -&gt; b) -&gt; PLens a b"><code>L.to(maybeValue =&gt; maybeValue)</code></a></h5>
 <p><code>L.to</code> creates a read-only lens whose view is determined by the given function.</p>
 <p>For example:</p>
@@ -907,10 +908,12 @@ undefined)</code> are inverses of each other.</p>
 <h5 id="-a-name-l-getinverse-a-contents-l-getinverse-isomorphism-maybedata-l-getinverse-l-getinverse-piso-a-b-maybe-b-maybe-a-"><a name="L-getInverse"></a> <a href="#contents">≡</a> <a href="#L-getInverse" title="L.getInverse: PIso a b -&gt; Maybe b -&gt; Maybe a"><code>L.getInverse(isomorphism, maybeData)</code></a></h5>
 <p><code>L.getInverse</code> views through an isomorphism in the inverse direction.</p>
 <p>For example:</p>
-<pre><code class="hljs lang-js">L.getInverse(L.fromArrayBy(&quot;id&quot;), {&#39;1&#39;: {id: 1, value: 2}, &#39;3&#39;: {id: 3, value: 4}})
+<pre><code class="hljs lang-js">var numeric = f =&gt; x =&gt; typeof x === &quot;number&quot; ? f(x) : undefined
+var offBy1 = L.iso(numeric(R.inc), numeric(R.dec))
+L.getInverse(offBy1, 1)
 </code></pre>
-<p>Note that <code>L.getInverse(iso, data)</code> is equivalent to <code>L.set(iso, data,
-undefined)</code>.</p>
+<p>Note that <code>L.getInverse(iso, data)</code> is equivalent
+to <a href="#L-get"><code>L.set(iso, data, undefined)</code></a>.</p>
 <p>Also note that, while <code>L.getInverse</code> makes most sense when used with an
 isomorphism, it is valid to use <code>L.getInverse</code> with <em>partial</em> lenses in general.
 Doing so essentially constructs a minimal data structure that contains the given
@@ -921,21 +924,10 @@ value.  For example:</p>
 <h5 id="-a-name-l-iso-a-contents-l-iso-maybedata-maybevalue-maybevalue-maybedata-l-iso-l-iso-maybe-s-maybe-a-maybe-a-maybe-s-piso-s-a-"><a name="L-iso"></a> <a href="#contents">≡</a> <a href="#L-iso" title="L.iso: (Maybe s -&gt; Maybe a) -&gt; (Maybe a -&gt; Maybe s) -&gt; PIso s a"><code>L.iso(maybeData =&gt; maybeValue, maybeValue =&gt; maybeData)</code></a></h5>
 <p><code>L.iso</code> creates a new primitive isomorphism.</p>
 <p>For example:</p>
-<pre><code class="hljs lang-js">var negate = L.iso(R.negate, R.negate)
+<pre><code class="hljs lang-js">var negate = L.iso(numeric(R.negate), numeric(R.negate))
 L.get([negate, L.inverse(negate)], 112)
 </code></pre>
 <h4 id="isomorphisms-and-combinators">Isomorphisms and combinators</h4>
-<h5 id="-a-name-l-fromarrayby-a-contents-l-fromarrayby-idpropname-l-fromarrayby-l-fromarrayby-p-string-piso-p-string-ps-string-p-string-ps-"><a name="L-fromArrayBy"></a> <a href="#contents">≡</a> <a href="#L-fromArrayBy" title="L.fromArrayBy: (p: String) -&gt; PIso [{p: String, ...ps}] {String: {p: String, ...ps}}"><code>L.fromArrayBy(idPropName)</code></a></h5>
-<p><strong><code>L.fromArrayBy</code> is experimental and might be removed, renamed or changed
-semantically before next major release.</strong></p>
-<p><code>L.fromArrayBy(id)</code> is an isomorphism that converts an array of objects
-containing <code>id</code> properties into an object with the <code>id</code>s as keys and the array
-elements as values.</p>
-<p>For example:</p>
-<pre><code class="hljs lang-js">L.get(L.fromArrayBy(&quot;id&quot;), [{id: 1, value: 2}, {id: 3, value: 4}])
-</code></pre>
-<pre><code class="hljs lang-js">L.set([L.fromArrayBy(&quot;id&quot;), &quot;3&quot;, &quot;value&quot;], 5, [{id: 1, value: 2}, {id: 3, value: 4}])
-</code></pre>
 <h5 id="-a-name-l-identity-a-contents-l-identity-l-identity-l-identity-piso-s-s-"><a name="L-identity"></a> <a href="#contents">≡</a> <a href="#L-identity" title="L.identity: PIso s s"><code>L.identity</code></a></h5>
 <p><code>L.identity</code> is the identity element of lens composition and also the identity
 isomorphism.  The following equations characterize <code>L.identity</code>:</p>
@@ -948,7 +940,7 @@ L.modify(L.identity, f, x) = f(x)
 <p><code>L.inverse</code> returns the inverse of the given isomorphism.  Note that this
 operation only makes sense on isomorphisms.</p>
 <p>For example:</p>
-<pre><code class="hljs lang-js">L.get(L.inverse(L.fromArrayBy(&#39;id&#39;)), {a: {id: &quot;a&quot;, x: 1}, b: {id: &quot;b&quot;, x: 2}})
+<pre><code class="hljs lang-js">L.get(L.inverse(offBy1), 1)
 </code></pre>
 <h2 id="examples">Examples</h2>
 <p>If you are new to lenses, then you probably want to start with
diff --git a/package.json b/package.json
index 2690e65..0154e15 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "partial.lenses",
-  "version": "5.3.2",
+  "version": "6.0.0",
   "description": "Partial lenses, isomorphisms and traversals for manipulating JSON and more",
   "main": "lib/partial.lenses.js",
   "scripts": {
diff --git a/src/partial.lenses.js b/src/partial.lenses.js
index c515f76..124802f 100644
--- a/src/partial.lenses.js
+++ b/src/partial.lenses.js
@@ -10,8 +10,8 @@ import {
   isArray,
   isDefined,
   isObject,
-  mapPartialU,
-  values
+  keys,
+  mapPartialU
 } from "infestines"
 
 //
@@ -26,7 +26,7 @@ const snd = (_, c) => c
 //
 
 const Ident = {map: apply, of: id, ap: apply}
-const Const = {map: snd, of: id}
+const Const = {map: snd}
 function ConstOf(Monoid) {
   const concat = Monoid.concat
   return {
@@ -78,18 +78,6 @@ function traverse(A, x2yA, xs) {
 
 //
 
-const warn = process.env.NODE_ENV === "production" ? () => {} : (() => {
-  const warned = {}
-  return message => {
-    if (!(message in warned)) {
-      warned[message] = message
-      console.warn("partial.lenses:", message)
-    }
-  }
-})()
-
-//
-
 const unArray = x => isArray(x) ? x : undefined
 
 const mkArray = x => isArray(x) ? x : emptyArray
@@ -106,6 +94,13 @@ const assert = process.env.NODE_ENV === "production" ? id : (x, p, msg) => {
 
 const emptyArrayToUndefined = xs => xs.length ? xs : undefined
 
+const emptyObjectToUndefined = o => {
+  if (!isObject(o))
+    return o
+  for (const k in o)
+    return o
+}
+
 //
 
 const toPartial = x2y => x => isDefined(x) ? x2y(x) : x
@@ -179,7 +174,7 @@ function getU(l, s) {
   switch (typeof l) {
     case "string":   return getProp(l, s)
     case "number":   return getIndex(l, s)
-    case "function": return lifted(l)(Const, Const.of, s)
+    case "function": return lifted(l)(Const, id, s)
     default:         return getComposed(l, s)
   }
 }
@@ -249,12 +244,16 @@ export const foldMapOf = curry4((m, l, to, s) => lift(l)(ConstOf(m), to, s))
 export const inverse = iso => (F, inner, x) =>
   (0,F.map)(x => getU(iso, x), inner(getInverseU(iso, x)))
 
+export const zero = (C, x2yC, x) => {
+  const of = C.of
+  return of ? of(x) : (0,C.map)(always(x), x2yC(undefined))
+}
+
 export const chain = curry2((x2yL, xL) =>
-  [xL, choose(xO => isDefined(xO) ? x2yL(xO) : nothing)])
+  [xL, choose(xO => isDefined(xO) ? x2yL(xO) : zero)])
 
 export const to = x2y => (F, y2zF, x) => (0,F.map)(always(x), y2zF(x2y(x)))
 export const just = x => to(always(x))
-export const nothing = just(undefined)
 
 export const choose = x2l => (F, x2yF, x) => lift(x2l(x))(F, x2yF, x)
 
@@ -263,7 +262,7 @@ export const orElse =
 
 export const choice = (...ls) => choose(x => {
   const i = ls.findIndex(l => isDefined(getU(l, x)))
-  return i < 0 ? nothing : ls[i]
+  return i < 0 ? zero : ls[i]
 })
 
 const replacer = (inn, out) => x => acyclicEqualsU(x, inn) ? out : x
@@ -434,18 +433,38 @@ export function lazy(toLens) {
   return rec
 }
 
-export const sequence = (A, x2yA, xs) =>
-  notGet(A) === Ident
-  ? emptyArrayToUndefined(mapPartialU(x2yA, mkArray(xs)))
-  : (0,A.map)(emptyArrayToUndefined, traverse(A, x2yA, mkArray(xs)))
+function branchOn(keys, vals) {
+  const n = keys.length
+  return (A, x2yA, x) => {
+    notGet(A)
+    const ap = A.ap,
+          wait = (x, i) => 0 <= i ? y => wait(setProp(keys[i], y, x), i-1) : x
+    let r = (0,A.of)(wait(x, n-1))
+    if (!isObject(x))
+      x = undefined
+    for (let i=n-1; 0<=i; --i) {
+      const v = x && x[keys[i]]
+      r = ap(r, (vals ? vals[i](A, x2yA, v) : x2yA(v)))
+    }
+    return (0,A.map)(emptyObjectToUndefined, r)
+  }
+}
 
-export const when = p => (A, x2yA, x) => {
+export function sequence(A, x2yA, xs) {
   notGet(A)
-  return p(x) ? x2yA(x) : (0,A.of)(x)
+  if (isArray(xs))
+    return A === Ident
+    ? emptyArrayToUndefined(mapPartialU(x2yA, xs))
+    : (0,A.map)(emptyArrayToUndefined, traverse(A, x2yA, xs))
+  else if (isObject(xs))
+    return branchOn(keys(xs))(A, x2yA, xs)
+  else
+    return (0,A.of)(xs)
 }
 
+export const when = p => (C, x2yC, x) => p(x) ? x2yC(x) : zero(C, x2yC, x)
+
 export const optional = when(isDefined)
-export const skip = when(always(false))
 
 export function branch(template) {
   const keys = []
@@ -454,34 +473,5 @@ export function branch(template) {
     keys.push(k)
     vals.push(lift(template[k]))
   }
-  const n = keys.length
-  return (A, x2yA, x) => {
-    notGet(A)
-    const ap = A.ap,
-          wait = (x, i) => 0 <= i ? y => wait(setProp(keys[i], y, x), i-1) : x
-    let r = (0,A.of)(wait(x, n-1))
-    if (!isObject(x))
-      x = undefined
-    for (let i=n-1; 0<=i; --i)
-      r = ap(r, vals[i](A, x2yA, x && x[keys[i]]))
-    return r
-  }
+  return branchOn(keys, vals)
 }
-
-export const fromArrayBy = id =>
-  warn("`fromArrayBy` is experimental and might be removed, renamed or changed semantically before next major release") ||
-  isoU(xs => {
-    if (isArray(xs)) {
-      const o = {}, n=xs.length
-      for (let i=0; i<n; ++i) {
-        const x = xs[i]
-        o[x[id]] = x
-      }
-      return o
-    }
-  },
-  o => isObject(o) ? values(o) : undefined)
-
-export default (...ls) =>
-  warn("default import will be removed. Use `compose` or array notation `[...]`.") ||
-  compose(...ls)


Test patch:
diff --git a/test/core.js b/test/core.js
index c0729a8..76e3aec 100644
--- a/test/core.js
+++ b/test/core.js
@@ -4,33 +4,40 @@ import * as L from "../src/partial.lenses"
 //
 
 const toPartial = x2x => s => I.isDefined(s) ? x2x(s) : s
-const List = {empty: I.always([]), concat: (x, y) => x.concat(y)}
-const toList = x => I.isDefined(x) ? [x] : []
+const Collect = {empty: I.always([]), concat: (x, y) => x.concat(y)}
+const toCollect = x => I.isDefined(x) ? [x] : []
 
-const Defined = {empty: () => {}, concat: (l, r) => I.isDefined(l) ? l : r}
-
-//
+// Optics
 
 export const modify = L.modify
 export const remove = I.curry2((o, s) => set(o, undefined, s))
 export const set = I.curry3((o, x, s) => modify(o, I.always(x), s))
 
 export const compose = L.compose
+
+export const chain = I.curry2((x2yO, xO) => [xO, choose(xM => I.isDefined(xM) ? x2yO(xM) : zero)])
+export const choice = (...ls) => choose(x => {const i = ls.findIndex(l => I.isDefined(get(l, x))); return 0 <= i ? ls[i] : zero})
 export const choose = L.choose
+export const when = p => choose(x => p(x) ? identity : zero)
+export const zero = L.zero
+
 export const lazy = L.lazy
+
 export const log = L.log
 
-export const collect = I.curry2((t, s) => foldMapOf(List, t, toList, s))
+// Traversals
+
+export const collect = I.curry2((t, s) => foldMapOf(Collect, t, toCollect, s))
 export const foldMapOf = L.foldMapOf
 
 export const branch = L.branch
 
-export const when = p => choose(x => p(x) ? identity : skip)
 export const optional = when(I.isDefined)
 export const sequence = L.sequence
-export const skip = L.skip
 
-export const get = I.curry2((l, s) => foldMapOf(Defined, l, I.id, s))
+// Lenses
+
+export const get = L.get
 
 export const lens = L.lens
 
@@ -53,20 +60,19 @@ export const props = (...ps) => pick(I.zipObjPartialU(ps, ps))
 
 export const valueOr = v => lens(s => s === null || s === undefined ? v : s, I.id)
 
-export const chain = I.curry2((x2yL, xL) => [xL, choose(xO => I.isDefined(xO) ? x2yL(xO) : nothing)])
-export const choice = (...ls) => choose(x => {const i = ls.findIndex(l => I.isDefined(get(l, x))); return 0 <= i ? ls[i] : nothing})
-export const to = a2b => lens(a2b, (_, s) => s)
-export const just = v => to(I.always(v))
-export const nothing = just(undefined)
 export const orElse = I.curry2((d, l) => choose(x => I.isDefined(get(l, x)) ? l : d))
 
+export const just = v => to(I.always(v))
+export const to = a2b => lens(a2b, (_, s) => s)
+
 export const pick = L.pick
 export const replace = I.curry2((i, o) => iso(x => I.acyclicEqualsU(i, x) ? o : x, x => I.acyclicEqualsU(o, x) ? i : x))
 
+// Isomorphisms
+
 export const getInverse = I.curry2((i, s) => set(i, s, undefined))
 
 export const iso = lens
 
-export const fromArrayBy = L.fromArrayBy
 export const identity = iso(I.id, I.id)
 export const inverse = i => iso(getInverse(i), get(i))
diff --git a/test/tests.js b/test/tests.js
index e0b19cf..b32bbbe 100644
--- a/test/tests.js
+++ b/test/tests.js
@@ -45,10 +45,10 @@ const testThrows = expr => it(`${expr} => throws`, () => {
 const empties = [undefined, null, false, true, "a", 0, 0.0/0.0, {}, []]
 
 describe("compose", () => {
-  testEq('P()', L.identity)
-  testEq('P("x")', "x")
-  testEq('P(101)', 101)
-  testEq('P(101, "x")', [101, "x"])
+  testEq('L.compose()', L.identity)
+  testEq('L.compose("x")', "x")
+  testEq('L.compose(101)', 101)
+  testEq('L.compose(101, "x")', [101, "x"])
 })
 
 describe("L.identity", () => {
@@ -212,9 +212,12 @@ describe("L.rewrite", () => {
   testEq('L.set(L.rewrite(x => x-1), 3, 1)', 2)
 })
 
-describe("L.nothing", () => {
-  testEq('L.get(L.nothing, "anything")', undefined)
-  testEq('L.set(L.nothing, "anything", "original")', "original")
+describe("L.zero", () => {
+  testEq('L.get(L.zero, "anything")', undefined)
+  testEq('L.get([L.zero, L.valueOr("whatever")], "anything")', "whatever")
+  testEq('L.set(L.zero, "anything", "original")', "original")
+  testEq('L.collect([L.sequence, L.zero], [1,3])', [])
+  testEq('L.remove([L.sequence, L.zero], [1,2])', [1,2])
 })
 
 describe("L.to", () => {
@@ -286,12 +289,18 @@ describe("L.augment", () => {
 })
 
 describe("L.sequence", () => {
+  testEq('L.modify(L.sequence, R.negate, [])', undefined)
   testEq('L.modify(["xs", L.sequence, "x", L.sequence], R.add(1), {xs: [{x: [1]}, {x: [2,3,4]}]})', {xs: [{x: [2]}, {x: [3,4,5]}]})
   testEq('L.set(["xs", L.sequence, "x", L.sequence], 101, {xs: [{x: [1]}, {x: [2,3,4]}]})', {xs: [{x: [101]}, {x: [101,101,101]}]})
   testEq('L.remove(["xs", L.sequence, "x", L.sequence], {ys: "hip", xs: [{x: [1]}, {x: [2,3,4]}]})', {ys: "hip"})
   testEq('L.modify(["xs", L.sequence, "x"], x => x < 2 ? undefined : x, {xs: [{x:3},{x:1},{x:4},{x:1,y:0},{x:5},{x:9},{x:2}]})', {xs:[{x:3},{x:4},{y:0},{x:5},{x:9},{x:2}]})
   testEq('L.modify([L.sequence, ["x", L.sequence]], R.add(1), [{x: [1]}, {}, {x: []}, {x: [2, 3]}])', [{x: [2]}, {x: [3, 4]}])
   testEq('L.modify([[L.sequence, "x"], L.sequence], R.add(1), [{x: [1]}, {y: "keep"}, {x: [], z: "these"}, {x: [2, 3]}])', [{x: [2]}, {y: "keep"}, {z: "these"}, {x: [3, 4]}])
+  testEq('L.modify(L.sequence, R.negate, {x: 11, y: 22})', {x: -11, y: -22})
+  testEq('L.remove([L.sequence, L.when(x => 11 < x && x < 33)], {x: 11, y: 22, z: 33})', {x: 11, z: 33})
+  testEq('L.remove(L.sequence, {x: 11, y: 22, z: 33})', undefined)
+  testEq('L.modify(L.sequence, R.inc, {})', undefined)
+  testEq('L.modify(L.sequence, R.inc, null)', null)
 })
 
 describe("L.optional", () => {
@@ -304,12 +313,10 @@ describe("L.optional", () => {
   testEq('L.modify([L.sequence, "x", L.optional, L.sequence], x => x < 2 ? undefined : x-1, [{x: [1, 2]}, {y: 2}, {x: [3], z: 1}])', [{x: [1]}, {y: 2}, {x: [2], z: 1}])
 })
 
-describe("L.skip", () => {
-  testEq('L.collect([L.sequence, L.skip], [1,3])', [])
-  testEq('L.remove([L.sequence, L.skip], [1,2])', [1,2])
-})
-
 describe("L.when", () => {
+  testEq('L.get(L.when(x => x > 2), 1)', undefined)
+  testEq('L.get([L.when(x => x > 2), L.just(2)], 1)', 2)
+  testEq('L.get(L.when(x => x > 2), 3)', 3)
   testEq('L.collect([L.sequence, L.when(x => x > 2)], [1,3,2,4])', [3,4])
   testEq('L.modify([L.sequence, L.when(x => x > 2)], R.negate, [1,3,2,4])', [1,-3,2,-4])
 })
@@ -354,18 +361,12 @@ describe("L.props", () => {
   testEq('L.set(L.props("length"), "lol", undefined)', undefined)
 })
 
-describe("L.fromArrayBy", () => {
-  testEq('L.get(L.fromArrayBy(""), undefined)', undefined)
-  testEq('L.get(L.fromArrayBy("id"), [{id: 1}, {id: 2}, {id: 3}])', {"1":{"id":1},"2":{"id":2},"3":{"id":3}})
-  testEq('L.set([L.fromArrayBy("id"), "2", "x"], 1, [{id: 1}, {id: 2}, {id: 3}])', [{id: 1}, {id: 2, x: 1}, {id: 3}])
-  testEq('L.remove([L.fromArrayBy("id"), "1"], [{id: 1}, {id: 2}, {id: 3}])', [{id: 2}, {id: 3}])
-  testEq('L.remove([L.fromArrayBy("id"), "3"], [{id: 1}, {id: 2}, {id: 3}])', [{id: 1}, {id: 2}])
-  testEq('L.remove([L.fromArrayBy("id"), "3"], [{id: 3}])', undefined)
-})
+export const numeric = f => x => x !== undefined ? f(x) : undefined
+export const offBy1 = L.iso(numeric(R.inc), numeric(R.dec))
 
 describe("L.getInverse", () => {
-  testEq('L.getInverse(L.fromArrayBy(""), undefined)', undefined)
-  testEq('L.getInverse(L.fromArrayBy("id"), {"1":{"id":1},"2":{"id":2},"3":{"id":3}})', [{id: 1}, {id: 2}, {id: 3}])
+  testEq('L.getInverse(offBy1, undefined)', undefined)
+  testEq('L.getInverse(offBy1, 1)', 0)
 })
 
 export const flatten = L.lazy(rec => {
@@ -380,14 +381,14 @@ describe("L.lazy", () => {
 })
 
 describe("L.inverse", () => {
-  testEq('L.get(L.inverse(L.fromArrayBy("id")), undefined)', undefined)
-  testEq('L.get(L.inverse(L.fromArrayBy("id")), {a: {id: "a", x: 1}, b: {id: "b", x: 2}})', [{id: "a", x: 1}, {id: "b", x: 2}])
-  testEq('L.set([L.inverse(L.fromArrayBy("id")), 2], {id: "c", x: 3}, {a: {id: "a", x: 1}, b: {id: "b", x: 2}})', {a: {id: "a", x: 1}, b: {id: "b", x: 2}, c: {id: "c", x: 3}})
-  testEq('L.remove([L.inverse(L.fromArrayBy("id")), 0], {a: {id: "a", x: 1}, b: {id: "b", x: 2}})', {b: {id: "b", x: 2}})
-  testEq('L.remove([L.inverse(L.fromArrayBy("id")), 0], {a: {id: "a", x: 1}})', undefined)
+  testEq('L.get(L.inverse(offBy1), undefined)', undefined)
+  testEq('L.get(L.inverse(offBy1), 1)', 0)
+  testEq('L.getInverse(L.inverse(offBy1), 0)', 1)
+  testEq('L.remove(["x", L.inverse(offBy1)], {x:1})', undefined)
 })
 
 describe("L.branch", () => {
+  testEq('L.modify(L.branch({}), x => x+1, null)', null)
   testEq('L.modify(L.branch({}), x => x+1, "anything")', "anything")
   testEq('L.modify(L.branch({a: "x", b: [], c: 0, d: L.identity}), x => x+1, {a:{x:1},b:2,c:[3],d:4,extra:"one"})', {"a":{"x":2},"b":3,"c":[4],"d":5,extra:"one"})
   testEq('L.set(L.branch({a: ["x",0], b: []}), 0, null)', {a:{x:[0]},b:0})