From fb7590e30d549b198011b246dad042c08dff2bc0 Mon Sep 17 00:00:00 2001 From: Andriy Kashcha Date: Tue, 9 Oct 2018 00:08:52 -0700 Subject: [PATCH] Added "Bush" algorithm Works very well - see performance results! Also fixes https://github.com/anvaka/isect/issues/1 --- README.md | 91 ++-- build/isect.js | 431 ++++++++++++++++- build/isect.js.map | 2 +- build/isect.min.js | 431 ++++++++++++++++- build/isect.min.js.map | 2 +- build/isect.module.js | 432 +++++++++++++++++- demo/interactive/src/generateRandomExample.js | 22 +- demo/interactive/src/generators.js | 1 + demo/interactive/src/main.js | 5 +- package-lock.json | 6 + package.json | 1 + perf/index.js | 18 + src/brute.js | 30 +- src/bush.js | 92 ++++ src/index.js | 3 +- src/intersectSegments.js | 24 + src/sweep.js | 10 +- test/findIntersections.js | 42 ++ 18 files changed, 1502 insertions(+), 141 deletions(-) create mode 100644 src/bush.js create mode 100644 src/intersectSegments.js diff --git a/README.md b/README.md index 1c16879..05eb728 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ segments. # Algorithms -The library implements two algorithms +The library implements three algorithms ## Bentley-Ottmann sweep line algorithm @@ -36,6 +36,22 @@ common in force-based graph drawing, where "hairball" is formed by a few thousan [![demo](https://i.imgur.com/SUKRHt4.gif)](https://anvaka.github.io/isect/?isAsync=true&p0=12&p1=40&generator=complete&algorithm=brute&stepsPerFrame=1) +## "Bush" algorithm + +This algorithm was suggested by [@mourner](https://twitter.com/mourner/status/1049325199617921024) and +[@dy](https://github.com/anvaka/isect/issues/1). +It uses [mourner/flatbush](https://github.com/mourner/flatbush) as a spatial +index of segments, and then iterates over every segment, checking overlapping bounding boxes. + +Intuitively, worst case performance of this algorithm is comparable with brute force. When every segment +overlaps with every other segment we should expect `O(n^2)` operations. In practice, however, this +algorithm beats both `Bentley-Ottman` and `Brute force` approaches. + +Its beauty is in its simplicity. It adapts very well to both sparse and dense segments distribution. + +You can also find performance test suite below, so you can decide for yourself. I would absolutely go with +this algorithm as my default choice. + ## Performance The benchmark code is [available here](https://github.com/anvaka/isect/blob/master/perf/index.js). Higher ops per second is better! @@ -44,11 +60,13 @@ The benchmark code is [available here](https://github.com/anvaka/isect/blob/mast [![K12 graph](https://i.imgur.com/PTXwvd3m.png)](https://anvaka.github.io/isect/?isAsync=false&p0=12&p1=40&generator=complete&algorithm=brute&stepsPerFrame=1) -* Sweep: x 1,022 ops/sec ±1.94% (90 runs sampled) -* Brute: x **7,252** ops/sec ±3.15% (78 runs sampled) +* Sweep: Circular lines 12x40 x 1,069 ops/sec ±1.98% (91 runs sampled) +* **Brute: Circular lines 12x40 x 7,463 ops/sec ±3.01% (76 runs sampled)** +* Bush: Circular lines 12x40 x 5,678 ops/sec ±2.20% (80 runs sampled) The graph has only `66` unique segments, and `313` unique -intersections. Brute force algorithm is 7x faster than Sweep Line +intersections. Brute force algorithm is 7x faster than Sweep Line, closely followed by + ### 100 random lines @@ -56,22 +74,23 @@ intersections. Brute force algorithm is 7x faster than Sweep Line In this demo 100 lines are randomly sampled inside a box with a side of 42px. -* Sweep: x 267 ops/sec ±0.80% (89 runs sampled) -* Brute: x **3,751** ops/sec ±2.42% (76 runs sampled) +* Sweep: 100 Random lines lines in 42px box x 277 ops/sec ±1.20% (87 runs sampled) +* **Brute: 100 Random lines lines in 42px box x 3,606 ops/sec ±3.61% (74 runs sampled)** +* Bush: 100 Random lines in 42px box x 3,314 ops/sec ±2.66% (83 runs sampled) -Again, brute force algorithm wins by large margin. You might be wondering if there -even a point to have sweep line implementation? Yes! Let's measure how algorithms -perform on a dataset with many lines and very few intersections. +Again, the brute force algorithm wins. The distance between brute force and +Bush shortens. Sweep line comes last. ### Sparse intersections [![sparse](https://i.imgur.com/ZkzZS9sm.png)](https://anvaka.github.io/isect/?isAsync=false&p0=50&p1=40&generator=sparse&algorithm=sweep&stepsPerFrame=1) -* Sweep: x **135** ops/sec ±0.55% (75 runs sampled) -* Brute: x 13.5 ops/sec ±0.43% (38 runs sampled) +* Sweep: 2,500 sparse lines x 156 ops/sec ±0.97% (80 runs sampled) +* Brute: 2,500 sparse lines x 13.62 ops/sec ±0.91% (38 runs sampled) +* **Bush: 2,500 sparse lines x 592 ops/sec ±1.05% (93 runs sampled)** -Now is the time for the sweep line to shine! We have only `~350` intersections and `2,500` -lines. And sweep line outperforms brute force by a factor of 10. +Now Bush algorithm wins by huge margin. Bentley-Ottman comes second, and brute +force comes the last. # usage @@ -97,7 +116,7 @@ The code below detects all intersections between segments in the array: var isect = require('isect'); // Prepare the library to detect all intersection -var sweepLine = isect.sweep([{ +var detectIntersections = isect.bush([{ from: {x: 0, y: 0}, to: {x: 10, y: 10} }, { @@ -106,7 +125,7 @@ var sweepLine = isect.sweep([{ }]); // Detect them all, operation is synchronous. -var intersections = sweepLine.run(); +var intersections = detectIntersections.run(); console.log(intersections); // Prints: // @@ -115,10 +134,11 @@ console.log(intersections); // array of segments contain both segments. ``` -## Brute force +## Brute force and Sweep Line -You can also run the above example with a brute force algorithm. Simply -change `.sweep()` to `.brute()` : +You can also run the above example with a different algorithm. Simply +change `.bush()` to `.sweep()` (to run Bentley-Ottman) or to `.brute()` (to try +brute force): ``` js @@ -135,10 +155,22 @@ var bruteForce = isect.brute([{ var intersections = bruteForce.run(); console.log(intersections); + +// do the same with sweep line: +var sweepLine = isect.sweep([{ + from: {x: 0, y: 0}, + to: {x: 10, y: 10} +}, { + from: {x: 0, y: 10}, + to: {x: 10, y: 0} +}]); + +var intersections = sweepLine.run(); +console.log(intersections); ``` -Both `.sweep()` and `.brute()` have identical API. In every example below -you can replace `.sweep()` with `.brute()` - just pay attention to notes that calls out +All algorithms have identical API. In every example below +you can replace `.bush()` with `.sweeep()` or `.brute()` - just pay attention to notes that calls out a discrepancies in the API. ## Early stopping @@ -148,12 +180,10 @@ at least one intersection, you can pass a `onFound()` callback and request the library to stop as soon as it finds an intersection: ``` js -var sweepLine = isect.sweep([/* array of segments */], { - onFound(point, interior, lower, upper) { +var intersections = isect.bush([/* array of segments */], { + onFound(point, segments) { // `point` is {x, y} of the intersection, - // `interior`is array of segments that have this point inside - // `lower` are segments that have point as a lower endpoint (segment.to) - // `upper` are segments that have point as an upper endpoint (segment.from) + // `segments` are intersecting segments. // If you return true from this method, no further processing will be done: @@ -162,11 +192,6 @@ var sweepLine = isect.sweep([/* array of segments */], { }); ``` -*Note:* `.brute()` also supports early stopping. Unlike `.sweep()` it doesn't de-dupe -points. If more than two segments intersect in the same point, the `onFound()` is called -for each pair of intersecting segments. Another major difference between `.sweep()` and `.brute()` -is that `.brute()` never provides `lower` or `upper` arrays - you would have to do check yourself. - ## Asynchronous workflow If you want to give browser time to catch up with user input, it may be desirable to break the @@ -175,9 +200,9 @@ method of the algorithm's instance: ``` js -var sweepLine = isect.sweep([/* array of segments */]); -// instead of sweepLine.run(), we do: -var isDone = sweepLine.step() +var detector = isect.bush([/* array of segments */]); +// instead of detector.run(), we do: +var isDone = detector.step() // isDone will be set to true, once the algorithm is completed. ``` diff --git a/build/isect.js b/build/isect.js index dbafa0d..9566842 100644 --- a/build/isect.js +++ b/build/isect.js @@ -1455,7 +1455,7 @@ if (hasIntersection || hasPointIntersection) { p.isReported = true; - if (reportIntersection(lastPoint, interior, lower, upper)) { + if (reportIntersection(lastPoint, union(interior, union(lower, upper)))) { return true; } } @@ -1534,10 +1534,10 @@ } } - function defaultIntersectionReporter(p, interior, lower, upper) { + function defaultIntersectionReporter(p, segments) { results.push({ point: p, - segments: union(union(interior, lower), upper) + segments: segments }); } @@ -1583,8 +1583,8 @@ for (var i = 0; i < prevFrom.length; ++i) { var s = prevFrom[i]; if (samePoint(s.to, to)) { - reportIntersection(s.from, [], s.from, s.to); - reportIntersection(s.to, [], s.from, s.to); + reportIntersection(s.from, [s.from, s.to]); + reportIntersection(s.to, [s.from, s.to]); return; } } @@ -1637,6 +1637,31 @@ return res; } + function intersectSegments$1(a, b) { + // Note: this is almost the same as geom.intersectSegments() + // The main difference is that we don't have a pre-computed + // value for dx/dy on the segments. + // https://stackoverflow.com/a/1968345/125351 + var aStart = a.from, bStart = b.from; + var p0_x = aStart.x, p0_y = aStart.y, + p2_x = bStart.x, p2_y = bStart.y; + + var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y; + var div = s1_x * s2_y - s2_x * s1_y; + + var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div; + if (s < 0 || s > 1) { return; } + + var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div; + + if (t >= 0 && t <= 1) { + return { + x: p0_x - (t * s1_x), + y: p0_y - (t * s1_y) + } + } + } + /** * This is a brute force solution with O(n^2) performance. * (`n` is number of segments). @@ -1644,7 +1669,6 @@ * Use this when number of lines is low, and number of intersections * is high. */ - function brute(lines, options) { var results = []; var reportIntersection = (options && options.onFound) || @@ -1711,30 +1735,397 @@ } } - function intersectSegments$1(a, b) { - // https://stackoverflow.com/a/1968345/125351 - var aStart = a.from, bStart = b.from; - var p0_x = aStart.x, p0_y = aStart.y, - p2_x = bStart.x, p2_y = bStart.y; + var ARRAY_TYPES = [ + Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, + Int32Array, Uint32Array, Float32Array, Float64Array + ]; - var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y; - var div = s1_x * s2_y - s2_x * s1_y; + var VERSION = 3; // serialized format version - var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div; - if (s < 0 || s > 1) { return; } + var Flatbush = function Flatbush(numItems, nodeSize, ArrayType, data) { + var this$1 = this; - var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div; + if (numItems === undefined) { throw new Error('Missing required argument: numItems.'); } + if (isNaN(numItems) || numItems <= 0) { throw new Error(("Unpexpected numItems value: " + numItems + ".")); } - if (t >= 0 && t <= 1) { - return { - x: p0_x - (t * s1_x), - y: p0_y - (t * s1_y) + this.numItems = +numItems; + this.nodeSize = Math.min(Math.max(+nodeSize || 16, 2), 65535); + + // calculate the total number of nodes in the R-tree to allocate space for + // and the index of each tree level (used in search later) + var n = numItems; + var numNodes = n; + this._levelBounds = [n * 4]; + do { + n = Math.ceil(n / this$1.nodeSize); + numNodes += n; + this$1._levelBounds.push(numNodes * 4); + } while (n !== 1); + + this.ArrayType = ArrayType || Float64Array; + this.IndexArrayType = numNodes < 16384 ? Uint16Array : Uint32Array; + + var arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType); + var nodesByteSize = numNodes * 4 * this.ArrayType.BYTES_PER_ELEMENT; + + if (arrayTypeIndex < 0) { + throw new Error(("Unexpected typed array class: " + ArrayType + ".")); + } + + if (data && (data instanceof ArrayBuffer)) { + this.data = data; + this._boxes = new this.ArrayType(this.data, 8, numNodes * 4); + this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes); + + this._pos = numNodes * 4; + this.minX = this._boxes[this._pos - 4]; + this.minY = this._boxes[this._pos - 3]; + this.maxX = this._boxes[this._pos - 2]; + this.maxY = this._boxes[this._pos - 1]; + + } else { + this.data = new ArrayBuffer(8 + nodesByteSize + numNodes * this.IndexArrayType.BYTES_PER_ELEMENT); + this._boxes = new this.ArrayType(this.data, 8, numNodes * 4); + this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes); + this._pos = 0; + this.minX = Infinity; + this.minY = Infinity; + this.maxX = -Infinity; + this.maxY = -Infinity; + + new Uint8Array(this.data, 0, 2).set([0xfb, (VERSION << 4) + arrayTypeIndex]); + new Uint16Array(this.data, 2, 1)[0] = nodeSize; + new Uint32Array(this.data, 4, 1)[0] = numItems; + } + }; + + Flatbush.from = function from (data) { + if (!(data instanceof ArrayBuffer)) { + throw new Error('Data must be an instance of ArrayBuffer.'); + } + var ref = new Uint8Array(data, 0, 2); + var magic = ref[0]; + var versionAndType = ref[1]; + if (magic !== 0xfb) { + throw new Error('Data does not appear to be in a Flatbush format.'); + } + if (versionAndType >> 4 !== VERSION) { + throw new Error(("Got v" + (versionAndType >> 4) + " data when expected v" + VERSION + ".")); + } + var ref$1 = new Uint16Array(data, 2, 1); + var nodeSize = ref$1[0]; + var ref$2 = new Uint32Array(data, 4, 1); + var numItems = ref$2[0]; + + return new Flatbush(numItems, nodeSize, ARRAY_TYPES[versionAndType & 0x0f], data); + }; + + Flatbush.prototype.add = function add (minX, minY, maxX, maxY) { + var index = this._pos >> 2; + this._indices[index] = index; + this._boxes[this._pos++] = minX; + this._boxes[this._pos++] = minY; + this._boxes[this._pos++] = maxX; + this._boxes[this._pos++] = maxY; + + if (minX < this.minX) { this.minX = minX; } + if (minY < this.minY) { this.minY = minY; } + if (maxX > this.maxX) { this.maxX = maxX; } + if (maxY > this.maxY) { this.maxY = maxY; } + }; + + Flatbush.prototype.finish = function finish () { + var this$1 = this; + + if (this._pos >> 2 !== this.numItems) { + throw new Error(("Added " + (this._pos >> 2) + " items when expected " + (this.numItems) + ".")); + } + + var width = this.maxX - this.minX; + var height = this.maxY - this.minY; + var hilbertValues = new Uint32Array(this.numItems); + var hilbertMax = (1 << 16) - 1; + + // map item centers into Hilbert coordinate space and calculate Hilbert values + for (var i = 0; i < this.numItems; i++) { + var pos = 4 * i; + var minX = this$1._boxes[pos++]; + var minY = this$1._boxes[pos++]; + var maxX = this$1._boxes[pos++]; + var maxY = this$1._boxes[pos++]; + var x = Math.floor(hilbertMax * ((minX + maxX) / 2 - this$1.minX) / width); + var y = Math.floor(hilbertMax * ((minY + maxY) / 2 - this$1.minY) / height); + hilbertValues[i] = hilbert(x, y); + } + + // sort items by their Hilbert value (for packing later) + sort$1(hilbertValues, this._boxes, this._indices, 0, this.numItems - 1); + + // generate nodes at each tree level, bottom-up + for (var i$1 = 0, pos$1 = 0; i$1 < this._levelBounds.length - 1; i$1++) { + var end = this$1._levelBounds[i$1]; + + // generate a parent node for each block of consecutive nodes + while (pos$1 < end) { + var nodeMinX = Infinity; + var nodeMinY = Infinity; + var nodeMaxX = -Infinity; + var nodeMaxY = -Infinity; + var nodeIndex = pos$1; + + // calculate bbox for the new node + for (var i$2 = 0; i$2 < this.nodeSize && pos$1 < end; i$2++) { + var minX$1 = this$1._boxes[pos$1++]; + var minY$1 = this$1._boxes[pos$1++]; + var maxX$1 = this$1._boxes[pos$1++]; + var maxY$1 = this$1._boxes[pos$1++]; + if (minX$1 < nodeMinX) { nodeMinX = minX$1; } + if (minY$1 < nodeMinY) { nodeMinY = minY$1; } + if (maxX$1 > nodeMaxX) { nodeMaxX = maxX$1; } + if (maxY$1 > nodeMaxY) { nodeMaxY = maxY$1; } + } + + // add the new node to the tree data + this$1._indices[this$1._pos >> 2] = nodeIndex; + this$1._boxes[this$1._pos++] = nodeMinX; + this$1._boxes[this$1._pos++] = nodeMinY; + this$1._boxes[this$1._pos++] = nodeMaxX; + this$1._boxes[this$1._pos++] = nodeMaxY; + } + } + }; + + Flatbush.prototype.search = function search (minX, minY, maxX, maxY, filterFn) { + var this$1 = this; + + if (this._pos !== this._boxes.length) { + throw new Error('Data not yet indexed - call index.finish().'); + } + + var nodeIndex = this._boxes.length - 4; + var level = this._levelBounds.length - 1; + var queue = []; + var results = []; + + while (nodeIndex !== undefined) { + // find the end index of the node + var end = Math.min(nodeIndex + this$1.nodeSize * 4, this$1._levelBounds[level]); + + // search through child nodes + for (var pos = nodeIndex; pos < end; pos += 4) { + var index = this$1._indices[pos >> 2]; + + // check if node bbox intersects with query bbox + if (maxX < this$1._boxes[pos]) { continue; } // maxX < nodeMinX + if (maxY < this$1._boxes[pos + 1]) { continue; } // maxY < nodeMinY + if (minX > this$1._boxes[pos + 2]) { continue; } // minX > nodeMaxX + if (minY > this$1._boxes[pos + 3]) { continue; } // minY > nodeMaxY + + if (nodeIndex < this$1.numItems * 4) { + if (filterFn === undefined || filterFn(index)) { + results.push(index); // leaf item + } + + } else { + queue.push(index); // node; add it to the search queue + queue.push(level - 1); + } + } + + level = queue.pop(); + nodeIndex = queue.pop(); } + + return results; + }; + + // custom quicksort that sorts bbox data alongside the hilbert values + function sort$1(values, boxes, indices, left, right) { + if (left >= right) { return; } + + var pivot = values[(left + right) >> 1]; + var i = left - 1; + var j = right + 1; + + while (true) { + do { i++; } while (values[i] < pivot); + do { j--; } while (values[j] > pivot); + if (i >= j) { break; } + swap(values, boxes, indices, i, j); + } + + sort$1(values, boxes, indices, left, j); + sort$1(values, boxes, indices, j + 1, right); + } + + // swap two values and two corresponding boxes + function swap(values, boxes, indices, i, j) { + var temp = values[i]; + values[i] = values[j]; + values[j] = temp; + + var k = 4 * i; + var m = 4 * j; + + var a = boxes[k]; + var b = boxes[k + 1]; + var c = boxes[k + 2]; + var d = boxes[k + 3]; + boxes[k] = boxes[m]; + boxes[k + 1] = boxes[m + 1]; + boxes[k + 2] = boxes[m + 2]; + boxes[k + 3] = boxes[m + 3]; + boxes[m] = a; + boxes[m + 1] = b; + boxes[m + 2] = c; + boxes[m + 3] = d; + + var e = indices[i]; + indices[i] = indices[j]; + indices[j] = e; + } + + // Fast Hilbert curve algorithm by http://threadlocalmutex.com/ + // Ported from C++ https://github.com/rawrunprotected/hilbert_curves (public domain) + function hilbert(x, y) { + var a = x ^ y; + var b = 0xFFFF ^ a; + var c = 0xFFFF ^ (x | y); + var d = x & (y ^ 0xFFFF); + + var A = a | (b >> 1); + var B = (a >> 1) ^ a; + var C = ((c >> 1) ^ (b & (d >> 1))) ^ c; + var D = ((a & (c >> 1)) ^ (d >> 1)) ^ d; + + a = A; b = B; c = C; d = D; + A = ((a & (a >> 2)) ^ (b & (b >> 2))); + B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2))); + C ^= ((a & (c >> 2)) ^ (b & (d >> 2))); + D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2))); + + a = A; b = B; c = C; d = D; + A = ((a & (a >> 4)) ^ (b & (b >> 4))); + B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4))); + C ^= ((a & (c >> 4)) ^ (b & (d >> 4))); + D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4))); + + a = A; b = B; c = C; d = D; + C ^= ((a & (c >> 8)) ^ (b & (d >> 8))); + D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8))); + + a = C ^ (C >> 1); + b = D ^ (D >> 1); + + var i0 = x ^ y; + var i1 = b | (0xFFFF ^ (i0 | a)); + + i0 = (i0 | (i0 << 8)) & 0x00FF00FF; + i0 = (i0 | (i0 << 4)) & 0x0F0F0F0F; + i0 = (i0 | (i0 << 2)) & 0x33333333; + i0 = (i0 | (i0 << 1)) & 0x55555555; + + i1 = (i1 | (i1 << 8)) & 0x00FF00FF; + i1 = (i1 | (i1 << 4)) & 0x0F0F0F0F; + i1 = (i1 | (i1 << 2)) & 0x33333333; + i1 = (i1 | (i1 << 1)) & 0x55555555; + + return ((i1 << 1) | i0) >>> 0; + } + + /** + * This implementation is inspired by discussion here + * https://twitter.com/mourner/status/1049325199617921024 and + * here https://github.com/anvaka/isect/issues/1 + * + * It builds an index of all segments using static spatial index + * and then for each segment it queries overlapping rectangles. + */ + function bush(lines, options) { + var results = []; + var reportIntersection = (options && options.onFound) || + defaultIntersectionReporter; + var asyncState; + + var index = new Flatbush(lines.length); + lines.forEach(addToIndex); + index.finish(); + + return { + run: run, + step: step, + results: results, + + // undocumented, don't use unless you know what you are doing: + checkIntersection: checkIntersection + } + + function run() { + for (var i = 0; i < lines.length; ++i) { + if (checkIntersection(lines[i], i)) { + return; // stop early + } + } + return results; + } + + function checkIntersection(currentSegment, currentId) { + // sorry about code duplication. + var minX = currentSegment.from.x; var maxX = currentSegment.to.x; + var minY = currentSegment.from.y; var maxY = currentSegment.to.y; + var t; + if (minX > maxX) { t = minX; minX = maxX; maxX = t; } + if (minY > maxY) { t = minY; minY = maxY; maxY = t; } + + var ids = index.search(minX, minY, maxX, maxY); + + for (var i = 0; i < ids.length; ++i) { + var segmentIndex = ids[i]; + if (segmentIndex <= currentId) { continue; } // we have either reported it, or it is current. + + var otherSegment = lines[segmentIndex]; + var point = intersectSegments$1(otherSegment, currentSegment); + + if (point) { + if (reportIntersection(point, [currentSegment, otherSegment])) { + // stop early + return true; + } + } + } + } + + function step() { + if (!asyncState) { + asyncState = {i: 0}; + } + var test = lines[asyncState.i]; + checkIntersection(test, asyncState.i); + asyncState.i += 1; + return asyncState.i < lines.length; + } + + + function addToIndex(line) { + var minX = line.from.x; var maxX = line.to.x; + var minY = line.from.y; var maxY = line.to.y; + var t; + if (minX > maxX) { t = minX; minX = maxX; maxX = t; } + if (minY > maxY) { t = minY; minY = maxY; maxY = t; } + index.add(minX, minY, maxX, maxY); + } + + function defaultIntersectionReporter(p, interior) { + results.push({ + point: p, + segments: interior + }); } } exports.sweep = isect; exports.brute = brute; + exports.bush = bush; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/build/isect.js.map b/build/isect.js.map index e898a9a..3a4d62c 100644 --- a/build/isect.js.map +++ b/build/isect.js.map @@ -1 +1 @@ -{"version":3,"file":"isect.js","sources":["../node_modules/splaytree/index.js","../src/createEventQueue.js","../src/geom.js","../src/sweepStatus.js","../src/SweepEvent.js","../src/sweep.js","../src/brute.js"],"sourcesContent":["/* follows \"An implementation of top-down splaying\"\n * by D. Sleator March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Tree} tree\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, t, comparator, tree) {\n let x;\n if (t === null) return null;\n t = splay(i, t, comparator);\n var cmp = comparator(i, t.key);\n if (cmp === 0) { /* found it */\n if (t.left === null) {\n x = t.right;\n } else {\n x = splay(i, t.left, comparator);\n x.right = t.right;\n }\n tree._size--;\n return x;\n }\n return t; /* It wasn't there */\n}\n\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n remove (key) {\n this._root = remove(key, this._root, this._comparator, this);\n }\n\n\n /**\n * Removes and returns the node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n this._root = splay(node.key, this._root, this._comparator);\n this._root = remove(node.key, this._root, this._comparator, this);\n return { key: node.key, data: node.data };\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array} keys\n * @param {Array} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n","import SplayTree from 'splaytree';\n\nexport default function createEventQueue(byY) {\n const q = new SplayTree(byY);\n\n return {\n isEmpty: isEmpty,\n size: size,\n pop: pop,\n find: find,\n insert: insert\n }\n\n function find(p) {\n return q.find(p);\n }\n\n function size() {\n return q.size;\n }\n\n function isEmpty() {\n return q.isEmpty();\n }\n\n function insert(event) {\n // debugger;\n q.add(event.point, event);\n }\n\n function pop() {\n var node = q.pop();\n return node && node.data;\n }\n}\n","/**\n * Just a collection of geometry related utilities\n */\n\n// This is used for precision checking (e.g. two numbers are equal\n// if their difference is smaller than this number). The value is \n// chosen empirically. We still may run into precision related issues.\n// TODO: we should allow consumers to configure this.\nexport const EPS = 1e-9;//10;\n\nexport function getIntersectionXPoint(segment, xPos, yPos) {\n var dy1 = segment.from.y - yPos;\n var dy2 = yPos - segment.to.y;\n var dy = segment.to.y - segment.from.y;\n if (Math.abs(dy1) < EPS) {\n // The segment starts on the sweep line\n if (Math.abs(dy) < EPS) {\n // the segment is horizontal. Intersection is at the point\n if (xPos <= segment.from.x) return segment.from.x;\n if (xPos > segment.to.x) return segment.to.x;\n return xPos;\n }\n return segment.from.x;\n }\n \n var dx = (segment.to.x - segment.from.x); \n var xOffset; \n if (dy1 >= dy2) {\n xOffset = dy1 * (dx / dy); \n return (segment.from.x - xOffset);\n } \n xOffset = dy2 * (dx / dy);\n return (segment.to.x + xOffset);\n}\n\nexport function angle(dx, dy) {\n // https://stackoverflow.com/questions/16542042/fastest-way-to-sort-vectors-by-angle-without-actually-computing-that-angle\n var p = dx/(Math.abs(dx) + Math.abs(dy)) // -1 .. 1 increasing with x\n\n if (dy < 0) return p - 1; // -2 .. 0 increasing with x\n return 1 - p // 0 .. 2 decreasing with x\n}\n\nexport function intersectSegments(a, b) {\n // https://stackoverflow.com/a/1968345/125351\n var aStart = a.from, bStart = b.from;\n var p0_x = aStart.x, p0_y = aStart.y,\n p2_x = bStart.x, p2_y = bStart.y;\n\n var s1_x = a.dx, s1_y = a.dy, s2_x = b.dx, s2_y = b.dy;\n var div = s1_x * s2_y - s2_x * s1_y;\n\n var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div;\n if (s < 0 || s > 1) return;\n\n var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div;\n\n if (t >= 0 && t <= 1) {\n return {\n x: p0_x - (t * s1_x),\n y: p0_y - (t * s1_y)\n }\n }\n}\n\nexport function same(x0, x1, y0, y1) {\n return Math.abs(x0 - x1) < EPS && Math.abs(y0 - y1) < EPS;\n}\n\nexport function samePoint(a, b) {\n return Math.abs(a.x - b.x) < EPS && Math.abs(a.y - b.y) < EPS;\n}\n","import SplayTree from 'splaytree';\nimport {samePoint, getIntersectionXPoint} from './geom'\n\n/**\n * Creates a new sweep status data structure.\n */\nexport default function createSweepStatus(onError, EPS) {\n var lastPointY, prevY;\n var lastPointX, prevX;\n var useBelow = false;\n var status = new SplayTree(compareSegments);\n\n // To save on GC we return mutable object.\n var currentBoundary = {\n beforeLeft: null,\n left: null,\n right: null,\n afterRight: null,\n }\n\n var currentLeftRight = {left: null, right: null};\n\n return {\n /**\n * Add new segments into the status tree.\n */\n insertSegments,\n\n /**\n * Remove segments from the status tree.\n */\n deleteSegments,\n\n /**\n * Returns segments that are to the left and right from a given point.\n */\n getLeftRightPoint,\n\n /**\n * For a given collections of segments finds the most left and the most right\n * segments. Also returns segments immediately before left, and after right segments.\n */\n getBoundarySegments,\n\n findSegmentsWithPoint,\n\n /**\n * Current binary search tree with segments\n */\n status,\n\n /**\n * Introspection method that verifies if there are duplicates in the segment tree.\n * If there are - `onError()` is called.\n */\n checkDuplicate,\n\n /**\n * Prints current segments in order of their intersection with sweep line. Introspection method.\n */\n printStatus,\n\n /**\n * Returns current position of the sweep line.\n */\n getLastPoint() {\n return {x: lastPointX, y: lastPointY};\n }\n }\n\n function compareSegments(a, b) {\n if (a === b) return 0;\n\n var ak = getIntersectionXPoint(a, lastPointX, lastPointY);\n var bk = getIntersectionXPoint(b, lastPointX, lastPointY);\n\n var res = ak - bk;\n if (Math.abs(res) >= EPS) {\n // We are okay fine. Intersection distance between two segments\n // is good to give conclusive answer\n return res;\n }\n\n var aIsHorizontal = Math.abs(a.dy) < EPS;\n var bIsHorizontal = Math.abs(b.dy) < EPS;\n if (aIsHorizontal && bIsHorizontal) {\n return b.to.x - a.to.x;\n }\n // TODO: What if both a and b is horizontal?\n // move horizontal to end\n if (aIsHorizontal) { \n return useBelow ? -1 : 1;\n }\n\n if (bIsHorizontal) {\n if (useBelow) {\n return (b.from.x >= lastPointX) ? -1 : 1\n }\n return -1;\n // return useBelow ? 1 : -1;\n }\n var pa = a.angle;\n var pb = b.angle;\n if (Math.abs(pa - pb) >= EPS) {\n return useBelow ? pa - pb : pb - pa;\n }\n\n var segDist = a.from.y - b.from.y;\n if (Math.abs(segDist) >= EPS) {\n return -segDist;\n }\n segDist = a.to.y - b.to.y;\n if (Math.abs(segDist) >= EPS) {\n // TODO: Is this accurate?\n return -segDist;\n }\n\n return 0;\n // Could also use:\n // var aAngle = Math.atan2(a.from.y - a.to.y, a.from.x - a.to.x);\n // var bAngle = Math.atan2(b.from.y - b.to.y, b.from.x - b.to.x);\n // return useBelow ? bAngle - aAngle : aAngle - bAngle;\n }\n\n function getBoundarySegments(upper, interior) {\n var leftMost, rightMost, i;\n var uLength = upper.length;\n\n if (uLength > 0) {\n leftMost = rightMost = upper[0];\n } else {\n leftMost = rightMost = interior[0];\n }\n\n for (i = 1; i < uLength; ++i) {\n var s = upper[i];\n var cmp = compareSegments(leftMost, s);\n if (cmp > 0) leftMost = s;\n\n cmp = compareSegments(rightMost, s);\n if (cmp < 0) rightMost = s;\n }\n\n var startFrom = uLength > 0 ? 0 : 1;\n for (i = startFrom; i < interior.length; ++i) {\n s = interior[i];\n cmp = compareSegments(leftMost, s);\n if (cmp > 0) leftMost = s;\n\n cmp = compareSegments(rightMost, s);\n if (cmp < 0) rightMost = s;\n }\n\n // at this point we have our left/right segments in the status.\n // Let's find their prev/next elements and report them back:\n var left = status.find(leftMost);\n if (!left) {\n onError('Left is missing. Precision error?');\n }\n\n var right = status.find(rightMost);\n if (!right) {\n onError('Right is missing. Precision error?');\n }\n\n var beforeLeft = left && status.prev(left);\n var afterRight = right && status.next(right);\n\n while (afterRight && right.key.dy === 0 && afterRight.key.dy === 0) {\n // horizontal segments are special :(\n afterRight = status.next(afterRight);\n }\n\n currentBoundary.beforeLeft = beforeLeft && beforeLeft.key;\n currentBoundary.left = left && left.key;\n currentBoundary.right = right && right.key;\n currentBoundary.afterRight = afterRight && afterRight.key;\n\n return currentBoundary;\n }\n\n function getLeftRightPoint(p) {\n // We are trying to find left and right segments that are nearest to the\n // point p. For this we traverse the binary search tree, and remember\n // node with the shortest distance to p.\n var lastLeft;\n var current = status._root;\n var minX = Number.POSITIVE_INFINITY;\n\n var useNext = false;\n while (current) {\n var x = getIntersectionXPoint(current.key, p.x, p.y);\n var dx = p.x - x;\n if (dx >= 0) {\n if (dx < minX) {\n minX = dx;\n lastLeft = current;\n current = current.left;\n useNext = false;\n } else {\n break;\n }\n } else {\n if (-dx < minX) {\n useNext = true;\n minX = -dx;\n lastLeft = current;\n current = current.right;\n } else {\n break;\n }\n }\n }\n if (useNext) {\n // I'm not sure why I did this. I don't this this is right now.\n // lastLeft = status.next(lastLeft);\n }\n\n currentLeftRight.left = lastLeft && lastLeft.key\n var next = lastLeft && status.next(lastLeft);\n currentLeftRight.right = next && next.key\n return currentLeftRight;\n\n // Conceptually, the code above should be equivalent to the code below;\n // The code below is easier to understand, but intuitively, the code above\n // should have better performance (as we do not traverse the entire status\n // tree)\n\n // var right, left, x;\n // var all = status.keys()\n // for (var i = 0; i < all.length; ++i) {\n // var segment = all[i];\n // x = getIntersectionXPoint(segment, p.x, p.y);\n // if (x > p.x && !right) {\n // right = segment;\n // break;\n // } else if (x < p.x) {\n // left = segment;\n // }\n // }\n\n // currentLeftRight.left = left;\n // currentLeftRight.right = right;\n\n // return currentLeftRight;\n }\n\n function findSegmentsWithPoint(p, onFound) {\n // Option 1.\n // var arrResults = [];\n // status.forEach(current => {\n // var x = getIntersectionXPoint(current.key, p.x, p.y);\n // var dx = p.x - x;\n // if (Math.abs(dx) < EPS) {\n // onFound(current.key);\n // // arrResults.push(current.key)\n // }\n // });\n // return arrResults;\n\n // Option 2.\n\n // let current = status._root;\n // const Q = []; /* Initialize stack s */\n // let done = false;\n // var res = [];\n // var breakEarly = false;\n\n // while (!done) {\n // if (current !== null) {\n // Q.push(current);\n // current = current.left;\n // } else {\n // if (Q.length !== 0) {\n // current = Q.pop();\n\n // var x = getIntersectionXPoint(current.key, p.x, p.y);\n // var dx = p.x - x;\n // if (Math.abs(dx) < EPS) {\n // res.push(current.key)\n // breakEarly = true;\n // } else if (breakEarly) {\n // done = true;\n // }\n\n // current = current.right;\n // } else done = true;\n // }\n // }\n\n // return res;\n\n // option 3.\n var current = status._root;\n\n while (current) {\n var x = getIntersectionXPoint(current.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(current, p, onFound);\n break;\n } else if (dx < 0) {\n current = current.left;\n } else {\n current = current.right;\n }\n }\n }\n\n function collectAdjacentNodes(root, p, onFound) {\n onFound(root.key);\n goOverPredecessors(root.left, p, onFound);\n goOverSuccessors(root.right, p, onFound);\n }\n\n function goOverPredecessors(root, p, res) {\n if (!root) return;\n var x = getIntersectionXPoint(root.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(root, p, res);\n } else {\n goOverPredecessors(root.right, p, res);\n }\n }\n\n function goOverSuccessors(root, p, res) {\n if (!root) return;\n var x = getIntersectionXPoint(root.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(root, p, res);\n } else {\n goOverSuccessors(root.left, p, res);\n }\n }\n\n function checkDuplicate() {\n var prev;\n status.forEach(node => {\n var current = node.key;\n\n if (prev) {\n if (samePoint(prev.from, current.from) && samePoint(prev.to, current.to)) {\n // Likely you have received error before during segment removal.\n onError('Duplicate key in the status! This may be caused by Floating Point rounding error')\n }\n }\n prev = current;\n });\n }\n\n function printStatus(prefix = '') {\n // eslint-disable-next-line\n console.log(prefix, 'status line: ', lastPointX, lastPointY);\n status.forEach(node => {\n var x = getIntersectionXPoint(node.key, lastPointX, lastPointY);\n // eslint-disable-next-line\n console.log(x + ' ' + node.key.name);\n })\n }\n\n function insertSegments(interior, upper, sweepLinePos) {\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n var key;\n\n for (var i = 0; i < interior.length; ++i) {\n key = interior[i];\n status.add(key);\n }\n for (i = 0; i < upper.length; ++i) {\n key = upper[i]\n status.add(key);\n }\n }\n\n function deleteSegments(lower, interior, sweepLinePos) {\n // I spent most of the time debugging this method. Depending on the\n // algorithm state we can run into situation when dynamic keys of the\n // `status` tree predict wrong branch, and thus we are not able to find\n // the segment that needs to be deleted. If that happens I'm trying to\n // use previous point and repeat the process. This may result in \n // incorrect state. In that case I report an error. \n var i;\n var prevCount = status._size;\n prevX = lastPointX;\n prevY = lastPointY;\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n\n useBelow = true;\n for(i = 0; i < lower.length; ++i) {\n removeSegment(lower[i], sweepLinePos)\n }\n for(i = 0; i < interior.length; ++i) {\n removeSegment(interior[i], sweepLinePos)\n }\n useBelow = false;\n\n if (status._size !== prevCount - interior.length - lower.length) {\n // This can happen when rounding error occurs. You can try scaling your input\n onError('Segments were not removed from a tree properly. Precision error?');\n }\n }\n\n function removeSegment(key, sweepLinePos) {\n if (status.find(key)) {\n status.remove(key);\n } else {\n lastPointX = prevX;\n lastPointY = prevY;\n if (status.find(key)) {\n status.remove(key);\n } else {\n // They will get an error :(\n }\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n }\n }\n}","/**\n * Represents a single event in the sweep-line algorithm\n */\nexport default class SweepEvent {\n /**\n * Creates new sweep event of a given kind.\n */\n constructor(point, segment) {\n this.point = point;\n if (segment) this.from = [segment];\n }\n}\n","import createEventQueue from './createEventQueue';\nimport createSweepStatus from './sweepStatus';\nimport SweepEvent from './SweepEvent';\n\nimport {intersectSegments, EPS, angle, samePoint} from './geom';\n\n/**\n * A point on a line\n * \n * @typedef {Object} Point\n * @property {number} x coordinate\n * @property {number} y coordinate\n */\n\n\n/**\n * @typedef {Object} Segment \n * @property {Point} from start of the segment\n * @property {Point} to end of the segment\n */\n\n/**\n * @typedef {function(point : Point, interior : Segment[], lower : Segment[], upper : Segment[])} ReportIntersectionCallback\n */\n\n/**\n * @typedef {Object} ISectOptions \n * @property {ReportIntersectionCallback} onFound \n */\n\n /**\n * @typedef {Object} ISectResult\n */\n\n// We use EMPTY array to avoid pressure on garbage collector. Need to be\n// very cautious to not mutate this array.\nvar EMPTY = [];\n\n/**\n * Finds all intersections among given segments.\n * \n * The algorithm follows \"Computation Geometry, Algorithms and Applications\" book\n * by Mark de Berg, Otfried Cheong, Marc van Kreveld, and Mark Overmars.\n * \n * Line is swept top-down\n * \n * @param {Segment[]} segments\n * @param {ISectOptions=} options\n * @returns {ISectResult}\n */\nexport default function isect(segments, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || defaultIntersectionReporter;\n\n var onError = (options && options.onError) || defaultErrorReporter;\n\n var eventQueue = createEventQueue(byY);\n var sweepStatus = createSweepStatus(onError, EPS);\n var lower, interior, lastPoint;\n\n segments.forEach(addSegment);\n\n return {\n /**\n * Find all intersections synchronously.\n * \n * @returns array of found intersections.\n */\n run,\n\n /**\n * Performs a single step in the sweep line algorithm\n * \n * @returns true if there was something to process; False if no more work to do\n */\n step,\n\n // Methods below are low level API for fine-grained control.\n // Don't use it unless you understand this code thoroughly\n\n /**\n * Add segment into the \n */\n addSegment,\n\n /**\n * Direct access to event queue. Queue contains segment endpoints and\n * pending detected intersections.\n */\n eventQueue, \n\n /**\n * Direct access to sweep line status. \"Status\" holds information about\n * all intersected segments.\n */\n sweepStatus,\n\n /**\n * Access to results array. Works only when you use default onFound() handler\n */\n results\n }\n\n function run() {\n while (!eventQueue.isEmpty()) {\n var eventPoint = eventQueue.pop();\n if (handleEventPoint(eventPoint)) {\n // they decided to stop.\n return;\n };\n }\n\n return results;\n }\n\n function step() {\n if (!eventQueue.isEmpty()) {\n var eventPoint = eventQueue.pop();\n handleEventPoint(eventPoint);\n // Note: we don't check results of `handleEventPoint()`\n // assumption is that client controls `step()` and thus they \n // know better if they want to stop.\n return true;\n }\n return false;\n }\n\n function handleEventPoint(p) {\n lastPoint = p.point;\n var upper = p.from || EMPTY;\n\n lower = interior = undefined;\n // TODO: move lower/interior into sweep status method?\n\n sweepStatus.findSegmentsWithPoint(lastPoint, addLowerOrInterior);\n // if (segmentsWithPoint) {\n // segmentsWithPoint.forEach()\n // } \n\n if (!lower) lower = EMPTY;\n if (!interior) interior = EMPTY;\n\n var uLength = upper.length;\n var iLength = interior.length;\n var lLength = lower.length;\n var hasIntersection = uLength + iLength + lLength > 1;\n var hasPointIntersection = !hasIntersection && (uLength === 0 && lLength === 0 && iLength > 0);\n\n if (hasIntersection || hasPointIntersection) {\n p.isReported = true;\n if (reportIntersection(lastPoint, interior, lower, upper)) {\n return true;\n }\n }\n\n sweepStatus.deleteSegments(lower, interior, lastPoint);\n sweepStatus.insertSegments(interior, upper, lastPoint);\n\n var sLeft, sRight;\n\n var hasNoCrossing = (uLength + iLength === 0);\n\n if (hasNoCrossing) {\n var leftRight = sweepStatus.getLeftRightPoint(lastPoint);\n sLeft = leftRight.left;\n if (!sLeft) return;\n\n sRight = leftRight.right;\n if (!sRight) return;\n\n findNewEvent(sLeft, sRight, p);\n } else {\n var boundarySegments = sweepStatus.getBoundarySegments(upper, interior);\n\n findNewEvent(boundarySegments.beforeLeft, boundarySegments.left, p);\n findNewEvent(boundarySegments.right, boundarySegments.afterRight, p);\n }\n\n return false;\n }\n\n function addLowerOrInterior(s) {\n if (samePoint(s.to, lastPoint)) {\n if (!lower) lower = [s];\n else lower.push(s);\n } else if (!samePoint(s.from, lastPoint)) {\n if (!interior) interior = [s];\n else interior.push(s);\n }\n }\n\n function findNewEvent(left, right, p) {\n if (!left || !right) return;\n\n var intersection = intersectSegments(left, right);\n if (!intersection) {\n return;\n }\n\n var dy = p.point.y - intersection.y\n // TODO: should I add dy to intersection.y?\n if (dy < -EPS) {\n // this means intersection happened after the sweep line. \n // We already processed it.\n return;\n }\n if (Math.abs(dy) < EPS && intersection.x <= p.point.x) {\n return;\n }\n\n // Need to adjust floating point for this special case,\n // since otherwise it gives rounding errors:\n roundNearZero(intersection);\n\n var current = eventQueue.find(intersection);\n\n if (current && current.isReported) {\n // We already reported this event. No need to add it one more time\n // TODO: Is this case even possible?\n onError('We already reported this event.');\n return;\n }\n\n if (!current) {\n var event = new SweepEvent(intersection)\n eventQueue.insert(event);\n }\n }\n\n function defaultIntersectionReporter(p, interior, lower, upper) {\n results.push({\n point: p, \n segments: union(union(interior, lower), upper)\n });\n }\n\n function addSegment(segment) {\n var from = segment.from;\n var to = segment.to;\n\n // Small numbers give more precision errors. Rounding them to 0.\n roundNearZero(from);\n roundNearZero(to);\n\n var dy = from.y - to.y;\n\n // Note: dy is much smaller then EPS on purpose. I found that higher\n // precision here does less good - getting way more rounding errors.\n if (Math.abs(dy) < 1e-5) {\n from.y = to.y;\n segment.dy = 0;\n }\n if ((from.y < to.y) || (\n (from.y === to.y) && (from.x > to.x))\n ) {\n var temp = from;\n from = segment.from = to; \n to = segment.to = temp;\n }\n\n // We pre-compute some immutable properties of the segment\n // They are used quite often in the tree traversal, and pre-computation\n // gives significant boost:\n segment.dy = from.y - to.y;\n segment.dx = from.x - to.x;\n segment.angle = angle(segment.dy, segment.dx);\n\n var isPoint = segment.dy === segment.dx && segment.dy === 0;\n var prev = eventQueue.find(from)\n if (prev && !isPoint) {\n // this detects identical segments early. Without this check\n // the algorithm would break since sweep line has no means to\n // detect identical segments.\n var prevFrom = prev.data.from;\n if (prevFrom) {\n for (var i = 0; i < prevFrom.length; ++i) {\n var s = prevFrom[i];\n if (samePoint(s.to, to)) {\n reportIntersection(s.from, [], s.from, s.to);\n reportIntersection(s.to, [], s.from, s.to);\n return;\n }\n }\n }\n }\n\n if (!isPoint) {\n if (prev) {\n if (prev.data.from) prev.data.from.push(segment);\n else prev.data.from = [segment];\n } else {\n var e = new SweepEvent(from, segment)\n eventQueue.insert(e);\n }\n var event = new SweepEvent(to)\n eventQueue.insert(event)\n } else {\n var event = new SweepEvent(to)\n eventQueue.insert(event)\n }\n } \n}\n\nfunction roundNearZero(point) {\n if (Math.abs(point.x) < EPS) point.x = 0;\n if (Math.abs(point.y) < EPS) point.y = 0;\n}\n\nfunction defaultErrorReporter(errorMessage) {\n throw new Error(errorMessage);\n}\n\nfunction union(a, b) {\n if (!a) return b;\n if (!b) return a;\n\n return a.concat(b);\n}\n\nfunction byY(a, b) {\n // decreasing Y \n var res = b.y - a.y;\n // TODO: This might mess up the status tree.\n if (Math.abs(res) < EPS) {\n // increasing x.\n res = a.x - b.x;\n if (Math.abs(res) < EPS) res = 0;\n }\n\n return res;\n}","/**\n * This is a brute force solution with O(n^2) performance.\n * (`n` is number of segments).\n * \n * Use this when number of lines is low, and number of intersections\n * is high.\n */\n\nexport default function brute(lines, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || \n defaultIntersectionReporter;\n var asyncState;\n\n return {\n /**\n * Execute brute force of the segment intersection search\n */\n run,\n /**\n * Access to results array. Works only when you use default onFound() handler\n */\n results,\n\n /**\n * Performs a single step in the brute force algorithm ()\n */\n step\n }\n\n function step() {\n if (!asyncState) {\n asyncState = {\n i: 0\n }\n }\n var test = lines[asyncState.i];\n for (var j = asyncState.i + 1; j < lines.length; ++j) {\n var other = lines[j];\n var pt = intersectSegments(test, other);\n if (pt) {\n if (reportIntersection(pt, [test, other])) {\n return;\n }\n }\n }\n asyncState.i += 1;\n return asyncState.i < lines.length;\n }\n\n function run() {\n for(var i = 0; i < lines.length; ++i) {\n var test = lines[i];\n for (var j = i + 1; j < lines.length; ++j) {\n var other = lines[j];\n var pt = intersectSegments(test, other);\n if (pt) {\n if (reportIntersection(pt, [test, other])) {\n return;\n }\n }\n }\n }\n return results;\n }\n\n function defaultIntersectionReporter(p, interior) {\n results.push({\n point: p, \n segments: interior\n });\n }\n}\n\nfunction intersectSegments(a, b) {\n // https://stackoverflow.com/a/1968345/125351\n var aStart = a.from, bStart = b.from;\n var p0_x = aStart.x, p0_y = aStart.y,\n p2_x = bStart.x, p2_y = bStart.y;\n\n var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y;\n var div = s1_x * s2_y - s2_x * s1_y;\n\n var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div;\n if (s < 0 || s > 1) return;\n\n var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div;\n\n if (t >= 0 && t <= 1) {\n return {\n x: p0_x - (t * s1_x),\n y: p0_y - (t * s1_y)\n }\n }\n}\n"],"names":["let","const","this","SplayTree","EPS","intersectSegments"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"isect.js","sources":["../node_modules/splaytree/index.js","../src/createEventQueue.js","../src/geom.js","../src/sweepStatus.js","../src/SweepEvent.js","../src/sweep.js","../src/intersectSegments.js","../src/brute.js","../node_modules/flatbush/index.js","../src/bush.js"],"sourcesContent":["/* follows \"An implementation of top-down splaying\"\n * by D. Sleator March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Tree} tree\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, t, comparator, tree) {\n let x;\n if (t === null) return null;\n t = splay(i, t, comparator);\n var cmp = comparator(i, t.key);\n if (cmp === 0) { /* found it */\n if (t.left === null) {\n x = t.right;\n } else {\n x = splay(i, t.left, comparator);\n x.right = t.right;\n }\n tree._size--;\n return x;\n }\n return t; /* It wasn't there */\n}\n\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n remove (key) {\n this._root = remove(key, this._root, this._comparator, this);\n }\n\n\n /**\n * Removes and returns the node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n this._root = splay(node.key, this._root, this._comparator);\n this._root = remove(node.key, this._root, this._comparator, this);\n return { key: node.key, data: node.data };\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array} keys\n * @param {Array} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n","import SplayTree from 'splaytree';\n\nexport default function createEventQueue(byY) {\n const q = new SplayTree(byY);\n\n return {\n isEmpty: isEmpty,\n size: size,\n pop: pop,\n find: find,\n insert: insert\n }\n\n function find(p) {\n return q.find(p);\n }\n\n function size() {\n return q.size;\n }\n\n function isEmpty() {\n return q.isEmpty();\n }\n\n function insert(event) {\n // debugger;\n q.add(event.point, event);\n }\n\n function pop() {\n var node = q.pop();\n return node && node.data;\n }\n}\n","/**\n * Just a collection of geometry related utilities\n */\n\n// This is used for precision checking (e.g. two numbers are equal\n// if their difference is smaller than this number). The value is \n// chosen empirically. We still may run into precision related issues.\n// TODO: we should allow consumers to configure this.\nexport const EPS = 1e-9;//10;\n\nexport function getIntersectionXPoint(segment, xPos, yPos) {\n var dy1 = segment.from.y - yPos;\n var dy2 = yPos - segment.to.y;\n var dy = segment.to.y - segment.from.y;\n if (Math.abs(dy1) < EPS) {\n // The segment starts on the sweep line\n if (Math.abs(dy) < EPS) {\n // the segment is horizontal. Intersection is at the point\n if (xPos <= segment.from.x) return segment.from.x;\n if (xPos > segment.to.x) return segment.to.x;\n return xPos;\n }\n return segment.from.x;\n }\n \n var dx = (segment.to.x - segment.from.x); \n var xOffset; \n if (dy1 >= dy2) {\n xOffset = dy1 * (dx / dy); \n return (segment.from.x - xOffset);\n } \n xOffset = dy2 * (dx / dy);\n return (segment.to.x + xOffset);\n}\n\nexport function angle(dx, dy) {\n // https://stackoverflow.com/questions/16542042/fastest-way-to-sort-vectors-by-angle-without-actually-computing-that-angle\n var p = dx/(Math.abs(dx) + Math.abs(dy)) // -1 .. 1 increasing with x\n\n if (dy < 0) return p - 1; // -2 .. 0 increasing with x\n return 1 - p // 0 .. 2 decreasing with x\n}\n\nexport function intersectSegments(a, b) {\n // https://stackoverflow.com/a/1968345/125351\n var aStart = a.from, bStart = b.from;\n var p0_x = aStart.x, p0_y = aStart.y,\n p2_x = bStart.x, p2_y = bStart.y;\n\n var s1_x = a.dx, s1_y = a.dy, s2_x = b.dx, s2_y = b.dy;\n var div = s1_x * s2_y - s2_x * s1_y;\n\n var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div;\n if (s < 0 || s > 1) return;\n\n var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div;\n\n if (t >= 0 && t <= 1) {\n return {\n x: p0_x - (t * s1_x),\n y: p0_y - (t * s1_y)\n }\n }\n}\n\nexport function same(x0, x1, y0, y1) {\n return Math.abs(x0 - x1) < EPS && Math.abs(y0 - y1) < EPS;\n}\n\nexport function samePoint(a, b) {\n return Math.abs(a.x - b.x) < EPS && Math.abs(a.y - b.y) < EPS;\n}\n","import SplayTree from 'splaytree';\nimport {samePoint, getIntersectionXPoint} from './geom'\n\n/**\n * Creates a new sweep status data structure.\n */\nexport default function createSweepStatus(onError, EPS) {\n var lastPointY, prevY;\n var lastPointX, prevX;\n var useBelow = false;\n var status = new SplayTree(compareSegments);\n\n // To save on GC we return mutable object.\n var currentBoundary = {\n beforeLeft: null,\n left: null,\n right: null,\n afterRight: null,\n }\n\n var currentLeftRight = {left: null, right: null};\n\n return {\n /**\n * Add new segments into the status tree.\n */\n insertSegments,\n\n /**\n * Remove segments from the status tree.\n */\n deleteSegments,\n\n /**\n * Returns segments that are to the left and right from a given point.\n */\n getLeftRightPoint,\n\n /**\n * For a given collections of segments finds the most left and the most right\n * segments. Also returns segments immediately before left, and after right segments.\n */\n getBoundarySegments,\n\n findSegmentsWithPoint,\n\n /**\n * Current binary search tree with segments\n */\n status,\n\n /**\n * Introspection method that verifies if there are duplicates in the segment tree.\n * If there are - `onError()` is called.\n */\n checkDuplicate,\n\n /**\n * Prints current segments in order of their intersection with sweep line. Introspection method.\n */\n printStatus,\n\n /**\n * Returns current position of the sweep line.\n */\n getLastPoint() {\n return {x: lastPointX, y: lastPointY};\n }\n }\n\n function compareSegments(a, b) {\n if (a === b) return 0;\n\n var ak = getIntersectionXPoint(a, lastPointX, lastPointY);\n var bk = getIntersectionXPoint(b, lastPointX, lastPointY);\n\n var res = ak - bk;\n if (Math.abs(res) >= EPS) {\n // We are okay fine. Intersection distance between two segments\n // is good to give conclusive answer\n return res;\n }\n\n var aIsHorizontal = Math.abs(a.dy) < EPS;\n var bIsHorizontal = Math.abs(b.dy) < EPS;\n if (aIsHorizontal && bIsHorizontal) {\n return b.to.x - a.to.x;\n }\n // TODO: What if both a and b is horizontal?\n // move horizontal to end\n if (aIsHorizontal) { \n return useBelow ? -1 : 1;\n }\n\n if (bIsHorizontal) {\n if (useBelow) {\n return (b.from.x >= lastPointX) ? -1 : 1\n }\n return -1;\n // return useBelow ? 1 : -1;\n }\n var pa = a.angle;\n var pb = b.angle;\n if (Math.abs(pa - pb) >= EPS) {\n return useBelow ? pa - pb : pb - pa;\n }\n\n var segDist = a.from.y - b.from.y;\n if (Math.abs(segDist) >= EPS) {\n return -segDist;\n }\n segDist = a.to.y - b.to.y;\n if (Math.abs(segDist) >= EPS) {\n // TODO: Is this accurate?\n return -segDist;\n }\n\n return 0;\n // Could also use:\n // var aAngle = Math.atan2(a.from.y - a.to.y, a.from.x - a.to.x);\n // var bAngle = Math.atan2(b.from.y - b.to.y, b.from.x - b.to.x);\n // return useBelow ? bAngle - aAngle : aAngle - bAngle;\n }\n\n function getBoundarySegments(upper, interior) {\n var leftMost, rightMost, i;\n var uLength = upper.length;\n\n if (uLength > 0) {\n leftMost = rightMost = upper[0];\n } else {\n leftMost = rightMost = interior[0];\n }\n\n for (i = 1; i < uLength; ++i) {\n var s = upper[i];\n var cmp = compareSegments(leftMost, s);\n if (cmp > 0) leftMost = s;\n\n cmp = compareSegments(rightMost, s);\n if (cmp < 0) rightMost = s;\n }\n\n var startFrom = uLength > 0 ? 0 : 1;\n for (i = startFrom; i < interior.length; ++i) {\n s = interior[i];\n cmp = compareSegments(leftMost, s);\n if (cmp > 0) leftMost = s;\n\n cmp = compareSegments(rightMost, s);\n if (cmp < 0) rightMost = s;\n }\n\n // at this point we have our left/right segments in the status.\n // Let's find their prev/next elements and report them back:\n var left = status.find(leftMost);\n if (!left) {\n onError('Left is missing. Precision error?');\n }\n\n var right = status.find(rightMost);\n if (!right) {\n onError('Right is missing. Precision error?');\n }\n\n var beforeLeft = left && status.prev(left);\n var afterRight = right && status.next(right);\n\n while (afterRight && right.key.dy === 0 && afterRight.key.dy === 0) {\n // horizontal segments are special :(\n afterRight = status.next(afterRight);\n }\n\n currentBoundary.beforeLeft = beforeLeft && beforeLeft.key;\n currentBoundary.left = left && left.key;\n currentBoundary.right = right && right.key;\n currentBoundary.afterRight = afterRight && afterRight.key;\n\n return currentBoundary;\n }\n\n function getLeftRightPoint(p) {\n // We are trying to find left and right segments that are nearest to the\n // point p. For this we traverse the binary search tree, and remember\n // node with the shortest distance to p.\n var lastLeft;\n var current = status._root;\n var minX = Number.POSITIVE_INFINITY;\n\n var useNext = false;\n while (current) {\n var x = getIntersectionXPoint(current.key, p.x, p.y);\n var dx = p.x - x;\n if (dx >= 0) {\n if (dx < minX) {\n minX = dx;\n lastLeft = current;\n current = current.left;\n useNext = false;\n } else {\n break;\n }\n } else {\n if (-dx < minX) {\n useNext = true;\n minX = -dx;\n lastLeft = current;\n current = current.right;\n } else {\n break;\n }\n }\n }\n if (useNext) {\n // I'm not sure why I did this. I don't this this is right now.\n // lastLeft = status.next(lastLeft);\n }\n\n currentLeftRight.left = lastLeft && lastLeft.key\n var next = lastLeft && status.next(lastLeft);\n currentLeftRight.right = next && next.key\n return currentLeftRight;\n\n // Conceptually, the code above should be equivalent to the code below;\n // The code below is easier to understand, but intuitively, the code above\n // should have better performance (as we do not traverse the entire status\n // tree)\n\n // var right, left, x;\n // var all = status.keys()\n // for (var i = 0; i < all.length; ++i) {\n // var segment = all[i];\n // x = getIntersectionXPoint(segment, p.x, p.y);\n // if (x > p.x && !right) {\n // right = segment;\n // break;\n // } else if (x < p.x) {\n // left = segment;\n // }\n // }\n\n // currentLeftRight.left = left;\n // currentLeftRight.right = right;\n\n // return currentLeftRight;\n }\n\n function findSegmentsWithPoint(p, onFound) {\n // Option 1.\n // var arrResults = [];\n // status.forEach(current => {\n // var x = getIntersectionXPoint(current.key, p.x, p.y);\n // var dx = p.x - x;\n // if (Math.abs(dx) < EPS) {\n // onFound(current.key);\n // // arrResults.push(current.key)\n // }\n // });\n // return arrResults;\n\n // Option 2.\n\n // let current = status._root;\n // const Q = []; /* Initialize stack s */\n // let done = false;\n // var res = [];\n // var breakEarly = false;\n\n // while (!done) {\n // if (current !== null) {\n // Q.push(current);\n // current = current.left;\n // } else {\n // if (Q.length !== 0) {\n // current = Q.pop();\n\n // var x = getIntersectionXPoint(current.key, p.x, p.y);\n // var dx = p.x - x;\n // if (Math.abs(dx) < EPS) {\n // res.push(current.key)\n // breakEarly = true;\n // } else if (breakEarly) {\n // done = true;\n // }\n\n // current = current.right;\n // } else done = true;\n // }\n // }\n\n // return res;\n\n // option 3.\n var current = status._root;\n\n while (current) {\n var x = getIntersectionXPoint(current.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(current, p, onFound);\n break;\n } else if (dx < 0) {\n current = current.left;\n } else {\n current = current.right;\n }\n }\n }\n\n function collectAdjacentNodes(root, p, onFound) {\n onFound(root.key);\n goOverPredecessors(root.left, p, onFound);\n goOverSuccessors(root.right, p, onFound);\n }\n\n function goOverPredecessors(root, p, res) {\n if (!root) return;\n var x = getIntersectionXPoint(root.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(root, p, res);\n } else {\n goOverPredecessors(root.right, p, res);\n }\n }\n\n function goOverSuccessors(root, p, res) {\n if (!root) return;\n var x = getIntersectionXPoint(root.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(root, p, res);\n } else {\n goOverSuccessors(root.left, p, res);\n }\n }\n\n function checkDuplicate() {\n var prev;\n status.forEach(node => {\n var current = node.key;\n\n if (prev) {\n if (samePoint(prev.from, current.from) && samePoint(prev.to, current.to)) {\n // Likely you have received error before during segment removal.\n onError('Duplicate key in the status! This may be caused by Floating Point rounding error')\n }\n }\n prev = current;\n });\n }\n\n function printStatus(prefix = '') {\n // eslint-disable-next-line\n console.log(prefix, 'status line: ', lastPointX, lastPointY);\n status.forEach(node => {\n var x = getIntersectionXPoint(node.key, lastPointX, lastPointY);\n // eslint-disable-next-line\n console.log(x + ' ' + node.key.name);\n })\n }\n\n function insertSegments(interior, upper, sweepLinePos) {\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n var key;\n\n for (var i = 0; i < interior.length; ++i) {\n key = interior[i];\n status.add(key);\n }\n for (i = 0; i < upper.length; ++i) {\n key = upper[i]\n status.add(key);\n }\n }\n\n function deleteSegments(lower, interior, sweepLinePos) {\n // I spent most of the time debugging this method. Depending on the\n // algorithm state we can run into situation when dynamic keys of the\n // `status` tree predict wrong branch, and thus we are not able to find\n // the segment that needs to be deleted. If that happens I'm trying to\n // use previous point and repeat the process. This may result in \n // incorrect state. In that case I report an error. \n var i;\n var prevCount = status._size;\n prevX = lastPointX;\n prevY = lastPointY;\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n\n useBelow = true;\n for(i = 0; i < lower.length; ++i) {\n removeSegment(lower[i], sweepLinePos)\n }\n for(i = 0; i < interior.length; ++i) {\n removeSegment(interior[i], sweepLinePos)\n }\n useBelow = false;\n\n if (status._size !== prevCount - interior.length - lower.length) {\n // This can happen when rounding error occurs. You can try scaling your input\n onError('Segments were not removed from a tree properly. Precision error?');\n }\n }\n\n function removeSegment(key, sweepLinePos) {\n if (status.find(key)) {\n status.remove(key);\n } else {\n lastPointX = prevX;\n lastPointY = prevY;\n if (status.find(key)) {\n status.remove(key);\n } else {\n // They will get an error :(\n }\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n }\n }\n}","/**\n * Represents a single event in the sweep-line algorithm\n */\nexport default class SweepEvent {\n /**\n * Creates new sweep event of a given kind.\n */\n constructor(point, segment) {\n this.point = point;\n if (segment) this.from = [segment];\n }\n}\n","import createEventQueue from './createEventQueue';\nimport createSweepStatus from './sweepStatus';\nimport SweepEvent from './SweepEvent';\n\nimport {intersectSegments, EPS, angle, samePoint} from './geom';\n\n/**\n * A point on a line\n * \n * @typedef {Object} Point\n * @property {number} x coordinate\n * @property {number} y coordinate\n */\n\n\n/**\n * @typedef {Object} Segment \n * @property {Point} from start of the segment\n * @property {Point} to end of the segment\n */\n\n/**\n * @typedef {function(point : Point, interior : Segment[], lower : Segment[], upper : Segment[])} ReportIntersectionCallback\n */\n\n/**\n * @typedef {Object} ISectOptions \n * @property {ReportIntersectionCallback} onFound \n */\n\n /**\n * @typedef {Object} ISectResult\n */\n\n// We use EMPTY array to avoid pressure on garbage collector. Need to be\n// very cautious to not mutate this array.\nvar EMPTY = [];\n\n/**\n * Finds all intersections among given segments.\n * \n * The algorithm follows \"Computation Geometry, Algorithms and Applications\" book\n * by Mark de Berg, Otfried Cheong, Marc van Kreveld, and Mark Overmars.\n * \n * Line is swept top-down\n * \n * @param {Segment[]} segments\n * @param {ISectOptions=} options\n * @returns {ISectResult}\n */\nexport default function isect(segments, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || defaultIntersectionReporter;\n\n var onError = (options && options.onError) || defaultErrorReporter;\n\n var eventQueue = createEventQueue(byY);\n var sweepStatus = createSweepStatus(onError, EPS);\n var lower, interior, lastPoint;\n\n segments.forEach(addSegment);\n\n return {\n /**\n * Find all intersections synchronously.\n * \n * @returns array of found intersections.\n */\n run,\n\n /**\n * Performs a single step in the sweep line algorithm\n * \n * @returns true if there was something to process; False if no more work to do\n */\n step,\n\n // Methods below are low level API for fine-grained control.\n // Don't use it unless you understand this code thoroughly\n\n /**\n * Add segment into the \n */\n addSegment,\n\n /**\n * Direct access to event queue. Queue contains segment endpoints and\n * pending detected intersections.\n */\n eventQueue, \n\n /**\n * Direct access to sweep line status. \"Status\" holds information about\n * all intersected segments.\n */\n sweepStatus,\n\n /**\n * Access to results array. Works only when you use default onFound() handler\n */\n results\n }\n\n function run() {\n while (!eventQueue.isEmpty()) {\n var eventPoint = eventQueue.pop();\n if (handleEventPoint(eventPoint)) {\n // they decided to stop.\n return;\n };\n }\n\n return results;\n }\n\n function step() {\n if (!eventQueue.isEmpty()) {\n var eventPoint = eventQueue.pop();\n handleEventPoint(eventPoint);\n // Note: we don't check results of `handleEventPoint()`\n // assumption is that client controls `step()` and thus they \n // know better if they want to stop.\n return true;\n }\n return false;\n }\n\n function handleEventPoint(p) {\n lastPoint = p.point;\n var upper = p.from || EMPTY;\n\n lower = interior = undefined;\n // TODO: move lower/interior into sweep status method?\n\n sweepStatus.findSegmentsWithPoint(lastPoint, addLowerOrInterior);\n // if (segmentsWithPoint) {\n // segmentsWithPoint.forEach()\n // } \n\n if (!lower) lower = EMPTY;\n if (!interior) interior = EMPTY;\n\n var uLength = upper.length;\n var iLength = interior.length;\n var lLength = lower.length;\n var hasIntersection = uLength + iLength + lLength > 1;\n var hasPointIntersection = !hasIntersection && (uLength === 0 && lLength === 0 && iLength > 0);\n\n if (hasIntersection || hasPointIntersection) {\n p.isReported = true;\n if (reportIntersection(lastPoint, union(interior, union(lower, upper)))) {\n return true;\n }\n }\n\n sweepStatus.deleteSegments(lower, interior, lastPoint);\n sweepStatus.insertSegments(interior, upper, lastPoint);\n\n var sLeft, sRight;\n\n var hasNoCrossing = (uLength + iLength === 0);\n\n if (hasNoCrossing) {\n var leftRight = sweepStatus.getLeftRightPoint(lastPoint);\n sLeft = leftRight.left;\n if (!sLeft) return;\n\n sRight = leftRight.right;\n if (!sRight) return;\n\n findNewEvent(sLeft, sRight, p);\n } else {\n var boundarySegments = sweepStatus.getBoundarySegments(upper, interior);\n\n findNewEvent(boundarySegments.beforeLeft, boundarySegments.left, p);\n findNewEvent(boundarySegments.right, boundarySegments.afterRight, p);\n }\n\n return false;\n }\n\n function addLowerOrInterior(s) {\n if (samePoint(s.to, lastPoint)) {\n if (!lower) lower = [s];\n else lower.push(s);\n } else if (!samePoint(s.from, lastPoint)) {\n if (!interior) interior = [s];\n else interior.push(s);\n }\n }\n\n function findNewEvent(left, right, p) {\n if (!left || !right) return;\n\n var intersection = intersectSegments(left, right);\n if (!intersection) {\n return;\n }\n\n var dy = p.point.y - intersection.y\n // TODO: should I add dy to intersection.y?\n if (dy < -EPS) {\n // this means intersection happened after the sweep line. \n // We already processed it.\n return;\n }\n if (Math.abs(dy) < EPS && intersection.x <= p.point.x) {\n return;\n }\n\n // Need to adjust floating point for this special case,\n // since otherwise it gives rounding errors:\n roundNearZero(intersection);\n\n var current = eventQueue.find(intersection);\n\n if (current && current.isReported) {\n // We already reported this event. No need to add it one more time\n // TODO: Is this case even possible?\n onError('We already reported this event.');\n return;\n }\n\n if (!current) {\n var event = new SweepEvent(intersection)\n eventQueue.insert(event);\n }\n }\n\n function defaultIntersectionReporter(p, segments) {\n results.push({\n point: p, \n segments: segments\n });\n }\n\n function addSegment(segment) {\n var from = segment.from;\n var to = segment.to;\n\n // Small numbers give more precision errors. Rounding them to 0.\n roundNearZero(from);\n roundNearZero(to);\n\n var dy = from.y - to.y;\n\n // Note: dy is much smaller then EPS on purpose. I found that higher\n // precision here does less good - getting way more rounding errors.\n if (Math.abs(dy) < 1e-5) {\n from.y = to.y;\n segment.dy = 0;\n }\n if ((from.y < to.y) || (\n (from.y === to.y) && (from.x > to.x))\n ) {\n var temp = from;\n from = segment.from = to; \n to = segment.to = temp;\n }\n\n // We pre-compute some immutable properties of the segment\n // They are used quite often in the tree traversal, and pre-computation\n // gives significant boost:\n segment.dy = from.y - to.y;\n segment.dx = from.x - to.x;\n segment.angle = angle(segment.dy, segment.dx);\n\n var isPoint = segment.dy === segment.dx && segment.dy === 0;\n var prev = eventQueue.find(from)\n if (prev && !isPoint) {\n // this detects identical segments early. Without this check\n // the algorithm would break since sweep line has no means to\n // detect identical segments.\n var prevFrom = prev.data.from;\n if (prevFrom) {\n for (var i = 0; i < prevFrom.length; ++i) {\n var s = prevFrom[i];\n if (samePoint(s.to, to)) {\n reportIntersection(s.from, [s.from, s.to]);\n reportIntersection(s.to, [s.from, s.to]);\n return;\n }\n }\n }\n }\n\n if (!isPoint) {\n if (prev) {\n if (prev.data.from) prev.data.from.push(segment);\n else prev.data.from = [segment];\n } else {\n var e = new SweepEvent(from, segment)\n eventQueue.insert(e);\n }\n var event = new SweepEvent(to)\n eventQueue.insert(event)\n } else {\n var event = new SweepEvent(to)\n eventQueue.insert(event)\n }\n } \n}\n\nfunction roundNearZero(point) {\n if (Math.abs(point.x) < EPS) point.x = 0;\n if (Math.abs(point.y) < EPS) point.y = 0;\n}\n\nfunction defaultErrorReporter(errorMessage) {\n throw new Error(errorMessage);\n}\n\nfunction union(a, b) {\n if (!a) return b;\n if (!b) return a;\n\n return a.concat(b);\n}\n\nfunction byY(a, b) {\n // decreasing Y \n var res = b.y - a.y;\n // TODO: This might mess up the status tree.\n if (Math.abs(res) < EPS) {\n // increasing x.\n res = a.x - b.x;\n if (Math.abs(res) < EPS) res = 0;\n }\n\n return res;\n}","export default function intersectSegments(a, b) {\n // Note: this is almost the same as geom.intersectSegments()\n // The main difference is that we don't have a pre-computed\n // value for dx/dy on the segments.\n // https://stackoverflow.com/a/1968345/125351\n var aStart = a.from, bStart = b.from;\n var p0_x = aStart.x, p0_y = aStart.y,\n p2_x = bStart.x, p2_y = bStart.y;\n\n var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y;\n var div = s1_x * s2_y - s2_x * s1_y;\n\n var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div;\n if (s < 0 || s > 1) return;\n\n var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div;\n\n if (t >= 0 && t <= 1) {\n return {\n x: p0_x - (t * s1_x),\n y: p0_y - (t * s1_y)\n }\n }\n}","import intersectSegments from './intersectSegments';\n\n/**\n * This is a brute force solution with O(n^2) performance.\n * (`n` is number of segments).\n * \n * Use this when number of lines is low, and number of intersections\n * is high.\n */\nexport default function brute(lines, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || \n defaultIntersectionReporter;\n var asyncState;\n\n return {\n /**\n * Execute brute force of the segment intersection search\n */\n run,\n /**\n * Access to results array. Works only when you use default onFound() handler\n */\n results,\n\n /**\n * Performs a single step in the brute force algorithm ()\n */\n step\n }\n\n function step() {\n if (!asyncState) {\n asyncState = {\n i: 0\n }\n }\n var test = lines[asyncState.i];\n for (var j = asyncState.i + 1; j < lines.length; ++j) {\n var other = lines[j];\n var pt = intersectSegments(test, other);\n if (pt) {\n if (reportIntersection(pt, [test, other])) {\n return;\n }\n }\n }\n asyncState.i += 1;\n return asyncState.i < lines.length;\n }\n\n function run() {\n for(var i = 0; i < lines.length; ++i) {\n var test = lines[i];\n for (var j = i + 1; j < lines.length; ++j) {\n var other = lines[j];\n var pt = intersectSegments(test, other);\n if (pt) {\n if (reportIntersection(pt, [test, other])) {\n return;\n }\n }\n }\n }\n return results;\n }\n\n function defaultIntersectionReporter(p, interior) {\n results.push({\n point: p, \n segments: interior\n });\n }\n}","\nconst ARRAY_TYPES = [\n Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,\n Int32Array, Uint32Array, Float32Array, Float64Array\n];\n\nconst VERSION = 3; // serialized format version\n\nexport default class Flatbush {\n\n static from(data) {\n if (!(data instanceof ArrayBuffer)) {\n throw new Error('Data must be an instance of ArrayBuffer.');\n }\n const [magic, versionAndType] = new Uint8Array(data, 0, 2);\n if (magic !== 0xfb) {\n throw new Error('Data does not appear to be in a Flatbush format.');\n }\n if (versionAndType >> 4 !== VERSION) {\n throw new Error(`Got v${versionAndType >> 4} data when expected v${VERSION}.`);\n }\n const [nodeSize] = new Uint16Array(data, 2, 1);\n const [numItems] = new Uint32Array(data, 4, 1);\n\n return new Flatbush(numItems, nodeSize, ARRAY_TYPES[versionAndType & 0x0f], data);\n }\n\n constructor(numItems, nodeSize, ArrayType, data) {\n if (numItems === undefined) throw new Error('Missing required argument: numItems.');\n if (isNaN(numItems) || numItems <= 0) throw new Error(`Unpexpected numItems value: ${numItems}.`);\n\n this.numItems = +numItems;\n this.nodeSize = Math.min(Math.max(+nodeSize || 16, 2), 65535);\n\n // calculate the total number of nodes in the R-tree to allocate space for\n // and the index of each tree level (used in search later)\n let n = numItems;\n let numNodes = n;\n this._levelBounds = [n * 4];\n do {\n n = Math.ceil(n / this.nodeSize);\n numNodes += n;\n this._levelBounds.push(numNodes * 4);\n } while (n !== 1);\n\n this.ArrayType = ArrayType || Float64Array;\n this.IndexArrayType = numNodes < 16384 ? Uint16Array : Uint32Array;\n\n const arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType);\n const nodesByteSize = numNodes * 4 * this.ArrayType.BYTES_PER_ELEMENT;\n\n if (arrayTypeIndex < 0) {\n throw new Error(`Unexpected typed array class: ${ArrayType}.`);\n }\n\n if (data && (data instanceof ArrayBuffer)) {\n this.data = data;\n this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes);\n\n this._pos = numNodes * 4;\n this.minX = this._boxes[this._pos - 4];\n this.minY = this._boxes[this._pos - 3];\n this.maxX = this._boxes[this._pos - 2];\n this.maxY = this._boxes[this._pos - 1];\n\n } else {\n this.data = new ArrayBuffer(8 + nodesByteSize + numNodes * this.IndexArrayType.BYTES_PER_ELEMENT);\n this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes);\n this._pos = 0;\n this.minX = Infinity;\n this.minY = Infinity;\n this.maxX = -Infinity;\n this.maxY = -Infinity;\n\n new Uint8Array(this.data, 0, 2).set([0xfb, (VERSION << 4) + arrayTypeIndex]);\n new Uint16Array(this.data, 2, 1)[0] = nodeSize;\n new Uint32Array(this.data, 4, 1)[0] = numItems;\n }\n }\n\n add(minX, minY, maxX, maxY) {\n const index = this._pos >> 2;\n this._indices[index] = index;\n this._boxes[this._pos++] = minX;\n this._boxes[this._pos++] = minY;\n this._boxes[this._pos++] = maxX;\n this._boxes[this._pos++] = maxY;\n\n if (minX < this.minX) this.minX = minX;\n if (minY < this.minY) this.minY = minY;\n if (maxX > this.maxX) this.maxX = maxX;\n if (maxY > this.maxY) this.maxY = maxY;\n }\n\n finish() {\n if (this._pos >> 2 !== this.numItems) {\n throw new Error(`Added ${this._pos >> 2} items when expected ${this.numItems}.`);\n }\n\n const width = this.maxX - this.minX;\n const height = this.maxY - this.minY;\n const hilbertValues = new Uint32Array(this.numItems);\n const hilbertMax = (1 << 16) - 1;\n\n // map item centers into Hilbert coordinate space and calculate Hilbert values\n for (let i = 0; i < this.numItems; i++) {\n let pos = 4 * i;\n const minX = this._boxes[pos++];\n const minY = this._boxes[pos++];\n const maxX = this._boxes[pos++];\n const maxY = this._boxes[pos++];\n const x = Math.floor(hilbertMax * ((minX + maxX) / 2 - this.minX) / width);\n const y = Math.floor(hilbertMax * ((minY + maxY) / 2 - this.minY) / height);\n hilbertValues[i] = hilbert(x, y);\n }\n\n // sort items by their Hilbert value (for packing later)\n sort(hilbertValues, this._boxes, this._indices, 0, this.numItems - 1);\n\n // generate nodes at each tree level, bottom-up\n for (let i = 0, pos = 0; i < this._levelBounds.length - 1; i++) {\n const end = this._levelBounds[i];\n\n // generate a parent node for each block of consecutive nodes\n while (pos < end) {\n let nodeMinX = Infinity;\n let nodeMinY = Infinity;\n let nodeMaxX = -Infinity;\n let nodeMaxY = -Infinity;\n const nodeIndex = pos;\n\n // calculate bbox for the new node\n for (let i = 0; i < this.nodeSize && pos < end; i++) {\n const minX = this._boxes[pos++];\n const minY = this._boxes[pos++];\n const maxX = this._boxes[pos++];\n const maxY = this._boxes[pos++];\n if (minX < nodeMinX) nodeMinX = minX;\n if (minY < nodeMinY) nodeMinY = minY;\n if (maxX > nodeMaxX) nodeMaxX = maxX;\n if (maxY > nodeMaxY) nodeMaxY = maxY;\n }\n\n // add the new node to the tree data\n this._indices[this._pos >> 2] = nodeIndex;\n this._boxes[this._pos++] = nodeMinX;\n this._boxes[this._pos++] = nodeMinY;\n this._boxes[this._pos++] = nodeMaxX;\n this._boxes[this._pos++] = nodeMaxY;\n }\n }\n }\n\n search(minX, minY, maxX, maxY, filterFn) {\n if (this._pos !== this._boxes.length) {\n throw new Error('Data not yet indexed - call index.finish().');\n }\n\n let nodeIndex = this._boxes.length - 4;\n let level = this._levelBounds.length - 1;\n const queue = [];\n const results = [];\n\n while (nodeIndex !== undefined) {\n // find the end index of the node\n const end = Math.min(nodeIndex + this.nodeSize * 4, this._levelBounds[level]);\n\n // search through child nodes\n for (let pos = nodeIndex; pos < end; pos += 4) {\n const index = this._indices[pos >> 2];\n\n // check if node bbox intersects with query bbox\n if (maxX < this._boxes[pos]) continue; // maxX < nodeMinX\n if (maxY < this._boxes[pos + 1]) continue; // maxY < nodeMinY\n if (minX > this._boxes[pos + 2]) continue; // minX > nodeMaxX\n if (minY > this._boxes[pos + 3]) continue; // minY > nodeMaxY\n\n if (nodeIndex < this.numItems * 4) {\n if (filterFn === undefined || filterFn(index)) {\n results.push(index); // leaf item\n }\n\n } else {\n queue.push(index); // node; add it to the search queue\n queue.push(level - 1);\n }\n }\n\n level = queue.pop();\n nodeIndex = queue.pop();\n }\n\n return results;\n }\n}\n\n// custom quicksort that sorts bbox data alongside the hilbert values\nfunction sort(values, boxes, indices, left, right) {\n if (left >= right) return;\n\n const pivot = values[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (values[i] < pivot);\n do j--; while (values[j] > pivot);\n if (i >= j) break;\n swap(values, boxes, indices, i, j);\n }\n\n sort(values, boxes, indices, left, j);\n sort(values, boxes, indices, j + 1, right);\n}\n\n// swap two values and two corresponding boxes\nfunction swap(values, boxes, indices, i, j) {\n const temp = values[i];\n values[i] = values[j];\n values[j] = temp;\n\n const k = 4 * i;\n const m = 4 * j;\n\n const a = boxes[k];\n const b = boxes[k + 1];\n const c = boxes[k + 2];\n const d = boxes[k + 3];\n boxes[k] = boxes[m];\n boxes[k + 1] = boxes[m + 1];\n boxes[k + 2] = boxes[m + 2];\n boxes[k + 3] = boxes[m + 3];\n boxes[m] = a;\n boxes[m + 1] = b;\n boxes[m + 2] = c;\n boxes[m + 3] = d;\n\n const e = indices[i];\n indices[i] = indices[j];\n indices[j] = e;\n}\n\n// Fast Hilbert curve algorithm by http://threadlocalmutex.com/\n// Ported from C++ https://github.com/rawrunprotected/hilbert_curves (public domain)\nfunction hilbert(x, y) {\n let a = x ^ y;\n let b = 0xFFFF ^ a;\n let c = 0xFFFF ^ (x | y);\n let d = x & (y ^ 0xFFFF);\n\n let A = a | (b >> 1);\n let B = (a >> 1) ^ a;\n let C = ((c >> 1) ^ (b & (d >> 1))) ^ c;\n let D = ((a & (c >> 1)) ^ (d >> 1)) ^ d;\n\n a = A; b = B; c = C; d = D;\n A = ((a & (a >> 2)) ^ (b & (b >> 2)));\n B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2)));\n C ^= ((a & (c >> 2)) ^ (b & (d >> 2)));\n D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2)));\n\n a = A; b = B; c = C; d = D;\n A = ((a & (a >> 4)) ^ (b & (b >> 4)));\n B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4)));\n C ^= ((a & (c >> 4)) ^ (b & (d >> 4)));\n D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4)));\n\n a = A; b = B; c = C; d = D;\n C ^= ((a & (c >> 8)) ^ (b & (d >> 8)));\n D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8)));\n\n a = C ^ (C >> 1);\n b = D ^ (D >> 1);\n\n let i0 = x ^ y;\n let i1 = b | (0xFFFF ^ (i0 | a));\n\n i0 = (i0 | (i0 << 8)) & 0x00FF00FF;\n i0 = (i0 | (i0 << 4)) & 0x0F0F0F0F;\n i0 = (i0 | (i0 << 2)) & 0x33333333;\n i0 = (i0 | (i0 << 1)) & 0x55555555;\n\n i1 = (i1 | (i1 << 8)) & 0x00FF00FF;\n i1 = (i1 | (i1 << 4)) & 0x0F0F0F0F;\n i1 = (i1 | (i1 << 2)) & 0x33333333;\n i1 = (i1 | (i1 << 1)) & 0x55555555;\n\n return ((i1 << 1) | i0) >>> 0;\n}\n","import Flatbush from 'flatbush';\nimport intersectSegments from './intersectSegments';\n\n/**\n * This implementation is inspired by discussion here \n * https://twitter.com/mourner/status/1049325199617921024 and \n * here https://github.com/anvaka/isect/issues/1\n * \n * It builds an index of all segments using static spatial index\n * and then for each segment it queries overlapping rectangles.\n */\nexport default function bush(lines, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || \n defaultIntersectionReporter;\n var asyncState;\n\n var index = new Flatbush(lines.length);\n lines.forEach(addToIndex);\n index.finish();\n\n return {\n run: run,\n step: step,\n results: results,\n\n // undocumented, don't use unless you know what you are doing:\n checkIntersection: checkIntersection\n }\n\n function run() {\n for (var i = 0; i < lines.length; ++i) {\n if (checkIntersection(lines[i], i)) {\n return; // stop early\n }\n }\n return results;\n }\n\n function checkIntersection(currentSegment, currentId) {\n // sorry about code duplication.\n var minX = currentSegment.from.x; var maxX = currentSegment.to.x;\n var minY = currentSegment.from.y; var maxY = currentSegment.to.y;\n var t;\n if (minX > maxX) { t = minX; minX = maxX; maxX = t; }\n if (minY > maxY) { t = minY; minY = maxY; maxY = t; }\n\n var ids = index.search(minX, minY, maxX, maxY);\n\n for (var i = 0; i < ids.length; ++i) {\n var segmentIndex = ids[i];\n if (segmentIndex <= currentId) continue; // we have either reported it, or it is current.\n\n var otherSegment = lines[segmentIndex];\n var point = intersectSegments(otherSegment, currentSegment);\n\n if (point) {\n if (reportIntersection(point, [currentSegment, otherSegment])) {\n // stop early\n return true;\n }\n }\n }\n }\n\n function step() {\n if (!asyncState) {\n asyncState = {i: 0};\n }\n var test = lines[asyncState.i];\n checkIntersection(test, asyncState.i);\n asyncState.i += 1;\n return asyncState.i < lines.length;\n }\n\n\n function addToIndex(line) {\n var minX = line.from.x; var maxX = line.to.x;\n var minY = line.from.y; var maxY = line.to.y;\n var t;\n if (minX > maxX) { t = minX; minX = maxX; maxX = t; }\n if (minY > maxY) { t = minY; minY = maxY; maxY = t; }\n index.add(minX, minY, maxX, maxY);\n }\n\n function defaultIntersectionReporter(p, interior) {\n results.push({\n point: p, \n segments: interior\n });\n }\n}"],"names":["let","const","this","SplayTree","EPS","intersectSegments","sort","i","pos","minX","minY","maxX","maxY"],"mappings":"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"} \ No newline at end of file diff --git a/build/isect.min.js b/build/isect.min.js index 04a39b0..d6fbca9 100644 --- a/build/isect.min.js +++ b/build/isect.min.js @@ -1455,7 +1455,7 @@ if (hasIntersection || hasPointIntersection) { p.isReported = true; - if (reportIntersection(lastPoint, interior, lower, upper)) { + if (reportIntersection(lastPoint, union(interior, union(lower, upper)))) { return true; } } @@ -1534,10 +1534,10 @@ } } - function defaultIntersectionReporter(p, interior, lower, upper) { + function defaultIntersectionReporter(p, segments) { results.push({ point: p, - segments: union(union(interior, lower), upper) + segments: segments }); } @@ -1583,8 +1583,8 @@ for (var i = 0; i < prevFrom.length; ++i) { var s = prevFrom[i]; if (samePoint(s.to, to)) { - reportIntersection(s.from, [], s.from, s.to); - reportIntersection(s.to, [], s.from, s.to); + reportIntersection(s.from, [s.from, s.to]); + reportIntersection(s.to, [s.from, s.to]); return; } } @@ -1637,6 +1637,31 @@ return res; } + function intersectSegments$1(a, b) { + // Note: this is almost the same as geom.intersectSegments() + // The main difference is that we don't have a pre-computed + // value for dx/dy on the segments. + // https://stackoverflow.com/a/1968345/125351 + var aStart = a.from, bStart = b.from; + var p0_x = aStart.x, p0_y = aStart.y, + p2_x = bStart.x, p2_y = bStart.y; + + var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y; + var div = s1_x * s2_y - s2_x * s1_y; + + var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div; + if (s < 0 || s > 1) { return; } + + var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div; + + if (t >= 0 && t <= 1) { + return { + x: p0_x - (t * s1_x), + y: p0_y - (t * s1_y) + } + } + } + /** * This is a brute force solution with O(n^2) performance. * (`n` is number of segments). @@ -1644,7 +1669,6 @@ * Use this when number of lines is low, and number of intersections * is high. */ - function brute(lines, options) { var results = []; var reportIntersection = (options && options.onFound) || @@ -1711,30 +1735,397 @@ } } - function intersectSegments$1(a, b) { - // https://stackoverflow.com/a/1968345/125351 - var aStart = a.from, bStart = b.from; - var p0_x = aStart.x, p0_y = aStart.y, - p2_x = bStart.x, p2_y = bStart.y; + var ARRAY_TYPES = [ + Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, + Int32Array, Uint32Array, Float32Array, Float64Array + ]; - var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y; - var div = s1_x * s2_y - s2_x * s1_y; + var VERSION = 3; // serialized format version - var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div; - if (s < 0 || s > 1) { return; } + var Flatbush = function Flatbush(numItems, nodeSize, ArrayType, data) { + var this$1 = this; - var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div; + if (numItems === undefined) { throw new Error('Missing required argument: numItems.'); } + if (isNaN(numItems) || numItems <= 0) { throw new Error(("Unpexpected numItems value: " + numItems + ".")); } - if (t >= 0 && t <= 1) { - return { - x: p0_x - (t * s1_x), - y: p0_y - (t * s1_y) + this.numItems = +numItems; + this.nodeSize = Math.min(Math.max(+nodeSize || 16, 2), 65535); + + // calculate the total number of nodes in the R-tree to allocate space for + // and the index of each tree level (used in search later) + var n = numItems; + var numNodes = n; + this._levelBounds = [n * 4]; + do { + n = Math.ceil(n / this$1.nodeSize); + numNodes += n; + this$1._levelBounds.push(numNodes * 4); + } while (n !== 1); + + this.ArrayType = ArrayType || Float64Array; + this.IndexArrayType = numNodes < 16384 ? Uint16Array : Uint32Array; + + var arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType); + var nodesByteSize = numNodes * 4 * this.ArrayType.BYTES_PER_ELEMENT; + + if (arrayTypeIndex < 0) { + throw new Error(("Unexpected typed array class: " + ArrayType + ".")); + } + + if (data && (data instanceof ArrayBuffer)) { + this.data = data; + this._boxes = new this.ArrayType(this.data, 8, numNodes * 4); + this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes); + + this._pos = numNodes * 4; + this.minX = this._boxes[this._pos - 4]; + this.minY = this._boxes[this._pos - 3]; + this.maxX = this._boxes[this._pos - 2]; + this.maxY = this._boxes[this._pos - 1]; + + } else { + this.data = new ArrayBuffer(8 + nodesByteSize + numNodes * this.IndexArrayType.BYTES_PER_ELEMENT); + this._boxes = new this.ArrayType(this.data, 8, numNodes * 4); + this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes); + this._pos = 0; + this.minX = Infinity; + this.minY = Infinity; + this.maxX = -Infinity; + this.maxY = -Infinity; + + new Uint8Array(this.data, 0, 2).set([0xfb, (VERSION << 4) + arrayTypeIndex]); + new Uint16Array(this.data, 2, 1)[0] = nodeSize; + new Uint32Array(this.data, 4, 1)[0] = numItems; + } + }; + + Flatbush.from = function from (data) { + if (!(data instanceof ArrayBuffer)) { + throw new Error('Data must be an instance of ArrayBuffer.'); + } + var ref = new Uint8Array(data, 0, 2); + var magic = ref[0]; + var versionAndType = ref[1]; + if (magic !== 0xfb) { + throw new Error('Data does not appear to be in a Flatbush format.'); + } + if (versionAndType >> 4 !== VERSION) { + throw new Error(("Got v" + (versionAndType >> 4) + " data when expected v" + VERSION + ".")); + } + var ref$1 = new Uint16Array(data, 2, 1); + var nodeSize = ref$1[0]; + var ref$2 = new Uint32Array(data, 4, 1); + var numItems = ref$2[0]; + + return new Flatbush(numItems, nodeSize, ARRAY_TYPES[versionAndType & 0x0f], data); + }; + + Flatbush.prototype.add = function add (minX, minY, maxX, maxY) { + var index = this._pos >> 2; + this._indices[index] = index; + this._boxes[this._pos++] = minX; + this._boxes[this._pos++] = minY; + this._boxes[this._pos++] = maxX; + this._boxes[this._pos++] = maxY; + + if (minX < this.minX) { this.minX = minX; } + if (minY < this.minY) { this.minY = minY; } + if (maxX > this.maxX) { this.maxX = maxX; } + if (maxY > this.maxY) { this.maxY = maxY; } + }; + + Flatbush.prototype.finish = function finish () { + var this$1 = this; + + if (this._pos >> 2 !== this.numItems) { + throw new Error(("Added " + (this._pos >> 2) + " items when expected " + (this.numItems) + ".")); + } + + var width = this.maxX - this.minX; + var height = this.maxY - this.minY; + var hilbertValues = new Uint32Array(this.numItems); + var hilbertMax = (1 << 16) - 1; + + // map item centers into Hilbert coordinate space and calculate Hilbert values + for (var i = 0; i < this.numItems; i++) { + var pos = 4 * i; + var minX = this$1._boxes[pos++]; + var minY = this$1._boxes[pos++]; + var maxX = this$1._boxes[pos++]; + var maxY = this$1._boxes[pos++]; + var x = Math.floor(hilbertMax * ((minX + maxX) / 2 - this$1.minX) / width); + var y = Math.floor(hilbertMax * ((minY + maxY) / 2 - this$1.minY) / height); + hilbertValues[i] = hilbert(x, y); + } + + // sort items by their Hilbert value (for packing later) + sort$1(hilbertValues, this._boxes, this._indices, 0, this.numItems - 1); + + // generate nodes at each tree level, bottom-up + for (var i$1 = 0, pos$1 = 0; i$1 < this._levelBounds.length - 1; i$1++) { + var end = this$1._levelBounds[i$1]; + + // generate a parent node for each block of consecutive nodes + while (pos$1 < end) { + var nodeMinX = Infinity; + var nodeMinY = Infinity; + var nodeMaxX = -Infinity; + var nodeMaxY = -Infinity; + var nodeIndex = pos$1; + + // calculate bbox for the new node + for (var i$2 = 0; i$2 < this.nodeSize && pos$1 < end; i$2++) { + var minX$1 = this$1._boxes[pos$1++]; + var minY$1 = this$1._boxes[pos$1++]; + var maxX$1 = this$1._boxes[pos$1++]; + var maxY$1 = this$1._boxes[pos$1++]; + if (minX$1 < nodeMinX) { nodeMinX = minX$1; } + if (minY$1 < nodeMinY) { nodeMinY = minY$1; } + if (maxX$1 > nodeMaxX) { nodeMaxX = maxX$1; } + if (maxY$1 > nodeMaxY) { nodeMaxY = maxY$1; } + } + + // add the new node to the tree data + this$1._indices[this$1._pos >> 2] = nodeIndex; + this$1._boxes[this$1._pos++] = nodeMinX; + this$1._boxes[this$1._pos++] = nodeMinY; + this$1._boxes[this$1._pos++] = nodeMaxX; + this$1._boxes[this$1._pos++] = nodeMaxY; + } + } + }; + + Flatbush.prototype.search = function search (minX, minY, maxX, maxY, filterFn) { + var this$1 = this; + + if (this._pos !== this._boxes.length) { + throw new Error('Data not yet indexed - call index.finish().'); + } + + var nodeIndex = this._boxes.length - 4; + var level = this._levelBounds.length - 1; + var queue = []; + var results = []; + + while (nodeIndex !== undefined) { + // find the end index of the node + var end = Math.min(nodeIndex + this$1.nodeSize * 4, this$1._levelBounds[level]); + + // search through child nodes + for (var pos = nodeIndex; pos < end; pos += 4) { + var index = this$1._indices[pos >> 2]; + + // check if node bbox intersects with query bbox + if (maxX < this$1._boxes[pos]) { continue; } // maxX < nodeMinX + if (maxY < this$1._boxes[pos + 1]) { continue; } // maxY < nodeMinY + if (minX > this$1._boxes[pos + 2]) { continue; } // minX > nodeMaxX + if (minY > this$1._boxes[pos + 3]) { continue; } // minY > nodeMaxY + + if (nodeIndex < this$1.numItems * 4) { + if (filterFn === undefined || filterFn(index)) { + results.push(index); // leaf item + } + + } else { + queue.push(index); // node; add it to the search queue + queue.push(level - 1); + } + } + + level = queue.pop(); + nodeIndex = queue.pop(); } + + return results; + }; + + // custom quicksort that sorts bbox data alongside the hilbert values + function sort$1(values, boxes, indices, left, right) { + if (left >= right) { return; } + + var pivot = values[(left + right) >> 1]; + var i = left - 1; + var j = right + 1; + + while (true) { + do { i++; } while (values[i] < pivot); + do { j--; } while (values[j] > pivot); + if (i >= j) { break; } + swap(values, boxes, indices, i, j); + } + + sort$1(values, boxes, indices, left, j); + sort$1(values, boxes, indices, j + 1, right); + } + + // swap two values and two corresponding boxes + function swap(values, boxes, indices, i, j) { + var temp = values[i]; + values[i] = values[j]; + values[j] = temp; + + var k = 4 * i; + var m = 4 * j; + + var a = boxes[k]; + var b = boxes[k + 1]; + var c = boxes[k + 2]; + var d = boxes[k + 3]; + boxes[k] = boxes[m]; + boxes[k + 1] = boxes[m + 1]; + boxes[k + 2] = boxes[m + 2]; + boxes[k + 3] = boxes[m + 3]; + boxes[m] = a; + boxes[m + 1] = b; + boxes[m + 2] = c; + boxes[m + 3] = d; + + var e = indices[i]; + indices[i] = indices[j]; + indices[j] = e; + } + + // Fast Hilbert curve algorithm by http://threadlocalmutex.com/ + // Ported from C++ https://github.com/rawrunprotected/hilbert_curves (public domain) + function hilbert(x, y) { + var a = x ^ y; + var b = 0xFFFF ^ a; + var c = 0xFFFF ^ (x | y); + var d = x & (y ^ 0xFFFF); + + var A = a | (b >> 1); + var B = (a >> 1) ^ a; + var C = ((c >> 1) ^ (b & (d >> 1))) ^ c; + var D = ((a & (c >> 1)) ^ (d >> 1)) ^ d; + + a = A; b = B; c = C; d = D; + A = ((a & (a >> 2)) ^ (b & (b >> 2))); + B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2))); + C ^= ((a & (c >> 2)) ^ (b & (d >> 2))); + D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2))); + + a = A; b = B; c = C; d = D; + A = ((a & (a >> 4)) ^ (b & (b >> 4))); + B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4))); + C ^= ((a & (c >> 4)) ^ (b & (d >> 4))); + D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4))); + + a = A; b = B; c = C; d = D; + C ^= ((a & (c >> 8)) ^ (b & (d >> 8))); + D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8))); + + a = C ^ (C >> 1); + b = D ^ (D >> 1); + + var i0 = x ^ y; + var i1 = b | (0xFFFF ^ (i0 | a)); + + i0 = (i0 | (i0 << 8)) & 0x00FF00FF; + i0 = (i0 | (i0 << 4)) & 0x0F0F0F0F; + i0 = (i0 | (i0 << 2)) & 0x33333333; + i0 = (i0 | (i0 << 1)) & 0x55555555; + + i1 = (i1 | (i1 << 8)) & 0x00FF00FF; + i1 = (i1 | (i1 << 4)) & 0x0F0F0F0F; + i1 = (i1 | (i1 << 2)) & 0x33333333; + i1 = (i1 | (i1 << 1)) & 0x55555555; + + return ((i1 << 1) | i0) >>> 0; + } + + /** + * This implementation is inspired by discussion here + * https://twitter.com/mourner/status/1049325199617921024 and + * here https://github.com/anvaka/isect/issues/1 + * + * It builds an index of all segments using static spatial index + * and then for each segment it queries overlapping rectangles. + */ + function bush(lines, options) { + var results = []; + var reportIntersection = (options && options.onFound) || + defaultIntersectionReporter; + var asyncState; + + var index = new Flatbush(lines.length); + lines.forEach(addToIndex); + index.finish(); + + return { + run: run, + step: step, + results: results, + + // undocumented, don't use unless you know what you are doing: + checkIntersection: checkIntersection + } + + function run() { + for (var i = 0; i < lines.length; ++i) { + if (checkIntersection(lines[i], i)) { + return; // stop early + } + } + return results; + } + + function checkIntersection(currentSegment, currentId) { + // sorry about code duplication. + var minX = currentSegment.from.x; var maxX = currentSegment.to.x; + var minY = currentSegment.from.y; var maxY = currentSegment.to.y; + var t; + if (minX > maxX) { t = minX; minX = maxX; maxX = t; } + if (minY > maxY) { t = minY; minY = maxY; maxY = t; } + + var ids = index.search(minX, minY, maxX, maxY); + + for (var i = 0; i < ids.length; ++i) { + var segmentIndex = ids[i]; + if (segmentIndex <= currentId) { continue; } // we have either reported it, or it is current. + + var otherSegment = lines[segmentIndex]; + var point = intersectSegments$1(otherSegment, currentSegment); + + if (point) { + if (reportIntersection(point, [currentSegment, otherSegment])) { + // stop early + return true; + } + } + } + } + + function step() { + if (!asyncState) { + asyncState = {i: 0}; + } + var test = lines[asyncState.i]; + checkIntersection(test, asyncState.i); + asyncState.i += 1; + return asyncState.i < lines.length; + } + + + function addToIndex(line) { + var minX = line.from.x; var maxX = line.to.x; + var minY = line.from.y; var maxY = line.to.y; + var t; + if (minX > maxX) { t = minX; minX = maxX; maxX = t; } + if (minY > maxY) { t = minY; minY = maxY; maxY = t; } + index.add(minX, minY, maxX, maxY); + } + + function defaultIntersectionReporter(p, interior) { + results.push({ + point: p, + segments: interior + }); } } exports.sweep = isect; exports.brute = brute; + exports.bush = bush; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/build/isect.min.js.map b/build/isect.min.js.map index 758f94b..61f6504 100644 --- a/build/isect.min.js.map +++ b/build/isect.min.js.map @@ -1 +1 @@ -{"version":3,"file":"isect.min.js","sources":["../node_modules/splaytree/index.js","../src/createEventQueue.js","../src/geom.js","../src/sweepStatus.js","../src/SweepEvent.js","../src/sweep.js","../src/brute.js"],"sourcesContent":["/* follows \"An implementation of top-down splaying\"\n * by D. Sleator March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Tree} tree\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, t, comparator, tree) {\n let x;\n if (t === null) return null;\n t = splay(i, t, comparator);\n var cmp = comparator(i, t.key);\n if (cmp === 0) { /* found it */\n if (t.left === null) {\n x = t.right;\n } else {\n x = splay(i, t.left, comparator);\n x.right = t.right;\n }\n tree._size--;\n return x;\n }\n return t; /* It wasn't there */\n}\n\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n remove (key) {\n this._root = remove(key, this._root, this._comparator, this);\n }\n\n\n /**\n * Removes and returns the node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n this._root = splay(node.key, this._root, this._comparator);\n this._root = remove(node.key, this._root, this._comparator, this);\n return { key: node.key, data: node.data };\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array} keys\n * @param {Array} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n","import SplayTree from 'splaytree';\n\nexport default function createEventQueue(byY) {\n const q = new SplayTree(byY);\n\n return {\n isEmpty: isEmpty,\n size: size,\n pop: pop,\n find: find,\n insert: insert\n }\n\n function find(p) {\n return q.find(p);\n }\n\n function size() {\n return q.size;\n }\n\n function isEmpty() {\n return q.isEmpty();\n }\n\n function insert(event) {\n // debugger;\n q.add(event.point, event);\n }\n\n function pop() {\n var node = q.pop();\n return node && node.data;\n }\n}\n","/**\n * Just a collection of geometry related utilities\n */\n\n// This is used for precision checking (e.g. two numbers are equal\n// if their difference is smaller than this number). The value is \n// chosen empirically. We still may run into precision related issues.\n// TODO: we should allow consumers to configure this.\nexport const EPS = 1e-9;//10;\n\nexport function getIntersectionXPoint(segment, xPos, yPos) {\n var dy1 = segment.from.y - yPos;\n var dy2 = yPos - segment.to.y;\n var dy = segment.to.y - segment.from.y;\n if (Math.abs(dy1) < EPS) {\n // The segment starts on the sweep line\n if (Math.abs(dy) < EPS) {\n // the segment is horizontal. Intersection is at the point\n if (xPos <= segment.from.x) return segment.from.x;\n if (xPos > segment.to.x) return segment.to.x;\n return xPos;\n }\n return segment.from.x;\n }\n \n var dx = (segment.to.x - segment.from.x); \n var xOffset; \n if (dy1 >= dy2) {\n xOffset = dy1 * (dx / dy); \n return (segment.from.x - xOffset);\n } \n xOffset = dy2 * (dx / dy);\n return (segment.to.x + xOffset);\n}\n\nexport function angle(dx, dy) {\n // https://stackoverflow.com/questions/16542042/fastest-way-to-sort-vectors-by-angle-without-actually-computing-that-angle\n var p = dx/(Math.abs(dx) + Math.abs(dy)) // -1 .. 1 increasing with x\n\n if (dy < 0) return p - 1; // -2 .. 0 increasing with x\n return 1 - p // 0 .. 2 decreasing with x\n}\n\nexport function intersectSegments(a, b) {\n // https://stackoverflow.com/a/1968345/125351\n var aStart = a.from, bStart = b.from;\n var p0_x = aStart.x, p0_y = aStart.y,\n p2_x = bStart.x, p2_y = bStart.y;\n\n var s1_x = a.dx, s1_y = a.dy, s2_x = b.dx, s2_y = b.dy;\n var div = s1_x * s2_y - s2_x * s1_y;\n\n var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div;\n if (s < 0 || s > 1) return;\n\n var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div;\n\n if (t >= 0 && t <= 1) {\n return {\n x: p0_x - (t * s1_x),\n y: p0_y - (t * s1_y)\n }\n }\n}\n\nexport function same(x0, x1, y0, y1) {\n return Math.abs(x0 - x1) < EPS && Math.abs(y0 - y1) < EPS;\n}\n\nexport function samePoint(a, b) {\n return Math.abs(a.x - b.x) < EPS && Math.abs(a.y - b.y) < EPS;\n}\n","import SplayTree from 'splaytree';\nimport {samePoint, getIntersectionXPoint} from './geom'\n\n/**\n * Creates a new sweep status data structure.\n */\nexport default function createSweepStatus(onError, EPS) {\n var lastPointY, prevY;\n var lastPointX, prevX;\n var useBelow = false;\n var status = new SplayTree(compareSegments);\n\n // To save on GC we return mutable object.\n var currentBoundary = {\n beforeLeft: null,\n left: null,\n right: null,\n afterRight: null,\n }\n\n var currentLeftRight = {left: null, right: null};\n\n return {\n /**\n * Add new segments into the status tree.\n */\n insertSegments,\n\n /**\n * Remove segments from the status tree.\n */\n deleteSegments,\n\n /**\n * Returns segments that are to the left and right from a given point.\n */\n getLeftRightPoint,\n\n /**\n * For a given collections of segments finds the most left and the most right\n * segments. Also returns segments immediately before left, and after right segments.\n */\n getBoundarySegments,\n\n findSegmentsWithPoint,\n\n /**\n * Current binary search tree with segments\n */\n status,\n\n /**\n * Introspection method that verifies if there are duplicates in the segment tree.\n * If there are - `onError()` is called.\n */\n checkDuplicate,\n\n /**\n * Prints current segments in order of their intersection with sweep line. Introspection method.\n */\n printStatus,\n\n /**\n * Returns current position of the sweep line.\n */\n getLastPoint() {\n return {x: lastPointX, y: lastPointY};\n }\n }\n\n function compareSegments(a, b) {\n if (a === b) return 0;\n\n var ak = getIntersectionXPoint(a, lastPointX, lastPointY);\n var bk = getIntersectionXPoint(b, lastPointX, lastPointY);\n\n var res = ak - bk;\n if (Math.abs(res) >= EPS) {\n // We are okay fine. Intersection distance between two segments\n // is good to give conclusive answer\n return res;\n }\n\n var aIsHorizontal = Math.abs(a.dy) < EPS;\n var bIsHorizontal = Math.abs(b.dy) < EPS;\n if (aIsHorizontal && bIsHorizontal) {\n return b.to.x - a.to.x;\n }\n // TODO: What if both a and b is horizontal?\n // move horizontal to end\n if (aIsHorizontal) { \n return useBelow ? -1 : 1;\n }\n\n if (bIsHorizontal) {\n if (useBelow) {\n return (b.from.x >= lastPointX) ? -1 : 1\n }\n return -1;\n // return useBelow ? 1 : -1;\n }\n var pa = a.angle;\n var pb = b.angle;\n if (Math.abs(pa - pb) >= EPS) {\n return useBelow ? pa - pb : pb - pa;\n }\n\n var segDist = a.from.y - b.from.y;\n if (Math.abs(segDist) >= EPS) {\n return -segDist;\n }\n segDist = a.to.y - b.to.y;\n if (Math.abs(segDist) >= EPS) {\n // TODO: Is this accurate?\n return -segDist;\n }\n\n return 0;\n // Could also use:\n // var aAngle = Math.atan2(a.from.y - a.to.y, a.from.x - a.to.x);\n // var bAngle = Math.atan2(b.from.y - b.to.y, b.from.x - b.to.x);\n // return useBelow ? bAngle - aAngle : aAngle - bAngle;\n }\n\n function getBoundarySegments(upper, interior) {\n var leftMost, rightMost, i;\n var uLength = upper.length;\n\n if (uLength > 0) {\n leftMost = rightMost = upper[0];\n } else {\n leftMost = rightMost = interior[0];\n }\n\n for (i = 1; i < uLength; ++i) {\n var s = upper[i];\n var cmp = compareSegments(leftMost, s);\n if (cmp > 0) leftMost = s;\n\n cmp = compareSegments(rightMost, s);\n if (cmp < 0) rightMost = s;\n }\n\n var startFrom = uLength > 0 ? 0 : 1;\n for (i = startFrom; i < interior.length; ++i) {\n s = interior[i];\n cmp = compareSegments(leftMost, s);\n if (cmp > 0) leftMost = s;\n\n cmp = compareSegments(rightMost, s);\n if (cmp < 0) rightMost = s;\n }\n\n // at this point we have our left/right segments in the status.\n // Let's find their prev/next elements and report them back:\n var left = status.find(leftMost);\n if (!left) {\n onError('Left is missing. Precision error?');\n }\n\n var right = status.find(rightMost);\n if (!right) {\n onError('Right is missing. Precision error?');\n }\n\n var beforeLeft = left && status.prev(left);\n var afterRight = right && status.next(right);\n\n while (afterRight && right.key.dy === 0 && afterRight.key.dy === 0) {\n // horizontal segments are special :(\n afterRight = status.next(afterRight);\n }\n\n currentBoundary.beforeLeft = beforeLeft && beforeLeft.key;\n currentBoundary.left = left && left.key;\n currentBoundary.right = right && right.key;\n currentBoundary.afterRight = afterRight && afterRight.key;\n\n return currentBoundary;\n }\n\n function getLeftRightPoint(p) {\n // We are trying to find left and right segments that are nearest to the\n // point p. For this we traverse the binary search tree, and remember\n // node with the shortest distance to p.\n var lastLeft;\n var current = status._root;\n var minX = Number.POSITIVE_INFINITY;\n\n var useNext = false;\n while (current) {\n var x = getIntersectionXPoint(current.key, p.x, p.y);\n var dx = p.x - x;\n if (dx >= 0) {\n if (dx < minX) {\n minX = dx;\n lastLeft = current;\n current = current.left;\n useNext = false;\n } else {\n break;\n }\n } else {\n if (-dx < minX) {\n useNext = true;\n minX = -dx;\n lastLeft = current;\n current = current.right;\n } else {\n break;\n }\n }\n }\n if (useNext) {\n // I'm not sure why I did this. I don't this this is right now.\n // lastLeft = status.next(lastLeft);\n }\n\n currentLeftRight.left = lastLeft && lastLeft.key\n var next = lastLeft && status.next(lastLeft);\n currentLeftRight.right = next && next.key\n return currentLeftRight;\n\n // Conceptually, the code above should be equivalent to the code below;\n // The code below is easier to understand, but intuitively, the code above\n // should have better performance (as we do not traverse the entire status\n // tree)\n\n // var right, left, x;\n // var all = status.keys()\n // for (var i = 0; i < all.length; ++i) {\n // var segment = all[i];\n // x = getIntersectionXPoint(segment, p.x, p.y);\n // if (x > p.x && !right) {\n // right = segment;\n // break;\n // } else if (x < p.x) {\n // left = segment;\n // }\n // }\n\n // currentLeftRight.left = left;\n // currentLeftRight.right = right;\n\n // return currentLeftRight;\n }\n\n function findSegmentsWithPoint(p, onFound) {\n // Option 1.\n // var arrResults = [];\n // status.forEach(current => {\n // var x = getIntersectionXPoint(current.key, p.x, p.y);\n // var dx = p.x - x;\n // if (Math.abs(dx) < EPS) {\n // onFound(current.key);\n // // arrResults.push(current.key)\n // }\n // });\n // return arrResults;\n\n // Option 2.\n\n // let current = status._root;\n // const Q = []; /* Initialize stack s */\n // let done = false;\n // var res = [];\n // var breakEarly = false;\n\n // while (!done) {\n // if (current !== null) {\n // Q.push(current);\n // current = current.left;\n // } else {\n // if (Q.length !== 0) {\n // current = Q.pop();\n\n // var x = getIntersectionXPoint(current.key, p.x, p.y);\n // var dx = p.x - x;\n // if (Math.abs(dx) < EPS) {\n // res.push(current.key)\n // breakEarly = true;\n // } else if (breakEarly) {\n // done = true;\n // }\n\n // current = current.right;\n // } else done = true;\n // }\n // }\n\n // return res;\n\n // option 3.\n var current = status._root;\n\n while (current) {\n var x = getIntersectionXPoint(current.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(current, p, onFound);\n break;\n } else if (dx < 0) {\n current = current.left;\n } else {\n current = current.right;\n }\n }\n }\n\n function collectAdjacentNodes(root, p, onFound) {\n onFound(root.key);\n goOverPredecessors(root.left, p, onFound);\n goOverSuccessors(root.right, p, onFound);\n }\n\n function goOverPredecessors(root, p, res) {\n if (!root) return;\n var x = getIntersectionXPoint(root.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(root, p, res);\n } else {\n goOverPredecessors(root.right, p, res);\n }\n }\n\n function goOverSuccessors(root, p, res) {\n if (!root) return;\n var x = getIntersectionXPoint(root.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(root, p, res);\n } else {\n goOverSuccessors(root.left, p, res);\n }\n }\n\n function checkDuplicate() {\n var prev;\n status.forEach(node => {\n var current = node.key;\n\n if (prev) {\n if (samePoint(prev.from, current.from) && samePoint(prev.to, current.to)) {\n // Likely you have received error before during segment removal.\n onError('Duplicate key in the status! This may be caused by Floating Point rounding error')\n }\n }\n prev = current;\n });\n }\n\n function printStatus(prefix = '') {\n // eslint-disable-next-line\n console.log(prefix, 'status line: ', lastPointX, lastPointY);\n status.forEach(node => {\n var x = getIntersectionXPoint(node.key, lastPointX, lastPointY);\n // eslint-disable-next-line\n console.log(x + ' ' + node.key.name);\n })\n }\n\n function insertSegments(interior, upper, sweepLinePos) {\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n var key;\n\n for (var i = 0; i < interior.length; ++i) {\n key = interior[i];\n status.add(key);\n }\n for (i = 0; i < upper.length; ++i) {\n key = upper[i]\n status.add(key);\n }\n }\n\n function deleteSegments(lower, interior, sweepLinePos) {\n // I spent most of the time debugging this method. Depending on the\n // algorithm state we can run into situation when dynamic keys of the\n // `status` tree predict wrong branch, and thus we are not able to find\n // the segment that needs to be deleted. If that happens I'm trying to\n // use previous point and repeat the process. This may result in \n // incorrect state. In that case I report an error. \n var i;\n var prevCount = status._size;\n prevX = lastPointX;\n prevY = lastPointY;\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n\n useBelow = true;\n for(i = 0; i < lower.length; ++i) {\n removeSegment(lower[i], sweepLinePos)\n }\n for(i = 0; i < interior.length; ++i) {\n removeSegment(interior[i], sweepLinePos)\n }\n useBelow = false;\n\n if (status._size !== prevCount - interior.length - lower.length) {\n // This can happen when rounding error occurs. You can try scaling your input\n onError('Segments were not removed from a tree properly. Precision error?');\n }\n }\n\n function removeSegment(key, sweepLinePos) {\n if (status.find(key)) {\n status.remove(key);\n } else {\n lastPointX = prevX;\n lastPointY = prevY;\n if (status.find(key)) {\n status.remove(key);\n } else {\n // They will get an error :(\n }\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n }\n }\n}","/**\n * Represents a single event in the sweep-line algorithm\n */\nexport default class SweepEvent {\n /**\n * Creates new sweep event of a given kind.\n */\n constructor(point, segment) {\n this.point = point;\n if (segment) this.from = [segment];\n }\n}\n","import createEventQueue from './createEventQueue';\nimport createSweepStatus from './sweepStatus';\nimport SweepEvent from './SweepEvent';\n\nimport {intersectSegments, EPS, angle, samePoint} from './geom';\n\n/**\n * A point on a line\n * \n * @typedef {Object} Point\n * @property {number} x coordinate\n * @property {number} y coordinate\n */\n\n\n/**\n * @typedef {Object} Segment \n * @property {Point} from start of the segment\n * @property {Point} to end of the segment\n */\n\n/**\n * @typedef {function(point : Point, interior : Segment[], lower : Segment[], upper : Segment[])} ReportIntersectionCallback\n */\n\n/**\n * @typedef {Object} ISectOptions \n * @property {ReportIntersectionCallback} onFound \n */\n\n /**\n * @typedef {Object} ISectResult\n */\n\n// We use EMPTY array to avoid pressure on garbage collector. Need to be\n// very cautious to not mutate this array.\nvar EMPTY = [];\n\n/**\n * Finds all intersections among given segments.\n * \n * The algorithm follows \"Computation Geometry, Algorithms and Applications\" book\n * by Mark de Berg, Otfried Cheong, Marc van Kreveld, and Mark Overmars.\n * \n * Line is swept top-down\n * \n * @param {Segment[]} segments\n * @param {ISectOptions=} options\n * @returns {ISectResult}\n */\nexport default function isect(segments, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || defaultIntersectionReporter;\n\n var onError = (options && options.onError) || defaultErrorReporter;\n\n var eventQueue = createEventQueue(byY);\n var sweepStatus = createSweepStatus(onError, EPS);\n var lower, interior, lastPoint;\n\n segments.forEach(addSegment);\n\n return {\n /**\n * Find all intersections synchronously.\n * \n * @returns array of found intersections.\n */\n run,\n\n /**\n * Performs a single step in the sweep line algorithm\n * \n * @returns true if there was something to process; False if no more work to do\n */\n step,\n\n // Methods below are low level API for fine-grained control.\n // Don't use it unless you understand this code thoroughly\n\n /**\n * Add segment into the \n */\n addSegment,\n\n /**\n * Direct access to event queue. Queue contains segment endpoints and\n * pending detected intersections.\n */\n eventQueue, \n\n /**\n * Direct access to sweep line status. \"Status\" holds information about\n * all intersected segments.\n */\n sweepStatus,\n\n /**\n * Access to results array. Works only when you use default onFound() handler\n */\n results\n }\n\n function run() {\n while (!eventQueue.isEmpty()) {\n var eventPoint = eventQueue.pop();\n if (handleEventPoint(eventPoint)) {\n // they decided to stop.\n return;\n };\n }\n\n return results;\n }\n\n function step() {\n if (!eventQueue.isEmpty()) {\n var eventPoint = eventQueue.pop();\n handleEventPoint(eventPoint);\n // Note: we don't check results of `handleEventPoint()`\n // assumption is that client controls `step()` and thus they \n // know better if they want to stop.\n return true;\n }\n return false;\n }\n\n function handleEventPoint(p) {\n lastPoint = p.point;\n var upper = p.from || EMPTY;\n\n lower = interior = undefined;\n // TODO: move lower/interior into sweep status method?\n\n sweepStatus.findSegmentsWithPoint(lastPoint, addLowerOrInterior);\n // if (segmentsWithPoint) {\n // segmentsWithPoint.forEach()\n // } \n\n if (!lower) lower = EMPTY;\n if (!interior) interior = EMPTY;\n\n var uLength = upper.length;\n var iLength = interior.length;\n var lLength = lower.length;\n var hasIntersection = uLength + iLength + lLength > 1;\n var hasPointIntersection = !hasIntersection && (uLength === 0 && lLength === 0 && iLength > 0);\n\n if (hasIntersection || hasPointIntersection) {\n p.isReported = true;\n if (reportIntersection(lastPoint, interior, lower, upper)) {\n return true;\n }\n }\n\n sweepStatus.deleteSegments(lower, interior, lastPoint);\n sweepStatus.insertSegments(interior, upper, lastPoint);\n\n var sLeft, sRight;\n\n var hasNoCrossing = (uLength + iLength === 0);\n\n if (hasNoCrossing) {\n var leftRight = sweepStatus.getLeftRightPoint(lastPoint);\n sLeft = leftRight.left;\n if (!sLeft) return;\n\n sRight = leftRight.right;\n if (!sRight) return;\n\n findNewEvent(sLeft, sRight, p);\n } else {\n var boundarySegments = sweepStatus.getBoundarySegments(upper, interior);\n\n findNewEvent(boundarySegments.beforeLeft, boundarySegments.left, p);\n findNewEvent(boundarySegments.right, boundarySegments.afterRight, p);\n }\n\n return false;\n }\n\n function addLowerOrInterior(s) {\n if (samePoint(s.to, lastPoint)) {\n if (!lower) lower = [s];\n else lower.push(s);\n } else if (!samePoint(s.from, lastPoint)) {\n if (!interior) interior = [s];\n else interior.push(s);\n }\n }\n\n function findNewEvent(left, right, p) {\n if (!left || !right) return;\n\n var intersection = intersectSegments(left, right);\n if (!intersection) {\n return;\n }\n\n var dy = p.point.y - intersection.y\n // TODO: should I add dy to intersection.y?\n if (dy < -EPS) {\n // this means intersection happened after the sweep line. \n // We already processed it.\n return;\n }\n if (Math.abs(dy) < EPS && intersection.x <= p.point.x) {\n return;\n }\n\n // Need to adjust floating point for this special case,\n // since otherwise it gives rounding errors:\n roundNearZero(intersection);\n\n var current = eventQueue.find(intersection);\n\n if (current && current.isReported) {\n // We already reported this event. No need to add it one more time\n // TODO: Is this case even possible?\n onError('We already reported this event.');\n return;\n }\n\n if (!current) {\n var event = new SweepEvent(intersection)\n eventQueue.insert(event);\n }\n }\n\n function defaultIntersectionReporter(p, interior, lower, upper) {\n results.push({\n point: p, \n segments: union(union(interior, lower), upper)\n });\n }\n\n function addSegment(segment) {\n var from = segment.from;\n var to = segment.to;\n\n // Small numbers give more precision errors. Rounding them to 0.\n roundNearZero(from);\n roundNearZero(to);\n\n var dy = from.y - to.y;\n\n // Note: dy is much smaller then EPS on purpose. I found that higher\n // precision here does less good - getting way more rounding errors.\n if (Math.abs(dy) < 1e-5) {\n from.y = to.y;\n segment.dy = 0;\n }\n if ((from.y < to.y) || (\n (from.y === to.y) && (from.x > to.x))\n ) {\n var temp = from;\n from = segment.from = to; \n to = segment.to = temp;\n }\n\n // We pre-compute some immutable properties of the segment\n // They are used quite often in the tree traversal, and pre-computation\n // gives significant boost:\n segment.dy = from.y - to.y;\n segment.dx = from.x - to.x;\n segment.angle = angle(segment.dy, segment.dx);\n\n var isPoint = segment.dy === segment.dx && segment.dy === 0;\n var prev = eventQueue.find(from)\n if (prev && !isPoint) {\n // this detects identical segments early. Without this check\n // the algorithm would break since sweep line has no means to\n // detect identical segments.\n var prevFrom = prev.data.from;\n if (prevFrom) {\n for (var i = 0; i < prevFrom.length; ++i) {\n var s = prevFrom[i];\n if (samePoint(s.to, to)) {\n reportIntersection(s.from, [], s.from, s.to);\n reportIntersection(s.to, [], s.from, s.to);\n return;\n }\n }\n }\n }\n\n if (!isPoint) {\n if (prev) {\n if (prev.data.from) prev.data.from.push(segment);\n else prev.data.from = [segment];\n } else {\n var e = new SweepEvent(from, segment)\n eventQueue.insert(e);\n }\n var event = new SweepEvent(to)\n eventQueue.insert(event)\n } else {\n var event = new SweepEvent(to)\n eventQueue.insert(event)\n }\n } \n}\n\nfunction roundNearZero(point) {\n if (Math.abs(point.x) < EPS) point.x = 0;\n if (Math.abs(point.y) < EPS) point.y = 0;\n}\n\nfunction defaultErrorReporter(errorMessage) {\n throw new Error(errorMessage);\n}\n\nfunction union(a, b) {\n if (!a) return b;\n if (!b) return a;\n\n return a.concat(b);\n}\n\nfunction byY(a, b) {\n // decreasing Y \n var res = b.y - a.y;\n // TODO: This might mess up the status tree.\n if (Math.abs(res) < EPS) {\n // increasing x.\n res = a.x - b.x;\n if (Math.abs(res) < EPS) res = 0;\n }\n\n return res;\n}","/**\n * This is a brute force solution with O(n^2) performance.\n * (`n` is number of segments).\n * \n * Use this when number of lines is low, and number of intersections\n * is high.\n */\n\nexport default function brute(lines, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || \n defaultIntersectionReporter;\n var asyncState;\n\n return {\n /**\n * Execute brute force of the segment intersection search\n */\n run,\n /**\n * Access to results array. Works only when you use default onFound() handler\n */\n results,\n\n /**\n * Performs a single step in the brute force algorithm ()\n */\n step\n }\n\n function step() {\n if (!asyncState) {\n asyncState = {\n i: 0\n }\n }\n var test = lines[asyncState.i];\n for (var j = asyncState.i + 1; j < lines.length; ++j) {\n var other = lines[j];\n var pt = intersectSegments(test, other);\n if (pt) {\n if (reportIntersection(pt, [test, other])) {\n return;\n }\n }\n }\n asyncState.i += 1;\n return asyncState.i < lines.length;\n }\n\n function run() {\n for(var i = 0; i < lines.length; ++i) {\n var test = lines[i];\n for (var j = i + 1; j < lines.length; ++j) {\n var other = lines[j];\n var pt = intersectSegments(test, other);\n if (pt) {\n if (reportIntersection(pt, [test, other])) {\n return;\n }\n }\n }\n }\n return results;\n }\n\n function defaultIntersectionReporter(p, interior) {\n results.push({\n point: p, \n segments: interior\n });\n }\n}\n\nfunction intersectSegments(a, b) {\n // https://stackoverflow.com/a/1968345/125351\n var aStart = a.from, bStart = b.from;\n var p0_x = aStart.x, p0_y = aStart.y,\n p2_x = bStart.x, p2_y = bStart.y;\n\n var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y;\n var div = s1_x * s2_y - s2_x * s1_y;\n\n var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div;\n if (s < 0 || s > 1) return;\n\n var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div;\n\n if (t >= 0 && t <= 1) {\n return {\n x: p0_x - (t * s1_x),\n y: p0_y - (t * s1_y)\n }\n }\n}\n"],"names":["let","const","this","SplayTree","EPS","intersectSegments"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"isect.min.js","sources":["../node_modules/splaytree/index.js","../src/createEventQueue.js","../src/geom.js","../src/sweepStatus.js","../src/SweepEvent.js","../src/sweep.js","../src/intersectSegments.js","../src/brute.js","../node_modules/flatbush/index.js","../src/bush.js"],"sourcesContent":["/* follows \"An implementation of top-down splaying\"\n * by D. Sleator March 1992\n */\n\n/**\n * @typedef {*} Key\n */\n\n\n/**\n * @typedef {*} Value\n */\n\n\n/**\n * @typedef {function(node:Node):void} Visitor\n */\n\n\n/**\n * @typedef {function(a:Key, b:Key):number} Comparator\n */\n\n\n/**\n * @param {function(node:Node):string} NodePrinter\n */\n\n\n/**\n * @typedef {Object} Node\n * @property {Key} Key\n * @property {Value=} data\n * @property {Node} left\n * @property {Node} right\n */\n\nclass Node {\n\n constructor (key, data) {\n this.key = key;\n this.data = data;\n this.left = null;\n this.right = null;\n }\n}\n\nfunction DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }\n\n\n/**\n * Simple top down splay, not requiring i to be in the tree t.\n * @param {Key} i\n * @param {Node?} t\n * @param {Comparator} comparator\n */\nfunction splay (i, t, comparator) {\n if (t === null) return t;\n let l, r, y;\n const N = new Node();\n l = r = N;\n\n while (true) {\n const cmp = comparator(i, t.key);\n //if (i < t.key) {\n if (cmp < 0) {\n if (t.left === null) break;\n //if (i < t.left.key) {\n if (comparator(i, t.left.key) < 0) {\n y = t.left; /* rotate right */\n t.left = y.right;\n y.right = t;\n t = y;\n if (t.left === null) break;\n }\n r.left = t; /* link right */\n r = t;\n t = t.left;\n //} else if (i > t.key) {\n } else if (cmp > 0) {\n if (t.right === null) break;\n //if (i > t.right.key) {\n if (comparator(i, t.right.key) > 0) {\n y = t.right; /* rotate left */\n t.right = y.left;\n y.left = t;\n t = y;\n if (t.right === null) break;\n }\n l.right = t; /* link left */\n l = t;\n t = t.right;\n } else {\n break;\n }\n }\n /* assemble */\n l.right = t.left;\n r.left = t.right;\n t.left = N.right;\n t.right = N.left;\n return t;\n}\n\n\n/**\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction insert (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n tree._size++;\n\n if (t === null) {\n node.left = node.right = null;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp >= 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n return node;\n}\n\n\n/**\n * Insert i into the tree t, unless it's already there.\n * @param {Key} i\n * @param {Value} data\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} root\n */\nfunction add (i, data, t, comparator, tree) {\n const node = new Node(i, data);\n\n if (t === null) {\n node.left = node.right = null;\n tree._size++;\n return node;\n }\n\n t = splay(i, t, comparator);\n const cmp = comparator(i, t.key);\n if (cmp === 0) return t;\n else {\n if (cmp < 0) {\n node.left = t.left;\n node.right = t;\n t.left = null;\n } else if (cmp > 0) {\n node.right = t.right;\n node.left = t;\n t.right = null;\n }\n tree._size++;\n return node;\n }\n}\n\n\n/**\n * Deletes i from the tree if it's there\n * @param {Key} i\n * @param {Tree} tree\n * @param {Comparator} comparator\n * @param {Tree} tree\n * @return {Node} new root\n */\nfunction remove (i, t, comparator, tree) {\n let x;\n if (t === null) return null;\n t = splay(i, t, comparator);\n var cmp = comparator(i, t.key);\n if (cmp === 0) { /* found it */\n if (t.left === null) {\n x = t.right;\n } else {\n x = splay(i, t.left, comparator);\n x.right = t.right;\n }\n tree._size--;\n return x;\n }\n return t; /* It wasn't there */\n}\n\n\nfunction split (key, v, comparator) {\n let left, right;\n if (v === null) {\n left = right = null;\n } else {\n v = splay(key, v, comparator);\n\n const cmp = comparator(v.key, key);\n if (cmp === 0) {\n left = v.left;\n right = v.right;\n } else if (cmp < 0) {\n right = v.right;\n v.right = null;\n left = v;\n } else {\n left = v.left;\n v.left = null;\n right = v;\n }\n }\n return { left, right };\n}\n\n\nfunction merge (left, right, comparator) {\n if (right === null) return left;\n if (left === null) return right;\n\n right = splay(left.key, right, comparator);\n right.left = left;\n return right;\n}\n\n\n/**\n * Prints level of the tree\n * @param {Node} root\n * @param {String} prefix\n * @param {Boolean} isTail\n * @param {Array} out\n * @param {Function(node:Node):String} printNode\n */\nfunction printRow (root, prefix, isTail, out, printNode) {\n if (root) {\n out(`${ prefix }${ isTail ? '└── ' : '├── ' }${ printNode(root) }\\n`);\n const indent = prefix + (isTail ? ' ' : '│ ');\n if (root.left) printRow(root.left, indent, false, out, printNode);\n if (root.right) printRow(root.right, indent, true, out, printNode);\n }\n}\n\n\nexport default class Tree {\n\n constructor (comparator = DEFAULT_COMPARE) {\n this._comparator = comparator;\n this._root = null;\n this._size = 0;\n }\n\n\n /**\n * Inserts a key, allows duplicates\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n insert (key, data) {\n return this._root = insert(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * Adds a key, if it is not present in the tree\n * @param {Key} key\n * @param {Value=} data\n * @return {Node|null}\n */\n add (key, data) {\n return this._root = add(key, data, this._root, this._comparator, this);\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n remove (key) {\n this._root = remove(key, this._root, this._comparator, this);\n }\n\n\n /**\n * Removes and returns the node with smallest key\n * @return {?Node}\n */\n pop () {\n let node = this._root;\n if (node) {\n while (node.left) node = node.left;\n this._root = splay(node.key, this._root, this._comparator);\n this._root = remove(node.key, this._root, this._comparator, this);\n return { key: node.key, data: node.data };\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n findStatic (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return current;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return null;\n }\n\n\n /**\n * @param {Key} key\n * @return {Node|null}\n */\n find (key) {\n if (this._root) {\n this._root = splay(key, this._root, this._comparator);\n if (this._comparator(key, this._root.key) !== 0) return null;\n }\n return this._root;\n }\n\n\n /**\n * @param {Key} key\n * @return {Boolean}\n */\n contains (key) {\n let current = this._root;\n const compare = this._comparator;\n while (current) {\n const cmp = compare(key, current.key);\n if (cmp === 0) return true;\n else if (cmp < 0) current = current.left;\n else current = current.right;\n }\n return false;\n }\n\n\n /**\n * @param {Visitor} visitor\n * @param {*=} ctx\n * @return {SplayTree}\n */\n forEach (visitor, ctx) {\n let current = this._root;\n const Q = []; /* Initialize stack s */\n let done = false;\n\n while (!done) {\n if (current !== null) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length !== 0) {\n current = Q.pop();\n visitor.call(ctx, current);\n\n current = current.right;\n } else done = true;\n }\n }\n return this;\n }\n\n\n /**\n * Walk key range from `low` to `high`. Stops if `fn` returns a value.\n * @param {Key} low\n * @param {Key} high\n * @param {Function} fn\n * @param {*?} ctx\n * @return {SplayTree}\n */\n range (low, high, fn, ctx) {\n const Q = [];\n const compare = this._comparator;\n let node = this._root, cmp;\n\n while (Q.length !== 0 || node) {\n if (node) {\n Q.push(node);\n node = node.left;\n } else {\n node = Q.pop();\n cmp = compare(node.key, high);\n if (cmp > 0) {\n break;\n } else if (compare(node.key, low) >= 0) {\n if (fn.call(ctx, node)) return this; // stop if smth is returned\n }\n node = node.right;\n }\n }\n return this;\n }\n\n\n /**\n * Returns array of keys\n * @return {Array}\n */\n keys () {\n const keys = [];\n this.forEach(({ key }) => keys.push(key));\n return keys;\n }\n\n\n /**\n * Returns array of all the data in the nodes\n * @return {Array}\n */\n values () {\n const values = [];\n this.forEach(({ data }) => values.push(data));\n return values;\n }\n\n\n /**\n * @return {Key|null}\n */\n min() {\n if (this._root) return this.minNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Key|null}\n */\n max() {\n if (this._root) return this.maxNode(this._root).key;\n return null;\n }\n\n\n /**\n * @return {Node|null}\n */\n minNode(t = this._root) {\n if (t) while (t.left) t = t.left;\n return t;\n }\n\n\n /**\n * @return {Node|null}\n */\n maxNode(t = this._root) {\n if (t) while (t.right) t = t.right;\n return t;\n }\n\n\n /**\n * Returns node at given index\n * @param {number} index\n * @return {?Node}\n */\n at (index) {\n let current = this._root, done = false, i = 0;\n const Q = [];\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = Q.pop();\n if (i === index) return current;\n i++;\n current = current.right;\n } else done = true;\n }\n }\n return null;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n next (d) {\n let root = this._root;\n let successor = null;\n\n if (d.right) {\n successor = d.right;\n while (successor.left) successor = successor.left;\n return successor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) {\n successor = root;\n root = root.left;\n } else root = root.right;\n }\n\n return successor;\n }\n\n\n /**\n * @param {Node} d\n * @return {Node|null}\n */\n prev (d) {\n let root = this._root;\n let predecessor = null;\n\n if (d.left !== null) {\n predecessor = d.left;\n while (predecessor.right) predecessor = predecessor.right;\n return predecessor;\n }\n\n const comparator = this._comparator;\n while (root) {\n const cmp = comparator(d.key, root.key);\n if (cmp === 0) break;\n else if (cmp < 0) root = root.left;\n else {\n predecessor = root;\n root = root.right;\n }\n }\n return predecessor;\n }\n\n\n /**\n * @return {SplayTree}\n */\n clear() {\n this._root = null;\n this._size = 0;\n return this;\n }\n\n\n /**\n * @return {NodeList}\n */\n toList() {\n return toList(this._root);\n }\n\n\n /**\n * Bulk-load items. Both array have to be same size\n * @param {Array} keys\n * @param {Array} [values]\n * @param {Boolean} [presort=false] Pre-sort keys and values, using\n * tree's comparator. Sorting is done\n * in-place\n * @return {AVLTree}\n */\n load (keys = [], values = [], presort = false) {\n let size = keys.length;\n const comparator = this._comparator;\n\n // sort if needed\n if (presort) sort(keys, values, 0, size - 1, comparator);\n\n if (this._root === null) { // empty tree\n this._root = loadRecursive(this._root, keys, values, 0, size);\n this._size = size;\n } else { // that re-builds the whole tree from two in-order traversals\n const mergedList = mergeLists(this.toList(), createList(keys, values), comparator);\n size = this._size + size;\n this._root = sortedListToBST({ head: mergedList }, 0, size);\n }\n return this;\n }\n\n\n /**\n * @return {Boolean}\n */\n isEmpty() { return this._root === null; }\n\n get size () { return this._size; }\n\n\n /**\n * @param {NodePrinter=} printNode\n * @return {String}\n */\n toString (printNode = (n) => n.key) {\n const out = [];\n printRow(this._root, '', true, (v) => out.push(v), printNode);\n return out.join('');\n }\n\n\n update (key, newKey, newData) {\n const comparator = this._comparator;\n let { left, right } = split(key, this._root, comparator);\n this._size--;\n if (comparator(key, newKey) < 0) {\n right = insert(newKey, newData, right, comparator, this);\n } else {\n left = insert(newKey, newData, left, comparator, this);\n }\n this._root = merge(left, right, comparator);\n }\n\n\n split(key) {\n return split(key, this._root, this._comparator);\n }\n}\n\n\nfunction loadRecursive (parent, keys, values, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const key = keys[middle];\n const data = values[middle];\n const node = { key, data, parent };\n node.left = loadRecursive(node, keys, values, start, middle);\n node.right = loadRecursive(node, keys, values, middle + 1, end);\n return node;\n }\n return null;\n}\n\n\nfunction createList(keys, values) {\n const head = { next: null };\n let p = head;\n for (let i = 0; i < keys.length; i++) {\n p = p.next = { key: keys[i], data: values[i] };\n }\n p.next = null;\n return head.next;\n}\n\n\nfunction toList (root) {\n var current = root;\n var Q = [], done = false;\n\n const head = { next: null };\n let p = head;\n\n while (!done) {\n if (current) {\n Q.push(current);\n current = current.left;\n } else {\n if (Q.length > 0) {\n current = p = p.next = Q.pop();\n current = current.right;\n } else done = true;\n }\n }\n p.next = null; // that'll work even if the tree was empty\n return head.next;\n}\n\n\nfunction sortedListToBST(list, start, end) {\n const size = end - start;\n if (size > 0) {\n const middle = start + Math.floor(size / 2);\n const left = sortedListToBST(list, start, middle);\n\n const root = list.head;\n root.left = left;\n\n list.head = list.head.next;\n\n root.right = sortedListToBST(list, middle + 1, end);\n return root;\n }\n return null;\n}\n\n\nfunction mergeLists (l1, l2, compare = (a, b) => a - b) {\n const head = {}; // dummy\n let p = head;\n\n let p1 = l1;\n let p2 = l2;\n\n while (p1 !== null && p2 !== null) {\n if (compare(p1.key, p2.key) < 0) {\n p.next = p1;\n p1 = p1.next;\n } else {\n p.next = p2;\n p2 = p2.next;\n }\n p = p.next;\n }\n\n if (p1 !== null) p.next = p1;\n else if (p2 !== null) p.next = p2;\n\n return head.next;\n}\n\n\nfunction sort(keys, values, left, right, compare) {\n if (left >= right) return;\n\n const pivot = keys[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (compare(keys[i], pivot) < 0);\n do j--; while (compare(keys[j], pivot) > 0);\n if (i >= j) break;\n\n let tmp = keys[i];\n keys[i] = keys[j];\n keys[j] = tmp;\n\n tmp = values[i];\n values[i] = values[j];\n values[j] = tmp;\n }\n\n sort(keys, values, left, j, compare);\n sort(keys, values, j + 1, right, compare);\n}\n","import SplayTree from 'splaytree';\n\nexport default function createEventQueue(byY) {\n const q = new SplayTree(byY);\n\n return {\n isEmpty: isEmpty,\n size: size,\n pop: pop,\n find: find,\n insert: insert\n }\n\n function find(p) {\n return q.find(p);\n }\n\n function size() {\n return q.size;\n }\n\n function isEmpty() {\n return q.isEmpty();\n }\n\n function insert(event) {\n // debugger;\n q.add(event.point, event);\n }\n\n function pop() {\n var node = q.pop();\n return node && node.data;\n }\n}\n","/**\n * Just a collection of geometry related utilities\n */\n\n// This is used for precision checking (e.g. two numbers are equal\n// if their difference is smaller than this number). The value is \n// chosen empirically. We still may run into precision related issues.\n// TODO: we should allow consumers to configure this.\nexport const EPS = 1e-9;//10;\n\nexport function getIntersectionXPoint(segment, xPos, yPos) {\n var dy1 = segment.from.y - yPos;\n var dy2 = yPos - segment.to.y;\n var dy = segment.to.y - segment.from.y;\n if (Math.abs(dy1) < EPS) {\n // The segment starts on the sweep line\n if (Math.abs(dy) < EPS) {\n // the segment is horizontal. Intersection is at the point\n if (xPos <= segment.from.x) return segment.from.x;\n if (xPos > segment.to.x) return segment.to.x;\n return xPos;\n }\n return segment.from.x;\n }\n \n var dx = (segment.to.x - segment.from.x); \n var xOffset; \n if (dy1 >= dy2) {\n xOffset = dy1 * (dx / dy); \n return (segment.from.x - xOffset);\n } \n xOffset = dy2 * (dx / dy);\n return (segment.to.x + xOffset);\n}\n\nexport function angle(dx, dy) {\n // https://stackoverflow.com/questions/16542042/fastest-way-to-sort-vectors-by-angle-without-actually-computing-that-angle\n var p = dx/(Math.abs(dx) + Math.abs(dy)) // -1 .. 1 increasing with x\n\n if (dy < 0) return p - 1; // -2 .. 0 increasing with x\n return 1 - p // 0 .. 2 decreasing with x\n}\n\nexport function intersectSegments(a, b) {\n // https://stackoverflow.com/a/1968345/125351\n var aStart = a.from, bStart = b.from;\n var p0_x = aStart.x, p0_y = aStart.y,\n p2_x = bStart.x, p2_y = bStart.y;\n\n var s1_x = a.dx, s1_y = a.dy, s2_x = b.dx, s2_y = b.dy;\n var div = s1_x * s2_y - s2_x * s1_y;\n\n var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div;\n if (s < 0 || s > 1) return;\n\n var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div;\n\n if (t >= 0 && t <= 1) {\n return {\n x: p0_x - (t * s1_x),\n y: p0_y - (t * s1_y)\n }\n }\n}\n\nexport function same(x0, x1, y0, y1) {\n return Math.abs(x0 - x1) < EPS && Math.abs(y0 - y1) < EPS;\n}\n\nexport function samePoint(a, b) {\n return Math.abs(a.x - b.x) < EPS && Math.abs(a.y - b.y) < EPS;\n}\n","import SplayTree from 'splaytree';\nimport {samePoint, getIntersectionXPoint} from './geom'\n\n/**\n * Creates a new sweep status data structure.\n */\nexport default function createSweepStatus(onError, EPS) {\n var lastPointY, prevY;\n var lastPointX, prevX;\n var useBelow = false;\n var status = new SplayTree(compareSegments);\n\n // To save on GC we return mutable object.\n var currentBoundary = {\n beforeLeft: null,\n left: null,\n right: null,\n afterRight: null,\n }\n\n var currentLeftRight = {left: null, right: null};\n\n return {\n /**\n * Add new segments into the status tree.\n */\n insertSegments,\n\n /**\n * Remove segments from the status tree.\n */\n deleteSegments,\n\n /**\n * Returns segments that are to the left and right from a given point.\n */\n getLeftRightPoint,\n\n /**\n * For a given collections of segments finds the most left and the most right\n * segments. Also returns segments immediately before left, and after right segments.\n */\n getBoundarySegments,\n\n findSegmentsWithPoint,\n\n /**\n * Current binary search tree with segments\n */\n status,\n\n /**\n * Introspection method that verifies if there are duplicates in the segment tree.\n * If there are - `onError()` is called.\n */\n checkDuplicate,\n\n /**\n * Prints current segments in order of their intersection with sweep line. Introspection method.\n */\n printStatus,\n\n /**\n * Returns current position of the sweep line.\n */\n getLastPoint() {\n return {x: lastPointX, y: lastPointY};\n }\n }\n\n function compareSegments(a, b) {\n if (a === b) return 0;\n\n var ak = getIntersectionXPoint(a, lastPointX, lastPointY);\n var bk = getIntersectionXPoint(b, lastPointX, lastPointY);\n\n var res = ak - bk;\n if (Math.abs(res) >= EPS) {\n // We are okay fine. Intersection distance between two segments\n // is good to give conclusive answer\n return res;\n }\n\n var aIsHorizontal = Math.abs(a.dy) < EPS;\n var bIsHorizontal = Math.abs(b.dy) < EPS;\n if (aIsHorizontal && bIsHorizontal) {\n return b.to.x - a.to.x;\n }\n // TODO: What if both a and b is horizontal?\n // move horizontal to end\n if (aIsHorizontal) { \n return useBelow ? -1 : 1;\n }\n\n if (bIsHorizontal) {\n if (useBelow) {\n return (b.from.x >= lastPointX) ? -1 : 1\n }\n return -1;\n // return useBelow ? 1 : -1;\n }\n var pa = a.angle;\n var pb = b.angle;\n if (Math.abs(pa - pb) >= EPS) {\n return useBelow ? pa - pb : pb - pa;\n }\n\n var segDist = a.from.y - b.from.y;\n if (Math.abs(segDist) >= EPS) {\n return -segDist;\n }\n segDist = a.to.y - b.to.y;\n if (Math.abs(segDist) >= EPS) {\n // TODO: Is this accurate?\n return -segDist;\n }\n\n return 0;\n // Could also use:\n // var aAngle = Math.atan2(a.from.y - a.to.y, a.from.x - a.to.x);\n // var bAngle = Math.atan2(b.from.y - b.to.y, b.from.x - b.to.x);\n // return useBelow ? bAngle - aAngle : aAngle - bAngle;\n }\n\n function getBoundarySegments(upper, interior) {\n var leftMost, rightMost, i;\n var uLength = upper.length;\n\n if (uLength > 0) {\n leftMost = rightMost = upper[0];\n } else {\n leftMost = rightMost = interior[0];\n }\n\n for (i = 1; i < uLength; ++i) {\n var s = upper[i];\n var cmp = compareSegments(leftMost, s);\n if (cmp > 0) leftMost = s;\n\n cmp = compareSegments(rightMost, s);\n if (cmp < 0) rightMost = s;\n }\n\n var startFrom = uLength > 0 ? 0 : 1;\n for (i = startFrom; i < interior.length; ++i) {\n s = interior[i];\n cmp = compareSegments(leftMost, s);\n if (cmp > 0) leftMost = s;\n\n cmp = compareSegments(rightMost, s);\n if (cmp < 0) rightMost = s;\n }\n\n // at this point we have our left/right segments in the status.\n // Let's find their prev/next elements and report them back:\n var left = status.find(leftMost);\n if (!left) {\n onError('Left is missing. Precision error?');\n }\n\n var right = status.find(rightMost);\n if (!right) {\n onError('Right is missing. Precision error?');\n }\n\n var beforeLeft = left && status.prev(left);\n var afterRight = right && status.next(right);\n\n while (afterRight && right.key.dy === 0 && afterRight.key.dy === 0) {\n // horizontal segments are special :(\n afterRight = status.next(afterRight);\n }\n\n currentBoundary.beforeLeft = beforeLeft && beforeLeft.key;\n currentBoundary.left = left && left.key;\n currentBoundary.right = right && right.key;\n currentBoundary.afterRight = afterRight && afterRight.key;\n\n return currentBoundary;\n }\n\n function getLeftRightPoint(p) {\n // We are trying to find left and right segments that are nearest to the\n // point p. For this we traverse the binary search tree, and remember\n // node with the shortest distance to p.\n var lastLeft;\n var current = status._root;\n var minX = Number.POSITIVE_INFINITY;\n\n var useNext = false;\n while (current) {\n var x = getIntersectionXPoint(current.key, p.x, p.y);\n var dx = p.x - x;\n if (dx >= 0) {\n if (dx < minX) {\n minX = dx;\n lastLeft = current;\n current = current.left;\n useNext = false;\n } else {\n break;\n }\n } else {\n if (-dx < minX) {\n useNext = true;\n minX = -dx;\n lastLeft = current;\n current = current.right;\n } else {\n break;\n }\n }\n }\n if (useNext) {\n // I'm not sure why I did this. I don't this this is right now.\n // lastLeft = status.next(lastLeft);\n }\n\n currentLeftRight.left = lastLeft && lastLeft.key\n var next = lastLeft && status.next(lastLeft);\n currentLeftRight.right = next && next.key\n return currentLeftRight;\n\n // Conceptually, the code above should be equivalent to the code below;\n // The code below is easier to understand, but intuitively, the code above\n // should have better performance (as we do not traverse the entire status\n // tree)\n\n // var right, left, x;\n // var all = status.keys()\n // for (var i = 0; i < all.length; ++i) {\n // var segment = all[i];\n // x = getIntersectionXPoint(segment, p.x, p.y);\n // if (x > p.x && !right) {\n // right = segment;\n // break;\n // } else if (x < p.x) {\n // left = segment;\n // }\n // }\n\n // currentLeftRight.left = left;\n // currentLeftRight.right = right;\n\n // return currentLeftRight;\n }\n\n function findSegmentsWithPoint(p, onFound) {\n // Option 1.\n // var arrResults = [];\n // status.forEach(current => {\n // var x = getIntersectionXPoint(current.key, p.x, p.y);\n // var dx = p.x - x;\n // if (Math.abs(dx) < EPS) {\n // onFound(current.key);\n // // arrResults.push(current.key)\n // }\n // });\n // return arrResults;\n\n // Option 2.\n\n // let current = status._root;\n // const Q = []; /* Initialize stack s */\n // let done = false;\n // var res = [];\n // var breakEarly = false;\n\n // while (!done) {\n // if (current !== null) {\n // Q.push(current);\n // current = current.left;\n // } else {\n // if (Q.length !== 0) {\n // current = Q.pop();\n\n // var x = getIntersectionXPoint(current.key, p.x, p.y);\n // var dx = p.x - x;\n // if (Math.abs(dx) < EPS) {\n // res.push(current.key)\n // breakEarly = true;\n // } else if (breakEarly) {\n // done = true;\n // }\n\n // current = current.right;\n // } else done = true;\n // }\n // }\n\n // return res;\n\n // option 3.\n var current = status._root;\n\n while (current) {\n var x = getIntersectionXPoint(current.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(current, p, onFound);\n break;\n } else if (dx < 0) {\n current = current.left;\n } else {\n current = current.right;\n }\n }\n }\n\n function collectAdjacentNodes(root, p, onFound) {\n onFound(root.key);\n goOverPredecessors(root.left, p, onFound);\n goOverSuccessors(root.right, p, onFound);\n }\n\n function goOverPredecessors(root, p, res) {\n if (!root) return;\n var x = getIntersectionXPoint(root.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(root, p, res);\n } else {\n goOverPredecessors(root.right, p, res);\n }\n }\n\n function goOverSuccessors(root, p, res) {\n if (!root) return;\n var x = getIntersectionXPoint(root.key, p.x, p.y);\n var dx = p.x - x;\n if (Math.abs(dx) < EPS) {\n collectAdjacentNodes(root, p, res);\n } else {\n goOverSuccessors(root.left, p, res);\n }\n }\n\n function checkDuplicate() {\n var prev;\n status.forEach(node => {\n var current = node.key;\n\n if (prev) {\n if (samePoint(prev.from, current.from) && samePoint(prev.to, current.to)) {\n // Likely you have received error before during segment removal.\n onError('Duplicate key in the status! This may be caused by Floating Point rounding error')\n }\n }\n prev = current;\n });\n }\n\n function printStatus(prefix = '') {\n // eslint-disable-next-line\n console.log(prefix, 'status line: ', lastPointX, lastPointY);\n status.forEach(node => {\n var x = getIntersectionXPoint(node.key, lastPointX, lastPointY);\n // eslint-disable-next-line\n console.log(x + ' ' + node.key.name);\n })\n }\n\n function insertSegments(interior, upper, sweepLinePos) {\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n var key;\n\n for (var i = 0; i < interior.length; ++i) {\n key = interior[i];\n status.add(key);\n }\n for (i = 0; i < upper.length; ++i) {\n key = upper[i]\n status.add(key);\n }\n }\n\n function deleteSegments(lower, interior, sweepLinePos) {\n // I spent most of the time debugging this method. Depending on the\n // algorithm state we can run into situation when dynamic keys of the\n // `status` tree predict wrong branch, and thus we are not able to find\n // the segment that needs to be deleted. If that happens I'm trying to\n // use previous point and repeat the process. This may result in \n // incorrect state. In that case I report an error. \n var i;\n var prevCount = status._size;\n prevX = lastPointX;\n prevY = lastPointY;\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n\n useBelow = true;\n for(i = 0; i < lower.length; ++i) {\n removeSegment(lower[i], sweepLinePos)\n }\n for(i = 0; i < interior.length; ++i) {\n removeSegment(interior[i], sweepLinePos)\n }\n useBelow = false;\n\n if (status._size !== prevCount - interior.length - lower.length) {\n // This can happen when rounding error occurs. You can try scaling your input\n onError('Segments were not removed from a tree properly. Precision error?');\n }\n }\n\n function removeSegment(key, sweepLinePos) {\n if (status.find(key)) {\n status.remove(key);\n } else {\n lastPointX = prevX;\n lastPointY = prevY;\n if (status.find(key)) {\n status.remove(key);\n } else {\n // They will get an error :(\n }\n lastPointY = sweepLinePos.y;\n lastPointX = sweepLinePos.x;\n }\n }\n}","/**\n * Represents a single event in the sweep-line algorithm\n */\nexport default class SweepEvent {\n /**\n * Creates new sweep event of a given kind.\n */\n constructor(point, segment) {\n this.point = point;\n if (segment) this.from = [segment];\n }\n}\n","import createEventQueue from './createEventQueue';\nimport createSweepStatus from './sweepStatus';\nimport SweepEvent from './SweepEvent';\n\nimport {intersectSegments, EPS, angle, samePoint} from './geom';\n\n/**\n * A point on a line\n * \n * @typedef {Object} Point\n * @property {number} x coordinate\n * @property {number} y coordinate\n */\n\n\n/**\n * @typedef {Object} Segment \n * @property {Point} from start of the segment\n * @property {Point} to end of the segment\n */\n\n/**\n * @typedef {function(point : Point, interior : Segment[], lower : Segment[], upper : Segment[])} ReportIntersectionCallback\n */\n\n/**\n * @typedef {Object} ISectOptions \n * @property {ReportIntersectionCallback} onFound \n */\n\n /**\n * @typedef {Object} ISectResult\n */\n\n// We use EMPTY array to avoid pressure on garbage collector. Need to be\n// very cautious to not mutate this array.\nvar EMPTY = [];\n\n/**\n * Finds all intersections among given segments.\n * \n * The algorithm follows \"Computation Geometry, Algorithms and Applications\" book\n * by Mark de Berg, Otfried Cheong, Marc van Kreveld, and Mark Overmars.\n * \n * Line is swept top-down\n * \n * @param {Segment[]} segments\n * @param {ISectOptions=} options\n * @returns {ISectResult}\n */\nexport default function isect(segments, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || defaultIntersectionReporter;\n\n var onError = (options && options.onError) || defaultErrorReporter;\n\n var eventQueue = createEventQueue(byY);\n var sweepStatus = createSweepStatus(onError, EPS);\n var lower, interior, lastPoint;\n\n segments.forEach(addSegment);\n\n return {\n /**\n * Find all intersections synchronously.\n * \n * @returns array of found intersections.\n */\n run,\n\n /**\n * Performs a single step in the sweep line algorithm\n * \n * @returns true if there was something to process; False if no more work to do\n */\n step,\n\n // Methods below are low level API for fine-grained control.\n // Don't use it unless you understand this code thoroughly\n\n /**\n * Add segment into the \n */\n addSegment,\n\n /**\n * Direct access to event queue. Queue contains segment endpoints and\n * pending detected intersections.\n */\n eventQueue, \n\n /**\n * Direct access to sweep line status. \"Status\" holds information about\n * all intersected segments.\n */\n sweepStatus,\n\n /**\n * Access to results array. Works only when you use default onFound() handler\n */\n results\n }\n\n function run() {\n while (!eventQueue.isEmpty()) {\n var eventPoint = eventQueue.pop();\n if (handleEventPoint(eventPoint)) {\n // they decided to stop.\n return;\n };\n }\n\n return results;\n }\n\n function step() {\n if (!eventQueue.isEmpty()) {\n var eventPoint = eventQueue.pop();\n handleEventPoint(eventPoint);\n // Note: we don't check results of `handleEventPoint()`\n // assumption is that client controls `step()` and thus they \n // know better if they want to stop.\n return true;\n }\n return false;\n }\n\n function handleEventPoint(p) {\n lastPoint = p.point;\n var upper = p.from || EMPTY;\n\n lower = interior = undefined;\n // TODO: move lower/interior into sweep status method?\n\n sweepStatus.findSegmentsWithPoint(lastPoint, addLowerOrInterior);\n // if (segmentsWithPoint) {\n // segmentsWithPoint.forEach()\n // } \n\n if (!lower) lower = EMPTY;\n if (!interior) interior = EMPTY;\n\n var uLength = upper.length;\n var iLength = interior.length;\n var lLength = lower.length;\n var hasIntersection = uLength + iLength + lLength > 1;\n var hasPointIntersection = !hasIntersection && (uLength === 0 && lLength === 0 && iLength > 0);\n\n if (hasIntersection || hasPointIntersection) {\n p.isReported = true;\n if (reportIntersection(lastPoint, union(interior, union(lower, upper)))) {\n return true;\n }\n }\n\n sweepStatus.deleteSegments(lower, interior, lastPoint);\n sweepStatus.insertSegments(interior, upper, lastPoint);\n\n var sLeft, sRight;\n\n var hasNoCrossing = (uLength + iLength === 0);\n\n if (hasNoCrossing) {\n var leftRight = sweepStatus.getLeftRightPoint(lastPoint);\n sLeft = leftRight.left;\n if (!sLeft) return;\n\n sRight = leftRight.right;\n if (!sRight) return;\n\n findNewEvent(sLeft, sRight, p);\n } else {\n var boundarySegments = sweepStatus.getBoundarySegments(upper, interior);\n\n findNewEvent(boundarySegments.beforeLeft, boundarySegments.left, p);\n findNewEvent(boundarySegments.right, boundarySegments.afterRight, p);\n }\n\n return false;\n }\n\n function addLowerOrInterior(s) {\n if (samePoint(s.to, lastPoint)) {\n if (!lower) lower = [s];\n else lower.push(s);\n } else if (!samePoint(s.from, lastPoint)) {\n if (!interior) interior = [s];\n else interior.push(s);\n }\n }\n\n function findNewEvent(left, right, p) {\n if (!left || !right) return;\n\n var intersection = intersectSegments(left, right);\n if (!intersection) {\n return;\n }\n\n var dy = p.point.y - intersection.y\n // TODO: should I add dy to intersection.y?\n if (dy < -EPS) {\n // this means intersection happened after the sweep line. \n // We already processed it.\n return;\n }\n if (Math.abs(dy) < EPS && intersection.x <= p.point.x) {\n return;\n }\n\n // Need to adjust floating point for this special case,\n // since otherwise it gives rounding errors:\n roundNearZero(intersection);\n\n var current = eventQueue.find(intersection);\n\n if (current && current.isReported) {\n // We already reported this event. No need to add it one more time\n // TODO: Is this case even possible?\n onError('We already reported this event.');\n return;\n }\n\n if (!current) {\n var event = new SweepEvent(intersection)\n eventQueue.insert(event);\n }\n }\n\n function defaultIntersectionReporter(p, segments) {\n results.push({\n point: p, \n segments: segments\n });\n }\n\n function addSegment(segment) {\n var from = segment.from;\n var to = segment.to;\n\n // Small numbers give more precision errors. Rounding them to 0.\n roundNearZero(from);\n roundNearZero(to);\n\n var dy = from.y - to.y;\n\n // Note: dy is much smaller then EPS on purpose. I found that higher\n // precision here does less good - getting way more rounding errors.\n if (Math.abs(dy) < 1e-5) {\n from.y = to.y;\n segment.dy = 0;\n }\n if ((from.y < to.y) || (\n (from.y === to.y) && (from.x > to.x))\n ) {\n var temp = from;\n from = segment.from = to; \n to = segment.to = temp;\n }\n\n // We pre-compute some immutable properties of the segment\n // They are used quite often in the tree traversal, and pre-computation\n // gives significant boost:\n segment.dy = from.y - to.y;\n segment.dx = from.x - to.x;\n segment.angle = angle(segment.dy, segment.dx);\n\n var isPoint = segment.dy === segment.dx && segment.dy === 0;\n var prev = eventQueue.find(from)\n if (prev && !isPoint) {\n // this detects identical segments early. Without this check\n // the algorithm would break since sweep line has no means to\n // detect identical segments.\n var prevFrom = prev.data.from;\n if (prevFrom) {\n for (var i = 0; i < prevFrom.length; ++i) {\n var s = prevFrom[i];\n if (samePoint(s.to, to)) {\n reportIntersection(s.from, [s.from, s.to]);\n reportIntersection(s.to, [s.from, s.to]);\n return;\n }\n }\n }\n }\n\n if (!isPoint) {\n if (prev) {\n if (prev.data.from) prev.data.from.push(segment);\n else prev.data.from = [segment];\n } else {\n var e = new SweepEvent(from, segment)\n eventQueue.insert(e);\n }\n var event = new SweepEvent(to)\n eventQueue.insert(event)\n } else {\n var event = new SweepEvent(to)\n eventQueue.insert(event)\n }\n } \n}\n\nfunction roundNearZero(point) {\n if (Math.abs(point.x) < EPS) point.x = 0;\n if (Math.abs(point.y) < EPS) point.y = 0;\n}\n\nfunction defaultErrorReporter(errorMessage) {\n throw new Error(errorMessage);\n}\n\nfunction union(a, b) {\n if (!a) return b;\n if (!b) return a;\n\n return a.concat(b);\n}\n\nfunction byY(a, b) {\n // decreasing Y \n var res = b.y - a.y;\n // TODO: This might mess up the status tree.\n if (Math.abs(res) < EPS) {\n // increasing x.\n res = a.x - b.x;\n if (Math.abs(res) < EPS) res = 0;\n }\n\n return res;\n}","export default function intersectSegments(a, b) {\n // Note: this is almost the same as geom.intersectSegments()\n // The main difference is that we don't have a pre-computed\n // value for dx/dy on the segments.\n // https://stackoverflow.com/a/1968345/125351\n var aStart = a.from, bStart = b.from;\n var p0_x = aStart.x, p0_y = aStart.y,\n p2_x = bStart.x, p2_y = bStart.y;\n\n var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y;\n var div = s1_x * s2_y - s2_x * s1_y;\n\n var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div;\n if (s < 0 || s > 1) return;\n\n var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div;\n\n if (t >= 0 && t <= 1) {\n return {\n x: p0_x - (t * s1_x),\n y: p0_y - (t * s1_y)\n }\n }\n}","import intersectSegments from './intersectSegments';\n\n/**\n * This is a brute force solution with O(n^2) performance.\n * (`n` is number of segments).\n * \n * Use this when number of lines is low, and number of intersections\n * is high.\n */\nexport default function brute(lines, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || \n defaultIntersectionReporter;\n var asyncState;\n\n return {\n /**\n * Execute brute force of the segment intersection search\n */\n run,\n /**\n * Access to results array. Works only when you use default onFound() handler\n */\n results,\n\n /**\n * Performs a single step in the brute force algorithm ()\n */\n step\n }\n\n function step() {\n if (!asyncState) {\n asyncState = {\n i: 0\n }\n }\n var test = lines[asyncState.i];\n for (var j = asyncState.i + 1; j < lines.length; ++j) {\n var other = lines[j];\n var pt = intersectSegments(test, other);\n if (pt) {\n if (reportIntersection(pt, [test, other])) {\n return;\n }\n }\n }\n asyncState.i += 1;\n return asyncState.i < lines.length;\n }\n\n function run() {\n for(var i = 0; i < lines.length; ++i) {\n var test = lines[i];\n for (var j = i + 1; j < lines.length; ++j) {\n var other = lines[j];\n var pt = intersectSegments(test, other);\n if (pt) {\n if (reportIntersection(pt, [test, other])) {\n return;\n }\n }\n }\n }\n return results;\n }\n\n function defaultIntersectionReporter(p, interior) {\n results.push({\n point: p, \n segments: interior\n });\n }\n}","\nconst ARRAY_TYPES = [\n Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,\n Int32Array, Uint32Array, Float32Array, Float64Array\n];\n\nconst VERSION = 3; // serialized format version\n\nexport default class Flatbush {\n\n static from(data) {\n if (!(data instanceof ArrayBuffer)) {\n throw new Error('Data must be an instance of ArrayBuffer.');\n }\n const [magic, versionAndType] = new Uint8Array(data, 0, 2);\n if (magic !== 0xfb) {\n throw new Error('Data does not appear to be in a Flatbush format.');\n }\n if (versionAndType >> 4 !== VERSION) {\n throw new Error(`Got v${versionAndType >> 4} data when expected v${VERSION}.`);\n }\n const [nodeSize] = new Uint16Array(data, 2, 1);\n const [numItems] = new Uint32Array(data, 4, 1);\n\n return new Flatbush(numItems, nodeSize, ARRAY_TYPES[versionAndType & 0x0f], data);\n }\n\n constructor(numItems, nodeSize, ArrayType, data) {\n if (numItems === undefined) throw new Error('Missing required argument: numItems.');\n if (isNaN(numItems) || numItems <= 0) throw new Error(`Unpexpected numItems value: ${numItems}.`);\n\n this.numItems = +numItems;\n this.nodeSize = Math.min(Math.max(+nodeSize || 16, 2), 65535);\n\n // calculate the total number of nodes in the R-tree to allocate space for\n // and the index of each tree level (used in search later)\n let n = numItems;\n let numNodes = n;\n this._levelBounds = [n * 4];\n do {\n n = Math.ceil(n / this.nodeSize);\n numNodes += n;\n this._levelBounds.push(numNodes * 4);\n } while (n !== 1);\n\n this.ArrayType = ArrayType || Float64Array;\n this.IndexArrayType = numNodes < 16384 ? Uint16Array : Uint32Array;\n\n const arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType);\n const nodesByteSize = numNodes * 4 * this.ArrayType.BYTES_PER_ELEMENT;\n\n if (arrayTypeIndex < 0) {\n throw new Error(`Unexpected typed array class: ${ArrayType}.`);\n }\n\n if (data && (data instanceof ArrayBuffer)) {\n this.data = data;\n this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes);\n\n this._pos = numNodes * 4;\n this.minX = this._boxes[this._pos - 4];\n this.minY = this._boxes[this._pos - 3];\n this.maxX = this._boxes[this._pos - 2];\n this.maxY = this._boxes[this._pos - 1];\n\n } else {\n this.data = new ArrayBuffer(8 + nodesByteSize + numNodes * this.IndexArrayType.BYTES_PER_ELEMENT);\n this._boxes = new this.ArrayType(this.data, 8, numNodes * 4);\n this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes);\n this._pos = 0;\n this.minX = Infinity;\n this.minY = Infinity;\n this.maxX = -Infinity;\n this.maxY = -Infinity;\n\n new Uint8Array(this.data, 0, 2).set([0xfb, (VERSION << 4) + arrayTypeIndex]);\n new Uint16Array(this.data, 2, 1)[0] = nodeSize;\n new Uint32Array(this.data, 4, 1)[0] = numItems;\n }\n }\n\n add(minX, minY, maxX, maxY) {\n const index = this._pos >> 2;\n this._indices[index] = index;\n this._boxes[this._pos++] = minX;\n this._boxes[this._pos++] = minY;\n this._boxes[this._pos++] = maxX;\n this._boxes[this._pos++] = maxY;\n\n if (minX < this.minX) this.minX = minX;\n if (minY < this.minY) this.minY = minY;\n if (maxX > this.maxX) this.maxX = maxX;\n if (maxY > this.maxY) this.maxY = maxY;\n }\n\n finish() {\n if (this._pos >> 2 !== this.numItems) {\n throw new Error(`Added ${this._pos >> 2} items when expected ${this.numItems}.`);\n }\n\n const width = this.maxX - this.minX;\n const height = this.maxY - this.minY;\n const hilbertValues = new Uint32Array(this.numItems);\n const hilbertMax = (1 << 16) - 1;\n\n // map item centers into Hilbert coordinate space and calculate Hilbert values\n for (let i = 0; i < this.numItems; i++) {\n let pos = 4 * i;\n const minX = this._boxes[pos++];\n const minY = this._boxes[pos++];\n const maxX = this._boxes[pos++];\n const maxY = this._boxes[pos++];\n const x = Math.floor(hilbertMax * ((minX + maxX) / 2 - this.minX) / width);\n const y = Math.floor(hilbertMax * ((minY + maxY) / 2 - this.minY) / height);\n hilbertValues[i] = hilbert(x, y);\n }\n\n // sort items by their Hilbert value (for packing later)\n sort(hilbertValues, this._boxes, this._indices, 0, this.numItems - 1);\n\n // generate nodes at each tree level, bottom-up\n for (let i = 0, pos = 0; i < this._levelBounds.length - 1; i++) {\n const end = this._levelBounds[i];\n\n // generate a parent node for each block of consecutive nodes\n while (pos < end) {\n let nodeMinX = Infinity;\n let nodeMinY = Infinity;\n let nodeMaxX = -Infinity;\n let nodeMaxY = -Infinity;\n const nodeIndex = pos;\n\n // calculate bbox for the new node\n for (let i = 0; i < this.nodeSize && pos < end; i++) {\n const minX = this._boxes[pos++];\n const minY = this._boxes[pos++];\n const maxX = this._boxes[pos++];\n const maxY = this._boxes[pos++];\n if (minX < nodeMinX) nodeMinX = minX;\n if (minY < nodeMinY) nodeMinY = minY;\n if (maxX > nodeMaxX) nodeMaxX = maxX;\n if (maxY > nodeMaxY) nodeMaxY = maxY;\n }\n\n // add the new node to the tree data\n this._indices[this._pos >> 2] = nodeIndex;\n this._boxes[this._pos++] = nodeMinX;\n this._boxes[this._pos++] = nodeMinY;\n this._boxes[this._pos++] = nodeMaxX;\n this._boxes[this._pos++] = nodeMaxY;\n }\n }\n }\n\n search(minX, minY, maxX, maxY, filterFn) {\n if (this._pos !== this._boxes.length) {\n throw new Error('Data not yet indexed - call index.finish().');\n }\n\n let nodeIndex = this._boxes.length - 4;\n let level = this._levelBounds.length - 1;\n const queue = [];\n const results = [];\n\n while (nodeIndex !== undefined) {\n // find the end index of the node\n const end = Math.min(nodeIndex + this.nodeSize * 4, this._levelBounds[level]);\n\n // search through child nodes\n for (let pos = nodeIndex; pos < end; pos += 4) {\n const index = this._indices[pos >> 2];\n\n // check if node bbox intersects with query bbox\n if (maxX < this._boxes[pos]) continue; // maxX < nodeMinX\n if (maxY < this._boxes[pos + 1]) continue; // maxY < nodeMinY\n if (minX > this._boxes[pos + 2]) continue; // minX > nodeMaxX\n if (minY > this._boxes[pos + 3]) continue; // minY > nodeMaxY\n\n if (nodeIndex < this.numItems * 4) {\n if (filterFn === undefined || filterFn(index)) {\n results.push(index); // leaf item\n }\n\n } else {\n queue.push(index); // node; add it to the search queue\n queue.push(level - 1);\n }\n }\n\n level = queue.pop();\n nodeIndex = queue.pop();\n }\n\n return results;\n }\n}\n\n// custom quicksort that sorts bbox data alongside the hilbert values\nfunction sort(values, boxes, indices, left, right) {\n if (left >= right) return;\n\n const pivot = values[(left + right) >> 1];\n let i = left - 1;\n let j = right + 1;\n\n while (true) {\n do i++; while (values[i] < pivot);\n do j--; while (values[j] > pivot);\n if (i >= j) break;\n swap(values, boxes, indices, i, j);\n }\n\n sort(values, boxes, indices, left, j);\n sort(values, boxes, indices, j + 1, right);\n}\n\n// swap two values and two corresponding boxes\nfunction swap(values, boxes, indices, i, j) {\n const temp = values[i];\n values[i] = values[j];\n values[j] = temp;\n\n const k = 4 * i;\n const m = 4 * j;\n\n const a = boxes[k];\n const b = boxes[k + 1];\n const c = boxes[k + 2];\n const d = boxes[k + 3];\n boxes[k] = boxes[m];\n boxes[k + 1] = boxes[m + 1];\n boxes[k + 2] = boxes[m + 2];\n boxes[k + 3] = boxes[m + 3];\n boxes[m] = a;\n boxes[m + 1] = b;\n boxes[m + 2] = c;\n boxes[m + 3] = d;\n\n const e = indices[i];\n indices[i] = indices[j];\n indices[j] = e;\n}\n\n// Fast Hilbert curve algorithm by http://threadlocalmutex.com/\n// Ported from C++ https://github.com/rawrunprotected/hilbert_curves (public domain)\nfunction hilbert(x, y) {\n let a = x ^ y;\n let b = 0xFFFF ^ a;\n let c = 0xFFFF ^ (x | y);\n let d = x & (y ^ 0xFFFF);\n\n let A = a | (b >> 1);\n let B = (a >> 1) ^ a;\n let C = ((c >> 1) ^ (b & (d >> 1))) ^ c;\n let D = ((a & (c >> 1)) ^ (d >> 1)) ^ d;\n\n a = A; b = B; c = C; d = D;\n A = ((a & (a >> 2)) ^ (b & (b >> 2)));\n B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2)));\n C ^= ((a & (c >> 2)) ^ (b & (d >> 2)));\n D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2)));\n\n a = A; b = B; c = C; d = D;\n A = ((a & (a >> 4)) ^ (b & (b >> 4)));\n B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4)));\n C ^= ((a & (c >> 4)) ^ (b & (d >> 4)));\n D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4)));\n\n a = A; b = B; c = C; d = D;\n C ^= ((a & (c >> 8)) ^ (b & (d >> 8)));\n D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8)));\n\n a = C ^ (C >> 1);\n b = D ^ (D >> 1);\n\n let i0 = x ^ y;\n let i1 = b | (0xFFFF ^ (i0 | a));\n\n i0 = (i0 | (i0 << 8)) & 0x00FF00FF;\n i0 = (i0 | (i0 << 4)) & 0x0F0F0F0F;\n i0 = (i0 | (i0 << 2)) & 0x33333333;\n i0 = (i0 | (i0 << 1)) & 0x55555555;\n\n i1 = (i1 | (i1 << 8)) & 0x00FF00FF;\n i1 = (i1 | (i1 << 4)) & 0x0F0F0F0F;\n i1 = (i1 | (i1 << 2)) & 0x33333333;\n i1 = (i1 | (i1 << 1)) & 0x55555555;\n\n return ((i1 << 1) | i0) >>> 0;\n}\n","import Flatbush from 'flatbush';\nimport intersectSegments from './intersectSegments';\n\n/**\n * This implementation is inspired by discussion here \n * https://twitter.com/mourner/status/1049325199617921024 and \n * here https://github.com/anvaka/isect/issues/1\n * \n * It builds an index of all segments using static spatial index\n * and then for each segment it queries overlapping rectangles.\n */\nexport default function bush(lines, options) {\n var results = [];\n var reportIntersection = (options && options.onFound) || \n defaultIntersectionReporter;\n var asyncState;\n\n var index = new Flatbush(lines.length);\n lines.forEach(addToIndex);\n index.finish();\n\n return {\n run: run,\n step: step,\n results: results,\n\n // undocumented, don't use unless you know what you are doing:\n checkIntersection: checkIntersection\n }\n\n function run() {\n for (var i = 0; i < lines.length; ++i) {\n if (checkIntersection(lines[i], i)) {\n return; // stop early\n }\n }\n return results;\n }\n\n function checkIntersection(currentSegment, currentId) {\n // sorry about code duplication.\n var minX = currentSegment.from.x; var maxX = currentSegment.to.x;\n var minY = currentSegment.from.y; var maxY = currentSegment.to.y;\n var t;\n if (minX > maxX) { t = minX; minX = maxX; maxX = t; }\n if (minY > maxY) { t = minY; minY = maxY; maxY = t; }\n\n var ids = index.search(minX, minY, maxX, maxY);\n\n for (var i = 0; i < ids.length; ++i) {\n var segmentIndex = ids[i];\n if (segmentIndex <= currentId) continue; // we have either reported it, or it is current.\n\n var otherSegment = lines[segmentIndex];\n var point = intersectSegments(otherSegment, currentSegment);\n\n if (point) {\n if (reportIntersection(point, [currentSegment, otherSegment])) {\n // stop early\n return true;\n }\n }\n }\n }\n\n function step() {\n if (!asyncState) {\n asyncState = {i: 0};\n }\n var test = lines[asyncState.i];\n checkIntersection(test, asyncState.i);\n asyncState.i += 1;\n return asyncState.i < lines.length;\n }\n\n\n function addToIndex(line) {\n var minX = line.from.x; var maxX = line.to.x;\n var minY = line.from.y; var maxY = line.to.y;\n var t;\n if (minX > maxX) { t = minX; minX = maxX; maxX = t; }\n if (minY > maxY) { t = minY; minY = maxY; maxY = t; }\n index.add(minX, minY, maxX, maxY);\n }\n\n function defaultIntersectionReporter(p, interior) {\n results.push({\n point: p, \n segments: interior\n });\n }\n}"],"names":["let","const","this","SplayTree","EPS","intersectSegments","sort","i","pos","minX","minY","maxX","maxY"],"mappings":";;;;;;;;;;;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCA,IAAM,IAAI,GAER,aAAW,EAAE,GAAG,EAAE,IAAI,EAAE;IACtB,IAAI,CAAC,GAAG,IAAM,GAAG,CAAC;IAClB,IAAI,CAAC,IAAI,GAAK,IAAI,CAAC;IACnB,IAAI,CAAC,IAAI,GAAK,IAAI,CAAC;IACnB,IAAI,CAAC,KAAK,EAAI,IAAI,CAAC;EACrB,CAAC,CACF;;EAED,SAAS,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;;;;;;;;;EAStE,SAAS,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE;IAChC,IAAI,CAAC,KAAK,IAAI,IAAE,OAAO,CAAC,GAAC;IACzBA,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACZC,IAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;IAEV,OAAO,IAAI,EAAE;MACXA,IAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;;MAEjC,IAAI,GAAG,GAAG,CAAC,EAAE;QACX,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAE,QAAM;;QAE3B,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;UACjC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;UACX,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;UACjB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;UACZ,CAAC,GAAG,CAAC,CAAC;UACN,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAE,QAAM;SAC5B;QACD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACX,CAAC,GAAG,CAAC,CAAC;QACN,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;;OAEZ,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE;QAClB,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAE,QAAM;;QAE5B,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;UAClC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;UACZ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;UACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;UACX,CAAC,GAAG,CAAC,CAAC;UACN,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAE,QAAM;SAC7B;QACD,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC,GAAG,CAAC,CAAC;QACN,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;OACb,MAAM;QACL,MAAM;OACP;KACF;;IAED,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;IACjB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACjB,OAAO,CAAC,CAAC;GACV;;;;;;;;;;EAUD,SAAS,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;IAC7CA,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;;IAE/B,IAAI,CAAC,KAAK,EAAE,CAAC;;IAEb,IAAI,CAAC,KAAK,IAAI,EAAE;MACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;MAC9B,OAAO,IAAI,CAAC;KACb;;IAED,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAC5BA,IAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,GAAG,CAAC,EAAE;MACX,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;MACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;MACf,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;KACf,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;MACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;MACrB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;MACd,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;KAChB;IACD,OAAO,IAAI,CAAC;GACb;;;;;;;;;;;EAWD,SAAS,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;IAC1CA,IAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;;IAE/B,IAAI,CAAC,KAAK,IAAI,EAAE;MACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;MAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;MACb,OAAO,IAAI,CAAC;KACb;;IAED,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAC5BA,IAAM,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,CAAC,IAAE,OAAO,CAAC,GAAC;SACnB;MACH,IAAI,GAAG,GAAG,CAAC,EAAE;QACX,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;OACf,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE;QAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;OAChB;MACD,IAAI,CAAC,KAAK,EAAE,CAAC;MACb,OAAO,IAAI,CAAC;KACb;GACF;;;;;;;;;;;EAWD,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;IACvCD,IAAI,CAAC,CAAC;IACN,IAAI,CAAC,KAAK,IAAI,IAAE,OAAO,IAAI,GAAC;IAC5B,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAC5B,IAAI,GAAG,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,EAAE;MACb,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE;QACnB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;OACb,MAAM;QACL,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACjC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;OACnB;MACD,IAAI,CAAC,KAAK,EAAE,CAAC;MACb,OAAO,CAAC,CAAC;KACV;IACD,OAAO,CAAC,CAAC;GACV;;;EAGD,SAAS,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE;IAClCA,IAAI,IAAI,EAAE,KAAK,CAAC;IAChB,IAAI,CAAC,KAAK,IAAI,EAAE;MACd,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;KACrB,MAAM;MACL,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;;MAE9BC,IAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;MACnC,IAAI,GAAG,KAAK,CAAC,EAAE;QACb,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;QACf,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;OACjB,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE;QAClB,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;QACf,IAAI,MAAM,CAAC,CAAC;OACb,MAAM;QACL,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;QAChB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QACd,KAAK,IAAI,CAAC,CAAC;OACZ;KACF;IACD,OAAO,QAAE,IAAI,SAAE,KAAK,EAAE,CAAC;GACxB;;;EAGD,SAAS,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,IAAI,KAAK,KAAK,IAAI,IAAE,OAAO,IAAI,GAAC;IAChC,IAAI,IAAI,MAAM,IAAI,IAAE,OAAO,KAAK,GAAC;;IAEjC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,OAAO,KAAK,CAAC;GACd;;;;;;;;;;;EAWD,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE;IACvD,IAAI,IAAI,EAAE;MACR,GAAG,OAAK,MAAM,IAAK,MAAM,GAAG,MAAM,GAAG,MAAM,KAAK,SAAS,CAAC,IAAI,EAAC,SAAM,CAAC;MACtEA,IAAM,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;MACnD,IAAI,IAAI,CAAC,IAAI,KAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,GAAC;MACpE,IAAI,IAAI,CAAC,KAAK,IAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,GAAG,EAAE,SAAS,CAAC,GAAC;KACrE;GACF;;;EAGc,IAAM,IAAI,GAEvB,aAAW,EAAE,UAA4B,EAAE;2CAApB,GAAG;;IACxB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAC9B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;EACnB;;4DAAG;;;EAGH;;;;;;EAMA,eAAE,MAAM,sBAAE,GAAG,EAAE,IAAI,EAAE;IACnB,OAAS,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;EAC5E,EAAC;;;EAGH;;;;;;EAMA,eAAE,GAAG,mBAAE,GAAG,EAAE,IAAI,EAAE;IAChB,OAAS,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;EACzE,EAAC;;;EAGH;;;;EAIA,eAAE,MAAM,sBAAE,GAAG,EAAE;IACX,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;EAC/D,EAAC;;;EAGH;;;;EAIA,eAAE,GAAG,mBAAI;IACLD,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACxB,IAAM,IAAI,EAAE;MACV,OAAS,IAAI,CAAC,IAAI,IAAE,IAAI,GAAG,IAAI,CAAC,IAAI,GAAC;MACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAM,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;MAC9D,IAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;MAClE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;KAC3C;IACH,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;;EAIA,eAAE,UAAU,wBAAE,GAAG,EAAE;IACjB,IAAM,OAAO,GAAK,IAAI,CAAC,KAAK,CAAC;IAC3BC,IAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IACnC,OAAS,OAAO,EAAE;MACdA,IAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;MACxC,IAAM,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,OAAO,GAAC;WAC5B,IAAI,GAAG,GAAG,CAAC,IAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAC;sBACzB,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAC;KAC3C;IACH,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;;EAIA,eAAE,IAAI,kBAAE,GAAG,EAAE;IACT,IAAI,IAAI,CAAC,KAAK,EAAE;MACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;MACtD,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAE,OAAO,IAAI,GAAC;KAC9D;IACD,OAAO,IAAI,CAAC,KAAK,CAAC;EACpB,EAAC;;;EAGH;;;;EAIA,eAAE,QAAQ,sBAAE,GAAG,EAAE;IACf,IAAM,OAAO,GAAK,IAAI,CAAC,KAAK,CAAC;IAC3BA,IAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IACnC,OAAS,OAAO,EAAE;MACdA,IAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;MACxC,IAAM,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,IAAI,GAAC;WACzB,IAAI,GAAG,GAAG,CAAC,IAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAC;sBACzB,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAC;KAC3C;IACH,OAAS,KAAK,CAAC;EACf,EAAC;;;EAGH;;;;;EAKA,eAAE,OAAO,qBAAE,OAAO,EAAE,GAAG,EAAE;IACrBD,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;IACzBC,IAAM,CAAC,GAAG,EAAE,CAAC;IACbD,IAAI,IAAI,GAAG,KAAK,CAAC;;IAEnB,OAAS,CAAC,IAAI,EAAE;MACZ,IAAI,OAAO,IAAM,IAAI,EAAE;QACrB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;OACxB,MAAM;QACL,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;UAClB,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;UACpB,OAAS,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;;UAE3B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB,QAAM,IAAI,GAAG,IAAI,GAAC;OACpB;KACF;IACH,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;;;;;;EAQA,eAAE,KAAK,mBAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE;;;IACzBC,IAAM,CAAC,GAAG,EAAE,CAAC;IACbA,IAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IACnC,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;;IAE7B,OAAS,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,EAAE;MAC/B,IAAM,IAAI,EAAE;QACR,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;OAClB,MAAM;QACL,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACjB,GAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG,CAAC,EAAE;UACX,MAAM;SACP,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;UACtC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAE,OAAOC,MAAI,GAAC;SACrC;QACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;OACnB;KACF;IACH,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;;EAIA,eAAE,IAAI,oBAAI;IACND,IAAM,IAAI,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,OAAO,WAAE,GAAO,EAAE;;;eAAG,IAAI,CAAC,IAAI,CAAC,GAAG;OAAC,CAAC,CAAC;IAC5C,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;;EAIA,eAAE,MAAM,sBAAI;IACRA,IAAM,MAAM,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC,OAAO,WAAE,GAAQ,EAAE;;;eAAG,MAAM,CAAC,IAAI,CAAC,IAAI;OAAC,CAAC,CAAC;IAChD,OAAS,MAAM,CAAC;EAChB,EAAC;;;EAGH;;;EAGA,eAAE,sBAAM;IACJ,IAAI,IAAI,CAAC,KAAK,IAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAC;IACtD,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;EAGA,eAAE,sBAAM;IACJ,IAAI,IAAI,CAAC,KAAK,IAAE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAC;IACtD,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;EAGA,eAAE,4BAAQ,CAAc,EAAE;2BAAf,GAAG,IAAI,CAAC;;IACf,IAAI,CAAC,IAAE,OAAO,CAAC,CAAC,IAAI,IAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAC;IACnC,OAAS,CAAC,CAAC;EACX,EAAC;;;EAGH;;;EAGA,eAAE,4BAAQ,CAAc,EAAE;2BAAf,GAAG,IAAI,CAAC;;IACf,IAAI,CAAC,IAAE,OAAO,CAAC,CAAC,KAAK,IAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAC;IACrC,OAAS,CAAC,CAAC;EACX,EAAC;;;EAGH;;;;;EAKA,eAAE,EAAE,gBAAE,KAAK,EAAE;IACTD,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9CC,IAAM,CAAC,GAAG,EAAE,CAAC;;IAEf,OAAS,CAAC,IAAI,EAAE;MACd,IAAM,OAAO,EAAE;QACX,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;OACxB,MAAM;QACL,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;UAChB,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;UAClB,IAAI,CAAC,KAAK,KAAK,IAAE,OAAO,OAAO,GAAC;UAClC,CAAG,EAAE,CAAC;UACJ,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB,QAAM,IAAI,GAAG,IAAI,GAAC;OACpB;KACF;IACH,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;;EAIA,eAAE,IAAI,kBAAE,CAAC,EAAE;IACPD,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtBA,IAAI,SAAS,GAAG,IAAI,CAAC;;IAErB,IAAI,CAAC,CAAC,KAAK,EAAE;MACX,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;MACtB,OAAS,SAAS,CAAC,IAAI,IAAE,SAAS,GAAG,SAAS,CAAC,IAAI,GAAC;MACpD,OAAS,SAAS,CAAC;KAClB;;IAEDC,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,OAAS,IAAI,EAAE;MACXA,IAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;MACxC,IAAI,GAAG,KAAK,CAAC,IAAE,QAAM;WAChB,IAAI,GAAG,GAAG,CAAC,EAAE;QAClB,SAAW,GAAG,IAAI,CAAC;QACjB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;OAClB,QAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAC;KAC1B;;IAEH,OAAS,SAAS,CAAC;EACnB,EAAC;;;EAGH;;;;EAIA,eAAE,IAAI,kBAAE,CAAC,EAAE;IACPD,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtBA,IAAI,WAAW,GAAG,IAAI,CAAC;;IAEvB,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE;MACnB,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC;MACvB,OAAS,WAAW,CAAC,KAAK,IAAE,WAAW,GAAG,WAAW,CAAC,KAAK,GAAC;MAC5D,OAAS,WAAW,CAAC;KACpB;;IAEDC,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,OAAS,IAAI,EAAE;MACXA,IAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;MACxC,IAAI,GAAG,KAAK,CAAC,IAAE,QAAM;WAChB,IAAI,GAAG,GAAG,CAAC,IAAE,IAAI,GAAG,IAAI,CAAC,IAAI,GAAC;WAC9B;QACL,WAAa,GAAG,IAAI,CAAC;QACnB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;OACnB;KACF;IACH,OAAS,WAAW,CAAC;EACrB,EAAC;;;EAGH;;;EAGA,eAAE,0BAAQ;IACN,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;EAGA,eAAE,8BAAS;IACP,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EAC5B,EAAC;;;EAGH;;;;;;;;;EASA,eAAE,IAAI,kBAAE,IAAS,EAAE,MAAW,EAAE,OAAe,EAAE;iCAArC,GAAG;qCAAU,GAAG;uCAAW,GAAG;;IACtCD,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IACvBC,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;;;IAGpC,IAAI,OAAO,IAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,UAAU,CAAC,GAAC;;IAEzD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;MACvB,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;MAC9D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;KACnB,MAAM;MACP,IAAQ,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;MACnF,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;MACzB,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;KAC7D;IACH,OAAS,IAAI,CAAC;EACd,EAAC;;;EAGH;;;EAGA,eAAE,8BAAU,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,GAAE;;EAE3C,mBAAM,IAAI,mBAAI,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAE;;;EAGpC;;;;EAIA,eAAE,QAAQ,sBAAE,SAAwB,EAAE;2CAAjB,aAAI,CAAC,EAAE,SAAG,CAAC,CAAC;;IAC7BA,IAAM,GAAG,GAAG,EAAE,CAAC;IACjB,QAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,YAAG,CAAC,EAAE,SAAG,GAAG,CAAC,IAAI,CAAC,CAAC,IAAC,EAAE,SAAS,CAAC,CAAC;IAC9D,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;EACtB,EAAC;;;EAGH,eAAE,MAAM,oBAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAC5BA,IAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,OAAqB,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU;MAAjD;MAAM,sBAA6C;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,IAAM,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;MAC/B,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;KAC1D,MAAM;MACL,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;KACxD;IACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;EAC9C,EAAC;;;EAGH,eAAE,0BAAM,GAAG,EAAE;IACT,OAAO,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;EAClD,CAAC;;;;;EAIH,SAAS,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;IACxDA,IAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;IACzB,IAAI,IAAI,GAAG,CAAC,EAAE;MACZA,IAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;MAC5CA,IAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;MAC5BA,IAAM,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;MAC9BA,IAAM,IAAI,KAAK,OAAE,GAAG,QAAE,IAAI,UAAE,MAAM,EAAE,CAAC;MACrC,IAAI,CAAC,IAAI,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;MAChE,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;MAClE,OAAO,IAAI,CAAC;KACb;IACD,OAAO,IAAI,CAAC;GACb;;;EAGD,SAAS,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE;IAChCA,IAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5BD,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,KAAKA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MACpC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD;IACD,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;IACd,OAAO,IAAI,CAAC,IAAI,CAAC;GAClB;;;EAGD,SAAS,MAAM,EAAE,IAAI,EAAE;IACrB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,KAAK,CAAC;;IAEzBC,IAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5BD,IAAI,CAAC,GAAG,IAAI,CAAC;;IAEb,OAAO,CAAC,IAAI,EAAE;MACZ,IAAI,OAAO,EAAE;QACX,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;OACxB,MAAM;QACL,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;UAChB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;UAC/B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB,QAAM,IAAI,GAAG,IAAI,GAAC;OACpB;KACF;IACD,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;IACd,OAAO,IAAI,CAAC,IAAI,CAAC;GAClB;;;EAGD,SAAS,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;IACzCC,IAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;IACzB,IAAI,IAAI,GAAG,CAAC,EAAE;MACZA,IAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;MAC5CA,IAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;;MAElDA,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;MACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;;MAEjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;MAE3B,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;MACpD,OAAO,IAAI,CAAC;KACb;IACD,OAAO,IAAI,CAAC;GACb;;;EAGD,SAAS,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,OAAyB,EAAE;qCAApB,aAAI,CAAC,EAAE,CAAC,EAAE,SAAG,CAAC,GAAG;;IACnDA,IAAM,IAAI,GAAG,EAAE,CAAC;IAChBD,IAAI,CAAC,GAAG,IAAI,CAAC;;IAEbA,IAAI,EAAE,GAAG,EAAE,CAAC;IACZA,IAAI,EAAE,GAAG,EAAE,CAAC;;IAEZ,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE;MACjC,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC/B,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;QACZ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;OACd,MAAM;QACL,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;QACZ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;OACd;MACD,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;KACZ;;IAED,IAAI,EAAE,KAAK,IAAI,SAAO,CAAC,CAAC,IAAI,GAAG,EAAE,GAAC;SAC7B,IAAI,EAAE,KAAK,IAAI,IAAE,CAAC,CAAC,IAAI,GAAG,EAAE,GAAC;;IAElC,OAAO,IAAI,CAAC,IAAI,CAAC;GAClB;;;EAGD,SAAS,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;IAChD,IAAI,IAAI,IAAI,KAAK,IAAE,SAAO;;IAE1BC,IAAM,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC;IACxCD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IACjBA,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;;IAElB,OAAO,IAAI,EAAE;MACX,KAAG,CAAC,EAAE,GAAC,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;MAC5C,KAAG,CAAC,EAAE,GAAC,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE;MAC5C,IAAI,CAAC,IAAI,CAAC,IAAE,QAAM;;MAElBA,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;MAClB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;MAClB,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;;MAEd,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;MAChB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;MACtB,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;KACjB;;IAED,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;GAC3C;;EChvBc,SAAS,gBAAgB,CAAC,GAAG,EAAE;IAC5CC,IAAM,CAAC,GAAG,IAAIE,IAAS,CAAC,GAAG,CAAC,CAAC;;IAE7B,OAAO;MACL,OAAO,EAAE,OAAO;MAChB,IAAI,EAAE,IAAI;MACV,GAAG,EAAE,GAAG;MACR,IAAI,EAAE,IAAI;MACV,MAAM,EAAE,MAAM;KACf;;IAED,SAAS,IAAI,CAAC,CAAC,EAAE;MACf,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KAClB;;IAED,SAAS,IAAI,GAAG;MACd,OAAO,CAAC,CAAC,IAAI,CAAC;KACf;;IAED,SAAS,OAAO,GAAG;MACjB,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;KACpB;;IAED,SAAS,MAAM,CAAC,KAAK,EAAE;;MAErB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;KAC3B;;IAED,SAAS,GAAG,GAAG;MACb,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;MACnB,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;KAC1B;GACF;;EClCD;;;;;;;;AAQA,EAAOF,IAAM,GAAG,GAAG,IAAI,CAAC;;AAExB,EAAO,SAAS,qBAAqB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;IACzD,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAChC,IAAI,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE;;MAEvB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE;;QAEtB,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAC;QAClD,IAAI,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,IAAE,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,GAAC;QAC7C,OAAO,IAAI,CAAC;OACb;MACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;KACvB;;IAED,IAAI,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC;IACZ,IAAI,GAAG,IAAI,GAAG,EAAE;MACd,OAAO,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;MAC1B,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE;KACnC;IACD,OAAO,GAAG,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,QAAQ,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE;GACjC;;AAED,EAAO,SAAS,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE;;IAE5B,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAC;;IAExC,IAAI,EAAE,GAAG,CAAC,IAAE,OAAO,CAAC,GAAG,CAAC,GAAC;IACzB,OAAO,CAAC,GAAG,CAAC;GACb;;AAED,EAAO,SAAS,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE;;IAEtC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;QAChC,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;;IAErC,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;IACvD,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;;IAEpC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;IAC5D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAE,SAAO;;IAE3B,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;;IAE5D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;MACpB,OAAO;QACL,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;QACpB,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;OACrB;KACF;GACF;;AAMD,EAAO,SAAS,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE;IAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;GAC/D;;;;;ACjED,EAAe,SAAS,iBAAiB,CAAC,OAAO,EAAEG,MAAG,EAAE;IACtD,IAAI,UAAU,EAAE,KAAK,CAAC;IACtB,IAAI,UAAU,EAAE,KAAK,CAAC;IACtB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,MAAM,GAAG,IAAID,IAAS,CAAC,eAAe,CAAC,CAAC;;;IAG5C,IAAI,eAAe,GAAG;MACpB,UAAU,EAAE,IAAI;MAChB,IAAI,EAAE,IAAI;MACV,KAAK,EAAE,IAAI;MACX,UAAU,EAAE,IAAI;MACjB;;IAED,IAAI,gBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;;IAEjD,OAAO;;;;sBAIL,cAAc;;;;;sBAKd,cAAc;;;;;yBAKd,iBAAiB;;;;;;2BAMjB,mBAAmB;;6BAEnB,qBAAqB;;;;;cAKrB,MAAM;;;;;;sBAMN,cAAc;;;;;mBAKd,WAAW;;;;;MAKX,mCAAY,GAAG;QACb,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;OACvC;KACF;;IAED,SAAS,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE;MAC7B,IAAI,CAAC,KAAK,CAAC,IAAE,OAAO,CAAC,GAAC;;MAEtB,IAAI,EAAE,GAAG,qBAAqB,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;MAC1D,IAAI,EAAE,GAAG,qBAAqB,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;;MAE1D,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;MAClB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAIC,MAAG,EAAE;;;QAGxB,OAAO,GAAG,CAAC;OACZ;;MAED,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAGA,MAAG,CAAC;MACzC,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAGA,MAAG,CAAC;MACzC,IAAI,aAAa,IAAI,aAAa,EAAE;QAClC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;OACxB;;;MAGD,IAAI,aAAa,EAAE;QACjB,OAAO,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;OAC1B;;MAED,IAAI,aAAa,EAAE;QACjB,IAAI,QAAQ,EAAE;UACZ,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC;SACzC;QACD,OAAO,CAAC,CAAC,CAAC;;OAEX;MACD,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;MACjB,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;MACjB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAIA,MAAG,EAAE;QAC5B,OAAO,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;OACrC;;MAED,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;MAClC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAIA,MAAG,EAAE;QAC5B,OAAO,CAAC,OAAO,CAAC;OACjB;MACD,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;MAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAIA,MAAG,EAAE;;QAE5B,OAAO,CAAC,OAAO,CAAC;OACjB;;MAED,OAAO,CAAC,CAAC;;;;;KAKV;;IAED,SAAS,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE;MAC5C,IAAI,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;MAC3B,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;;MAE3B,IAAI,OAAO,GAAG,CAAC,EAAE;QACf,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;OACjC,MAAM;QACL,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;OACpC;;MAED,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,EAAE;QAC5B,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,IAAE,QAAQ,GAAG,CAAC,GAAC;;QAE1B,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,GAAG,GAAG,CAAC,IAAE,SAAS,GAAG,CAAC,GAAC;OAC5B;;MAED,IAAI,SAAS,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;MACpC,KAAK,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QAC5C,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAChB,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,GAAG,GAAG,CAAC,IAAE,QAAQ,GAAG,CAAC,GAAC;;QAE1B,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,GAAG,GAAG,CAAC,IAAE,SAAS,GAAG,CAAC,GAAC;OAC5B;;;;MAID,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;MACjC,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,CAAC,mCAAmC,CAAC,CAAC;OAC9C;;MAED,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;MACnC,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,CAAC,oCAAoC,CAAC,CAAC;OAC/C;;MAED,IAAI,UAAU,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAC3C,IAAI,UAAU,GAAG,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;MAE7C,OAAO,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE;;QAElE,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;OACtC;;MAED,eAAe,CAAC,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,GAAG,CAAC;MAC1D,eAAe,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC;MACxC,eAAe,CAAC,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC;MAC3C,eAAe,CAAC,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,GAAG,CAAC;;MAE1D,OAAO,eAAe,CAAC;KACxB;;IAED,SAAS,iBAAiB,CAAC,CAAC,EAAE;;;;MAI5B,IAAI,QAAQ,CAAC;MACb,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;MAC3B,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;MAGpC,OAAO,OAAO,EAAE;QACd,IAAI,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,EAAE,IAAI,CAAC,EAAE;UACX,IAAI,EAAE,GAAG,IAAI,EAAE;YACb,IAAI,GAAG,EAAE,CAAC;YACV,QAAQ,GAAG,OAAO,CAAC;YACnB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;WAExB,MAAM;YACL,MAAM;WACP;SACF,MAAM;UACL,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE;YAEd,IAAI,GAAG,CAAC,EAAE,CAAC;YACX,QAAQ,GAAG,OAAO,CAAC;YACnB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;WACzB,MAAM;YACL,MAAM;WACP;SACF;OACF;;MAMD,gBAAgB,CAAC,IAAI,GAAG,QAAQ,IAAI,QAAQ,CAAC,IAAG;MAChD,IAAI,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;MAC7C,gBAAgB,CAAC,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,IAAG;MACzC,OAAO,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;KAwBzB;;IAED,SAAS,qBAAqB,CAAC,CAAC,EAAE,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8CzC,IAAI,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;;MAE3B,OAAO,OAAO,EAAE;QACd,IAAI,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAGA,MAAG,EAAE;UACtB,oBAAoB,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;UAC1C,MAAM;SACP,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE;UACjB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;SACxB,MAAM;UACL,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB;OACF;KACF;;IAED,SAAS,oBAAoB,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE;MAC9C,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;MAClB,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;MAC1C,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;KAC1C;;IAED,SAAS,kBAAkB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE;MACxC,IAAI,CAAC,IAAI,IAAE,SAAO;MAClB,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;MAClD,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;MACjB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAGA,MAAG,EAAE;QACtB,oBAAoB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;OACpC,MAAM;QACL,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;OACxC;KACF;;IAED,SAAS,gBAAgB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE;MACtC,IAAI,CAAC,IAAI,IAAE,SAAO;MAClB,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;MAClD,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;MACjB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAGA,MAAG,EAAE;QACtB,oBAAoB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;OACpC,MAAM;QACL,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;OACrC;KACF;;IAED,SAAS,cAAc,GAAG;MACxB,IAAI,IAAI,CAAC;MACT,MAAM,CAAC,OAAO,WAAC,MAAK;QAClB,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;;QAEvB,IAAI,IAAI,EAAE;UACR,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE;;YAExE,OAAO,CAAC,kFAAkF,EAAC;WAC5F;SACF;QACD,IAAI,GAAG,OAAO,CAAC;OAChB,CAAC,CAAC;KACJ;;IAED,SAAS,WAAW,CAAC,MAAW,EAAE;qCAAP,GAAG;;;MAE5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;MAC7D,MAAM,CAAC,OAAO,WAAC,MAAK;QAClB,IAAI,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;;QAEhE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;OACtC,EAAC;KACH;;IAED,SAAS,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;MACrD,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC;MAC5B,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC;MAC5B,IAAI,GAAG,CAAC;;MAER,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACxC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;OACjB;MACD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACjC,GAAG,GAAG,KAAK,CAAC,CAAC,EAAC;QACd,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;OACjB;KACF;;IAED,SAAS,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE;;;;;;;MAOrD,IAAI,CAAC,CAAC;MACN,IAAI,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;MAC7B,KAAK,GAAG,UAAU,CAAC;MACnB,KAAK,GAAG,UAAU,CAAC;MACnB,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC;MAC5B,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC;;MAE5B,QAAQ,GAAG,IAAI,CAAC;MAChB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QAChC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAC;OACtC;MACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACnC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAC;OACzC;MACD,QAAQ,GAAG,KAAK,CAAC;;MAEjB,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE;;QAE/D,OAAO,CAAC,kEAAkE,CAAC,CAAC;OAC7E;KACF;;IAED,SAAS,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE;MACxC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACpB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;OACpB,MAAM;QACL,UAAU,GAAG,KAAK,CAAC;QACnB,UAAU,GAAG,KAAK,CAAC;QACnB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;UACpB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SACpB,AAEA;QACD,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC;QAC5B,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC;OAC7B;KACF;;;ECpaH;;;EAGA,IAAqB,UAAU,GAI7B,mBAAW,CAAC,KAAK,EAAE,OAAO,EAAE;IAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,IAAM,OAAO,IAAE,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAC;EACrC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC0BH,IAAI,KAAK,GAAG,EAAE,CAAC;;;;;;;;;;;;;;AAcf,EAAe,SAAS,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE;IAC/C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,kBAAkB,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,2BAA2B,CAAC;;IAErF,IAAI,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,oBAAoB,CAAC;;IAEnE,IAAI,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,WAAW,GAAG,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClD,IAAI,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC;;IAE/B,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;;IAE7B,OAAO;;;;;;WAML,GAAG;;;;;;;YAOH,IAAI;;;;;;;;kBAQJ,UAAU;;;;;;kBAMV,UAAU;;;;;;mBAMV,WAAW;;;;;eAKX,OAAO;KACR;;IAED,SAAS,GAAG,GAAG;MACb,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE;QAC5B,IAAI,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE;;UAEhC,OAAO;SACR,KACF;;MAED,OAAO,OAAO,CAAC;KAChB;;IAED,SAAS,IAAI,GAAG;MACd,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE;QACzB,IAAI,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;QAClC,gBAAgB,CAAC,UAAU,CAAC,CAAC;;;;QAI7B,OAAO,IAAI,CAAC;OACb;MACD,OAAO,KAAK,CAAC;KACd;;IAED,SAAS,gBAAgB,CAAC,CAAC,EAAE;MAC3B,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;MACpB,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC;;MAE5B,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;;;MAG7B,WAAW,CAAC,qBAAqB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;;;;;MAKjE,IAAI,CAAC,KAAK,IAAE,KAAK,GAAG,KAAK,GAAC;MAC1B,IAAI,CAAC,QAAQ,IAAE,QAAQ,GAAG,KAAK,GAAC;;MAEhC,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;MAC3B,IAAI,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;MAC9B,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;MAC3B,IAAI,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;MACtD,IAAI,oBAAoB,GAAG,CAAC,eAAe,KAAK,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;;MAE/F,IAAI,eAAe,IAAI,oBAAoB,EAAE;QAC3C,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC;QACpB,IAAI,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;UACvE,OAAO,IAAI,CAAC;SACb;OACF;;MAED,WAAW,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;MACvD,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;;MAEvD,IAAI,KAAK,EAAE,MAAM,CAAC;;MAElB,IAAI,aAAa,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC;;MAE9C,IAAI,aAAa,EAAE;QACjB,IAAI,SAAS,GAAG,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACzD,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,IAAE,SAAO;;QAEnB,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,IAAE,SAAO;;QAEpB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;OAChC,MAAM;QACL,IAAI,gBAAgB,GAAG,WAAW,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;;QAExE,YAAY,CAAC,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpE,YAAY,CAAC,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;OACtE;;MAED,OAAO,KAAK,CAAC;KACd;;IAED,SAAS,kBAAkB,CAAC,CAAC,EAAE;MAC7B,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE;QAC9B,IAAI,CAAC,KAAK,IAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAC;eACnB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAC;OACpB,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE;QACxC,IAAI,CAAC,QAAQ,IAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAC;eACzB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAC;OACvB;KACF;;IAED,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;MACpC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAE,SAAO;;MAE5B,IAAI,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;MAClD,IAAI,CAAC,YAAY,EAAE;UACf,OAAO;OACV;;MAED,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,YAAY,CAAC,EAAC;;MAEnC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE;;;QAGb,OAAO;OACR;MACD,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;QACrD,OAAO;OACR;;;;MAID,aAAa,CAAC,YAAY,CAAC,CAAC;;MAE5B,IAAI,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;;MAE5C,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE;;;QAGjC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAC3C,OAAO;OACR;;MAED,IAAI,CAAC,OAAO,EAAE;QACZ,IAAI,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,EAAC;QACxC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;OAC1B;KACF;;IAED,SAAS,2BAA2B,CAAC,CAAC,EAAE,QAAQ,EAAE;MAChD,OAAO,CAAC,IAAI,CAAC;QACX,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,QAAQ;OACnB,CAAC,CAAC;KACJ;;IAED,SAAS,UAAU,CAAC,OAAO,EAAE;MAC3B,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;MACxB,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;;;MAGpB,aAAa,CAAC,IAAI,CAAC,CAAC;MACpB,aAAa,CAAC,EAAE,CAAC,CAAC;;MAElB,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;;;;MAIvB,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE;QACvB,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACd,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;OAChB;MACD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;UACd,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;UACrC;QACF,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,GAAG,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;QACzB,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;OACxB;;;;;MAKD,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;MAC3B,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;MAC3B,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;;MAE9C,IAAI,OAAO,GAAG,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;MAC5D,IAAI,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAC;MAChC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;;;;QAIpB,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,IAAI,QAAQ,EAAE;UACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACxC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;cACvB,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;cAC3C,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;cACzC,OAAO;aACR;WACF;SACF;OACF;;MAED,IAAI,CAAC,OAAO,EAAE;QACZ,IAAI,IAAI,EAAE;UACR,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAC;iBAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAC;SACjC,MAAM;UACL,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,EAAC;UACrC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACtB;QACD,IAAI,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,EAAC;QAC9B,UAAU,CAAC,MAAM,CAAC,KAAK,EAAC;OACzB,MAAM;QACL,IAAI,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,EAAC;QAC9B,UAAU,CAAC,MAAM,CAAC,KAAK,EAAC;OACzB;KACF;GACF;;EAED,SAAS,aAAa,CAAC,KAAK,EAAE;IAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,IAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAC;IACzC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,IAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAC;GAC1C;;EAED,SAAS,oBAAoB,CAAC,YAAY,EAAE;IAC1C,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;GAC/B;;EAED,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE;IACnB,IAAI,CAAC,CAAC,IAAE,OAAO,CAAC,GAAC;IACjB,IAAI,CAAC,CAAC,IAAE,OAAO,CAAC,GAAC;;IAEjB,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;GACpB;;EAED,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE;;IAEjB,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;IAEpB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE;;MAEvB,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;MAChB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,IAAE,GAAG,GAAG,CAAC,GAAC;KAClC;;IAED,OAAO,GAAG,CAAC;;;ECzUE,SAASC,mBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE;;;;;IAK9C,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,IAAI,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;QAChC,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;;IAErC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3G,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;;IAEpC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;IAC5D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAE,SAAO;;IAE3B,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;;IAE5D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;MACpB,OAAO;QACL,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;QACpB,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;OACrB;KACF;;;;;;;;;;ACbH,EAAe,SAAS,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE;IAC5C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,kBAAkB,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;8BAC1B,2BAA2B,CAAC;IACtD,IAAI,UAAU,CAAC;;IAEf,OAAO;;;;WAIL,GAAG;;;;eAIH,OAAO;;;;;YAKP,IAAI;KACL;;IAED,SAAS,IAAI,GAAG;MACd,IAAI,CAAC,UAAU,EAAE;QACf,UAAU,GAAG;UACX,CAAC,EAAE,CAAC;UACL;OACF;MACD,IAAI,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;MAC/B,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACpD,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,EAAE,GAAGA,mBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,EAAE,EAAE;UACN,IAAI,kBAAkB,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE;YACzC,OAAO;WACR;SACF;OACF;MACD,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;MAClB,OAAO,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;KACpC;;IAED,SAAS,GAAG,GAAG;MACb,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACpC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;UACzC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;UACrB,IAAI,EAAE,GAAGA,mBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;UACxC,IAAI,EAAE,EAAE;YACN,IAAI,kBAAkB,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE;cACzC,OAAO;aACR;WACF;SACF;OACF;MACD,OAAO,OAAO,CAAC;KAChB;;IAED,SAAS,2BAA2B,CAAC,CAAC,EAAE,QAAQ,EAAE;MAChD,OAAO,CAAC,IAAI,CAAC;QACX,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,QAAQ;OACnB,CAAC,CAAC;KACJ;;;ECvEHJ,IAAM,WAAW,GAAG;MAChB,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW;MACjE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY;GACtD,CAAC;;EAEFA,IAAM,OAAO,GAAG,CAAC,CAAC;;EAEH,IAAM,QAAQ,GAmBzB,iBAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;;;MACjD,IAAQ,QAAQ,KAAK,SAAS,IAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,GAAC;MACpF,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAE,MAAM,IAAI,KAAK,mCAAgC,QAAQ,QAAI,GAAC;;MAElG,IAAI,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC;MAC9B,IAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;;;;MAI9DD,IAAI,CAAC,GAAG,QAAQ,CAAC;MACjBA,IAAI,QAAQ,GAAG,CAAC,CAAC;MACrB,IAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;MAC5B,GAAG;UACC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAGE,MAAI,CAAC,QAAQ,CAAC,CAAC;UACrC,QAAY,IAAI,CAAC,CAAC;UAClB,MAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;OACxC,QAAQ,CAAC,KAAK,CAAC,EAAE;;MAElB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,YAAY,CAAC;MAC/C,IAAQ,CAAC,cAAc,GAAG,QAAQ,GAAG,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC;;MAEnED,IAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;MAC3DA,IAAM,aAAa,GAAG,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;;MAEtE,IAAI,cAAc,GAAG,CAAC,EAAE;UACxB,MAAU,IAAI,KAAK,qCAAkC,SAAS,QAAI,CAAC;OAClE;;MAEL,IAAQ,IAAI,KAAK,IAAI,YAAY,WAAW,CAAC,EAAE;UACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;UACjB,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;UAC7D,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,aAAa,EAAE,QAAQ,CAAC,CAAC;;UAEhF,IAAI,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC;UACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;UACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;UACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;UACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;;OAE1C,MAAM;UACH,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;UAClG,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;UAC7D,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,aAAa,EAAE,QAAQ,CAAC,CAAC;UAChF,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;UACd,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;UACrB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;UACrB,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC;UACtB,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC;;UAE1B,IAAQ,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;UAC7E,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;UAC/C,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;OAClD;EACL,EAAC;;EAEL,SAxEW,sBAAK,IAAI,EAAE;MACd,IAAI,EAAE,IAAI,YAAY,WAAW,CAAC,EAAE;UAChC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;OAC/D;MACL,OAAiC,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;UAAlD;UAAO,4BAA6C;MAC3D,IAAI,KAAK,KAAK,IAAI,EAAE;UAChB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;OACvE;MACD,IAAI,cAAc,IAAI,CAAC,KAAK,OAAO,EAAE;UACjC,MAAM,IAAI,KAAK,aAAS,cAAc,IAAI,EAAC,6BAAwB,OAAO,QAAI,CAAC;OAClF;MACL,SAAoB,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;UAAtC,wBAAwC;MACnD,SAAoB,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;UAAtC,wBAAwC;;MAE/C,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;EACtF,CAAC;;qBAyDD,oBAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;MAC5B,IAAU,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;MACjC,IAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;MACjC,IAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;MACpC,IAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;MACpC,IAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;MACpC,IAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;;MAEhC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,IAAE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAC;MACvC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,IAAE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAC;MACvC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,IAAE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAC;MACvC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,IAAE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAC;EAC3C,EAAC;;EAEL,mBAAI,4BAAS;;;MACT,IAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE;UAClC,MAAM,IAAI,KAAK,cAAU,IAAI,CAAC,IAAI,IAAI,EAAC,8BAAwB,IAAI,CAAC,SAAQ,QAAI,CAAC;OACpF;;MAEL,IAAU,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;MACxC,IAAU,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;MACzC,IAAU,aAAa,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;MACzD,IAAU,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;;MAGjC,KAAKD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;UACpCA,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;UACpB,IAAU,IAAI,GAAGE,MAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;UACpC,IAAU,IAAI,GAAGA,MAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;UACpC,IAAU,IAAI,GAAGA,MAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;UACpC,IAAU,IAAI,GAAGA,MAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;UACpC,IAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,GAAGA,MAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;UAC/E,IAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,GAAGA,MAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;UAChF,aAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;OACpC;;;MAGLI,MAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;;;MAG1E,KAASN,IAAIO,GAAC,GAAG,CAAC,EAAEC,KAAG,GAAG,CAAC,EAAED,GAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAEA,GAAC,EAAE,EAAE;UAChE,IAAU,GAAG,GAAGL,MAAI,CAAC,YAAY,CAACK,GAAC,CAAC,CAAC;;;UAGjC,OAAOC,KAAG,GAAG,GAAG,EAAE;cACdR,IAAI,QAAQ,GAAG,QAAQ,CAAC;cACxBA,IAAI,QAAQ,GAAG,QAAQ,CAAC;cACxBA,IAAI,QAAQ,GAAG,CAAC,QAAQ,CAAC;cACzBA,IAAI,QAAQ,GAAG,CAAC,QAAQ,CAAC;cACzBC,IAAM,SAAS,GAAGO,KAAG,CAAC;;;cAGtB,KAAKR,IAAIO,GAAC,GAAG,CAAC,EAAEA,GAAC,GAAG,IAAI,CAAC,QAAQ,IAAIC,KAAG,GAAG,GAAG,EAAED,GAAC,EAAE,EAAE;kBACrD,IAAUE,MAAI,GAAGP,MAAI,CAAC,MAAM,CAACM,KAAG,EAAE,CAAC,CAAC;kBACpC,IAAUE,MAAI,GAAGR,MAAI,CAAC,MAAM,CAACM,KAAG,EAAE,CAAC,CAAC;kBACpC,IAAUG,MAAI,GAAGT,MAAI,CAAC,MAAM,CAACM,KAAG,EAAE,CAAC,CAAC;kBACpC,IAAUI,MAAI,GAAGV,MAAI,CAAC,MAAM,CAACM,KAAG,EAAE,CAAC,CAAC;kBACpC,IAAQC,MAAI,GAAG,QAAQ,IAAE,QAAQ,GAAGA,MAAI,GAAC;kBACzC,IAAQC,MAAI,GAAG,QAAQ,IAAE,QAAQ,GAAGA,MAAI,GAAC;kBACzC,IAAQC,MAAI,GAAG,QAAQ,IAAE,QAAQ,GAAGA,MAAI,GAAC;kBACzC,IAAQC,MAAI,GAAG,QAAQ,IAAE,QAAQ,GAAGA,MAAI,GAAC;eACxC;;;cAGDV,MAAI,CAAC,QAAQ,CAACA,MAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;cAC9C,MAAQ,CAAC,MAAM,CAACA,MAAI,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC;cACxC,MAAQ,CAAC,MAAM,CAACA,MAAI,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC;cACxC,MAAQ,CAAC,MAAM,CAACA,MAAI,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC;cACxC,MAAQ,CAAC,MAAM,CAACA,MAAI,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC;WACvC;OACJ;EACL,EAAC;;EAEL,mBAAI,0BAAO,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;;;MACzC,IAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;UAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;OAClE;;MAEL,IAAQ,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;MAC3C,IAAQ,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;MACzCD,IAAM,KAAK,GAAG,EAAE,CAAC;MACjBA,IAAM,OAAO,GAAG,EAAE,CAAC;;MAEnB,OAAO,SAAS,KAAK,SAAS,EAAE;;UAEhC,IAAU,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAGC,MAAI,CAAC,QAAQ,GAAG,CAAC,EAAEA,MAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;;;UAG9E,KAAKF,IAAI,GAAG,GAAG,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE;cAC3CC,IAAM,KAAK,GAAGC,MAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;;;cAG1C,IAAQ,IAAI,GAAGA,MAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAE,WAAS;cACtC,IAAI,IAAI,GAAGA,MAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAE,WAAS;cAC1C,IAAI,IAAI,GAAGA,MAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAE,WAAS;cAC1C,IAAI,IAAI,GAAGA,MAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAE,WAAS;;cAE9C,IAAQ,SAAS,GAAGA,MAAI,CAAC,QAAQ,GAAG,CAAC,EAAE;kBACnC,IAAQ,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;sBAC3C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;mBACvB;;eAEJ,MAAM;kBACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;kBACtB,KAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;eACzB;WACJ;;UAED,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;UACpB,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;OAC3B;;MAEL,OAAW,OAAO,CAAC;EACnB,CAAC;;;EAIL,SAASI,MAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;MAC/C,IAAI,IAAI,IAAI,KAAK,IAAE,SAAO;;MAE1BL,IAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC;MAC1CD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;MACjBA,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;;MAElB,OAAO,IAAI,EAAE;UACT,KAAG,CAAC,EAAE,GAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE;UAClC,KAAG,CAAC,EAAE,GAAC,QAAQ,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE;UAClC,IAAI,CAAC,IAAI,CAAC,IAAE,QAAM;UAClB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;OACtC;;MAEDM,MAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;MACtCA,MAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;GAC9C;;;EAGD,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE;MACxCL,IAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;MACvB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;MACtB,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;;MAEjBA,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;MAChBA,IAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;MAEhBA,IAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;MACnBA,IAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;MACvBA,IAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;MACvBA,IAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;MACvB,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;MACpB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;MAC5B,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;MAC5B,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;MAC5B,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;MACb,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;MACjB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;MACjB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;;MAEjBA,IAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;MACrB,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;MACxB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;GAClB;;;;EAID,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE;MACnBD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;MACdA,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;MACnBA,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;MACzBA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;;MAEzBA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACrBA,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MACrBA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;MACxCA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;;MAExC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;MAC3B,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;MACtC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;MAC5C,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;MACvC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;;MAE7C,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;MAC3B,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;MACtC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;MAC5C,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;MACvC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;;MAE7C,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;MAC3B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;MACvC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;;MAE7C,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACjB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;MAEjBA,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;MACfA,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;;MAEjC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC;MACnC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC;MACnC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC;MACnC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC;;MAEnC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC;MACnC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC;MACnC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC;MACnC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC;;MAEnC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;GACjC;;;;;;;;;;ACvRD,EAAe,SAAS,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE;IAC3C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,kBAAkB,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;8BAC1B,2BAA2B,CAAC;IACtD,IAAI,UAAU,CAAC;;IAEf,IAAI,KAAK,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1B,KAAK,CAAC,MAAM,EAAE,CAAC;;IAEf,OAAO;MACL,GAAG,EAAE,GAAG;MACR,IAAI,EAAE,IAAI;MACV,OAAO,EAAE,OAAO;;;MAGhB,iBAAiB,EAAE,iBAAiB;KACrC;;IAED,SAAS,GAAG,GAAG;MACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACrC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;UAClC,OAAO;SACR;OACF;MACD,OAAO,OAAO,CAAC;KAChB;;IAED,SAAS,iBAAiB,CAAC,cAAc,EAAE,SAAS,EAAE;;MAEpD,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;MACjE,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;MACjE,IAAI,CAAC,CAAC;MACN,IAAI,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE;MACrD,IAAI,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE;;MAErD,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;;MAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACnC,IAAI,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,YAAY,IAAI,SAAS,IAAE,WAAS;;QAExC,IAAI,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,KAAK,GAAGK,mBAAiB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;;QAE5D,IAAI,KAAK,EAAE;UACT,IAAI,kBAAkB,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,EAAE;;YAE7D,OAAO,IAAI,CAAC;WACb;SACF;OACF;KACF;;IAED,SAAS,IAAI,GAAG;MACd,IAAI,CAAC,UAAU,EAAE;QACf,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;OACrB;MACD,IAAI,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;MAC/B,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;MACtC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;MAClB,OAAO,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;KACpC;;;IAGD,SAAS,UAAU,CAAC,IAAI,EAAE;MACxB,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;MAC7C,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;MAC7C,IAAI,CAAC,CAAC;MACN,IAAI,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE;MACrD,IAAI,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE;MACrD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;KACnC;;IAED,SAAS,2BAA2B,CAAC,CAAC,EAAE,QAAQ,EAAE;MAChD,OAAO,CAAC,IAAI,CAAC;QACX,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,QAAQ;OACnB,CAAC,CAAC;KACJ;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/build/isect.module.js b/build/isect.module.js index b2f2c5e..59468b7 100644 --- a/build/isect.module.js +++ b/build/isect.module.js @@ -1444,7 +1444,7 @@ function isect(segments, options) { if (hasIntersection || hasPointIntersection) { p.isReported = true; - if (reportIntersection(lastPoint, interior, lower, upper)) { + if (reportIntersection(lastPoint, union(interior, union(lower, upper)))) { return true; } } @@ -1523,10 +1523,10 @@ function isect(segments, options) { } } - function defaultIntersectionReporter(p, interior, lower, upper) { + function defaultIntersectionReporter(p, segments) { results.push({ point: p, - segments: union(union(interior, lower), upper) + segments: segments }); } @@ -1572,8 +1572,8 @@ function isect(segments, options) { for (var i = 0; i < prevFrom.length; ++i) { var s = prevFrom[i]; if (samePoint(s.to, to)) { - reportIntersection(s.from, [], s.from, s.to); - reportIntersection(s.to, [], s.from, s.to); + reportIntersection(s.from, [s.from, s.to]); + reportIntersection(s.to, [s.from, s.to]); return; } } @@ -1626,6 +1626,31 @@ function byY(a, b) { return res; } +function intersectSegments$1(a, b) { + // Note: this is almost the same as geom.intersectSegments() + // The main difference is that we don't have a pre-computed + // value for dx/dy on the segments. + // https://stackoverflow.com/a/1968345/125351 + var aStart = a.from, bStart = b.from; + var p0_x = aStart.x, p0_y = aStart.y, + p2_x = bStart.x, p2_y = bStart.y; + + var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y; + var div = s1_x * s2_y - s2_x * s1_y; + + var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div; + if (s < 0 || s > 1) { return; } + + var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div; + + if (t >= 0 && t <= 1) { + return { + x: p0_x - (t * s1_x), + y: p0_y - (t * s1_y) + } + } +} + /** * This is a brute force solution with O(n^2) performance. * (`n` is number of segments). @@ -1633,7 +1658,6 @@ function byY(a, b) { * Use this when number of lines is low, and number of intersections * is high. */ - function brute(lines, options) { var results = []; var reportIntersection = (options && options.onFound) || @@ -1700,26 +1724,392 @@ function brute(lines, options) { } } -function intersectSegments$1(a, b) { - // https://stackoverflow.com/a/1968345/125351 - var aStart = a.from, bStart = b.from; - var p0_x = aStart.x, p0_y = aStart.y, - p2_x = bStart.x, p2_y = bStart.y; +var ARRAY_TYPES = [ + Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, + Int32Array, Uint32Array, Float32Array, Float64Array +]; - var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y; - var div = s1_x * s2_y - s2_x * s1_y; +var VERSION = 3; // serialized format version - var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div; - if (s < 0 || s > 1) { return; } +var Flatbush = function Flatbush(numItems, nodeSize, ArrayType, data) { + var this$1 = this; - var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div; + if (numItems === undefined) { throw new Error('Missing required argument: numItems.'); } + if (isNaN(numItems) || numItems <= 0) { throw new Error(("Unpexpected numItems value: " + numItems + ".")); } - if (t >= 0 && t <= 1) { - return { - x: p0_x - (t * s1_x), - y: p0_y - (t * s1_y) + this.numItems = +numItems; + this.nodeSize = Math.min(Math.max(+nodeSize || 16, 2), 65535); + + // calculate the total number of nodes in the R-tree to allocate space for + // and the index of each tree level (used in search later) + var n = numItems; + var numNodes = n; + this._levelBounds = [n * 4]; + do { + n = Math.ceil(n / this$1.nodeSize); + numNodes += n; + this$1._levelBounds.push(numNodes * 4); + } while (n !== 1); + + this.ArrayType = ArrayType || Float64Array; + this.IndexArrayType = numNodes < 16384 ? Uint16Array : Uint32Array; + + var arrayTypeIndex = ARRAY_TYPES.indexOf(this.ArrayType); + var nodesByteSize = numNodes * 4 * this.ArrayType.BYTES_PER_ELEMENT; + + if (arrayTypeIndex < 0) { + throw new Error(("Unexpected typed array class: " + ArrayType + ".")); + } + + if (data && (data instanceof ArrayBuffer)) { + this.data = data; + this._boxes = new this.ArrayType(this.data, 8, numNodes * 4); + this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes); + + this._pos = numNodes * 4; + this.minX = this._boxes[this._pos - 4]; + this.minY = this._boxes[this._pos - 3]; + this.maxX = this._boxes[this._pos - 2]; + this.maxY = this._boxes[this._pos - 1]; + + } else { + this.data = new ArrayBuffer(8 + nodesByteSize + numNodes * this.IndexArrayType.BYTES_PER_ELEMENT); + this._boxes = new this.ArrayType(this.data, 8, numNodes * 4); + this._indices = new this.IndexArrayType(this.data, 8 + nodesByteSize, numNodes); + this._pos = 0; + this.minX = Infinity; + this.minY = Infinity; + this.maxX = -Infinity; + this.maxY = -Infinity; + + new Uint8Array(this.data, 0, 2).set([0xfb, (VERSION << 4) + arrayTypeIndex]); + new Uint16Array(this.data, 2, 1)[0] = nodeSize; + new Uint32Array(this.data, 4, 1)[0] = numItems; + } +}; + +Flatbush.from = function from (data) { + if (!(data instanceof ArrayBuffer)) { + throw new Error('Data must be an instance of ArrayBuffer.'); + } + var ref = new Uint8Array(data, 0, 2); + var magic = ref[0]; + var versionAndType = ref[1]; + if (magic !== 0xfb) { + throw new Error('Data does not appear to be in a Flatbush format.'); + } + if (versionAndType >> 4 !== VERSION) { + throw new Error(("Got v" + (versionAndType >> 4) + " data when expected v" + VERSION + ".")); + } + var ref$1 = new Uint16Array(data, 2, 1); + var nodeSize = ref$1[0]; + var ref$2 = new Uint32Array(data, 4, 1); + var numItems = ref$2[0]; + + return new Flatbush(numItems, nodeSize, ARRAY_TYPES[versionAndType & 0x0f], data); +}; + +Flatbush.prototype.add = function add (minX, minY, maxX, maxY) { + var index = this._pos >> 2; + this._indices[index] = index; + this._boxes[this._pos++] = minX; + this._boxes[this._pos++] = minY; + this._boxes[this._pos++] = maxX; + this._boxes[this._pos++] = maxY; + + if (minX < this.minX) { this.minX = minX; } + if (minY < this.minY) { this.minY = minY; } + if (maxX > this.maxX) { this.maxX = maxX; } + if (maxY > this.maxY) { this.maxY = maxY; } +}; + +Flatbush.prototype.finish = function finish () { + var this$1 = this; + + if (this._pos >> 2 !== this.numItems) { + throw new Error(("Added " + (this._pos >> 2) + " items when expected " + (this.numItems) + ".")); + } + + var width = this.maxX - this.minX; + var height = this.maxY - this.minY; + var hilbertValues = new Uint32Array(this.numItems); + var hilbertMax = (1 << 16) - 1; + + // map item centers into Hilbert coordinate space and calculate Hilbert values + for (var i = 0; i < this.numItems; i++) { + var pos = 4 * i; + var minX = this$1._boxes[pos++]; + var minY = this$1._boxes[pos++]; + var maxX = this$1._boxes[pos++]; + var maxY = this$1._boxes[pos++]; + var x = Math.floor(hilbertMax * ((minX + maxX) / 2 - this$1.minX) / width); + var y = Math.floor(hilbertMax * ((minY + maxY) / 2 - this$1.minY) / height); + hilbertValues[i] = hilbert(x, y); + } + + // sort items by their Hilbert value (for packing later) + sort$1(hilbertValues, this._boxes, this._indices, 0, this.numItems - 1); + + // generate nodes at each tree level, bottom-up + for (var i$1 = 0, pos$1 = 0; i$1 < this._levelBounds.length - 1; i$1++) { + var end = this$1._levelBounds[i$1]; + + // generate a parent node for each block of consecutive nodes + while (pos$1 < end) { + var nodeMinX = Infinity; + var nodeMinY = Infinity; + var nodeMaxX = -Infinity; + var nodeMaxY = -Infinity; + var nodeIndex = pos$1; + + // calculate bbox for the new node + for (var i$2 = 0; i$2 < this.nodeSize && pos$1 < end; i$2++) { + var minX$1 = this$1._boxes[pos$1++]; + var minY$1 = this$1._boxes[pos$1++]; + var maxX$1 = this$1._boxes[pos$1++]; + var maxY$1 = this$1._boxes[pos$1++]; + if (minX$1 < nodeMinX) { nodeMinX = minX$1; } + if (minY$1 < nodeMinY) { nodeMinY = minY$1; } + if (maxX$1 > nodeMaxX) { nodeMaxX = maxX$1; } + if (maxY$1 > nodeMaxY) { nodeMaxY = maxY$1; } + } + + // add the new node to the tree data + this$1._indices[this$1._pos >> 2] = nodeIndex; + this$1._boxes[this$1._pos++] = nodeMinX; + this$1._boxes[this$1._pos++] = nodeMinY; + this$1._boxes[this$1._pos++] = nodeMaxX; + this$1._boxes[this$1._pos++] = nodeMaxY; + } + } +}; + +Flatbush.prototype.search = function search (minX, minY, maxX, maxY, filterFn) { + var this$1 = this; + + if (this._pos !== this._boxes.length) { + throw new Error('Data not yet indexed - call index.finish().'); + } + + var nodeIndex = this._boxes.length - 4; + var level = this._levelBounds.length - 1; + var queue = []; + var results = []; + + while (nodeIndex !== undefined) { + // find the end index of the node + var end = Math.min(nodeIndex + this$1.nodeSize * 4, this$1._levelBounds[level]); + + // search through child nodes + for (var pos = nodeIndex; pos < end; pos += 4) { + var index = this$1._indices[pos >> 2]; + + // check if node bbox intersects with query bbox + if (maxX < this$1._boxes[pos]) { continue; } // maxX < nodeMinX + if (maxY < this$1._boxes[pos + 1]) { continue; } // maxY < nodeMinY + if (minX > this$1._boxes[pos + 2]) { continue; } // minX > nodeMaxX + if (minY > this$1._boxes[pos + 3]) { continue; } // minY > nodeMaxY + + if (nodeIndex < this$1.numItems * 4) { + if (filterFn === undefined || filterFn(index)) { + results.push(index); // leaf item + } + + } else { + queue.push(index); // node; add it to the search queue + queue.push(level - 1); + } + } + + level = queue.pop(); + nodeIndex = queue.pop(); } + + return results; +}; + +// custom quicksort that sorts bbox data alongside the hilbert values +function sort$1(values, boxes, indices, left, right) { + if (left >= right) { return; } + + var pivot = values[(left + right) >> 1]; + var i = left - 1; + var j = right + 1; + + while (true) { + do { i++; } while (values[i] < pivot); + do { j--; } while (values[j] > pivot); + if (i >= j) { break; } + swap(values, boxes, indices, i, j); + } + + sort$1(values, boxes, indices, left, j); + sort$1(values, boxes, indices, j + 1, right); +} + +// swap two values and two corresponding boxes +function swap(values, boxes, indices, i, j) { + var temp = values[i]; + values[i] = values[j]; + values[j] = temp; + + var k = 4 * i; + var m = 4 * j; + + var a = boxes[k]; + var b = boxes[k + 1]; + var c = boxes[k + 2]; + var d = boxes[k + 3]; + boxes[k] = boxes[m]; + boxes[k + 1] = boxes[m + 1]; + boxes[k + 2] = boxes[m + 2]; + boxes[k + 3] = boxes[m + 3]; + boxes[m] = a; + boxes[m + 1] = b; + boxes[m + 2] = c; + boxes[m + 3] = d; + + var e = indices[i]; + indices[i] = indices[j]; + indices[j] = e; +} + +// Fast Hilbert curve algorithm by http://threadlocalmutex.com/ +// Ported from C++ https://github.com/rawrunprotected/hilbert_curves (public domain) +function hilbert(x, y) { + var a = x ^ y; + var b = 0xFFFF ^ a; + var c = 0xFFFF ^ (x | y); + var d = x & (y ^ 0xFFFF); + + var A = a | (b >> 1); + var B = (a >> 1) ^ a; + var C = ((c >> 1) ^ (b & (d >> 1))) ^ c; + var D = ((a & (c >> 1)) ^ (d >> 1)) ^ d; + + a = A; b = B; c = C; d = D; + A = ((a & (a >> 2)) ^ (b & (b >> 2))); + B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2))); + C ^= ((a & (c >> 2)) ^ (b & (d >> 2))); + D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2))); + + a = A; b = B; c = C; d = D; + A = ((a & (a >> 4)) ^ (b & (b >> 4))); + B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4))); + C ^= ((a & (c >> 4)) ^ (b & (d >> 4))); + D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4))); + + a = A; b = B; c = C; d = D; + C ^= ((a & (c >> 8)) ^ (b & (d >> 8))); + D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8))); + + a = C ^ (C >> 1); + b = D ^ (D >> 1); + + var i0 = x ^ y; + var i1 = b | (0xFFFF ^ (i0 | a)); + + i0 = (i0 | (i0 << 8)) & 0x00FF00FF; + i0 = (i0 | (i0 << 4)) & 0x0F0F0F0F; + i0 = (i0 | (i0 << 2)) & 0x33333333; + i0 = (i0 | (i0 << 1)) & 0x55555555; + + i1 = (i1 | (i1 << 8)) & 0x00FF00FF; + i1 = (i1 | (i1 << 4)) & 0x0F0F0F0F; + i1 = (i1 | (i1 << 2)) & 0x33333333; + i1 = (i1 | (i1 << 1)) & 0x55555555; + + return ((i1 << 1) | i0) >>> 0; +} + +/** + * This implementation is inspired by discussion here + * https://twitter.com/mourner/status/1049325199617921024 and + * here https://github.com/anvaka/isect/issues/1 + * + * It builds an index of all segments using static spatial index + * and then for each segment it queries overlapping rectangles. + */ +function bush(lines, options) { + var results = []; + var reportIntersection = (options && options.onFound) || + defaultIntersectionReporter; + var asyncState; + + var index = new Flatbush(lines.length); + lines.forEach(addToIndex); + index.finish(); + + return { + run: run, + step: step, + results: results, + + // undocumented, don't use unless you know what you are doing: + checkIntersection: checkIntersection + } + + function run() { + for (var i = 0; i < lines.length; ++i) { + if (checkIntersection(lines[i], i)) { + return; // stop early + } + } + return results; + } + + function checkIntersection(currentSegment, currentId) { + // sorry about code duplication. + var minX = currentSegment.from.x; var maxX = currentSegment.to.x; + var minY = currentSegment.from.y; var maxY = currentSegment.to.y; + var t; + if (minX > maxX) { t = minX; minX = maxX; maxX = t; } + if (minY > maxY) { t = minY; minY = maxY; maxY = t; } + + var ids = index.search(minX, minY, maxX, maxY); + + for (var i = 0; i < ids.length; ++i) { + var segmentIndex = ids[i]; + if (segmentIndex <= currentId) { continue; } // we have either reported it, or it is current. + + var otherSegment = lines[segmentIndex]; + var point = intersectSegments$1(otherSegment, currentSegment); + + if (point) { + if (reportIntersection(point, [currentSegment, otherSegment])) { + // stop early + return true; + } + } + } + } + + function step() { + if (!asyncState) { + asyncState = {i: 0}; + } + var test = lines[asyncState.i]; + checkIntersection(test, asyncState.i); + asyncState.i += 1; + return asyncState.i < lines.length; + } + + + function addToIndex(line) { + var minX = line.from.x; var maxX = line.to.x; + var minY = line.from.y; var maxY = line.to.y; + var t; + if (minX > maxX) { t = minX; minX = maxX; maxX = t; } + if (minY > maxY) { t = minY; minY = maxY; maxY = t; } + index.add(minX, minY, maxX, maxY); + } + + function defaultIntersectionReporter(p, interior) { + results.push({ + point: p, + segments: interior + }); } } -export { isect as sweep, brute }; +export { isect as sweep, brute, bush }; diff --git a/demo/interactive/src/generateRandomExample.js b/demo/interactive/src/generateRandomExample.js index 2fe1fc9..67b3a9a 100644 --- a/demo/interactive/src/generateRandomExample.js +++ b/demo/interactive/src/generateRandomExample.js @@ -4,7 +4,7 @@ var prng = createRandom(42); var params = [ { name: 'random', - algorithm: 'brute', + algorithm: ['brute', 'bush'], args: [ {min: 100, max: 500}, // number of lines {min: 100, max: 200}, // visible area @@ -12,7 +12,7 @@ var params = [ }, { name: 'complete', - algorithm: 'brute', + algorithm: ['brute', 'bush'], args: [ {min: 10, max: 40}, // number of nodes function p1(qs) { @@ -23,7 +23,7 @@ var params = [ }, { name: 'cube', - algorithm: 'brute', + algorithm: ['brute', 'bush'], args: [ {min: 100, max: 150}, // number of rects function p2() { @@ -33,7 +33,7 @@ var params = [ }, { name: 'drunkgrid', - algorithm: 'brute', + algorithm: ['brute', 'bush'], args: [ {min: 10, max: 150}, // Row x Col function p2(qs) { @@ -46,7 +46,7 @@ var params = [ }, { name: 'sparse', - algorithm: 'sweep', + algorithm: ['bush', 'bush', 'sweep'], args: [ {min: 50, max: 300}, // Count ] @@ -55,7 +55,7 @@ var params = [ name: 'triangle', algorithm(qs) { // sparse is better with sweep - return (qs.p1 > 7) ? 'brute' : 'sweep' + return (qs.p1 > 7) ? 'brute' : 'bush' }, args: [ {min: 10, max: 30}, // Count @@ -64,7 +64,7 @@ var params = [ }, { name: 'splash', - algorithm: 'sweep', + algorithm: ['sweep', 'bush'], args: [ {min: 10, max: 50}, // Number of lines {min: 40, max: 70}, // squared variance @@ -72,12 +72,11 @@ var params = [ }, { name: 'island', - algorithm: 'sweep', + algorithm: ['sweep', 'bush'], args: [ {min: 3, max: 10}, // Number of control points on circle {min: 6, max: 11}, // Number of subdivisions ] - } ] @@ -97,7 +96,10 @@ export default function generateRandomExample() { } }); var algorithm = 'sweep'; - if (typeof generator.algorithm === 'function') { + if (Array.isArray(generator.algorithm)) { + var randomIndex = Math.round(Math.random() * (generator.algorithm.length - 1)); + algorithm = generator.algorithm[randomIndex]; + } else if (typeof generator.algorithm === 'function') { algorithm = generator.algorithm(qs); } else if (typeof generator.algorithm === 'string') { algorithm = generator.algorithm; diff --git a/demo/interactive/src/generators.js b/demo/interactive/src/generators.js index 8b6e869..f41cb37 100644 --- a/demo/interactive/src/generators.js +++ b/demo/interactive/src/generators.js @@ -6,6 +6,7 @@ var prng = createRandom(seed); export * from './brownian'; export function random(count = 4, range = 100, seed) { + seed = 1536687392180 if (seed !== undefined) { prng = createRandom(seed); } diff --git a/demo/interactive/src/main.js b/demo/interactive/src/main.js index 095c36e..8f0d001 100644 --- a/demo/interactive/src/main.js +++ b/demo/interactive/src/main.js @@ -7,6 +7,8 @@ import queryState from 'query-state'; import bus from './bus'; +var whitelistedAlgorithms = new Set(['brute', 'bush', 'sweep']); + var qs = queryState({ isAsync: false, p0: 150, @@ -48,7 +50,6 @@ function updateScene(appState) { currentScene = createScene(sceneOptions, document.getElementById('scene')); } - function getSceneOptions(state) { var generator = state.generator; if (!(generator in gen)) { @@ -65,7 +66,7 @@ function getSceneOptions(state) { lines, isAsync, stepsPerFrame, - algorithm: state.algorithm === 'brute' ? 'brute' : 'sweep' + algorithm: whitelistedAlgorithms.has(state.algorithm) ? state.algorithm : 'bush' } } diff --git a/package-lock.json b/package-lock.json index 73a816c..8f0d1f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -954,6 +954,12 @@ "write": "0.2.1" } }, + "flatbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/flatbush/-/flatbush-3.0.0.tgz", + "integrity": "sha512-RfIR6cqvvU9Oq5LpM2E9K+HByDCBaUUMawT0N+PkD9USmR7ig/ewDPS4/X+AqQqnCkeKIfCxeLz5Ut/YR9yMHQ==", + "dev": true + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", diff --git a/package.json b/package.json index f9fc70f..9a7e9f3 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "benchmark": "^2.1.4", "bentley-ottman-sweepline": "^0.1.4", "eslint": "^5.6.0", + "flatbush": "^3.0.0", "ngraph.random": "^0.1.0", "rollup": "^0.66.1", "rollup-plugin-buble": "^0.19.2", diff --git a/perf/index.js b/perf/index.js index 38c431f..6543d5c 100644 --- a/perf/index.js +++ b/perf/index.js @@ -4,17 +4,21 @@ var g = require('./generators'); var isect = require('../'); var sweep = isect.sweep; var brute = isect.brute; +var bush = isect.bush; var lines = g.complete(12, 40); var bruteLines = g.complete(12, 40); +var bushLines = g.complete(12, 40); var seed = 1536687392180; var randomLines = g.random(100, 42, seed); var bruteRandomLines = g.random(100, 42, seed); +var bushRandomLines = g.random(100, 42, seed); var sparseLines = g.sparse(50, seed); var bruteSparseLines = g.sparse(50, seed); +var bushSparseLines = g.sparse(50, seed); var aLines = lines.map(x => [[x.from.x, x.from.y], [x.to.x, x.to.y]]); var aRandomLines = randomLines.map(x => [[x.from.x, x.from.y], [x.to.x, x.to.y]]); @@ -35,6 +39,12 @@ suite.add('Sweep: Circular lines 12x40', function() { // while sweep line unites them all together. if (res.length !== 1071) throw new Error('Invalid number of intersections'); }) +.add('Bush: Circular lines 12x40', function() { + var res = bush(bruteLines).run(); + // Note: Similar to brute force, flatbush based implementation reports + // only two segments per intersection + if (res.length !== 1071) throw new Error('Invalid number of intersections'); +}) .add('Sweep: 100 Random lines lines in 42px box', function() { var res = sweep(randomLines).run(); if (res.length !== 1123) throw new Error('Invalid number of intersections'); @@ -43,6 +53,10 @@ suite.add('Sweep: Circular lines 12x40', function() { var res = brute(bruteRandomLines).run(); if (res.length !== 1123) throw new Error('Invalid number of intersections'); }) +.add('Bush: 100 Random lines in 42px box', function() { + var res = bush(bushRandomLines).run(); + if (res.length !== 1123) throw new Error('Invalid number of intersections'); +}) .add('Sweep: 2,500 sparse lines', function() { var res = sweep(sparseLines).run(); if (res.length !== 358) throw new Error('Invalid number of intersections'); @@ -51,6 +65,10 @@ suite.add('Sweep: Circular lines 12x40', function() { var res = brute(bruteSparseLines).run(); if (res.length !== 358) throw new Error('Invalid number of intersections'); }) +.add('Bush: 2,500 sparse lines', function() { + var res = bush(bushSparseLines).run(); + if (res.length !== 358) throw new Error('Invalid number of intersections'); +}) // .add('Alternative circular lines 12x40', function () { // var res = alternativeImplementation(aRandomLines); diff --git a/src/brute.js b/src/brute.js index 184f1db..26dca1a 100644 --- a/src/brute.js +++ b/src/brute.js @@ -1,3 +1,5 @@ +import intersectSegments from './intersectSegments'; + /** * This is a brute force solution with O(n^2) performance. * (`n` is number of segments). @@ -5,7 +7,6 @@ * Use this when number of lines is low, and number of intersections * is high. */ - export default function brute(lines, options) { var results = []; var reportIntersection = (options && options.onFound) || @@ -70,29 +71,4 @@ export default function brute(lines, options) { segments: interior }); } -} - -function intersectSegments(a, b) { - // Note: this is almost the same as geom.intersectSegments() - // The main difference is that we don't have a pre-computed - // value for dx/dy on the segments. - // https://stackoverflow.com/a/1968345/125351 - var aStart = a.from, bStart = b.from; - var p0_x = aStart.x, p0_y = aStart.y, - p2_x = bStart.x, p2_y = bStart.y; - - var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y; - var div = s1_x * s2_y - s2_x * s1_y; - - var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div; - if (s < 0 || s > 1) return; - - var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div; - - if (t >= 0 && t <= 1) { - return { - x: p0_x - (t * s1_x), - y: p0_y - (t * s1_y) - } - } -} +} \ No newline at end of file diff --git a/src/bush.js b/src/bush.js new file mode 100644 index 0000000..99ba391 --- /dev/null +++ b/src/bush.js @@ -0,0 +1,92 @@ +import Flatbush from 'flatbush'; +import intersectSegments from './intersectSegments'; + +/** + * This implementation is inspired by discussion here + * https://twitter.com/mourner/status/1049325199617921024 and + * here https://github.com/anvaka/isect/issues/1 + * + * It builds an index of all segments using static spatial index + * and then for each segment it queries overlapping rectangles. + */ +export default function bush(lines, options) { + var results = []; + var reportIntersection = (options && options.onFound) || + defaultIntersectionReporter; + var asyncState; + + var index = new Flatbush(lines.length); + lines.forEach(addToIndex); + index.finish(); + + return { + run: run, + step: step, + results: results, + + // undocumented, don't use unless you know what you are doing: + checkIntersection: checkIntersection + } + + function run() { + for (var i = 0; i < lines.length; ++i) { + if (checkIntersection(lines[i], i)) { + return; // stop early + } + } + return results; + } + + function checkIntersection(currentSegment, currentId) { + // sorry about code duplication. + var minX = currentSegment.from.x; var maxX = currentSegment.to.x; + var minY = currentSegment.from.y; var maxY = currentSegment.to.y; + var t; + if (minX > maxX) { t = minX; minX = maxX; maxX = t; } + if (minY > maxY) { t = minY; minY = maxY; maxY = t; } + + var ids = index.search(minX, minY, maxX, maxY); + + for (var i = 0; i < ids.length; ++i) { + var segmentIndex = ids[i]; + if (segmentIndex <= currentId) continue; // we have either reported it, or it is current. + + var otherSegment = lines[segmentIndex]; + var point = intersectSegments(otherSegment, currentSegment); + + if (point) { + if (reportIntersection(point, [currentSegment, otherSegment])) { + // stop early + return true; + } + } + } + } + + function step() { + if (!asyncState) { + asyncState = {i: 0}; + } + var test = lines[asyncState.i]; + checkIntersection(test, asyncState.i); + asyncState.i += 1; + return asyncState.i < lines.length; + } + + + function addToIndex(line) { + var minX = line.from.x; var maxX = line.to.x; + var minY = line.from.y; var maxY = line.to.y; + var t; + if (minX > maxX) { t = minX; minX = maxX; maxX = t; } + if (minY > maxY) { t = minY; minY = maxY; maxY = t; } + index.add(minX, minY, maxX, maxY); + } + + function defaultIntersectionReporter(p, interior) { + results.push({ + point: p, + segments: interior + }); + } +} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 1b26cda..82d641f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ import sweep from './sweep'; import brute from './brute'; +import bush from './bush'; export { - sweep, brute + sweep, brute, bush } \ No newline at end of file diff --git a/src/intersectSegments.js b/src/intersectSegments.js new file mode 100644 index 0000000..556ac1f --- /dev/null +++ b/src/intersectSegments.js @@ -0,0 +1,24 @@ +export default function intersectSegments(a, b) { + // Note: this is almost the same as geom.intersectSegments() + // The main difference is that we don't have a pre-computed + // value for dx/dy on the segments. + // https://stackoverflow.com/a/1968345/125351 + var aStart = a.from, bStart = b.from; + var p0_x = aStart.x, p0_y = aStart.y, + p2_x = bStart.x, p2_y = bStart.y; + + var s1_x = a.from.x - a.to.x, s1_y = a.from.y - a.to.y, s2_x = b.from.x - b.to.x, s2_y = b.from.y - b.to.y; + var div = s1_x * s2_y - s2_x * s1_y; + + var s = (s1_y * (p0_x - p2_x) - s1_x * (p0_y - p2_y)) / div; + if (s < 0 || s > 1) return; + + var t = (s2_x * (p2_y - p0_y) + s2_y * (p0_x - p2_x)) / div; + + if (t >= 0 && t <= 1) { + return { + x: p0_x - (t * s1_x), + y: p0_y - (t * s1_y) + } + } +} \ No newline at end of file diff --git a/src/sweep.js b/src/sweep.js index fa8f01d..0270db0 100644 --- a/src/sweep.js +++ b/src/sweep.js @@ -148,7 +148,7 @@ export default function isect(segments, options) { if (hasIntersection || hasPointIntersection) { p.isReported = true; - if (reportIntersection(lastPoint, interior, lower, upper)) { + if (reportIntersection(lastPoint, union(interior, union(lower, upper)))) { return true; } } @@ -227,10 +227,10 @@ export default function isect(segments, options) { } } - function defaultIntersectionReporter(p, interior, lower, upper) { + function defaultIntersectionReporter(p, segments) { results.push({ point: p, - segments: union(union(interior, lower), upper) + segments: segments }); } @@ -276,8 +276,8 @@ export default function isect(segments, options) { for (var i = 0; i < prevFrom.length; ++i) { var s = prevFrom[i]; if (samePoint(s.to, to)) { - reportIntersection(s.from, [], s.from, s.to); - reportIntersection(s.to, [], s.from, s.to); + reportIntersection(s.from, [s.from, s.to]); + reportIntersection(s.to, [s.from, s.to]); return; } } diff --git a/test/findIntersections.js b/test/findIntersections.js index 3716089..d838ec1 100644 --- a/test/findIntersections.js +++ b/test/findIntersections.js @@ -2,6 +2,7 @@ var test = require('tap').test; var isect = require('../'); var sweep = isect.sweep; var brute = isect.brute; +var bush = isect.bush; var rnd = require('../perf/generators').drunkGrid; @@ -36,6 +37,22 @@ test('brute force works too', t => { t.end(); }); +test('bush works too', t => { + var bushAlgorithm = bush([{ + from: {x: 0, y: 0}, + to: {x: 10, y: 10} + }, { + from: {x: 0, y: 10}, + to: {x: 10, y: 0} + }]); + + var intersections = bushAlgorithm.run(); + t.equals(intersections.length, 1, 'one intersection found'); + t.equals(intersections[0].point.x, 5) + t.equals(intersections[0].point.y, 5) + t.end(); +}); + test('brute force can stop early', t => { var callCount = 0; var bruteForce = brute([{ @@ -59,6 +76,31 @@ test('brute force can stop early', t => { bruteForce.run(); t.equals(callCount, 1, 'Stopped early'); t.end(); +}); + +test('bush can stop early', t => { + var callCount = 0; + var bushAlgorithm = bush([{ + from: {x: 0, y: 0}, + to: {x: 10, y: 10} + }, { + from: {x: 0, y: 10}, + to: {x: 10, y: 0} + }, { + from: {x: 1, y: 10}, + to: {x: 1, y: 0} + }], { + onFound(pt, intersections) { + callCount += 1; + t.ok(pt, 'point is reported'); + t.ok(Array.isArray(intersections), 'point is reported'); + return true; + } + }); + + bushAlgorithm.run(); + t.equals(callCount, 1, 'Stopped early'); + t.end(); }) test('it reports intersections', t => {