Skip to content

Instantly share code, notes, and snippets.

@vorg
Last active November 9, 2016 12:02
Show Gist options
  • Select an option

  • Save vorg/7af5868ec4afbf1c5f073a6197d06ebe to your computer and use it in GitHub Desktop.

Select an option

Save vorg/7af5868ec4afbf1c5f073a6197d06ebe to your computer and use it in GitHub Desktop.
pull stream drag mouse test
const pull = require('pull-stream')
const log = require('pull-stream/sinks/log')
const filter = require('pull-stream/throughs/filter')
const take = require('pull-stream/throughs/take')
const containsPoint = require('pex-geom/Rect').containsPoint
const pushableStream = require('pull-pushable')
// Draw a red canvas with yellow "button" on the left
const btnRect = [[10, 10], [100, 100]]
const smallBtnRect = [[20, 20], [50, 50]]
function inRect (rect) {
return function (e) {
// TODO: curry this!
return containsPoint(rect, [e.clientX, e.clientY])
}
}
const canvas = document.createElement('canvas')
canvas.style.background = 'red'
document.body.appendChild(canvas)
const ctx = canvas.getContext('2d')
ctx.fillStyle = '#FFFF00'
ctx.fillRect(btnRect[0][0], btnRect[0][1], btnRect[1][0] - btnRect[0][0], btnRect[1][1] - btnRect[0][1])
ctx.fillStyle = '#00FF00'
ctx.fillRect(smallBtnRect[0][0], smallBtnRect[0][1], smallBtnRect[1][0] - smallBtnRect[0][0], smallBtnRect[1][1] - smallBtnRect[0][1])
function createEventStream(element, event) {
const events = pushableStream()
element.addEventListener(event, (e) => {
events.push(e)
})
return events
}
//read source and log it.
function logger (msg) {
return function (read) {
read(null, function next(end, data) {
if(end === true) return
if(end) throw end
console.log(msg, data)
read(null, next)
})
}
}
var mousedown = createEventStream(canvas, 'mousedown')
var mousemove = createEventStream(canvas, 'mousemove')
var mouseup = createEventStream(canvas, 'mouseup')
function makeDragStream(mousedown) {
const events = pushableStream()
pull(mousedown, pull.take(() => {}), pull.drain((e) => {
events.push(e)
}))
return events
}
//pull(mousedown, filter(inRect(btnRect)), logger('stream down'))
setTimeout(function(){
;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){
'use strict'
module.exports = function pull (a) {
var length = arguments.length
if (typeof a === 'function' && a.length === 1) {
var args = new Array(length)
for(var i = 0; i < length; i++)
args[i] = arguments[i]
return function (read) {
if (args == null) {
throw new TypeError("partial sink should only be called once!")
}
// Grab the reference after the check, because it's always an array now
// (engines like that kind of consistency).
var ref = args
args = null
// Prioritize common case of small number of pulls.
switch (length) {
case 1: return pull(read, ref[0])
case 2: return pull(read, ref[0], ref[1])
case 3: return pull(read, ref[0], ref[1], ref[2])
case 4: return pull(read, ref[0], ref[1], ref[2], ref[3])
default:
ref.unshift(read)
return pull.apply(null, ref)
}
}
}
var read = a
if (read && typeof read.source === 'function') {
read = read.source
}
for (var i = 1; i < length; i++) {
var s = arguments[i]
if (typeof s === 'function') {
read = s(read)
} else if (s && typeof s === 'object') {
s.sink(read)
read = s.source
}
}
return read
}
},{}],2:[function(require,module,exports){
'use strict'
var reduce = require('./reduce')
module.exports = function collect (cb) {
return reduce(function (arr, item) {
arr.push(item)
return arr
}, [], cb)
}
},{"./reduce":9}],3:[function(require,module,exports){
'use strict'
var reduce = require('./reduce')
module.exports = function concat (cb) {
return reduce(function (a, b) {
return a + b
}, '', cb)
}
},{"./reduce":9}],4:[function(require,module,exports){
'use strict'
module.exports = function drain (op, done) {
var read, abort
function sink (_read) {
read = _read
if(abort) return sink.abort()
//this function is much simpler to write if you
//just use recursion, but by using a while loop
//we do not blow the stack if the stream happens to be sync.
;(function next() {
var loop = true, cbed = false
while(loop) {
cbed = false
read(null, function (end, data) {
cbed = true
if(end = end || abort) {
loop = false
if(done) done(end === true ? null : end)
else if(end && end !== true)
throw end
}
else if(op && false === op(data) || abort) {
loop = false
read(abort || true, done || function () {})
}
else if(!loop){
next()
}
})
if(!cbed) {
loop = false
return
}
}
})()
}
sink.abort = function (err, cb) {
if('function' == typeof err)
cb = err, err = true
abort = err || true
if(read) return read(abort, cb || function () {})
}
return sink
}
},{}],5:[function(require,module,exports){
'use strict'
function id (e) { return e }
var prop = require('../util/prop')
var drain = require('./drain')
module.exports = function find (test, cb) {
var ended = false
if(!cb)
cb = test, test = id
else
test = prop(test) || id
return drain(function (data) {
if(test(data)) {
ended = true
cb(null, data)
return false
}
}, function (err) {
if(ended) return //already called back
cb(err === true ? null : err, null)
})
}
},{"../util/prop":29,"./drain":4}],6:[function(require,module,exports){
'use strict'
module.exports = {
drain: require('./drain'),
onEnd: require('./on-end'),
log: require('./log'),
find: require('./find'),
reduce: require('./reduce'),
collect: require('./collect'),
concat: require('./concat')
}
},{"./collect":2,"./concat":3,"./drain":4,"./find":5,"./log":7,"./on-end":8,"./reduce":9}],7:[function(require,module,exports){
'use strict'
var drain = require('./drain')
module.exports = function log (done) {
return drain(function (data) {
console.log(data)
}, done)
}
},{"./drain":4}],8:[function(require,module,exports){
'use strict'
var drain = require('./drain')
module.exports = function onEnd (done) {
return drain(null, done)
}
},{"./drain":4}],9:[function(require,module,exports){
'use strict'
var drain = require('./drain')
module.exports = function reduce (reducer, acc, cb ) {
if(!cb) cb = acc, acc = null
var sink = drain(function (data) {
acc = reducer(acc, data)
}, function (err) {
cb(err, acc)
})
if (arguments.length === 2)
return function (source) {
source(null, function (end, data) {
//if ended immediately, and no initial...
if(end) return cb(end === true ? null : end)
acc = data; sink(source)
})
}
else
return sink
}
},{"./drain":4}],10:[function(require,module,exports){
'use strict'
module.exports = function count (max) {
var i = 0; max = max || Infinity
return function (end, cb) {
if(end) return cb && cb(end)
if(i > max)
return cb(true)
cb(null, i++)
}
}
},{}],11:[function(require,module,exports){
'use strict'
//a stream that ends immediately.
module.exports = function empty () {
return function (abort, cb) {
cb(true)
}
}
},{}],12:[function(require,module,exports){
'use strict'
//a stream that errors immediately.
module.exports = function error (err) {
return function (abort, cb) {
cb(err)
}
}
},{}],13:[function(require,module,exports){
'use strict'
module.exports = {
keys: require('./keys'),
once: require('./once'),
values: require('./values'),
count: require('./count'),
infinite: require('./infinite'),
empty: require('./empty'),
error: require('./error')
}
},{"./count":10,"./empty":11,"./error":12,"./infinite":14,"./keys":15,"./once":16,"./values":17}],14:[function(require,module,exports){
'use strict'
module.exports = function infinite (generate) {
generate = generate || Math.random
return function (end, cb) {
if(end) return cb && cb(end)
return cb(null, generate())
}
}
},{}],15:[function(require,module,exports){
'use strict'
var values = require('./values')
module.exports = function (object) {
return values(Object.keys(object))
}
},{"./values":17}],16:[function(require,module,exports){
'use strict'
var abortCb = require('../util/abort-cb')
module.exports = function once (value, onAbort) {
return function (abort, cb) {
if(abort)
return abortCb(cb, abort, onAbort)
if(value != null) {
var _value = value; value = null
cb(null, _value)
} else
cb(true)
}
}
},{"../util/abort-cb":28}],17:[function(require,module,exports){
'use strict'
var abortCb = require('../util/abort-cb')
module.exports = function values (array, onAbort) {
if(!array)
return function (abort, cb) {
if(abort) return abortCb(cb, abort, onAbort)
return cb(true)
}
if(!Array.isArray(array))
array = Object.keys(array).map(function (k) {
return array[k]
})
var i = 0
return function (abort, cb) {
if(abort)
return abortCb(cb, abort, onAbort)
if(i >= array.length)
cb(true)
else
cb(null, array[i++])
}
}
},{"../util/abort-cb":28}],18:[function(require,module,exports){
'use strict'
function id (e) { return e }
var prop = require('../util/prop')
module.exports = function asyncMap (map) {
if(!map) return id
map = prop(map)
var busy = false, abortCb, aborted
return function (read) {
return function next (abort, cb) {
if(aborted) return cb(aborted)
if(abort) {
aborted = abort
if(!busy) read(abort, cb)
else read(abort, function () {
//if we are still busy, wait for the mapper to complete.
if(busy) abortCb = cb
else cb(abort)
})
}
else
read(null, function (end, data) {
if(end) cb(end)
else if(aborted) cb(aborted)
else {
busy = true
map(data, function (err, data) {
busy = false
if(aborted) {
cb(aborted)
abortCb(aborted)
}
else if(err) next (err, cb)
else cb(null, data)
})
}
})
}
}
}
},{"../util/prop":29}],19:[function(require,module,exports){
'use strict'
var tester = require('../util/tester')
var filter = require('./filter')
module.exports = function filterNot (test) {
test = tester(test)
return filter(function (data) { return !test(data) })
}
},{"../util/tester":30,"./filter":20}],20:[function(require,module,exports){
'use strict'
var tester = require('../util/tester')
module.exports = function filter (test) {
//regexp
test = tester(test)
return function (read) {
return function next (end, cb) {
var sync, loop = true
while(loop) {
loop = false
sync = true
read(end, function (end, data) {
if(!end && !test(data))
return sync ? loop = true : next(end, cb)
cb(end, data)
})
sync = false
}
}
}
}
},{"../util/tester":30}],21:[function(require,module,exports){
'use strict'
var values = require('../sources/values')
var once = require('../sources/once')
//convert a stream of arrays or streams into just a stream.
module.exports = function flatten () {
return function (read) {
var _read
return function (abort, cb) {
if (abort) { //abort the current stream, and then stream of streams.
_read ? _read(abort, function(err) {
read(err || abort, cb)
}) : read(abort, cb)
}
else if(_read) nextChunk()
else nextStream()
function nextChunk () {
_read(null, function (err, data) {
if (err === true) nextStream()
else if (err) {
read(true, function(abortErr) {
// TODO: what do we do with the abortErr?
cb(err)
})
}
else cb(null, data)
})
}
function nextStream () {
_read = null
read(null, function (end, stream) {
if(end)
return cb(end)
if(Array.isArray(stream) || stream && 'object' === typeof stream)
stream = values(stream)
else if('function' != typeof stream)
stream = once(stream)
_read = stream
nextChunk()
})
}
}
}
}
},{"../sources/once":16,"../sources/values":17}],22:[function(require,module,exports){
'use strict'
module.exports = {
map: require('./map'),
asyncMap: require('./async-map'),
filter: require('./filter'),
filterNot: require('./filter-not'),
through: require('./through'),
take: require('./take'),
unique: require('./unique'),
nonUnique: require('./non-unique'),
flatten: require('./flatten')
}
},{"./async-map":18,"./filter":20,"./filter-not":19,"./flatten":21,"./map":23,"./non-unique":24,"./take":25,"./through":26,"./unique":27}],23:[function(require,module,exports){
'use strict'
function id (e) { return e }
var prop = require('../util/prop')
module.exports = function map (mapper) {
if(!mapper) return id
mapper = prop(mapper)
return function (read) {
return function (abort, cb) {
read(abort, function (end, data) {
try {
data = !end ? mapper(data) : null
} catch (err) {
return read(err, function () {
return cb(err)
})
}
cb(end, data)
})
}
}
}
},{"../util/prop":29}],24:[function(require,module,exports){
'use strict'
var unique = require('./unique')
//passes an item through when you see it for the second time.
module.exports = function nonUnique (field) {
return unique(field, true)
}
},{"./unique":27}],25:[function(require,module,exports){
'use strict'
//read a number of items and then stop.
module.exports = function take (test, opts) {
opts = opts || {}
var last = opts.last || false // whether the first item for which !test(item) should still pass
var ended = false
if('number' === typeof test) {
last = true
var n = test; test = function () {
return --n
}
}
return function (read) {
function terminate (cb) {
read(true, function (err) {
last = false; cb(err || true)
})
}
return function (end, cb) {
if(ended) last ? terminate(cb) : cb(ended)
else if(ended = end) read(ended, cb)
else
read(null, function (end, data) {
if(ended = ended || end) {
//last ? terminate(cb) :
cb(ended)
}
else if(!test(data)) {
ended = true
last ? cb(null, data) : terminate(cb)
}
else
cb(null, data)
})
}
}
}
},{}],26:[function(require,module,exports){
'use strict'
//a pass through stream that doesn't change the value.
module.exports = function through (op, onEnd) {
var a = false
function once (abort) {
if(a || !onEnd) return
a = true
onEnd(abort === true ? null : abort)
}
return function (read) {
return function (end, cb) {
if(end) once(end)
return read(end, function (end, data) {
if(!end) op && op(data)
else once(end)
cb(end, data)
})
}
}
}
},{}],27:[function(require,module,exports){
'use strict'
function id (e) { return e }
var prop = require('../util/prop')
var filter = require('./filter')
//drop items you have already seen.
module.exports = function unique (field, invert) {
field = prop(field) || id
var seen = {}
return filter(function (data) {
var key = field(data)
if(seen[key]) return !!invert //false, by default
else seen[key] = true
return !invert //true by default
})
}
},{"../util/prop":29,"./filter":20}],28:[function(require,module,exports){
module.exports = function abortCb(cb, abort, onAbort) {
cb(abort)
onAbort && onAbort(abort === true ? null: abort)
return
}
},{}],29:[function(require,module,exports){
module.exports = function prop (key) {
return key && (
'string' == typeof key
? function (data) { return data[key] }
: 'object' === typeof key && 'function' === typeof key.exec //regexp
? function (data) { var v = key.exec(data); return v && v[0] }
: key
)
}
},{}],30:[function(require,module,exports){
var prop = require('./prop')
function id (e) { return e }
module.exports = function tester (test) {
return (
'object' === typeof test && 'function' === typeof test.test //regexp
? function (data) { return test.test(data) }
: prop (test) || id
)
}
},{"./prop":29}],"pull-stream":[function(require,module,exports){
'use strict'
var sources = require('./sources')
var sinks = require('./sinks')
var throughs = require('./throughs')
exports = module.exports = require('./pull')
for(var k in sources)
exports[k] = sources[k]
for(var k in throughs)
exports[k] = throughs[k]
for(var k in sinks)
exports[k] = sinks[k]
},{"./pull":1,"./sinks":6,"./sources":13,"./throughs":22}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInB1bGwuanMiLCJzaW5rcy9jb2xsZWN0LmpzIiwic2lua3MvY29uY2F0LmpzIiwic2lua3MvZHJhaW4uanMiLCJzaW5rcy9maW5kLmpzIiwic2lua3MvaW5kZXguanMiLCJzaW5rcy9sb2cuanMiLCJzaW5rcy9vbi1lbmQuanMiLCJzaW5rcy9yZWR1Y2UuanMiLCJzb3VyY2VzL2NvdW50LmpzIiwic291cmNlcy9lbXB0eS5qcyIsInNvdXJjZXMvZXJyb3IuanMiLCJzb3VyY2VzL2luZGV4LmpzIiwic291cmNlcy9pbmZpbml0ZS5qcyIsInNvdXJjZXMva2V5cy5qcyIsInNvdXJjZXMvb25jZS5qcyIsInNvdXJjZXMvdmFsdWVzLmpzIiwidGhyb3VnaHMvYXN5bmMtbWFwLmpzIiwidGhyb3VnaHMvZmlsdGVyLW5vdC5qcyIsInRocm91Z2hzL2ZpbHRlci5qcyIsInRocm91Z2hzL2ZsYXR0ZW4uanMiLCJ0aHJvdWdocy9pbmRleC5qcyIsInRocm91Z2hzL21hcC5qcyIsInRocm91Z2hzL25vbi11bmlxdWUuanMiLCJ0aHJvdWdocy90YWtlLmpzIiwidGhyb3VnaHMvdGhyb3VnaC5qcyIsInRocm91Z2hzL3VuaXF1ZS5qcyIsInV0aWwvYWJvcnQtY2IuanMiLCJ1dGlsL3Byb3AuanMiLCJ1dGlsL3Rlc3Rlci5qcyIsImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHB1bGwgKGEpIHtcbiAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgaWYgKHR5cGVvZiBhID09PSAnZnVuY3Rpb24nICYmIGEubGVuZ3RoID09PSAxKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuZ3RoKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV1cbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInBhcnRpYWwgc2luayBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSFcIilcbiAgICAgIH1cblxuICAgICAgLy8gR3JhYiB0aGUgcmVmZXJlbmNlIGFmdGVyIHRoZSBjaGVjaywgYmVjYXVzZSBpdCdzIGFsd2F5cyBhbiBhcnJheSBub3dcbiAgICAgIC8vIChlbmdpbmVzIGxpa2UgdGhhdCBraW5kIG9mIGNvbnNpc3RlbmN5KS5cbiAgICAgIHZhciByZWYgPSBhcmdzXG4gICAgICBhcmdzID0gbnVsbFxuXG4gICAgICAvLyBQcmlvcml0aXplIGNvbW1vbiBjYXNlIG9mIHNtYWxsIG51bWJlciBvZiBwdWxscy5cbiAgICAgIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiBwdWxsKHJlYWQsIHJlZlswXSlcbiAgICAgIGNhc2UgMjogcmV0dXJuIHB1bGwocmVhZCwgcmVmWzBdLCByZWZbMV0pXG4gICAgICBjYXNlIDM6IHJldHVybiBwdWxsKHJlYWQsIHJlZlswXSwgcmVmWzFdLCByZWZbMl0pXG4gICAgICBjYXNlIDQ6IHJldHVybiBwdWxsKHJlYWQsIHJlZlswXSwgcmVmWzFdLCByZWZbMl0sIHJlZlszXSlcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJlZi51bnNoaWZ0KHJlYWQpXG4gICAgICAgIHJldHVybiBwdWxsLmFwcGx5KG51bGwsIHJlZilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcmVhZCA9IGFcblxuICBpZiAocmVhZCAmJiB0eXBlb2YgcmVhZC5zb3VyY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZWFkID0gcmVhZC5zb3VyY2VcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcyA9IGFyZ3VtZW50c1tpXVxuICAgIGlmICh0eXBlb2YgcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVhZCA9IHMocmVhZClcbiAgICB9IGVsc2UgaWYgKHMgJiYgdHlwZW9mIHMgPT09ICdvYmplY3QnKSB7XG4gICAgICBzLnNpbmsocmVhZClcbiAgICAgIHJlYWQgPSBzLnNvdXJjZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkXG59XG4iLCIndXNlIHN0cmljdCdcblxudmFyIHJlZHVjZSA9IHJlcXVpcmUoJy4vcmVkdWNlJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb2xsZWN0IChjYikge1xuICByZXR1cm4gcmVkdWNlKGZ1bmN0aW9uIChhcnIsIGl0ZW0pIHtcbiAgICBhcnIucHVzaChpdGVtKVxuICAgIHJldHVybiBhcnJcbiAgfSwgW10sIGNiKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29uY2F0IChjYikge1xuICByZXR1cm4gcmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEgKyBiXG4gIH0sICcnLCBjYilcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRyYWluIChvcCwgZG9uZSkge1xuICB2YXIgcmVhZCwgYWJvcnRcblxuICBmdW5jdGlvbiBzaW5rIChfcmVhZCkge1xuICAgIHJlYWQgPSBfcmVhZFxuICAgIGlmKGFib3J0KSByZXR1cm4gc2luay5hYm9ydCgpXG4gICAgLy90aGlzIGZ1bmN0aW9uIGlzIG11Y2ggc2ltcGxlciB0byB3cml0ZSBpZiB5b3VcbiAgICAvL2p1c3QgdXNlIHJlY3Vyc2lvbiwgYnV0IGJ5IHVzaW5nIGEgd2hpbGUgbG9vcFxuICAgIC8vd2UgZG8gbm90IGJsb3cgdGhlIHN0YWNrIGlmIHRoZSBzdHJlYW0gaGFwcGVucyB0byBiZSBzeW5jLlxuICAgIDsoZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgdmFyIGxvb3AgPSB0cnVlLCBjYmVkID0gZmFsc2VcbiAgICAgICAgd2hpbGUobG9vcCkge1xuICAgICAgICAgIGNiZWQgPSBmYWxzZVxuICAgICAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgICAgY2JlZCA9IHRydWVcbiAgICAgICAgICAgIGlmKGVuZCA9IGVuZCB8fCBhYm9ydCkge1xuICAgICAgICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgICAgICAgaWYoZG9uZSkgZG9uZShlbmQgPT09IHRydWUgPyBudWxsIDogZW5kKVxuICAgICAgICAgICAgICBlbHNlIGlmKGVuZCAmJiBlbmQgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgdGhyb3cgZW5kXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKG9wICYmIGZhbHNlID09PSBvcChkYXRhKSB8fCBhYm9ydCkge1xuICAgICAgICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgICAgICAgcmVhZChhYm9ydCB8fCB0cnVlLCBkb25lIHx8IGZ1bmN0aW9uICgpIHt9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZighbG9vcCl7XG4gICAgICAgICAgICAgIG5leHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYoIWNiZWQpIHtcbiAgICAgICAgICAgIGxvb3AgPSBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gIH1cblxuICBzaW5rLmFib3J0ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgICBpZignZnVuY3Rpb24nID09IHR5cGVvZiBlcnIpXG4gICAgICBjYiA9IGVyciwgZXJyID0gdHJ1ZVxuICAgIGFib3J0ID0gZXJyIHx8IHRydWVcbiAgICBpZihyZWFkKSByZXR1cm4gcmVhZChhYm9ydCwgY2IgfHwgZnVuY3Rpb24gKCkge30pXG4gIH1cblxuICByZXR1cm4gc2lua1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIGlkIChlKSB7IHJldHVybiBlIH1cbnZhciBwcm9wID0gcmVxdWlyZSgnLi4vdXRpbC9wcm9wJylcbnZhciBkcmFpbiA9IHJlcXVpcmUoJy4vZHJhaW4nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbmQgKHRlc3QsIGNiKSB7XG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCFjYilcbiAgICBjYiA9IHRlc3QsIHRlc3QgPSBpZFxuICBlbHNlXG4gICAgdGVzdCA9IHByb3AodGVzdCkgfHwgaWRcblxuICByZXR1cm4gZHJhaW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZih0ZXN0KGRhdGEpKSB7XG4gICAgICBlbmRlZCA9IHRydWVcbiAgICAgIGNiKG51bGwsIGRhdGEpXG4gICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYoZW5kZWQpIHJldHVybiAvL2FscmVhZHkgY2FsbGVkIGJhY2tcbiAgICBjYihlcnIgPT09IHRydWUgPyBudWxsIDogZXJyLCBudWxsKVxuICB9KVxufVxuXG5cblxuXG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRyYWluOiByZXF1aXJlKCcuL2RyYWluJyksXG4gIG9uRW5kOiByZXF1aXJlKCcuL29uLWVuZCcpLFxuICBsb2c6IHJlcXVpcmUoJy4vbG9nJyksXG4gIGZpbmQ6IHJlcXVpcmUoJy4vZmluZCcpLFxuICByZWR1Y2U6IHJlcXVpcmUoJy4vcmVkdWNlJyksXG4gIGNvbGxlY3Q6IHJlcXVpcmUoJy4vY29sbGVjdCcpLFxuICBjb25jYXQ6IHJlcXVpcmUoJy4vY29uY2F0Jylcbn1cblxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBkcmFpbiA9IHJlcXVpcmUoJy4vZHJhaW4nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGxvZyAoZG9uZSkge1xuICByZXR1cm4gZHJhaW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBjb25zb2xlLmxvZyhkYXRhKVxuICB9LCBkb25lKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBkcmFpbiA9IHJlcXVpcmUoJy4vZHJhaW4nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG9uRW5kIChkb25lKSB7XG4gIHJldHVybiBkcmFpbihudWxsLCBkb25lKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBkcmFpbiA9IHJlcXVpcmUoJy4vZHJhaW4nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlZHVjZSAocmVkdWNlciwgYWNjLCBjYiApIHtcbiAgaWYoIWNiKSBjYiA9IGFjYywgYWNjID0gbnVsbFxuICB2YXIgc2luayA9IGRyYWluKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgYWNjID0gcmVkdWNlcihhY2MsIGRhdGEpXG4gIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBjYihlcnIsIGFjYylcbiAgfSlcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHNvdXJjZShudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgIC8vaWYgZW5kZWQgaW1tZWRpYXRlbHksIGFuZCBubyBpbml0aWFsLi4uXG4gICAgICAgIGlmKGVuZCkgcmV0dXJuIGNiKGVuZCA9PT0gdHJ1ZSA/IG51bGwgOiBlbmQpXG4gICAgICAgIGFjYyA9IGRhdGE7IHNpbmsoc291cmNlKVxuICAgICAgfSlcbiAgICB9XG4gIGVsc2VcbiAgICByZXR1cm4gc2lua1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY291bnQgKG1heCkge1xuICB2YXIgaSA9IDA7IG1heCA9IG1heCB8fCBJbmZpbml0eVxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiBjYiAmJiBjYihlbmQpXG4gICAgaWYoaSA+IG1heClcbiAgICAgIHJldHVybiBjYih0cnVlKVxuICAgIGNiKG51bGwsIGkrKylcbiAgfVxufVxuXG5cbiIsIid1c2Ugc3RyaWN0J1xuLy9hIHN0cmVhbSB0aGF0IGVuZHMgaW1tZWRpYXRlbHkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVtcHR5ICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBjYih0cnVlKVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcbi8vYSBzdHJlYW0gdGhhdCBlcnJvcnMgaW1tZWRpYXRlbHkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVycm9yIChlcnIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBjYihlcnIpXG4gIH1cbn1cblxuIiwiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga2V5czogcmVxdWlyZSgnLi9rZXlzJyksXG4gIG9uY2U6IHJlcXVpcmUoJy4vb25jZScpLFxuICB2YWx1ZXM6IHJlcXVpcmUoJy4vdmFsdWVzJyksXG4gIGNvdW50OiByZXF1aXJlKCcuL2NvdW50JyksXG4gIGluZmluaXRlOiByZXF1aXJlKCcuL2luZmluaXRlJyksXG4gIGVtcHR5OiByZXF1aXJlKCcuL2VtcHR5JyksXG4gIGVycm9yOiByZXF1aXJlKCcuL2Vycm9yJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZpbml0ZSAoZ2VuZXJhdGUpIHtcbiAgZ2VuZXJhdGUgPSBnZW5lcmF0ZSB8fCBNYXRoLnJhbmRvbVxuICByZXR1cm4gZnVuY3Rpb24gKGVuZCwgY2IpIHtcbiAgICBpZihlbmQpIHJldHVybiBjYiAmJiBjYihlbmQpXG4gICAgcmV0dXJuIGNiKG51bGwsIGdlbmVyYXRlKCkpXG4gIH1cbn1cblxuXG4iLCIndXNlIHN0cmljdCdcbnZhciB2YWx1ZXMgPSByZXF1aXJlKCcuL3ZhbHVlcycpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgcmV0dXJuIHZhbHVlcyhPYmplY3Qua2V5cyhvYmplY3QpKVxufVxuXG5cbiIsIid1c2Ugc3RyaWN0J1xudmFyIGFib3J0Q2IgPSByZXF1aXJlKCcuLi91dGlsL2Fib3J0LWNiJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvbmNlICh2YWx1ZSwgb25BYm9ydCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGFib3J0LCBjYikge1xuICAgIGlmKGFib3J0KVxuICAgICAgcmV0dXJuIGFib3J0Q2IoY2IsIGFib3J0LCBvbkFib3J0KVxuICAgIGlmKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhciBfdmFsdWUgPSB2YWx1ZTsgdmFsdWUgPSBudWxsXG4gICAgICBjYihudWxsLCBfdmFsdWUpXG4gICAgfSBlbHNlXG4gICAgICBjYih0cnVlKVxuICB9XG59XG5cblxuIiwiJ3VzZSBzdHJpY3QnXG52YXIgYWJvcnRDYiA9IHJlcXVpcmUoJy4uL3V0aWwvYWJvcnQtY2InKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbHVlcyAoYXJyYXksIG9uQWJvcnQpIHtcbiAgaWYoIWFycmF5KVxuICAgIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgICBpZihhYm9ydCkgcmV0dXJuIGFib3J0Q2IoY2IsIGFib3J0LCBvbkFib3J0KVxuICAgICAgcmV0dXJuIGNiKHRydWUpXG4gICAgfVxuICBpZighQXJyYXkuaXNBcnJheShhcnJheSkpXG4gICAgYXJyYXkgPSBPYmplY3Qua2V5cyhhcnJheSkubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gYXJyYXlba11cbiAgICB9KVxuICB2YXIgaSA9IDBcbiAgcmV0dXJuIGZ1bmN0aW9uIChhYm9ydCwgY2IpIHtcbiAgICBpZihhYm9ydClcbiAgICAgIHJldHVybiBhYm9ydENiKGNiLCBhYm9ydCwgb25BYm9ydClcbiAgICBpZihpID49IGFycmF5Lmxlbmd0aClcbiAgICAgIGNiKHRydWUpXG4gICAgZWxzZVxuICAgICAgY2IobnVsbCwgYXJyYXlbaSsrXSlcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIGlkIChlKSB7IHJldHVybiBlIH1cbnZhciBwcm9wID0gcmVxdWlyZSgnLi4vdXRpbC9wcm9wJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhc3luY01hcCAobWFwKSB7XG4gIGlmKCFtYXApIHJldHVybiBpZFxuICBtYXAgPSBwcm9wKG1hcClcbiAgdmFyIGJ1c3kgPSBmYWxzZSwgYWJvcnRDYiwgYWJvcnRlZFxuICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoYWJvcnQsIGNiKSB7XG4gICAgICBpZihhYm9ydGVkKSByZXR1cm4gY2IoYWJvcnRlZClcbiAgICAgIGlmKGFib3J0KSB7XG4gICAgICAgIGFib3J0ZWQgPSBhYm9ydFxuICAgICAgICBpZighYnVzeSkgcmVhZChhYm9ydCwgY2IpXG4gICAgICAgIGVsc2UgcmVhZChhYm9ydCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vaWYgd2UgYXJlIHN0aWxsIGJ1c3ksIHdhaXQgZm9yIHRoZSBtYXBwZXIgdG8gY29tcGxldGUuXG4gICAgICAgICAgaWYoYnVzeSkgYWJvcnRDYiA9IGNiXG4gICAgICAgICAgZWxzZSBjYihhYm9ydClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgcmVhZChudWxsLCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgICAgaWYoZW5kKSBjYihlbmQpXG4gICAgICAgICAgZWxzZSBpZihhYm9ydGVkKSBjYihhYm9ydGVkKVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVzeSA9IHRydWVcbiAgICAgICAgICAgIG1hcChkYXRhLCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgICAgICAgIGJ1c3kgPSBmYWxzZVxuICAgICAgICAgICAgICBpZihhYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgY2IoYWJvcnRlZClcbiAgICAgICAgICAgICAgICBhYm9ydENiKGFib3J0ZWQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZihlcnIpIG5leHQgKGVyciwgY2IpXG4gICAgICAgICAgICAgIGVsc2UgY2IobnVsbCwgZGF0YSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5cbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgdGVzdGVyID0gcmVxdWlyZSgnLi4vdXRpbC90ZXN0ZXInKVxudmFyIGZpbHRlciA9IHJlcXVpcmUoJy4vZmlsdGVyJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWx0ZXJOb3QgKHRlc3QpIHtcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiAhdGVzdChkYXRhKSB9KVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciB0ZXN0ZXIgPSByZXF1aXJlKCcuLi91dGlsL3Rlc3RlcicpXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZmlsdGVyICh0ZXN0KSB7XG4gIC8vcmVnZXhwXG4gIHRlc3QgPSB0ZXN0ZXIodGVzdClcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZWFkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQgKGVuZCwgY2IpIHtcbiAgICAgIHZhciBzeW5jLCBsb29wID0gdHJ1ZVxuICAgICAgd2hpbGUobG9vcCkge1xuICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgc3luYyA9IHRydWVcbiAgICAgICAgcmVhZChlbmQsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgICBpZighZW5kICYmICF0ZXN0KGRhdGEpKVxuICAgICAgICAgICAgcmV0dXJuIHN5bmMgPyBsb29wID0gdHJ1ZSA6IG5leHQoZW5kLCBjYilcbiAgICAgICAgICBjYihlbmQsIGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIHN5bmMgPSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4iLCIndXNlIHN0cmljdCdcblxudmFyIHZhbHVlcyA9IHJlcXVpcmUoJy4uL3NvdXJjZXMvdmFsdWVzJylcbnZhciBvbmNlID0gcmVxdWlyZSgnLi4vc291cmNlcy9vbmNlJylcblxuLy9jb252ZXJ0IGEgc3RyZWFtIG9mIGFycmF5cyBvciBzdHJlYW1zIGludG8ganVzdCBhIHN0cmVhbS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZmxhdHRlbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHZhciBfcmVhZFxuICAgIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgICBpZiAoYWJvcnQpIHsgLy9hYm9ydCB0aGUgY3VycmVudCBzdHJlYW0sIGFuZCB0aGVuIHN0cmVhbSBvZiBzdHJlYW1zLlxuICAgICAgICBfcmVhZCA/IF9yZWFkKGFib3J0LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICByZWFkKGVyciB8fCBhYm9ydCwgY2IpXG4gICAgICAgIH0pIDogcmVhZChhYm9ydCwgY2IpXG4gICAgICB9XG4gICAgICBlbHNlIGlmKF9yZWFkKSBuZXh0Q2h1bmsoKVxuICAgICAgZWxzZSBuZXh0U3RyZWFtKClcblxuICAgICAgZnVuY3Rpb24gbmV4dENodW5rICgpIHtcbiAgICAgICAgX3JlYWQobnVsbCwgZnVuY3Rpb24gKGVyciwgZGF0YSkge1xuICAgICAgICAgIGlmIChlcnIgPT09IHRydWUpIG5leHRTdHJlYW0oKVxuICAgICAgICAgIGVsc2UgaWYgKGVycikge1xuICAgICAgICAgICAgcmVhZCh0cnVlLCBmdW5jdGlvbihhYm9ydEVycikge1xuICAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IGRvIHdlIGRvIHdpdGggdGhlIGFib3J0RXJyP1xuICAgICAgICAgICAgICBjYihlcnIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGNiKG51bGwsIGRhdGEpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBuZXh0U3RyZWFtICgpIHtcbiAgICAgICAgX3JlYWQgPSBudWxsXG4gICAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgc3RyZWFtKSB7XG4gICAgICAgICAgaWYoZW5kKVxuICAgICAgICAgICAgcmV0dXJuIGNiKGVuZClcbiAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHN0cmVhbSkgfHwgc3RyZWFtICYmICdvYmplY3QnID09PSB0eXBlb2Ygc3RyZWFtKVxuICAgICAgICAgICAgc3RyZWFtID0gdmFsdWVzKHN0cmVhbSlcbiAgICAgICAgICBlbHNlIGlmKCdmdW5jdGlvbicgIT0gdHlwZW9mIHN0cmVhbSlcbiAgICAgICAgICAgIHN0cmVhbSA9IG9uY2Uoc3RyZWFtKVxuICAgICAgICAgIF9yZWFkID0gc3RyZWFtXG4gICAgICAgICAgbmV4dENodW5rKClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtYXA6IHJlcXVpcmUoJy4vbWFwJyksXG4gIGFzeW5jTWFwOiByZXF1aXJlKCcuL2FzeW5jLW1hcCcpLFxuICBmaWx0ZXI6IHJlcXVpcmUoJy4vZmlsdGVyJyksXG4gIGZpbHRlck5vdDogcmVxdWlyZSgnLi9maWx0ZXItbm90JyksXG4gIHRocm91Z2g6IHJlcXVpcmUoJy4vdGhyb3VnaCcpLFxuICB0YWtlOiByZXF1aXJlKCcuL3Rha2UnKSxcbiAgdW5pcXVlOiByZXF1aXJlKCcuL3VuaXF1ZScpLFxuICBub25VbmlxdWU6IHJlcXVpcmUoJy4vbm9uLXVuaXF1ZScpLFxuICBmbGF0dGVuOiByZXF1aXJlKCcuL2ZsYXR0ZW4nKVxufVxuXG5cblxuIiwiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIGlkIChlKSB7IHJldHVybiBlIH1cbnZhciBwcm9wID0gcmVxdWlyZSgnLi4vdXRpbC9wcm9wJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtYXAgKG1hcHBlcikge1xuICBpZighbWFwcGVyKSByZXR1cm4gaWRcbiAgbWFwcGVyID0gcHJvcChtYXBwZXIpXG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYWJvcnQsIGNiKSB7XG4gICAgICByZWFkKGFib3J0LCBmdW5jdGlvbiAoZW5kLCBkYXRhKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSAhZW5kID8gbWFwcGVyKGRhdGEpIDogbnVsbFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVhZChlcnIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYihlcnIpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBjYihlbmQsIGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciB1bmlxdWUgPSByZXF1aXJlKCcuL3VuaXF1ZScpXG5cbi8vcGFzc2VzIGFuIGl0ZW0gdGhyb3VnaCB3aGVuIHlvdSBzZWUgaXQgZm9yIHRoZSBzZWNvbmQgdGltZS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9uVW5pcXVlIChmaWVsZCkge1xuICByZXR1cm4gdW5pcXVlKGZpZWxkLCB0cnVlKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vcmVhZCBhIG51bWJlciBvZiBpdGVtcyBhbmQgdGhlbiBzdG9wLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0YWtlICh0ZXN0LCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIHZhciBsYXN0ID0gb3B0cy5sYXN0IHx8IGZhbHNlIC8vIHdoZXRoZXIgdGhlIGZpcnN0IGl0ZW0gZm9yIHdoaWNoICF0ZXN0KGl0ZW0pIHNob3VsZCBzdGlsbCBwYXNzXG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCdudW1iZXInID09PSB0eXBlb2YgdGVzdCkge1xuICAgIGxhc3QgPSB0cnVlXG4gICAgdmFyIG4gPSB0ZXN0OyB0ZXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIC0tblxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuXG4gICAgZnVuY3Rpb24gdGVybWluYXRlIChjYikge1xuICAgICAgcmVhZCh0cnVlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGxhc3QgPSBmYWxzZTsgY2IoZXJyIHx8IHRydWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgICAgaWYoZW5kZWQpICAgICAgICAgICAgbGFzdCA/IHRlcm1pbmF0ZShjYikgOiBjYihlbmRlZClcbiAgICAgIGVsc2UgaWYoZW5kZWQgPSBlbmQpIHJlYWQoZW5kZWQsIGNiKVxuICAgICAgZWxzZVxuICAgICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkge1xuICAgICAgICAgICAgLy9sYXN0ID8gdGVybWluYXRlKGNiKSA6XG4gICAgICAgICAgICBjYihlbmRlZClcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighdGVzdChkYXRhKSkge1xuICAgICAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgICAgICBsYXN0ID8gY2IobnVsbCwgZGF0YSkgOiB0ZXJtaW5hdGUoY2IpXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxuLy9hIHBhc3MgdGhyb3VnaCBzdHJlYW0gdGhhdCBkb2Vzbid0IGNoYW5nZSB0aGUgdmFsdWUuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRocm91Z2ggKG9wLCBvbkVuZCkge1xuICB2YXIgYSA9IGZhbHNlXG5cbiAgZnVuY3Rpb24gb25jZSAoYWJvcnQpIHtcbiAgICBpZihhIHx8ICFvbkVuZCkgcmV0dXJuXG4gICAgYSA9IHRydWVcbiAgICBvbkVuZChhYm9ydCA9PT0gdHJ1ZSA/IG51bGwgOiBhYm9ydClcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgICAgaWYoZW5kKSBvbmNlKGVuZClcbiAgICAgIHJldHVybiByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICBpZighZW5kKSBvcCAmJiBvcChkYXRhKVxuICAgICAgICBlbHNlIG9uY2UoZW5kKVxuICAgICAgICBjYihlbmQsIGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmZ1bmN0aW9uIGlkIChlKSB7IHJldHVybiBlIH1cbnZhciBwcm9wID0gcmVxdWlyZSgnLi4vdXRpbC9wcm9wJylcbnZhciBmaWx0ZXIgPSByZXF1aXJlKCcuL2ZpbHRlcicpXG5cbi8vZHJvcCBpdGVtcyB5b3UgaGF2ZSBhbHJlYWR5IHNlZW4uXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHVuaXF1ZSAoZmllbGQsIGludmVydCkge1xuICBmaWVsZCA9IHByb3AoZmllbGQpIHx8IGlkXG4gIHZhciBzZWVuID0ge31cbiAgcmV0dXJuIGZpbHRlcihmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBrZXkgPSBmaWVsZChkYXRhKVxuICAgIGlmKHNlZW5ba2V5XSkgcmV0dXJuICEhaW52ZXJ0IC8vZmFsc2UsIGJ5IGRlZmF1bHRcbiAgICBlbHNlIHNlZW5ba2V5XSA9IHRydWVcbiAgICByZXR1cm4gIWludmVydCAvL3RydWUgYnkgZGVmYXVsdFxuICB9KVxufVxuXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFib3J0Q2IoY2IsIGFib3J0LCBvbkFib3J0KSB7XG4gIGNiKGFib3J0KVxuICBvbkFib3J0ICYmIG9uQWJvcnQoYWJvcnQgPT09IHRydWUgPyBudWxsOiBhYm9ydClcbiAgcmV0dXJuXG59XG5cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHJvcCAoa2V5KSB7XG4gIHJldHVybiBrZXkgJiYgKFxuICAgICdzdHJpbmcnID09IHR5cGVvZiBrZXlcbiAgICA/IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhW2tleV0gfVxuICAgIDogJ29iamVjdCcgPT09IHR5cGVvZiBrZXkgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGtleS5leGVjIC8vcmVnZXhwXG4gICAgPyBmdW5jdGlvbiAoZGF0YSkgeyB2YXIgdiA9IGtleS5leGVjKGRhdGEpOyByZXR1cm4gdiAmJiB2WzBdIH1cbiAgICA6IGtleVxuICApXG59XG4iLCJ2YXIgcHJvcCA9IHJlcXVpcmUoJy4vcHJvcCcpXG5cbmZ1bmN0aW9uIGlkIChlKSB7IHJldHVybiBlIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0ZXN0ZXIgKHRlc3QpIHtcbiAgcmV0dXJuIChcbiAgICAnb2JqZWN0JyA9PT0gdHlwZW9mIHRlc3QgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRlc3QudGVzdCAvL3JlZ2V4cFxuICAgID8gZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIHRlc3QudGVzdChkYXRhKSB9XG4gICAgOiBwcm9wICh0ZXN0KSB8fCBpZFxuICApXG59XG4iLCIndXNlIHN0cmljdCdcblxudmFyIHNvdXJjZXMgID0gcmVxdWlyZSgnLi9zb3VyY2VzJylcbnZhciBzaW5rcyAgICA9IHJlcXVpcmUoJy4vc2lua3MnKVxudmFyIHRocm91Z2hzID0gcmVxdWlyZSgnLi90aHJvdWdocycpXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcHVsbCcpXG5cbmZvcih2YXIgayBpbiBzb3VyY2VzKVxuICBleHBvcnRzW2tdID0gc291cmNlc1trXVxuXG5mb3IodmFyIGsgaW4gdGhyb3VnaHMpXG4gIGV4cG9ydHNba10gPSB0aHJvdWdoc1trXVxuXG5mb3IodmFyIGsgaW4gc2lua3MpXG4gIGV4cG9ydHNba10gPSBzaW5rc1trXVxuXG4iXX0=
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})({"pull-pushable":[function(require,module,exports){
module.exports = pullPushable
function pullPushable (onClose) {
// create a buffer for data
// that have been pushed
// but not yet pulled.
var buffer = []
// a pushable is a source stream
// (abort, cb) => cb(end, data)
//
// when pushable is pulled,
// keep references to abort and cb
// so we can call back after
// .end(end) or .push(data)
var abort, cb
function read (_abort, _cb) {
if (_abort) {
abort = _abort
// if there is already a cb waiting, abort it.
if (cb) callback(abort)
}
cb = _cb
drain()
}
var ended
read.end = function (end) {
ended = ended || end || true
// attempt to drain
drain()
}
read.push = function (data) {
if (ended) return
// if sink already waiting,
// we can call back directly.
if (cb) {
callback(abort, data)
return
}
// otherwise push data and
// attempt to drain
buffer.push(data)
drain()
}
return read
// `drain` calls back to (if any) waiting
// sink with abort, end, or next data.
function drain () {
if (!cb) return
if (abort) callback(abort)
else if (!buffer.length && ended) callback(ended)
else if (buffer.length) callback(null, buffer.shift())
}
// `callback` calls back to waiting sink,
// and removes references to sink cb.
function callback (err, val) {
var _cb = cb
// if error and pushable passed onClose, call it
// the first time this stream ends or errors.
if (err && onClose) {
var c = onClose
onClose = null
c(err === true ? null : err)
}
cb = null
_cb(err, val)
}
}
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImluZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIm1vZHVsZS5leHBvcnRzID0gcHVsbFB1c2hhYmxlXG5cbmZ1bmN0aW9uIHB1bGxQdXNoYWJsZSAob25DbG9zZSkge1xuICAvLyBjcmVhdGUgYSBidWZmZXIgZm9yIGRhdGFcbiAgLy8gdGhhdCBoYXZlIGJlZW4gcHVzaGVkXG4gIC8vIGJ1dCBub3QgeWV0IHB1bGxlZC5cbiAgdmFyIGJ1ZmZlciA9IFtdXG5cbiAgLy8gYSBwdXNoYWJsZSBpcyBhIHNvdXJjZSBzdHJlYW1cbiAgLy8gKGFib3J0LCBjYikgPT4gY2IoZW5kLCBkYXRhKVxuICAvL1xuICAvLyB3aGVuIHB1c2hhYmxlIGlzIHB1bGxlZCxcbiAgLy8ga2VlcCByZWZlcmVuY2VzIHRvIGFib3J0IGFuZCBjYlxuICAvLyBzbyB3ZSBjYW4gY2FsbCBiYWNrIGFmdGVyXG4gIC8vIC5lbmQoZW5kKSBvciAucHVzaChkYXRhKVxuICB2YXIgYWJvcnQsIGNiXG4gIGZ1bmN0aW9uIHJlYWQgKF9hYm9ydCwgX2NiKSB7XG4gICAgaWYgKF9hYm9ydCkge1xuICAgICAgYWJvcnQgPSBfYWJvcnRcbiAgICAgIC8vIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBjYiB3YWl0aW5nLCBhYm9ydCBpdC5cbiAgICAgIGlmIChjYikgY2FsbGJhY2soYWJvcnQpXG4gICAgfVxuICAgIGNiID0gX2NiXG4gICAgZHJhaW4oKVxuICB9XG5cbiAgdmFyIGVuZGVkXG4gIHJlYWQuZW5kID0gZnVuY3Rpb24gKGVuZCkge1xuICAgIGVuZGVkID0gZW5kZWQgfHwgZW5kIHx8IHRydWVcbiAgICAvLyBhdHRlbXB0IHRvIGRyYWluXG4gICAgZHJhaW4oKVxuICB9XG5cbiAgcmVhZC5wdXNoID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAoZW5kZWQpIHJldHVyblxuICAgIC8vIGlmIHNpbmsgYWxyZWFkeSB3YWl0aW5nLFxuICAgIC8vIHdlIGNhbiBjYWxsIGJhY2sgZGlyZWN0bHkuXG4gICAgaWYgKGNiKSB7XG4gICAgICBjYWxsYmFjayhhYm9ydCwgZGF0YSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBvdGhlcndpc2UgcHVzaCBkYXRhIGFuZFxuICAgIC8vIGF0dGVtcHQgdG8gZHJhaW5cbiAgICBidWZmZXIucHVzaChkYXRhKVxuICAgIGRyYWluKClcbiAgfVxuXG4gIHJldHVybiByZWFkXG5cbiAgLy8gYGRyYWluYCBjYWxscyBiYWNrIHRvIChpZiBhbnkpIHdhaXRpbmdcbiAgLy8gc2luayB3aXRoIGFib3J0LCBlbmQsIG9yIG5leHQgZGF0YS5cbiAgZnVuY3Rpb24gZHJhaW4gKCkge1xuICAgIGlmICghY2IpIHJldHVyblxuXG4gICAgaWYgKGFib3J0KSBjYWxsYmFjayhhYm9ydClcbiAgICBlbHNlIGlmICghYnVmZmVyLmxlbmd0aCAmJiBlbmRlZCkgY2FsbGJhY2soZW5kZWQpXG4gICAgZWxzZSBpZiAoYnVmZmVyLmxlbmd0aCkgY2FsbGJhY2sobnVsbCwgYnVmZmVyLnNoaWZ0KCkpXG4gIH1cblxuICAvLyBgY2FsbGJhY2tgIGNhbGxzIGJhY2sgdG8gd2FpdGluZyBzaW5rLFxuICAvLyBhbmQgcmVtb3ZlcyByZWZlcmVuY2VzIHRvIHNpbmsgY2IuXG4gIGZ1bmN0aW9uIGNhbGxiYWNrIChlcnIsIHZhbCkge1xuICAgIHZhciBfY2IgPSBjYlxuICAgIC8vIGlmIGVycm9yIGFuZCBwdXNoYWJsZSBwYXNzZWQgb25DbG9zZSwgY2FsbCBpdFxuICAgIC8vIHRoZSBmaXJzdCB0aW1lIHRoaXMgc3RyZWFtIGVuZHMgb3IgZXJyb3JzLlxuICAgIGlmIChlcnIgJiYgb25DbG9zZSkge1xuICAgICAgdmFyIGMgPSBvbkNsb3NlXG4gICAgICBvbkNsb3NlID0gbnVsbFxuICAgICAgYyhlcnIgPT09IHRydWUgPyBudWxsIDogZXJyKVxuICAgIH1cbiAgICBjYiA9IG51bGxcbiAgICBfY2IoZXJyLCB2YWwpXG4gIH1cbn1cbiJdfQ==
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){
'use strict'
module.exports = function drain (op, done) {
var read, abort
function sink (_read) {
read = _read
if(abort) return sink.abort()
//this function is much simpler to write if you
//just use recursion, but by using a while loop
//we do not blow the stack if the stream happens to be sync.
;(function next() {
var loop = true, cbed = false
while(loop) {
cbed = false
read(null, function (end, data) {
cbed = true
if(end = end || abort) {
loop = false
if(done) done(end === true ? null : end)
else if(end && end !== true)
throw end
}
else if(op && false === op(data) || abort) {
loop = false
read(abort || true, done || function () {})
}
else if(!loop){
next()
}
})
if(!cbed) {
loop = false
return
}
}
})()
}
sink.abort = function (err, cb) {
if('function' == typeof err)
cb = err, err = true
abort = err || true
if(read) return read(abort, cb || function () {})
}
return sink
}
},{}],"pull-stream/sinks/log":[function(require,module,exports){
'use strict'
var drain = require('./drain')
module.exports = function log (done) {
return drain(function (data) {
console.log(data)
}, done)
}
},{"./drain":1}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInNpbmtzL2RyYWluLmpzIiwic2lua3MvbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRyYWluIChvcCwgZG9uZSkge1xuICB2YXIgcmVhZCwgYWJvcnRcblxuICBmdW5jdGlvbiBzaW5rIChfcmVhZCkge1xuICAgIHJlYWQgPSBfcmVhZFxuICAgIGlmKGFib3J0KSByZXR1cm4gc2luay5hYm9ydCgpXG4gICAgLy90aGlzIGZ1bmN0aW9uIGlzIG11Y2ggc2ltcGxlciB0byB3cml0ZSBpZiB5b3VcbiAgICAvL2p1c3QgdXNlIHJlY3Vyc2lvbiwgYnV0IGJ5IHVzaW5nIGEgd2hpbGUgbG9vcFxuICAgIC8vd2UgZG8gbm90IGJsb3cgdGhlIHN0YWNrIGlmIHRoZSBzdHJlYW0gaGFwcGVucyB0byBiZSBzeW5jLlxuICAgIDsoZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgdmFyIGxvb3AgPSB0cnVlLCBjYmVkID0gZmFsc2VcbiAgICAgICAgd2hpbGUobG9vcCkge1xuICAgICAgICAgIGNiZWQgPSBmYWxzZVxuICAgICAgICAgIHJlYWQobnVsbCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgICAgY2JlZCA9IHRydWVcbiAgICAgICAgICAgIGlmKGVuZCA9IGVuZCB8fCBhYm9ydCkge1xuICAgICAgICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgICAgICAgaWYoZG9uZSkgZG9uZShlbmQgPT09IHRydWUgPyBudWxsIDogZW5kKVxuICAgICAgICAgICAgICBlbHNlIGlmKGVuZCAmJiBlbmQgIT09IHRydWUpXG4gICAgICAgICAgICAgICAgdGhyb3cgZW5kXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKG9wICYmIGZhbHNlID09PSBvcChkYXRhKSB8fCBhYm9ydCkge1xuICAgICAgICAgICAgICBsb29wID0gZmFsc2VcbiAgICAgICAgICAgICAgcmVhZChhYm9ydCB8fCB0cnVlLCBkb25lIHx8IGZ1bmN0aW9uICgpIHt9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZighbG9vcCl7XG4gICAgICAgICAgICAgIG5leHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYoIWNiZWQpIHtcbiAgICAgICAgICAgIGxvb3AgPSBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gIH1cblxuICBzaW5rLmFib3J0ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgICBpZignZnVuY3Rpb24nID09IHR5cGVvZiBlcnIpXG4gICAgICBjYiA9IGVyciwgZXJyID0gdHJ1ZVxuICAgIGFib3J0ID0gZXJyIHx8IHRydWVcbiAgICBpZihyZWFkKSByZXR1cm4gcmVhZChhYm9ydCwgY2IgfHwgZnVuY3Rpb24gKCkge30pXG4gIH1cblxuICByZXR1cm4gc2lua1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBkcmFpbiA9IHJlcXVpcmUoJy4vZHJhaW4nKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGxvZyAoZG9uZSkge1xuICByZXR1cm4gZHJhaW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBjb25zb2xlLmxvZyhkYXRhKVxuICB9LCBkb25lKVxufVxuIl19
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){
module.exports = function prop (key) {
return key && (
'string' == typeof key
? function (data) { return data[key] }
: 'object' === typeof key && 'function' === typeof key.exec //regexp
? function (data) { var v = key.exec(data); return v && v[0] }
: key
)
}
},{}],2:[function(require,module,exports){
var prop = require('./prop')
function id (e) { return e }
module.exports = function tester (test) {
return (
'object' === typeof test && 'function' === typeof test.test //regexp
? function (data) { return test.test(data) }
: prop (test) || id
)
}
},{"./prop":1}],"pull-stream/throughs/filter":[function(require,module,exports){
'use strict'
var tester = require('../util/tester')
module.exports = function filter (test) {
//regexp
test = tester(test)
return function (read) {
return function next (end, cb) {
var sync, loop = true
while(loop) {
loop = false
sync = true
read(end, function (end, data) {
if(!end && !test(data))
return sync ? loop = true : next(end, cb)
cb(end, data)
})
sync = false
}
}
}
}
},{"../util/tester":2}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInV0aWwvcHJvcC5qcyIsInV0aWwvdGVzdGVyLmpzIiwidGhyb3VnaHMvZmlsdGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHJvcCAoa2V5KSB7XG4gIHJldHVybiBrZXkgJiYgKFxuICAgICdzdHJpbmcnID09IHR5cGVvZiBrZXlcbiAgICA/IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhW2tleV0gfVxuICAgIDogJ29iamVjdCcgPT09IHR5cGVvZiBrZXkgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGtleS5leGVjIC8vcmVnZXhwXG4gICAgPyBmdW5jdGlvbiAoZGF0YSkgeyB2YXIgdiA9IGtleS5leGVjKGRhdGEpOyByZXR1cm4gdiAmJiB2WzBdIH1cbiAgICA6IGtleVxuICApXG59XG4iLCJ2YXIgcHJvcCA9IHJlcXVpcmUoJy4vcHJvcCcpXG5cbmZ1bmN0aW9uIGlkIChlKSB7IHJldHVybiBlIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0ZXN0ZXIgKHRlc3QpIHtcbiAgcmV0dXJuIChcbiAgICAnb2JqZWN0JyA9PT0gdHlwZW9mIHRlc3QgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRlc3QudGVzdCAvL3JlZ2V4cFxuICAgID8gZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIHRlc3QudGVzdChkYXRhKSB9XG4gICAgOiBwcm9wICh0ZXN0KSB8fCBpZFxuICApXG59XG4iLCIndXNlIHN0cmljdCdcblxudmFyIHRlc3RlciA9IHJlcXVpcmUoJy4uL3V0aWwvdGVzdGVyJylcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWx0ZXIgKHRlc3QpIHtcbiAgLy9yZWdleHBcbiAgdGVzdCA9IHRlc3Rlcih0ZXN0KVxuICByZXR1cm4gZnVuY3Rpb24gKHJlYWQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCAoZW5kLCBjYikge1xuICAgICAgdmFyIHN5bmMsIGxvb3AgPSB0cnVlXG4gICAgICB3aGlsZShsb29wKSB7XG4gICAgICAgIGxvb3AgPSBmYWxzZVxuICAgICAgICBzeW5jID0gdHJ1ZVxuICAgICAgICByZWFkKGVuZCwgZnVuY3Rpb24gKGVuZCwgZGF0YSkge1xuICAgICAgICAgIGlmKCFlbmQgJiYgIXRlc3QoZGF0YSkpXG4gICAgICAgICAgICByZXR1cm4gc3luYyA/IGxvb3AgPSB0cnVlIDogbmV4dChlbmQsIGNiKVxuICAgICAgICAgIGNiKGVuZCwgZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgc3luYyA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbiJdfQ==
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})({"pull-stream/throughs/take":[function(require,module,exports){
'use strict'
//read a number of items and then stop.
module.exports = function take (test, opts) {
opts = opts || {}
var last = opts.last || false // whether the first item for which !test(item) should still pass
var ended = false
if('number' === typeof test) {
last = true
var n = test; test = function () {
return --n
}
}
return function (read) {
function terminate (cb) {
read(true, function (err) {
last = false; cb(err || true)
})
}
return function (end, cb) {
if(ended) last ? terminate(cb) : cb(ended)
else if(ended = end) read(ended, cb)
else
read(null, function (end, data) {
if(ended = ended || end) {
//last ? terminate(cb) :
cb(ended)
}
else if(!test(data)) {
ended = true
last ? cb(null, data) : terminate(cb)
}
else
cb(null, data)
})
}
}
}
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsInRocm91Z2hzL3Rha2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnXG5cbi8vcmVhZCBhIG51bWJlciBvZiBpdGVtcyBhbmQgdGhlbiBzdG9wLlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0YWtlICh0ZXN0LCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIHZhciBsYXN0ID0gb3B0cy5sYXN0IHx8IGZhbHNlIC8vIHdoZXRoZXIgdGhlIGZpcnN0IGl0ZW0gZm9yIHdoaWNoICF0ZXN0KGl0ZW0pIHNob3VsZCBzdGlsbCBwYXNzXG4gIHZhciBlbmRlZCA9IGZhbHNlXG4gIGlmKCdudW1iZXInID09PSB0eXBlb2YgdGVzdCkge1xuICAgIGxhc3QgPSB0cnVlXG4gICAgdmFyIG4gPSB0ZXN0OyB0ZXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIC0tblxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAocmVhZCkge1xuXG4gICAgZnVuY3Rpb24gdGVybWluYXRlIChjYikge1xuICAgICAgcmVhZCh0cnVlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGxhc3QgPSBmYWxzZTsgY2IoZXJyIHx8IHRydWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoZW5kLCBjYikge1xuICAgICAgaWYoZW5kZWQpICAgICAgICAgICAgbGFzdCA/IHRlcm1pbmF0ZShjYikgOiBjYihlbmRlZClcbiAgICAgIGVsc2UgaWYoZW5kZWQgPSBlbmQpIHJlYWQoZW5kZWQsIGNiKVxuICAgICAgZWxzZVxuICAgICAgICByZWFkKG51bGwsIGZ1bmN0aW9uIChlbmQsIGRhdGEpIHtcbiAgICAgICAgICBpZihlbmRlZCA9IGVuZGVkIHx8IGVuZCkge1xuICAgICAgICAgICAgLy9sYXN0ID8gdGVybWluYXRlKGNiKSA6XG4gICAgICAgICAgICBjYihlbmRlZClcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighdGVzdChkYXRhKSkge1xuICAgICAgICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICAgICAgICBsYXN0ID8gY2IobnVsbCwgZGF0YSkgOiB0ZXJtaW5hdGUoY2IpXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNiKG51bGwsIGRhdGEpXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iXX0=
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})({"pex-geom/Rect":[function(require,module,exports){
function create(){
return [[Infinity,Infinity],[-Infinity,-Infinity]];
}
function zero(){
return [[0,0],[0,0]];
}
function copy(a){
return [a[0].slice(0),a[1].slice()];
}
function set(a,b){
a[0][0] = b[0][0];
a[0][1] = b[0][1];
a[1][0] = b[1][0];
a[1][1] = b[1][1];
return a;
}
function set4(a,x,y,w,h){
a[0][0] = x;
a[0][1] = y;
a[1][0] = x + w;
a[1][1] = y + h;
return a;
}
function scale(a,n){
a[0][0] *= n;
a[0][1] *= n;
a[1][0] *= n;
a[1][1] *= n;
return a;
}
function setMinMax(a,min,max){
a[0][0] = min[0];
a[0][1] = min[1];
a[1][0] = max[0];
a[1][1] = max[1];
return a;
}
function setMinMax4(a,minx,miny,maxx,maxy){
a[0][0] = minx;
a[0][1] = miny;
a[1][0] = maxx;
a[1][1] = maxy;
return a;
}
function getMin(a,out){
if(out === undefined){
return [a[0][0],a[0][1]];
}
out[0] = a[0][0];
out[1] = a[0][1];
return out;
}
function getMax(a,out){
if(out === undefined){
return [a[1][0],a[1][1]];
}
out[0] = a[1][0];
out[1] = a[1][1];
return out;
}
function setSize2(a,width,height){
a[1][0] = a[0][0] + width;
a[1][1] = a[0][1] + height;
return a;
}
function setSize(a,size){
a[1][0] = a[0][0] + size[0];
a[1][1] = a[0][1] + size[1];
return a;
}
function getSize(a,out){
var width = getWidth(a);
var height = getHeight(a);
if(out === undefined){
return [width,height];
}
out[0] = width;
out[1] = height;
return out;
}
function setWidth(a,width){
a[1][0] = a[0][0] + width;
return a;
}
function setHeight(a,height){
a[1][1] = a[0][1] + height;
return a;
}
function getWidth(a){
return a[1][0] - a[0][0];
}
function getHeight(a){
return a[1][1] - a[0][1];
}
function getAspectRatio(a){
return getWidth(a) / getHeight(a);
}
function setPosition(a,position){
return setPosition2(a,position[0],position[1]);
}
function setPosition2(a,x,y){
a[0][0] = x;
a[0][1] = y;
a[1][0] = x + getWidth(a);
a[1][1] = y + getHeight(a);
return a;
}
function getTR(a,out){
if(out === undefined){
return [a[1][0],a[1]];
}
out[0] = a[1][0];
out[1] = a[0][1];
return out;
}
function getBL(a,out){
if(out === undefined){
return [a[0][0],a[1][1]];
}
out[0] = a[0][0];
out[1] = a[1][1];
return out;
}
function getCenter(a,out){
var x = getWidth(a) * 0.5;
var y = getHeight(a) * 0.5;
if(out === undefined){
return [x,y];
}
out[0] = x;
out[1] = y;
return out;
}
function containsPoint(a,point){
return containsPoint2(a,point[0],point[1]);
}
function containsPoint2(a,x,y){
return x >= a[0][0] && x <= a[1][0] && y >= a[0][1] && y <= a[1][1];
}
function containsRect(a,b){
return containsPoint2(a,b[0][0],b[0][1]) && containsPoint2(a,b[1][0],b[1][1]);
}
function includePoint(a,point){
return includePoint2(a,point[0],point[1]);
}
function includePoint2(a,x,y){
var minx = a[0][0];
var miny = a[0][1];
var maxx = a[1][0];
var maxy = a[1][1];
a[0][0] = minx > x ? x : minx;
a[0][1] = miny > y ? y : miny;
a[1][0] = maxx < x ? x : maxx;
a[1][1] = maxy < y ? y : maxy;
return a;
}
function includePoints(a,points){
var minx = a[0][0];
var miny = a[0][1];
var maxx = a[1][0];
var maxy = a[1][1];
for(var i = 0, l = points.length, x, y; i < l; ++i){
x = points[i][0];
y = points[i][1];
minx = minx > x ? x : minx;
miny = miny > y ? y : miny;
maxx = maxx < x ? x : maxx;
maxy = maxy < y ? y : maxy;
}
a[0][0] = minx;
a[0][1] = miny;
a[1][0] = maxx;
a[1][1] = maxy;
return a;
}
function includePointsFlat(a,points){
var minx = a[0][0];
var miny = a[0][1];
var maxx = a[1][0];
var maxy = a[1][1];
for(var i = 0, l = points.length, x, y; i < l; i+=2){
x = points[i ];
y = points[i+1];
minx = minx > x ? x : minx;
miny = miny > y ? y : miny;
maxx = maxx < x ? x : maxx;
maxy = maxy < y ? y : maxy;
}
a[0][0] = minx;
a[0][1] = miny;
a[1][0] = maxx;
a[1][1] = maxy;
return a;
}
function includeRect(a,rect){
includePoint(a,rect[0]);
includePoint(a,rect[1]);
return a;
}
function includeRects(a,rects){
for(var i = 0, l = rects.length; i < l; ++i){
includeRect(a,rects[i]);
}
return a;
}
function mapPoint(a,point){
var minx = a[0][0];
var miny = a[0][1];
var maxx = a[1][0];
var maxy = a[1][1];
var x = point[0];
var y = point[1];
point[0] = Math.max(minx,Math.min(x,maxx)) - minx;
point[1] = Math.max(miny,Math.min(y,maxy)) - miny;
return point;
}
function clampPoint(a,point){
var minx = a[0][0];
var miny = a[0][1];
var maxx = a[1][0];
var maxy = a[1][1];
point[0] = Math.max(minx,Math.min(point[0],maxx));
point[1] = Math.max(miny,Math.min(point[1],maxy));
return point;
}
function toMax(a){
a[0][0] = a[1][0] = -Number.MAX_VALUE;
a[0][1] = a[1][1] = Number.MAX_VALUE;
}
function setEmpty(a){
a[0][0] = a[0][1] = Infinity;
a[1][0] = a[1][1] = -Infinity;
return a;
}
function isEmpty(a){
return (a[0][0] > a[1][0]) || (a[0][1] > a[1][1]);
}
function isZero(a){
return a[0][0] == 0 && a[0][1] == 0 && a[1][0] == 0 && a[1][1] == 0;
}
function setZero(a){
a[0][0] = a[0][1] = a[1][0] = a[1][1] = 0;
return a;
}
function createFromPoints(points){
return includePoints(create(),points);
}
function createFromPointsFlat(points){
return includePointsFlat(create(),points);
}
function createFromRects(rects){
return includeRects(create(),rects);
}
/**
* [Rect description]
* @type {Object}
*/
var Rect = {
/**
* [create description]
* @type {[type]}
*/
create : create,
/**
* [zero description]
* @type {[type]}
*/
zero : zero,
/**
* [copy description]
* @type {[type]}
*/
copy : copy,
/**
* [set description]
* @type {[type]}
*/
set : set,
/**
* [set4 description]
* @type {[type]}
*/
set4 : set4,
/**
* [scale description]
* @type {[type]}
*/
scale : scale,
/**
* [setMinMax description]
* @type {[type]}
*/
setMinMax : setMinMax,
/**
* [setMinMax4 description]
* @type {[type]}
*/
setMinMax4 : setMinMax4,
/**
* [getMin description]
* @type {[type]}
*/
getMin : getMin,
/**
* [getMax description]
* @type {[type]}
*/
getMax : getMax,
/**
* [setSize2 description]
* @type {[type]}
*/
setSize2 : setSize2,
/**
* [setSize description]
* @type {[type]}
*/
setSize : setSize,
/**
* [getSize description]
* @type {[type]}
*/
getSize : getSize,
/**
* [setWidth description]
* @type {[type]}
*/
setWidth : setWidth,
/**
* [getWidth description]
* @type {[type]}
*/
getWidth : getWidth,
/**
* [setHeight description]
* @type {[type]}
*/
setHeight : setHeight,
/**
* [getHeight description]
* @type {[type]}
*/
getHeight : getHeight,
/**
* [getAspectRatio description]
* @type {[type]}
*/
getAspectRatio : getAspectRatio,
/**
* [setPosition description]
* @type {[type]}
*/
setPosition : setPosition,
/**
* [setPosition2 description]
* @type {[type]}
*/
setPosition2 : setPosition2,
/**
* [getPosition description]
* @type {[type]}
*/
getPosition : getMin,
/**
* [getTL description]
* @type {[type]}
*/
getTL : getMin,
/**
* [getTR description]
* @type {[type]}
*/
getTR : getTR,
/**
* [getBL description]
* @type {[type]}
*/
getBL : getBL,
/**
* [getBR description]
* @type {[type]}
*/
getBR : getMax,
/**
* [getCenter description]
* @type {[type]}
*/
getCenter : getCenter,
/**
* [containsPoint description]
* @type {[type]}
*/
containsPoint : containsPoint,
/**
* [containsPoint2 description]
* @type {[type]}
*/
containsPoint2 : containsPoint2,
/**
* [containsRect description]
* @type {[type]}
*/
containsRect : containsRect,
/**
* [includePoint description]
* @type {[type]}
*/
includePoint : includePoint,
/**
* [includePoint2 description]
* @type {[type]}
*/
includePoint2 : includePoint2,
/**
* [includePoints description]
* @type {[type]}
*/
includePoints : includePoints,
/**
* [includePointsFlat description]
* @type {[type]}
*/
includePointsFlat : includePointsFlat,
/**
* [includeRect description]
* @type {[type]}
*/
includeRect : includeRect,
/**
* [includeRects description]
* @type {[type]}
*/
includeRects : includeRects,
/**
* [mapPoint description]
* @type {[type]}
*/
mapPoint : mapPoint,
/**
* [clampPoint description]
* @type {[type]}
*/
clampPoint : clampPoint,
/**
* [isZero description]
* @type {Boolean}
*/
isZero : isZero,
/**
* [isEmpty description]
* @type {Boolean}
*/
isEmpty : isEmpty,
/**
* [setEmpty description]
* @type {[type]}
*/
setEmpty : setEmpty,
/**
* [toMax description]
* @type {[type]}
*/
toMax : toMax,
/**
* [setZero description]
* @type {[type]}
*/
setZero : setZero,
/**
* [createFromPoints description]
* @type {[type]}
*/
createFromPoints : createFromPoints,
/**
* [createFromPointsFlat description]
* @type {[type]}
*/
createFromPointsFlat : createFromPointsFlat,
/**
* [createFromRects description]
* @type {[type]}
*/
createFromRects : createFromRects
};
module.exports = Rect;
},{}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIlJlY3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsImZ1bmN0aW9uIGNyZWF0ZSgpe1xuICAgIHJldHVybiBbW0luZmluaXR5LEluZmluaXR5XSxbLUluZmluaXR5LC1JbmZpbml0eV1dO1xufVxuXG5mdW5jdGlvbiB6ZXJvKCl7XG4gICAgcmV0dXJuIFtbMCwwXSxbMCwwXV07XG59XG5cbmZ1bmN0aW9uIGNvcHkoYSl7XG4gICAgcmV0dXJuIFthWzBdLnNsaWNlKDApLGFbMV0uc2xpY2UoKV07XG59XG5cbmZ1bmN0aW9uIHNldChhLGIpe1xuICAgIGFbMF1bMF0gPSBiWzBdWzBdO1xuICAgIGFbMF1bMV0gPSBiWzBdWzFdO1xuICAgIGFbMV1bMF0gPSBiWzFdWzBdO1xuICAgIGFbMV1bMV0gPSBiWzFdWzFdO1xuICAgIHJldHVybiBhO1xufVxuXG5mdW5jdGlvbiBzZXQ0KGEseCx5LHcsaCl7XG4gICAgYVswXVswXSA9IHg7XG4gICAgYVswXVsxXSA9IHk7XG4gICAgYVsxXVswXSA9IHggKyB3O1xuICAgIGFbMV1bMV0gPSB5ICsgaDtcbiAgICByZXR1cm4gYTtcbn1cblxuZnVuY3Rpb24gc2NhbGUoYSxuKXtcbiAgICBhWzBdWzBdICo9IG47XG4gICAgYVswXVsxXSAqPSBuO1xuICAgIGFbMV1bMF0gKj0gbjtcbiAgICBhWzFdWzFdICo9IG47XG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIHNldE1pbk1heChhLG1pbixtYXgpe1xuICAgIGFbMF1bMF0gPSBtaW5bMF07XG4gICAgYVswXVsxXSA9IG1pblsxXTtcbiAgICBhWzFdWzBdID0gbWF4WzBdO1xuICAgIGFbMV1bMV0gPSBtYXhbMV07XG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIHNldE1pbk1heDQoYSxtaW54LG1pbnksbWF4eCxtYXh5KXtcbiAgICBhWzBdWzBdID0gbWlueDtcbiAgICBhWzBdWzFdID0gbWlueTtcbiAgICBhWzFdWzBdID0gbWF4eDtcbiAgICBhWzFdWzFdID0gbWF4eTtcbiAgICByZXR1cm4gYTtcbn1cblxuZnVuY3Rpb24gZ2V0TWluKGEsb3V0KXtcbiAgICBpZihvdXQgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgIHJldHVybiBbYVswXVswXSxhWzBdWzFdXTtcbiAgICB9XG4gICAgb3V0WzBdID0gYVswXVswXTtcbiAgICBvdXRbMV0gPSBhWzBdWzFdO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGdldE1heChhLG91dCl7XG4gICAgaWYob3V0ID09PSB1bmRlZmluZWQpe1xuICAgICAgICByZXR1cm4gW2FbMV1bMF0sYVsxXVsxXV07XG4gICAgfVxuICAgIG91dFswXSA9IGFbMV1bMF07XG4gICAgb3V0WzFdID0gYVsxXVsxXTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBzZXRTaXplMihhLHdpZHRoLGhlaWdodCl7XG4gICAgYVsxXVswXSA9IGFbMF1bMF0gKyB3aWR0aDtcbiAgICBhWzFdWzFdID0gYVswXVsxXSArIGhlaWdodDtcbiAgICByZXR1cm4gYTtcbn1cblxuZnVuY3Rpb24gc2V0U2l6ZShhLHNpemUpe1xuICAgIGFbMV1bMF0gPSBhWzBdWzBdICsgc2l6ZVswXTtcbiAgICBhWzFdWzFdID0gYVswXVsxXSArIHNpemVbMV07XG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGdldFNpemUoYSxvdXQpe1xuICAgIHZhciB3aWR0aCAgPSBnZXRXaWR0aChhKTtcbiAgICB2YXIgaGVpZ2h0ID0gZ2V0SGVpZ2h0KGEpO1xuICAgIGlmKG91dCA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgcmV0dXJuIFt3aWR0aCxoZWlnaHRdO1xuICAgIH1cbiAgICBvdXRbMF0gPSB3aWR0aDtcbiAgICBvdXRbMV0gPSBoZWlnaHQ7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gc2V0V2lkdGgoYSx3aWR0aCl7XG4gICAgYVsxXVswXSA9IGFbMF1bMF0gKyB3aWR0aDtcbiAgICByZXR1cm4gYTtcbn1cblxuZnVuY3Rpb24gc2V0SGVpZ2h0KGEsaGVpZ2h0KXtcbiAgICBhWzFdWzFdID0gYVswXVsxXSArIGhlaWdodDtcbiAgICByZXR1cm4gYTtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGgoYSl7XG4gICAgcmV0dXJuIGFbMV1bMF0gLSBhWzBdWzBdO1xufVxuXG5mdW5jdGlvbiBnZXRIZWlnaHQoYSl7XG4gICAgcmV0dXJuIGFbMV1bMV0gLSBhWzBdWzFdO1xufVxuXG5mdW5jdGlvbiBnZXRBc3BlY3RSYXRpbyhhKXtcbiAgICByZXR1cm4gZ2V0V2lkdGgoYSkgLyBnZXRIZWlnaHQoYSk7XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aW9uKGEscG9zaXRpb24pe1xuICAgIHJldHVybiBzZXRQb3NpdGlvbjIoYSxwb3NpdGlvblswXSxwb3NpdGlvblsxXSk7XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aW9uMihhLHgseSl7XG4gICAgYVswXVswXSA9IHg7XG4gICAgYVswXVsxXSA9IHk7XG4gICAgYVsxXVswXSA9IHggKyBnZXRXaWR0aChhKTtcbiAgICBhWzFdWzFdID0geSArIGdldEhlaWdodChhKTtcbiAgICByZXR1cm4gYTtcbn1cblxuZnVuY3Rpb24gZ2V0VFIoYSxvdXQpe1xuICAgIGlmKG91dCA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgcmV0dXJuIFthWzFdWzBdLGFbMV1dO1xuICAgIH1cbiAgICBvdXRbMF0gPSBhWzFdWzBdO1xuICAgIG91dFsxXSA9IGFbMF1bMV07XG4gICAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gZ2V0QkwoYSxvdXQpe1xuICAgIGlmKG91dCA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgcmV0dXJuIFthWzBdWzBdLGFbMV1bMV1dO1xuICAgIH1cbiAgICBvdXRbMF0gPSBhWzBdWzBdO1xuICAgIG91dFsxXSA9IGFbMV1bMV07XG4gICAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2VudGVyKGEsb3V0KXtcbiAgICB2YXIgeCA9IGdldFdpZHRoKGEpICogMC41O1xuICAgIHZhciB5ID0gZ2V0SGVpZ2h0KGEpICogMC41O1xuICAgIGlmKG91dCA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgcmV0dXJuIFt4LHldO1xuICAgIH1cbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNQb2ludChhLHBvaW50KXtcbiAgICByZXR1cm4gY29udGFpbnNQb2ludDIoYSxwb2ludFswXSxwb2ludFsxXSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zUG9pbnQyKGEseCx5KXtcbiAgICByZXR1cm4geCA+PSBhWzBdWzBdICYmIHggPD0gYVsxXVswXSAmJiB5ID49IGFbMF1bMV0gJiYgeSA8PSBhWzFdWzFdO1xufVxuXG5mdW5jdGlvbiBjb250YWluc1JlY3QoYSxiKXtcbiAgICByZXR1cm4gY29udGFpbnNQb2ludDIoYSxiWzBdWzBdLGJbMF1bMV0pICYmIGNvbnRhaW5zUG9pbnQyKGEsYlsxXVswXSxiWzFdWzFdKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZVBvaW50KGEscG9pbnQpe1xuICAgIHJldHVybiBpbmNsdWRlUG9pbnQyKGEscG9pbnRbMF0scG9pbnRbMV0pO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlUG9pbnQyKGEseCx5KXtcbiAgICB2YXIgbWlueCA9IGFbMF1bMF07XG4gICAgdmFyIG1pbnkgPSBhWzBdWzFdO1xuICAgIHZhciBtYXh4ID0gYVsxXVswXTtcbiAgICB2YXIgbWF4eSA9IGFbMV1bMV07XG5cbiAgICBhWzBdWzBdID0gbWlueCA+IHggPyB4IDogbWlueDtcbiAgICBhWzBdWzFdID0gbWlueSA+IHkgPyB5IDogbWlueTtcbiAgICBhWzFdWzBdID0gbWF4eCA8IHggPyB4IDogbWF4eDtcbiAgICBhWzFdWzFdID0gbWF4eSA8IHkgPyB5IDogbWF4eTtcblxuICAgIHJldHVybiBhO1xufVxuXG5mdW5jdGlvbiBpbmNsdWRlUG9pbnRzKGEscG9pbnRzKXtcbiAgICB2YXIgbWlueCA9IGFbMF1bMF07XG4gICAgdmFyIG1pbnkgPSBhWzBdWzFdO1xuICAgIHZhciBtYXh4ID0gYVsxXVswXTtcbiAgICB2YXIgbWF4eSA9IGFbMV1bMV07XG5cbiAgICBmb3IodmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aCwgeCwgeTsgaSA8IGw7ICsraSl7XG4gICAgICAgIHggPSBwb2ludHNbaV1bMF07XG4gICAgICAgIHkgPSBwb2ludHNbaV1bMV07XG5cbiAgICAgICAgbWlueCA9IG1pbnggPiB4ID8geCA6IG1pbng7XG4gICAgICAgIG1pbnkgPSBtaW55ID4geSA/IHkgOiBtaW55O1xuICAgICAgICBtYXh4ID0gbWF4eCA8IHggPyB4IDogbWF4eDtcbiAgICAgICAgbWF4eSA9IG1heHkgPCB5ID8geSA6IG1heHk7XG4gICAgfVxuXG4gICAgYVswXVswXSA9IG1pbng7XG4gICAgYVswXVsxXSA9IG1pbnk7XG4gICAgYVsxXVswXSA9IG1heHg7XG4gICAgYVsxXVsxXSA9IG1heHk7XG5cbiAgICByZXR1cm4gYTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZVBvaW50c0ZsYXQoYSxwb2ludHMpe1xuICAgIHZhciBtaW54ID0gYVswXVswXTtcbiAgICB2YXIgbWlueSA9IGFbMF1bMV07XG4gICAgdmFyIG1heHggPSBhWzFdWzBdO1xuICAgIHZhciBtYXh5ID0gYVsxXVsxXTtcblxuICAgIGZvcih2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoLCB4LCB5OyBpIDwgbDsgaSs9Mil7XG4gICAgICAgIHggPSBwb2ludHNbaSAgXTtcbiAgICAgICAgeSA9IHBvaW50c1tpKzFdO1xuXG4gICAgICAgIG1pbnggPSBtaW54ID4geCA/IHggOiBtaW54O1xuICAgICAgICBtaW55ID0gbWlueSA+IHkgPyB5IDogbWlueTtcbiAgICAgICAgbWF4eCA9IG1heHggPCB4ID8geCA6IG1heHg7XG4gICAgICAgIG1heHkgPSBtYXh5IDwgeSA/IHkgOiBtYXh5O1xuICAgIH1cblxuICAgIGFbMF1bMF0gPSBtaW54O1xuICAgIGFbMF1bMV0gPSBtaW55O1xuICAgIGFbMV1bMF0gPSBtYXh4O1xuICAgIGFbMV1bMV0gPSBtYXh5O1xuXG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVSZWN0KGEscmVjdCl7XG4gICAgaW5jbHVkZVBvaW50KGEscmVjdFswXSk7XG4gICAgaW5jbHVkZVBvaW50KGEscmVjdFsxXSk7XG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVSZWN0cyhhLHJlY3RzKXtcbiAgICBmb3IodmFyIGkgPSAwLCBsID0gcmVjdHMubGVuZ3RoOyBpIDwgbDsgKytpKXtcbiAgICAgICAgaW5jbHVkZVJlY3QoYSxyZWN0c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufVxuXG5mdW5jdGlvbiBtYXBQb2ludChhLHBvaW50KXtcbiAgICB2YXIgbWlueCA9IGFbMF1bMF07XG4gICAgdmFyIG1pbnkgPSBhWzBdWzFdO1xuICAgIHZhciBtYXh4ID0gYVsxXVswXTtcbiAgICB2YXIgbWF4eSA9IGFbMV1bMV07XG4gICAgdmFyIHggPSBwb2ludFswXTtcbiAgICB2YXIgeSA9IHBvaW50WzFdO1xuXG4gICAgcG9pbnRbMF0gPSBNYXRoLm1heChtaW54LE1hdGgubWluKHgsbWF4eCkpIC0gbWlueDtcbiAgICBwb2ludFsxXSA9IE1hdGgubWF4KG1pbnksTWF0aC5taW4oeSxtYXh5KSkgLSBtaW55O1xuICAgIHJldHVybiBwb2ludDtcbn1cblxuZnVuY3Rpb24gY2xhbXBQb2ludChhLHBvaW50KXtcblxuICAgIHZhciBtaW54ID0gYVswXVswXTtcbiAgICB2YXIgbWlueSA9IGFbMF1bMV07XG4gICAgdmFyIG1heHggPSBhWzFdWzBdO1xuICAgIHZhciBtYXh5ID0gYVsxXVsxXTtcblxuICAgIHBvaW50WzBdID0gTWF0aC5tYXgobWlueCxNYXRoLm1pbihwb2ludFswXSxtYXh4KSk7XG4gICAgcG9pbnRbMV0gPSBNYXRoLm1heChtaW55LE1hdGgubWluKHBvaW50WzFdLG1heHkpKTtcbiAgICByZXR1cm4gcG9pbnQ7XG59XG5cbmZ1bmN0aW9uIHRvTWF4KGEpe1xuICAgIGFbMF1bMF0gPSBhWzFdWzBdID0gLU51bWJlci5NQVhfVkFMVUU7XG4gICAgYVswXVsxXSA9IGFbMV1bMV0gPSAgTnVtYmVyLk1BWF9WQUxVRTtcbn1cblxuZnVuY3Rpb24gc2V0RW1wdHkoYSl7XG4gICAgYVswXVswXSA9IGFbMF1bMV0gPSAgSW5maW5pdHk7XG4gICAgYVsxXVswXSA9IGFbMV1bMV0gPSAtSW5maW5pdHk7XG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkoYSl7XG4gICAgcmV0dXJuIChhWzBdWzBdID4gYVsxXVswXSkgfHwgKGFbMF1bMV0gPiBhWzFdWzFdKTtcbn1cblxuZnVuY3Rpb24gaXNaZXJvKGEpe1xuICAgIHJldHVybiBhWzBdWzBdID09IDAgJiYgYVswXVsxXSA9PSAwICYmIGFbMV1bMF0gPT0gMCAmJiBhWzFdWzFdID09IDA7XG59XG5cbmZ1bmN0aW9uIHNldFplcm8oYSl7XG4gICAgYVswXVswXSA9IGFbMF1bMV0gPSBhWzFdWzBdID0gYVsxXVsxXSA9IDA7XG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyb21Qb2ludHMocG9pbnRzKXtcbiAgICByZXR1cm4gaW5jbHVkZVBvaW50cyhjcmVhdGUoKSxwb2ludHMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcm9tUG9pbnRzRmxhdChwb2ludHMpe1xuICAgIHJldHVybiBpbmNsdWRlUG9pbnRzRmxhdChjcmVhdGUoKSxwb2ludHMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcm9tUmVjdHMocmVjdHMpe1xuICAgIHJldHVybiBpbmNsdWRlUmVjdHMoY3JlYXRlKCkscmVjdHMpO1xufVxuXG4vKipcbiAqIFtSZWN0IGRlc2NyaXB0aW9uXVxuICogQHR5cGUge09iamVjdH1cbiAqL1xudmFyIFJlY3QgPSB7XG4gICAgLyoqXG4gICAgICogW2NyZWF0ZSBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIGNyZWF0ZSA6IGNyZWF0ZSxcbiAgICAvKipcbiAgICAgKiBbemVybyBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIHplcm8gICA6IHplcm8sXG4gICAgLyoqXG4gICAgICogW2NvcHkgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBjb3B5ICAgOiBjb3B5LFxuICAgIC8qKlxuICAgICAqIFtzZXQgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBzZXQgIDogc2V0LFxuICAgIC8qKlxuICAgICAqIFtzZXQ0IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgc2V0NCA6IHNldDQsXG4gICAgLyoqXG4gICAgICogW3NjYWxlIGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgc2NhbGUgOiBzY2FsZSxcbiAgICAvKipcbiAgICAgKiBbc2V0TWluTWF4IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgc2V0TWluTWF4IDogc2V0TWluTWF4LFxuICAgIC8qKlxuICAgICAqIFtzZXRNaW5NYXg0IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgc2V0TWluTWF4NCA6IHNldE1pbk1heDQsXG4gICAgLyoqXG4gICAgICogW2dldE1pbiBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIGdldE1pbiA6IGdldE1pbixcbiAgICAvKipcbiAgICAgKiBbZ2V0TWF4IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgZ2V0TWF4IDogZ2V0TWF4LFxuICAgIC8qKlxuICAgICAqIFtzZXRTaXplMiBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIHNldFNpemUyICA6IHNldFNpemUyLFxuICAgIC8qKlxuICAgICAqIFtzZXRTaXplIGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgc2V0U2l6ZSAgIDogc2V0U2l6ZSxcbiAgICAvKipcbiAgICAgKiBbZ2V0U2l6ZSBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIGdldFNpemUgICA6IGdldFNpemUsXG4gICAgLyoqXG4gICAgICogW3NldFdpZHRoIGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgc2V0V2lkdGggIDogc2V0V2lkdGgsXG4gICAgLyoqXG4gICAgICogW2dldFdpZHRoIGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgZ2V0V2lkdGggIDogZ2V0V2lkdGgsXG4gICAgLyoqXG4gICAgICogW3NldEhlaWdodCBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIHNldEhlaWdodCA6IHNldEhlaWdodCxcbiAgICAvKipcbiAgICAgKiBbZ2V0SGVpZ2h0IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgZ2V0SGVpZ2h0IDogZ2V0SGVpZ2h0LFxuICAgIC8qKlxuICAgICAqIFtnZXRBc3BlY3RSYXRpbyBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIGdldEFzcGVjdFJhdGlvIDogZ2V0QXNwZWN0UmF0aW8sXG4gICAgLyoqXG4gICAgICogW3NldFBvc2l0aW9uIGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgc2V0UG9zaXRpb24gIDogc2V0UG9zaXRpb24sXG4gICAgLyoqXG4gICAgICogW3NldFBvc2l0aW9uMiBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIHNldFBvc2l0aW9uMiA6IHNldFBvc2l0aW9uMixcbiAgICAvKipcbiAgICAgKiBbZ2V0UG9zaXRpb24gZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBnZXRQb3NpdGlvbiAgOiBnZXRNaW4sXG4gICAgLyoqXG4gICAgICogW2dldFRMIGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgZ2V0VEwgOiBnZXRNaW4sXG4gICAgLyoqXG4gICAgICogW2dldFRSIGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgZ2V0VFIgOiBnZXRUUixcbiAgICAvKipcbiAgICAgKiBbZ2V0QkwgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBnZXRCTCA6IGdldEJMLFxuICAgIC8qKlxuICAgICAqIFtnZXRCUiBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIGdldEJSIDogZ2V0TWF4LFxuICAgIC8qKlxuICAgICAqIFtnZXRDZW50ZXIgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBnZXRDZW50ZXIgOiBnZXRDZW50ZXIsXG4gICAgLyoqXG4gICAgICogW2NvbnRhaW5zUG9pbnQgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBjb250YWluc1BvaW50IDogY29udGFpbnNQb2ludCxcbiAgICAvKipcbiAgICAgKiBbY29udGFpbnNQb2ludDIgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBjb250YWluc1BvaW50MiA6IGNvbnRhaW5zUG9pbnQyLFxuICAgIC8qKlxuICAgICAqIFtjb250YWluc1JlY3QgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBjb250YWluc1JlY3QgICA6IGNvbnRhaW5zUmVjdCxcbiAgICAvKipcbiAgICAgKiBbaW5jbHVkZVBvaW50IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgaW5jbHVkZVBvaW50ICAgICAgOiBpbmNsdWRlUG9pbnQsXG4gICAgLyoqXG4gICAgICogW2luY2x1ZGVQb2ludDIgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBpbmNsdWRlUG9pbnQyICAgICA6IGluY2x1ZGVQb2ludDIsXG4gICAgLyoqXG4gICAgICogW2luY2x1ZGVQb2ludHMgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBpbmNsdWRlUG9pbnRzICAgICA6IGluY2x1ZGVQb2ludHMsXG4gICAgLyoqXG4gICAgICogW2luY2x1ZGVQb2ludHNGbGF0IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgaW5jbHVkZVBvaW50c0ZsYXQgOiBpbmNsdWRlUG9pbnRzRmxhdCxcbiAgICAvKipcbiAgICAgKiBbaW5jbHVkZVJlY3QgZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICBpbmNsdWRlUmVjdCAgIDogaW5jbHVkZVJlY3QsXG4gICAgLyoqXG4gICAgICogW2luY2x1ZGVSZWN0cyBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIGluY2x1ZGVSZWN0cyAgOiBpbmNsdWRlUmVjdHMsXG4gICAgLyoqXG4gICAgICogW21hcFBvaW50IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgbWFwUG9pbnQgICA6IG1hcFBvaW50LFxuICAgIC8qKlxuICAgICAqIFtjbGFtcFBvaW50IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgY2xhbXBQb2ludCA6IGNsYW1wUG9pbnQsXG4gICAgLyoqXG4gICAgICogW2lzWmVybyBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc1plcm8gICA6IGlzWmVybyxcbiAgICAvKipcbiAgICAgKiBbaXNFbXB0eSBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0VtcHR5ICA6IGlzRW1wdHksXG4gICAgLyoqXG4gICAgICogW3NldEVtcHR5IGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgc2V0RW1wdHkgOiBzZXRFbXB0eSxcbiAgICAvKipcbiAgICAgKiBbdG9NYXggZGVzY3JpcHRpb25dXG4gICAgICogQHR5cGUge1t0eXBlXX1cbiAgICAgKi9cbiAgICB0b01heCAgOiB0b01heCxcbiAgICAvKipcbiAgICAgKiBbc2V0WmVybyBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIHNldFplcm8gOiBzZXRaZXJvLFxuICAgIC8qKlxuICAgICAqIFtjcmVhdGVGcm9tUG9pbnRzIGRlc2NyaXB0aW9uXVxuICAgICAqIEB0eXBlIHtbdHlwZV19XG4gICAgICovXG4gICAgY3JlYXRlRnJvbVBvaW50cyAgICAgOiBjcmVhdGVGcm9tUG9pbnRzLFxuICAgIC8qKlxuICAgICAqIFtjcmVhdGVGcm9tUG9pbnRzRmxhdCBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIGNyZWF0ZUZyb21Qb2ludHNGbGF0IDogY3JlYXRlRnJvbVBvaW50c0ZsYXQsXG4gICAgLyoqXG4gICAgICogW2NyZWF0ZUZyb21SZWN0cyBkZXNjcmlwdGlvbl1cbiAgICAgKiBAdHlwZSB7W3R5cGVdfVxuICAgICAqL1xuICAgIGNyZWF0ZUZyb21SZWN0cyAgICAgIDogY3JlYXRlRnJvbVJlY3RzXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlY3Q7XG4iXX0=
const pull = require('pull-stream')
const log = require('pull-stream/sinks/log')
const filter = require('pull-stream/throughs/filter')
const take = require('pull-stream/throughs/take')
const containsPoint = require('pex-geom/Rect').containsPoint
const pushableStream = require('pull-pushable')
// Draw a red canvas with yellow "button" on the left
const btnRect = [[10, 10], [100, 100]]
const smallBtnRect = [[20, 20], [50, 50]]
function inRect (rect) {
return function (e) {
// TODO: curry this!
return containsPoint(rect, [e.clientX, e.clientY])
}
}
const canvas = document.createElement('canvas')
canvas.style.background = 'red'
document.body.appendChild(canvas)
const ctx = canvas.getContext('2d')
ctx.fillStyle = '#FFFF00'
ctx.fillRect(btnRect[0][0], btnRect[0][1], btnRect[1][0] - btnRect[0][0], btnRect[1][1] - btnRect[0][1])
ctx.fillStyle = '#00FF00'
ctx.fillRect(smallBtnRect[0][0], smallBtnRect[0][1], smallBtnRect[1][0] - smallBtnRect[0][0], smallBtnRect[1][1] - smallBtnRect[0][1])
function createEventStream(element, event) {
const events = pushableStream()
element.addEventListener(event, (e) => {
events.push(e)
})
return events
}
//read source and log it.
function logger (msg) {
return function (read) {
read(null, function next(end, data) {
if(end === true) return
if(end) throw end
console.log(msg, data)
read(null, next)
})
}
}
var mousedown = createEventStream(canvas, 'mousedown')
var mousemove = createEventStream(canvas, 'mousemove')
var mouseup = createEventStream(canvas, 'mouseup')
function makeDragStream(mousedown) {
const events = pushableStream()
pull(mousedown, pull.take(() => {}), pull.drain((e) => {
events.push(e)
}))
return events
}
//pull(mousedown, filter(inRect(btnRect)), logger('stream down'))
;}, 0)
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"pull-stream": "3.5.0",
"pull-pushable": "2.0.1",
"pex-geom": "1.0.0-beta.2"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- contents of this file will be placed inside the <head> -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment