geojs 1.8.10 → 1.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/geo.lean.js CHANGED
@@ -138,6 +138,12 @@ var editHandleFeatureLevel = 3;
138
138
  * @property {boolean|string[]} [showLabel=true] `true` to show the annotation
139
139
  * label on annotations in done or edit states. Alternately, a list of
140
140
  * states in which to show the label. Falsy to not show the label.
141
+ * @property {boolean} [allowBooleanOperations] This defaults to `true` for
142
+ * annotations that have area and `false` for those without area (e.g.,
143
+ * false for lines and points). If it is truthy, then, when the annotation
144
+ * is being created, it checks the metakeys on the first click that defines
145
+ * a coordinate to determine what boolean polygon operation should be
146
+ * performaned on the completion of the annotation.
141
147
  */
142
148
 
143
149
  /**
@@ -160,9 +166,7 @@ var annotation = function annotation(type, args) {
160
166
  }
161
167
 
162
168
  var m_this = this,
163
- m_options = $.extend({}, {
164
- showLabel: true
165
- }, args || {}),
169
+ m_options = $.extend(true, {}, this.constructor.defaults, args || {}),
166
170
  m_id = m_options.annotationId;
167
171
  delete m_options.annotationId;
168
172
 
@@ -968,11 +972,16 @@ var annotation = function annotation(type, args) {
968
972
  value = util.ensureFunction(objStyle[key])();
969
973
 
970
974
  if (value !== undefined) {
975
+ var defvalue = ((m_this.constructor.defaults || {}).style || {})[key];
976
+
971
977
  if (key.toLowerCase().match(/color$/)) {
972
978
  value = util.convertColorToHex(value, 'needed');
979
+ defvalue = defvalue !== undefined ? util.convertColorToHex(defvalue, 'needed') : defvalue;
973
980
  }
974
981
 
975
- obj.properties[key] = value;
982
+ if (value !== defvalue) {
983
+ obj.properties[key] = value;
984
+ }
976
985
  }
977
986
  }
978
987
 
@@ -1699,7 +1708,14 @@ function constrainAspectRatio(ratio) {
1699
1708
 
1700
1709
  return constraintFunction;
1701
1710
  }
1711
+ /**
1712
+ * This object contains the default options to initialize the class.
1713
+ */
1702
1714
 
1715
+
1716
+ annotation.defaults = {
1717
+ showLabel: true
1718
+ };
1703
1719
  module.exports = {
1704
1720
  state: annotationState,
1705
1721
  actionOwner: annotationActionOwner,
@@ -1744,18 +1760,22 @@ var ellipseAnnotation = __webpack_require__(7505);
1744
1760
  var circleAnnotation = function circleAnnotation(args, annotationName) {
1745
1761
  'use strict';
1746
1762
 
1747
- args = $.extend({}, args, {
1748
- constraint: 1
1749
- });
1750
-
1751
1763
  if (!(this instanceof circleAnnotation)) {
1752
1764
  return new circleAnnotation(args, annotationName);
1753
1765
  }
1754
1766
 
1767
+ args = $.extend(true, {}, this.constructor.defaults, args, {
1768
+ constraint: 1
1769
+ });
1755
1770
  ellipseAnnotation.call(this, args, annotationName || 'circle');
1756
1771
  };
1757
1772
 
1758
1773
  inherit(circleAnnotation, ellipseAnnotation);
1774
+ /**
1775
+ * This object contains the default options to initialize the class.
1776
+ */
1777
+
1778
+ circleAnnotation.defaults = $.extend({}, ellipseAnnotation.defaults, {});
1759
1779
  var circleRequiredFeatures = {};
1760
1780
  circleRequiredFeatures[markerFeature.capabilities.feature] = true;
1761
1781
  registerAnnotation('circle', circleAnnotation, circleRequiredFeatures);
@@ -1798,6 +1818,7 @@ var ellipseAnnotation = function ellipseAnnotation(args, annotationName) {
1798
1818
  return new ellipseAnnotation(args, annotationName);
1799
1819
  }
1800
1820
 
1821
+ args = $.extend(true, {}, this.constructor.defaults, args);
1801
1822
  rectangleAnnotation.call(this, args, annotationName || 'ellipse');
1802
1823
  var m_this = this;
1803
1824
  /**
@@ -1844,9 +1865,68 @@ var ellipseAnnotation = function ellipseAnnotation(args, annotationName) {
1844
1865
 
1845
1866
  return features;
1846
1867
  };
1868
+ /**
1869
+ * Return this annotation as a polygon list.
1870
+ *
1871
+ * @param {geo.util.polyop.spec} [opts] The ``tolerance`` and
1872
+ * ``pixelTolerance`` parameters are used if set. Otherwise, a polygon is
1873
+ * approximated to 1/10th of a pixel at the map's current maximum zoom
1874
+ * level.
1875
+ * @returns {geo.polygonList} A list of polygons.
1876
+ */
1877
+
1878
+
1879
+ this.toPolygonList = function (opts) {
1880
+ var coord = m_this._coordinates();
1881
+
1882
+ if (coord.length < 3) {
1883
+ return [];
1884
+ }
1885
+
1886
+ var tolerance = opts && opts.tolerance || 0;
1887
+
1888
+ if (!tolerance) {
1889
+ var map = m_this.layer().map();
1890
+
1891
+ if (opts && opts.pixelTolerance) {
1892
+ tolerance = map.unitsPerPixel(map.zoom()) * opts.pixelTolerance;
1893
+ } else {
1894
+ tolerance = map.unitsPerPixel(map.zoomRange().max) * 0.1;
1895
+ }
1896
+ }
1897
+
1898
+ var w = Math.pow(Math.pow(coord[0].x - coord[1].x, 2) + Math.pow(coord[0].y - coord[1].y, 2), 0.5);
1899
+ var h = Math.pow(Math.pow(coord[0].x - coord[3].x, 2) + Math.pow(coord[0].y - coord[3].y, 2), 0.5);
1900
+ var cx = (coord[0].x + coord[2].x) / 2;
1901
+ var cy = (coord[0].y + coord[2].y) / 2;
1902
+ var radius = Math.max(w, h) / 2;
1903
+ var rotation = -Math.atan2(coord[1].y - coord[0].y, coord[1].x - coord[0].x);
1904
+ var sides = Math.max(12, Math.ceil(Math.PI / Math.acos((radius - tolerance) / (radius + tolerance))));
1905
+ var a = w / 2 * (1 + (1 - Math.cos(Math.PI / sides)) / 2);
1906
+ var b = h / 2 * (1 + (1 - Math.cos(Math.PI / sides)) / 2);
1907
+ var poly = [];
1908
+ var cosr = Math.cos(rotation),
1909
+ sinr = Math.sin(rotation);
1910
+
1911
+ for (var s = 0; s < sides; s += 1) {
1912
+ var sa = Math.PI * 2 * s / sides;
1913
+ var cosa = Math.cos(sa),
1914
+ sina = Math.sin(sa);
1915
+ var x = cx + a * cosr * cosa - b * sinr * sina;
1916
+ var y = cy + a * sinr * cosa + b * cosr * sina;
1917
+ poly.push([x, y]);
1918
+ }
1919
+
1920
+ return [[poly]];
1921
+ };
1847
1922
  };
1848
1923
 
1849
1924
  inherit(ellipseAnnotation, rectangleAnnotation);
1925
+ /**
1926
+ * This object contains the default options to initialize the class.
1927
+ */
1928
+
1929
+ ellipseAnnotation.defaults = $.extend({}, rectangleAnnotation.defaults, {});
1850
1930
  var ellipseRequiredFeatures = {};
1851
1931
  ellipseRequiredFeatures[markerFeature.capabilities.feature] = true;
1852
1932
  registerAnnotation('ellipse', ellipseAnnotation, ellipseRequiredFeatures);
@@ -1933,7 +2013,7 @@ var lineAnnotation = function lineAnnotation(args) {
1933
2013
  return new lineAnnotation(args);
1934
2014
  }
1935
2015
 
1936
- args = $.extend(true, {}, {
2016
+ args = $.extend(true, {}, this.constructor.defaults, {
1937
2017
  style: {
1938
2018
  line: function line(d) {
1939
2019
  /* Return an array that has the same number of items as we have
@@ -1944,20 +2024,7 @@ var lineAnnotation = function lineAnnotation(args) {
1944
2024
  },
1945
2025
  position: function position(d, i) {
1946
2026
  return m_this.options('vertices')[i];
1947
- },
1948
- strokeColor: {
1949
- r: 0,
1950
- g: 0,
1951
- b: 0
1952
- },
1953
- strokeOpacity: 1,
1954
- strokeWidth: 3,
1955
- closed: false,
1956
- lineCap: 'butt',
1957
- lineJoin: 'miter'
1958
- },
1959
- highlightStyle: {
1960
- strokeWidth: 5
2027
+ }
1961
2028
  },
1962
2029
  createStyle: {
1963
2030
  line: function line(d) {
@@ -1969,19 +2036,9 @@ var lineAnnotation = function lineAnnotation(args) {
1969
2036
  },
1970
2037
  position: function position(d, i) {
1971
2038
  return m_this.options('vertices')[i];
1972
- },
1973
- strokeColor: {
1974
- r: 0,
1975
- g: 0,
1976
- b: 1
1977
- },
1978
- strokeOpacity: 1,
1979
- strokeWidth: 3,
1980
- closed: false,
1981
- lineCap: 'butt',
1982
- lineJoin: 'miter'
2039
+ }
1983
2040
  }
1984
- }, args || {});
2041
+ }, args);
1985
2042
  args.vertices = args.vertices || args.coordinates || [];
1986
2043
  delete args.coordinates;
1987
2044
  annotation.call(this, 'line', args);
@@ -2277,6 +2334,39 @@ var lineAnnotation = function lineAnnotation(args) {
2277
2334
  };
2278
2335
 
2279
2336
  inherit(lineAnnotation, annotation);
2337
+ /**
2338
+ * This object contains the default options to initialize the class.
2339
+ */
2340
+
2341
+ lineAnnotation.defaults = $.extend({}, annotation.defaults, {
2342
+ style: {
2343
+ strokeColor: {
2344
+ r: 0,
2345
+ g: 0,
2346
+ b: 0
2347
+ },
2348
+ strokeOpacity: 1,
2349
+ strokeWidth: 3,
2350
+ closed: false,
2351
+ lineCap: 'butt',
2352
+ lineJoin: 'miter'
2353
+ },
2354
+ highlightStyle: {
2355
+ strokeWidth: 5
2356
+ },
2357
+ createStyle: {
2358
+ strokeColor: {
2359
+ r: 0,
2360
+ g: 0,
2361
+ b: 1
2362
+ },
2363
+ strokeOpacity: 1,
2364
+ strokeWidth: 3,
2365
+ closed: false,
2366
+ lineCap: 'butt',
2367
+ lineJoin: 'miter'
2368
+ }
2369
+ });
2280
2370
  var lineRequiredFeatures = {};
2281
2371
  lineRequiredFeatures[lineFeature.capabilities.basic] = [annotationState.create];
2282
2372
  registerAnnotation('line', lineAnnotation, lineRequiredFeatures);
@@ -2336,49 +2426,7 @@ var pointAnnotation = function pointAnnotation(args) {
2336
2426
  return new pointAnnotation(args);
2337
2427
  }
2338
2428
 
2339
- args = $.extend(true, {}, {
2340
- style: {
2341
- fill: true,
2342
- fillColor: {
2343
- r: 0,
2344
- g: 1,
2345
- b: 0
2346
- },
2347
- fillOpacity: 0.25,
2348
- radius: 10,
2349
- scaled: false,
2350
- stroke: true,
2351
- strokeColor: {
2352
- r: 0,
2353
- g: 0,
2354
- b: 0
2355
- },
2356
- strokeOpacity: 1,
2357
- strokeWidth: 3
2358
- },
2359
- createStyle: {
2360
- fillColor: {
2361
- r: 0.3,
2362
- g: 0.3,
2363
- b: 0.3
2364
- },
2365
- fillOpacity: 0.25,
2366
- strokeColor: {
2367
- r: 0,
2368
- g: 0,
2369
- b: 1
2370
- }
2371
- },
2372
- highlightStyle: {
2373
- fillColor: {
2374
- r: 0,
2375
- g: 1,
2376
- b: 1
2377
- },
2378
- fillOpacity: 0.5,
2379
- strokeWidth: 5
2380
- }
2381
- }, args || {});
2429
+ args = $.extend(true, {}, this.constructor.defaults, args);
2382
2430
  args.position = args.position || (args.coordinates ? args.coordinates[0] : undefined);
2383
2431
  delete args.coordinates;
2384
2432
  annotation.call(this, 'point', args);
@@ -2539,6 +2587,53 @@ var pointAnnotation = function pointAnnotation(args) {
2539
2587
  };
2540
2588
 
2541
2589
  inherit(pointAnnotation, annotation);
2590
+ /**
2591
+ * This object contains the default options to initialize the class.
2592
+ */
2593
+
2594
+ pointAnnotation.defaults = $.extend({}, annotation.defaults, {
2595
+ style: {
2596
+ fill: true,
2597
+ fillColor: {
2598
+ r: 0,
2599
+ g: 1,
2600
+ b: 0
2601
+ },
2602
+ fillOpacity: 0.25,
2603
+ radius: 10,
2604
+ scaled: false,
2605
+ stroke: true,
2606
+ strokeColor: {
2607
+ r: 0,
2608
+ g: 0,
2609
+ b: 0
2610
+ },
2611
+ strokeOpacity: 1,
2612
+ strokeWidth: 3
2613
+ },
2614
+ createStyle: {
2615
+ fillColor: {
2616
+ r: 0.3,
2617
+ g: 0.3,
2618
+ b: 0.3
2619
+ },
2620
+ fillOpacity: 0.25,
2621
+ strokeColor: {
2622
+ r: 0,
2623
+ g: 0,
2624
+ b: 1
2625
+ }
2626
+ },
2627
+ highlightStyle: {
2628
+ fillColor: {
2629
+ r: 0,
2630
+ g: 1,
2631
+ b: 1
2632
+ },
2633
+ fillOpacity: 0.5,
2634
+ strokeWidth: 5
2635
+ }
2636
+ });
2542
2637
  var pointRequiredFeatures = {};
2543
2638
  pointRequiredFeatures[pointFeature.capabilities.feature] = true;
2544
2639
  registerAnnotation('point', pointAnnotation, pointRequiredFeatures);
@@ -2603,45 +2698,13 @@ var polygonAnnotation = function polygonAnnotation(args) {
2603
2698
  return new polygonAnnotation(args);
2604
2699
  }
2605
2700
 
2606
- args = $.extend(true, {}, {
2701
+ args = $.extend(true, {}, this.constructor.defaults, {
2607
2702
  style: {
2608
- fill: true,
2609
- fillColor: {
2610
- r: 0,
2611
- g: 1,
2612
- b: 0
2613
- },
2614
- fillOpacity: 0.25,
2615
2703
  polygon: function polygon(d) {
2616
2704
  return d.polygon;
2617
- },
2618
- stroke: true,
2619
- strokeColor: {
2620
- r: 0,
2621
- g: 0,
2622
- b: 0
2623
- },
2624
- strokeOpacity: 1,
2625
- strokeWidth: 3,
2626
- uniformPolygon: true
2627
- },
2628
- highlightStyle: {
2629
- fillColor: {
2630
- r: 0,
2631
- g: 1,
2632
- b: 1
2633
- },
2634
- fillOpacity: 0.5,
2635
- strokeWidth: 5
2705
+ }
2636
2706
  },
2637
2707
  createStyle: {
2638
- closed: false,
2639
- fillColor: {
2640
- r: 0.3,
2641
- g: 0.3,
2642
- b: 0.3
2643
- },
2644
- fillOpacity: 0.25,
2645
2708
  line: function line(d) {
2646
2709
  var coord = m_this._coordinates();
2647
2710
  /* Return an array that has the same number of items as we have
@@ -2658,15 +2721,9 @@ var polygonAnnotation = function polygonAnnotation(args) {
2658
2721
  }
2659
2722
 
2660
2723
  return m_this.options('vertices')[i];
2661
- },
2662
- stroke: false,
2663
- strokeColor: {
2664
- r: 0,
2665
- g: 0,
2666
- b: 1
2667
2724
  }
2668
2725
  }
2669
- }, args || {});
2726
+ }, args);
2670
2727
  args.vertices = args.vertices || args.coordinates || [];
2671
2728
  delete args.coordinates;
2672
2729
  annotation.call(this, 'polygon', args);
@@ -2727,6 +2784,37 @@ var polygonAnnotation = function polygonAnnotation(args) {
2727
2784
 
2728
2785
  return features;
2729
2786
  };
2787
+ /**
2788
+ * Return this annotation as a polygon list.
2789
+ *
2790
+ * @param {geo.util.polyop.spec} [opts] Ignored.
2791
+ * @returns {geo.polygonList} A list of polygons.
2792
+ */
2793
+
2794
+
2795
+ this.toPolygonList = function (opts) {
2796
+ var coord = m_this._coordinates();
2797
+
2798
+ if (coord.outer) {
2799
+ var result = [[coord.outer.map(function (pt) {
2800
+ return [pt.x, pt.y];
2801
+ })]];
2802
+ (coord.inner || []).forEach(function (h) {
2803
+ return result[0].push(h.map(function (pt) {
2804
+ return [pt.x, pt.y];
2805
+ }));
2806
+ });
2807
+ return result;
2808
+ }
2809
+
2810
+ if (coord.length < 3) {
2811
+ return [];
2812
+ }
2813
+
2814
+ return [[coord.map(function (pt) {
2815
+ return [pt.x, pt.y];
2816
+ })]];
2817
+ };
2730
2818
  /**
2731
2819
  * Get and optionally set coordinates associated with this annotation in the
2732
2820
  * map gcs coordinate system.
@@ -2926,6 +3014,55 @@ var polygonAnnotation = function polygonAnnotation(args) {
2926
3014
  };
2927
3015
 
2928
3016
  inherit(polygonAnnotation, annotation);
3017
+ /**
3018
+ * This object contains the default options to initialize the class.
3019
+ */
3020
+
3021
+ polygonAnnotation.defaults = $.extend({}, annotation.defaults, {
3022
+ style: {
3023
+ fill: true,
3024
+ fillColor: {
3025
+ r: 0,
3026
+ g: 1,
3027
+ b: 0
3028
+ },
3029
+ fillOpacity: 0.25,
3030
+ stroke: true,
3031
+ strokeColor: {
3032
+ r: 0,
3033
+ g: 0,
3034
+ b: 0
3035
+ },
3036
+ strokeOpacity: 1,
3037
+ strokeWidth: 3,
3038
+ uniformPolygon: true
3039
+ },
3040
+ highlightStyle: {
3041
+ fillColor: {
3042
+ r: 0,
3043
+ g: 1,
3044
+ b: 1
3045
+ },
3046
+ fillOpacity: 0.5,
3047
+ strokeWidth: 5
3048
+ },
3049
+ createStyle: {
3050
+ closed: false,
3051
+ fillColor: {
3052
+ r: 0.3,
3053
+ g: 0.3,
3054
+ b: 0.3
3055
+ },
3056
+ fillOpacity: 0.25,
3057
+ stroke: false,
3058
+ strokeColor: {
3059
+ r: 0,
3060
+ g: 0,
3061
+ b: 1
3062
+ }
3063
+ },
3064
+ allowBooleanOperations: true
3065
+ });
2929
3066
  var polygonRequiredFeatures = {};
2930
3067
  polygonRequiredFeatures[polygonFeature.capabilities.feature] = true;
2931
3068
  polygonRequiredFeatures[lineFeature.capabilities.basic] = [annotationState.create];
@@ -2996,51 +3133,7 @@ var rectangleAnnotation = function rectangleAnnotation(args, annotationName) {
2996
3133
  return new rectangleAnnotation(args, annotationName);
2997
3134
  }
2998
3135
 
2999
- args = $.extend(true, {}, {
3000
- style: {
3001
- fill: true,
3002
- fillColor: {
3003
- r: 0,
3004
- g: 1,
3005
- b: 0
3006
- },
3007
- fillOpacity: 0.25,
3008
- polygon: function polygon(d) {
3009
- return d.polygon;
3010
- },
3011
- stroke: true,
3012
- strokeColor: {
3013
- r: 0,
3014
- g: 0,
3015
- b: 0
3016
- },
3017
- strokeOpacity: 1,
3018
- strokeWidth: 3,
3019
- uniformPolygon: true
3020
- },
3021
- highlightStyle: {
3022
- fillColor: {
3023
- r: 0,
3024
- g: 1,
3025
- b: 1
3026
- },
3027
- fillOpacity: 0.5,
3028
- strokeWidth: 5
3029
- },
3030
- createStyle: {
3031
- fillColor: {
3032
- r: 0.3,
3033
- g: 0.3,
3034
- b: 0.3
3035
- },
3036
- fillOpacity: 0.25,
3037
- strokeColor: {
3038
- r: 0,
3039
- g: 0,
3040
- b: 1
3041
- }
3042
- }
3043
- }, args || {});
3136
+ args = $.extend(true, {}, this.constructor.defaults, args);
3044
3137
  args.corners = args.corners || args.coordinates || [];
3045
3138
  delete args.coordinates;
3046
3139
  annotation.call(this, annotationName || 'rectangle', args);
@@ -3156,6 +3249,23 @@ var rectangleAnnotation = function rectangleAnnotation(args, annotationName) {
3156
3249
 
3157
3250
  return features;
3158
3251
  };
3252
+ /**
3253
+ * Return this annotation as a polygon list.
3254
+ *
3255
+ * @param {geo.util.polyop.spec} [opts] Ignored.
3256
+ * @returns {geo.polygonList} A list of polygons.
3257
+ */
3258
+
3259
+
3260
+ this.toPolygonList = function (opts) {
3261
+ if (m_this._coordinates().length < 3) {
3262
+ return [];
3263
+ }
3264
+
3265
+ return [[m_this._coordinates().map(function (pt) {
3266
+ return [pt.x, pt.y];
3267
+ })]];
3268
+ };
3159
3269
  /**
3160
3270
  * Get and optionally set coordinates associated with this annotation in the
3161
3271
  * map gcs coordinate system.
@@ -3431,6 +3541,56 @@ var rectangleAnnotation = function rectangleAnnotation(args, annotationName) {
3431
3541
  };
3432
3542
 
3433
3543
  inherit(rectangleAnnotation, annotation);
3544
+ /**
3545
+ * This object contains the default options to initialize the class.
3546
+ */
3547
+
3548
+ rectangleAnnotation.defaults = $.extend({}, annotation.defaults, {
3549
+ style: {
3550
+ fill: true,
3551
+ fillColor: {
3552
+ r: 0,
3553
+ g: 1,
3554
+ b: 0
3555
+ },
3556
+ fillOpacity: 0.25,
3557
+ polygon: function polygon(d) {
3558
+ return d.polygon;
3559
+ },
3560
+ stroke: true,
3561
+ strokeColor: {
3562
+ r: 0,
3563
+ g: 0,
3564
+ b: 0
3565
+ },
3566
+ strokeOpacity: 1,
3567
+ strokeWidth: 3,
3568
+ uniformPolygon: true
3569
+ },
3570
+ highlightStyle: {
3571
+ fillColor: {
3572
+ r: 0,
3573
+ g: 1,
3574
+ b: 1
3575
+ },
3576
+ fillOpacity: 0.5,
3577
+ strokeWidth: 5
3578
+ },
3579
+ createStyle: {
3580
+ fillColor: {
3581
+ r: 0.3,
3582
+ g: 0.3,
3583
+ b: 0.3
3584
+ },
3585
+ fillOpacity: 0.25,
3586
+ strokeColor: {
3587
+ r: 0,
3588
+ g: 0,
3589
+ b: 1
3590
+ }
3591
+ },
3592
+ allowBooleanOperations: true
3593
+ });
3434
3594
  var rectangleRequiredFeatures = {};
3435
3595
  rectangleRequiredFeatures[polygonFeature.capabilities.feature] = true;
3436
3596
  registerAnnotation('rectangle', rectangleAnnotation, rectangleRequiredFeatures);
@@ -3467,18 +3627,22 @@ var rectangleAnnotation = __webpack_require__(3442);
3467
3627
  var squareAnnotation = function squareAnnotation(args, annotationName) {
3468
3628
  'use strict';
3469
3629
 
3470
- args = $.extend({}, args, {
3471
- constraint: 1
3472
- });
3473
-
3474
3630
  if (!(this instanceof squareAnnotation)) {
3475
3631
  return new squareAnnotation(args, annotationName);
3476
3632
  }
3477
3633
 
3634
+ args = $.extend(true, {}, this.constructor.defaults, args, {
3635
+ constraint: 1
3636
+ });
3478
3637
  rectangleAnnotation.call(this, args, annotationName || 'square');
3479
3638
  };
3480
3639
 
3481
3640
  inherit(squareAnnotation, rectangleAnnotation);
3641
+ /**
3642
+ * This object contains the default options to initialize the class.
3643
+ */
3644
+
3645
+ squareAnnotation.defaults = $.extend({}, rectangleAnnotation.defaults, {});
3482
3646
  var squareRequiredFeatures = {};
3483
3647
  squareRequiredFeatures[polygonFeature.capabilities.feature] = true;
3484
3648
  registerAnnotation('square', squareAnnotation, squareRequiredFeatures);
@@ -3489,6 +3653,20 @@ module.exports = squareAnnotation;
3489
3653
  /***/ 836:
3490
3654
  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
3491
3655
 
3656
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
3657
+
3658
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
3659
+
3660
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3661
+
3662
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
3663
+
3664
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
3665
+
3666
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
3667
+
3668
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
3669
+
3492
3670
  var inherit = __webpack_require__(5699);
3493
3671
 
3494
3672
  var featureLayer = __webpack_require__(3715);
@@ -3722,6 +3900,56 @@ var annotationLayer = function annotationLayer(arg) {
3722
3900
 
3723
3901
  m_this._updateFromEvent(update);
3724
3902
  };
3903
+ /**
3904
+ * Check if there is a current boolean operation.
3905
+ *
3906
+ * @returns {string?} Either undefined for no current boolean operation or
3907
+ * the name of the operation.
3908
+ */
3909
+
3910
+
3911
+ this.currentBooleanOperation = function () {
3912
+ var op;
3913
+
3914
+ if (m_this._currentBooleanClass) {
3915
+ op = m_this._currentBooleanClass.split('-')[1];
3916
+ }
3917
+
3918
+ return op;
3919
+ };
3920
+ /**
3921
+ * Check if the map is currently in a mode where we are adding an annotation
3922
+ * with a boolean operation. If so, remove the current annotation from the
3923
+ * layer, then apply it via the boolean operation.
3924
+ */
3925
+
3926
+
3927
+ this._handleBooleanOperation = function () {
3928
+ var op = m_this.currentBooleanOperation();
3929
+
3930
+ if (!op || !m_this.currentAnnotation || !m_this.currentAnnotation.toPolygonList) {
3931
+ return;
3932
+ }
3933
+
3934
+ var newAnnot = m_this.currentAnnotation;
3935
+ m_this.removeAnnotation(m_this.currentAnnotation, false);
3936
+
3937
+ if (m_this.annotations().length || op !== 'difference' && op !== 'intersect') {
3938
+ var evt = {
3939
+ annotation: newAnnot,
3940
+ operation: op
3941
+ };
3942
+ m_this.geoTrigger(geo_event.annotation.boolean, evt);
3943
+
3944
+ if (evt.cancel !== false) {
3945
+ util.polyops[op](m_this, newAnnot.toPolygonList(), {
3946
+ correspond: {},
3947
+ keepAnnotations: 'exact',
3948
+ style: m_this
3949
+ });
3950
+ }
3951
+ }
3952
+ };
3725
3953
  /**
3726
3954
  * Handle updating the current annotation based on an update state.
3727
3955
  *
@@ -3740,6 +3968,8 @@ var annotationLayer = function annotationLayer(arg) {
3740
3968
  break;
3741
3969
 
3742
3970
  case 'done':
3971
+ m_this._handleBooleanOperation();
3972
+
3743
3973
  m_this.mode(null);
3744
3974
  break;
3745
3975
  }
@@ -3749,6 +3979,30 @@ var annotationLayer = function annotationLayer(arg) {
3749
3979
  m_this.draw();
3750
3980
  }
3751
3981
  };
3982
+ /**
3983
+ * Check the state of the modifier keys and apply them if appropriate.
3984
+ *
3985
+ * @param {geo.event} evt The mouse move or click event.
3986
+ */
3987
+
3988
+
3989
+ this._handleMouseMoveModifiers = function (evt) {
3990
+ if (m_this.mode() !== m_this.modes.edit && m_this.currentAnnotation.options('allowBooleanOperations') && m_this.currentAnnotation._coordinates().length < 2) {
3991
+ if (evt.modifiers) {
3992
+ var mod = (evt.modifiers.shift ? 's' : '') + (evt.modifiers.ctrl ? 'c' : '') + (evt.modifiers.meta || evt.modifiers.alt ? 'a' : '');
3993
+
3994
+ if (m_this._currentBooleanClass === m_this._booleanClasses[mod]) {
3995
+ return;
3996
+ }
3997
+
3998
+ m_this._currentBooleanClass = m_this._booleanClasses[mod];
3999
+ var mapNode = m_this.map().node();
4000
+ Object.values(m_this._booleanClasses).forEach(function (c) {
4001
+ mapNode.toggleClass(c, m_this._booleanClasses[mod] === c);
4002
+ });
4003
+ }
4004
+ }
4005
+ };
3752
4006
  /**
3753
4007
  * Handle mouse movement. If there is a current annotation, the movement
3754
4008
  * event is sent to it.
@@ -3759,6 +4013,8 @@ var annotationLayer = function annotationLayer(arg) {
3759
4013
 
3760
4014
  this._handleMouseMove = function (evt) {
3761
4015
  if (m_this.mode() && m_this.currentAnnotation) {
4016
+ m_this._handleMouseMoveModifiers(evt);
4017
+
3762
4018
  var update = m_this.currentAnnotation.mouseMove(evt);
3763
4019
 
3764
4020
  if (update) {
@@ -3881,6 +4137,8 @@ var annotationLayer = function annotationLayer(arg) {
3881
4137
  });
3882
4138
  retrigger = true;
3883
4139
  } else if (m_this.mode() && m_this.currentAnnotation) {
4140
+ m_this._handleMouseMoveModifiers(evt);
4141
+
3884
4142
  update = m_this.currentAnnotation.mouseClick(evt);
3885
4143
 
3886
4144
  m_this._updateFromEvent(update);
@@ -4118,6 +4376,15 @@ var annotationLayer = function annotationLayer(arg) {
4118
4376
  this.modes = {
4119
4377
  edit: 'edit'
4120
4378
  };
4379
+ /* Keys are short-hand for preferred event modifiers. Values are classes to
4380
+ * apply to the map node. */
4381
+
4382
+ this._booleanClasses = {
4383
+ s: 'annotation-union',
4384
+ sc: 'annotation-intersect',
4385
+ c: 'annotation-difference',
4386
+ sa: 'annotation-xor'
4387
+ };
4121
4388
  /**
4122
4389
  * Get or set the current mode.
4123
4390
  *
@@ -4139,7 +4406,7 @@ var annotationLayer = function annotationLayer(arg) {
4139
4406
  return m_mode;
4140
4407
  }
4141
4408
 
4142
- if (arg !== m_mode || arg === m_this.modes.edit && editAnnotation !== m_this.editAnnotation) {
4409
+ if (arg !== m_mode || arg === m_this.modes.edit && editAnnotation !== m_this.editAnnotation || arg !== m_this.modes.edit && arg && !m_this.currentAnnotation) {
4143
4410
  var createAnnotation,
4144
4411
  actions,
4145
4412
  mapNode = m_this.map().node(),
@@ -4147,6 +4414,13 @@ var annotationLayer = function annotationLayer(arg) {
4147
4414
  m_mode = arg;
4148
4415
  mapNode.toggleClass('annotation-input', !!(m_mode && m_mode !== m_this.modes.edit));
4149
4416
 
4417
+ if (!m_mode || m_mode === m_this.modes.edit) {
4418
+ Object.values(m_this._booleanClasses).forEach(function (c) {
4419
+ return mapNode.toggleClass(c, false);
4420
+ });
4421
+ m_this._currentBooleanClass = undefined;
4422
+ }
4423
+
4150
4424
  if (!m_keyHandler) {
4151
4425
  m_keyHandler = Mousetrap(mapNode[0]);
4152
4426
  }
@@ -4238,7 +4512,10 @@ var annotationLayer = function annotationLayer(arg) {
4238
4512
  this.geojson = function (geojson, clear, gcs, includeCrs) {
4239
4513
  if (geojson !== undefined) {
4240
4514
  var reader = registry.createFileReader('geojsonReader', {
4241
- layer: m_this
4515
+ layer: m_this,
4516
+ lineStyle: (__webpack_require__(3984).defaults.style),
4517
+ pointStyle: (__webpack_require__(8296).defaults.style),
4518
+ polygonStyle: (__webpack_require__(56).defaults.style)
4242
4519
  });
4243
4520
 
4244
4521
  if (!reader.canRead(geojson)) {
@@ -4887,6 +5164,150 @@ var annotationLayer = function annotationLayer(arg) {
4887
5164
  s_draw.call(m_this);
4888
5165
  return m_this;
4889
5166
  };
5167
+ /**
5168
+ * Return any annotation that has area as a polygon list: an array of
5169
+ * polygons, each of which is an array of polylines, each of which is an
5170
+ * array of points, each of which is a 2-tuple of numbers.
5171
+ *
5172
+ * @param {geo.util.polyop.spec} [opts] Ignored.
5173
+ * @returns {geo.polygonList} A list of polygons.
5174
+ */
5175
+
5176
+
5177
+ this.toPolygonList = function (opts) {
5178
+ var poly = [];
5179
+ opts = opts || {};
5180
+ opts.annotationIndices = [];
5181
+ m_annotations.forEach(function (annotation, idx) {
5182
+ if (annotation.toPolygonList) {
5183
+ annotation.toPolygonList(opts).forEach(function (p) {
5184
+ return poly.push(p);
5185
+ });
5186
+ opts.annotationIndices.push(idx);
5187
+ }
5188
+ });
5189
+ return poly;
5190
+ };
5191
+ /**
5192
+ * Replace appropriate annotations with a list of polygons.
5193
+ *
5194
+ * @param {geo.polygonList} poly A list of polygons.
5195
+ * @param {geo.util.polyop.spec} [opts] This contains annotationIndices and
5196
+ * correspondence used to track annotations.
5197
+ * @returns {this}
5198
+ */
5199
+
5200
+
5201
+ this.fromPolygonList = function (poly, opts) {
5202
+ if (!poly || !poly.length) {
5203
+ return m_this;
5204
+ }
5205
+ /* One of 'all', 'exact', 'none'; default is 'exact' */
5206
+
5207
+
5208
+ var keep = opts.keepAnnotations;
5209
+ var keepIds = {};
5210
+ var reusedIds = {};
5211
+ var correspond, exact, annot;
5212
+
5213
+ if (opts.annotationIndices && opts.correspond && opts.correspond.poly1 && opts.annotationIndices.length === opts.correspond.poly1.length) {
5214
+ correspond = opts.correspond.poly1;
5215
+ exact = opts.correspond.exact1;
5216
+ annot = m_this.annotations();
5217
+ }
5218
+
5219
+ if (keep !== 'all' && keep !== 'none') {
5220
+ annot.forEach(function (oldAnnot, idx) {
5221
+ if (opts.annotationIndices.indexOf(idx) < 0) {
5222
+ keepIds[oldAnnot.id()] = true;
5223
+ }
5224
+ });
5225
+ }
5226
+
5227
+ var polyAnnot = [];
5228
+ poly.forEach(function (p, idx) {
5229
+ p = p.map(function (h) {
5230
+ return h.map(function (pt) {
5231
+ return {
5232
+ x: pt[0],
5233
+ y: pt[1]
5234
+ };
5235
+ });
5236
+ });
5237
+ var result = {
5238
+ vertices: p.length === 1 ? p[0] : {
5239
+ outer: p[0],
5240
+ inner: p.slice(1)
5241
+ }
5242
+ };
5243
+
5244
+ if (correspond) {
5245
+ for (var i = 0; i < correspond.length; i += 1) {
5246
+ if (correspond[i] && correspond[i].indexOf(idx) >= 0) {
5247
+ var _ret = function () {
5248
+ var orig = annot[opts.annotationIndices[i]];
5249
+
5250
+ if (keep !== 'all' && keep !== 'none' && exact && exact[i] && exact[i].indexOf(idx) >= 0) {
5251
+ keepIds[orig.id()] = true;
5252
+ return {
5253
+ v: void 0
5254
+ };
5255
+ }
5256
+
5257
+ if (keep !== 'all' && reusedIds[orig.id()] === undefined) {
5258
+ result.annotationId = orig.id();
5259
+ reusedIds[orig.id()] = true;
5260
+ }
5261
+
5262
+ ['name', 'description', 'label'].forEach(function (k) {
5263
+ if (orig[k](undefined, true)) {
5264
+ result[k] = orig[k](undefined, true);
5265
+ }
5266
+ });
5267
+ Object.entries(orig.options()).forEach(function (_ref) {
5268
+ var _ref2 = _slicedToArray(_ref, 2),
5269
+ key = _ref2[0],
5270
+ value = _ref2[1];
5271
+
5272
+ if (['showLabel', 'style'].indexOf(key) >= 0 || key.endsWith('Style')) {
5273
+ result[key] = value;
5274
+ }
5275
+ });
5276
+ return "break";
5277
+ }();
5278
+
5279
+ if (_ret === "break") break;
5280
+ if (_typeof(_ret) === "object") return _ret.v;
5281
+ }
5282
+ }
5283
+ }
5284
+
5285
+ polyAnnot.push(result);
5286
+ });
5287
+ var update = false; // delete extant annotations
5288
+
5289
+ if (keep !== 'all' && annot) {
5290
+ annot.filter(function (oldAnnot) {
5291
+ return keepIds[oldAnnot.id()] === undefined;
5292
+ }).forEach(function (oldAnnot) {
5293
+ m_this.removeAnnotation(oldAnnot, false);
5294
+ update = true;
5295
+ });
5296
+ } // add new annotations
5297
+
5298
+
5299
+ polyAnnot.forEach(function (p) {
5300
+ m_this.addAnnotation(registry.createAnnotation('polygon', p), m_this.gcs(), false);
5301
+ update = true;
5302
+ });
5303
+
5304
+ if (update) {
5305
+ m_this.modified();
5306
+ m_this.draw();
5307
+ }
5308
+
5309
+ return m_this;
5310
+ };
4890
5311
  /**
4891
5312
  * Initialize.
4892
5313
  *
@@ -9418,6 +9839,20 @@ geo_event.annotation.state = 'geo_annotation_state';
9418
9839
  */
9419
9840
 
9420
9841
  geo_event.annotation.mode = 'geo_annotation_mode';
9842
+ /**
9843
+ * Triggered when an annotation can be combined via a boolean operation (union,
9844
+ * intersect, difference, xor).
9845
+ *
9846
+ * @event geo.event.annotation.boolean
9847
+ * @type {geo.event.base}
9848
+ * @property {geo.annotation} annotation The annotation that is being operated
9849
+ * on.
9850
+ * @property {string} operation The operation being performed.
9851
+ * @property {boolean} [cancel] If the handle sets this to false, don't apply
9852
+ * the operation to the annotation layer.
9853
+ */
9854
+
9855
+ geo_event.annotation.boolean = 'geo_annotation_boolean';
9421
9856
  module.exports = geo_event;
9422
9857
 
9423
9858
  /***/ }),
@@ -15293,7 +15728,10 @@ var lineFeature = function lineFeature(arg) {
15293
15728
  var p = posFunc(current, j, d, index);
15294
15729
 
15295
15730
  if (onlyInvertedY) {
15296
- p.y = -p.y;
15731
+ p = {
15732
+ x: p.x,
15733
+ y: -p.y
15734
+ };
15297
15735
  } else if (gcs !== mapgcs) {
15298
15736
  p = transform.transformCoordinates(gcs, mapgcs, p);
15299
15737
  }
@@ -25090,6 +25528,72 @@ var polygonFeature = function polygonFeature(arg) {
25090
25528
  evt.over.found[idx] = data[di];
25091
25529
  });
25092
25530
  };
25531
+ /**
25532
+ * Return the polygons as a polygon list: an array of polygons, each of which
25533
+ * is an array of polylines, each of which is an array of points, each of
25534
+ * which is a 2-tuple of numbers.
25535
+ *
25536
+ * @param {geo.util.polyop.spec} [opts] Ignored.
25537
+ * @returns {geo.polygonList} A list of polygons.
25538
+ */
25539
+
25540
+
25541
+ this.toPolygonList = function (opts) {
25542
+ var polyFunc = m_this.style.get('polygon');
25543
+ var posFunc = m_this.style.get('position');
25544
+ return m_this.data().map(function (d, i) {
25545
+ var polygon = polyFunc(d, i);
25546
+ var outer = polygon.outer || (Array.isArray(polygon) ? polygon : []);
25547
+
25548
+ if (outer.length < 3) {
25549
+ return [];
25550
+ }
25551
+
25552
+ var resp = [outer.map(function (p, j) {
25553
+ var pos = posFunc(p, j, d, i);
25554
+ return [pos.x, pos.y];
25555
+ })];
25556
+
25557
+ if (polygon.inner) {
25558
+ polygon.inner.forEach(function (h) {
25559
+ resp.push(h.map(function (p, j) {
25560
+ var pos = posFunc(p, j, d, i);
25561
+ return [pos.x, pos.y];
25562
+ }));
25563
+ });
25564
+ }
25565
+
25566
+ return resp;
25567
+ });
25568
+ };
25569
+ /**
25570
+ * Set the data, position accessor, and polygon accessor to use a list of
25571
+ * polygons.
25572
+ *
25573
+ * @param {geo.polygonList} poly A list of polygons.
25574
+ * @param {geo.util.polyop.spec} [opts] Ignored.
25575
+ * @returns {this}
25576
+ */
25577
+
25578
+
25579
+ this.fromPolygonList = function (poly, opts) {
25580
+ m_this.style({
25581
+ position: function position(p) {
25582
+ return {
25583
+ x: p[0],
25584
+ y: p[1]
25585
+ };
25586
+ },
25587
+ polygon: function polygon(p) {
25588
+ return {
25589
+ outer: p[0],
25590
+ inner: p.slice(1)
25591
+ };
25592
+ }
25593
+ });
25594
+ m_this.data(poly);
25595
+ return m_this;
25596
+ };
25093
25597
  /**
25094
25598
  * Destroy.
25095
25599
  */
@@ -27059,7 +27563,7 @@ module.exports = sceneObject;
27059
27563
  * @constant
27060
27564
  * @type {string}
27061
27565
  */
27062
- module.exports = "e13f6d922451bb86544884283bfb31843f58bd60";
27566
+ module.exports = "c77ab7869ca682dfc42f6a12a7ad2121687e94b8";
27063
27567
 
27064
27568
  /***/ }),
27065
27569
 
@@ -34006,6 +34510,17 @@ module.exports = transform;
34006
34510
  * @property {number} [z=0] Altitude coordinate.
34007
34511
  */
34008
34512
 
34513
+ /**
34514
+ * General represention of a point on the earth. The coordinates are most
34515
+ * commonly in longitude and latitude, but the coordinate system is changed
34516
+ * by the interface gcs. This is a list of numbers consisting of either [x, y]
34517
+ * or [x, y, z], where therse are the horizontal, vertical, and altitude
34518
+ * coordinates.
34519
+ *
34520
+ * @typedef geo.geoPositionFlat
34521
+ * @type {number[]}
34522
+ */
34523
+
34009
34524
  /**
34010
34525
  * General represention of a two-dimensional point in any coordinate system.
34011
34526
  *
@@ -38828,7 +39343,8 @@ __webpack_require__(7566), __webpack_require__(9215), __webpack_require__(895),
38828
39343
  {
38829
39344
  DistanceGrid: __webpack_require__(5844),
38830
39345
  ClusterGroup: __webpack_require__(9808),
38831
- mesh: __webpack_require__(9244)
39346
+ mesh: __webpack_require__(9244),
39347
+ polyops: __webpack_require__(6771)
38832
39348
  });
38833
39349
 
38834
39350
  /***/ }),
@@ -39205,6 +39721,592 @@ module.exports.restoreWebglRenderer = function () {
39205
39721
 
39206
39722
  /***/ }),
39207
39723
 
39724
+ /***/ 6771:
39725
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
39726
+
39727
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
39728
+
39729
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
39730
+
39731
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
39732
+
39733
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
39734
+
39735
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
39736
+
39737
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
39738
+
39739
+ var PolyBool = __webpack_require__(3291);
39740
+
39741
+ var geo_map = __webpack_require__(2804);
39742
+ /**
39743
+ * A list of flat polygon lists.
39744
+ *
39745
+ * @typedef {Array.<Array.<Array.<geo.geoPositionFlat>>>} geo.polygonList
39746
+ */
39747
+
39748
+ /**
39749
+ * A polygon in any of a variety of formats.
39750
+ *
39751
+ * This can be any object with a ``toPolygonList`` and ``fromPolygonList``
39752
+ * method.
39753
+ *
39754
+ * @typedef {geo.polygonFlat|Array.<geo.polygonFlat>|Array.<Array.<geo.polygonFlat>>|geo.polygonObject|Array.<geo.polygonObject>|Array.<geo.geoPositionFlat>|Array.<Array.<geo.geoPositionFlat>>|geo.polygonList|object} geo.polygonAny
39755
+ */
39756
+
39757
+ /**
39758
+ * Object specification for polygon operation options.
39759
+ *
39760
+ * @typedef {object} geo.util.polyop.spec
39761
+ * @property {geo.polygonAny} [poly1] The first polygon set to operate on.
39762
+ * @property {geo.polygonAny} [poly2] The second polygon set to operate on.
39763
+ * @property {number} [epsilon1] A precision value to use when computing the
39764
+ * operation. If not specified, this is computed from the range of values in
39765
+ * ``poly1``. It is used for processing ``poly1`` and the general operation.
39766
+ * @property {number} [epsilon1] A precision value to use when processing
39767
+ * ``poly2``. If not specified, this is computed from the range of values in
39768
+ * ``poly2``.
39769
+ * @property {string|object} [style] If specified, the preferred output style.
39770
+ * This can be (flat|object)[-list[list[-outer[-list]]]]. If an object,
39771
+ * the object must have a method ``fromPolygonList``.
39772
+ * @property {string|geo.transform} [ingcs] The default coordinate
39773
+ * system of the source polygon coordinates. If not specified , this is
39774
+ * taken from the feature first or the map second if either is available.
39775
+ * @property {string|geo.transform} [gcs] The default coordinate system to use
39776
+ * for the actual operations. This is where the epsilon and rdp values are
39777
+ * applied. If not specified , this is taken from the map second if
39778
+ * available.
39779
+ * @property {geo.map} [map] Used for ``ingcs`` and ``gcs`` if needed.
39780
+ * @property {string} [innerOperation="union"] one of union, intersect, xor.
39781
+ * Used to combine individual polygons in each of ``poly1`` and ``poly2``
39782
+ * before the main operation is carried out.
39783
+ * @property {object} [correspond] If present, information about the
39784
+ * correspondence of the input and output polygons is added to this object.
39785
+ * This is of the form {poly1: [idx...], poly2: [idx...], exact1: [idx...],
39786
+ * exact2: [idx...]}, where the [idx...] array is the length of the input
39787
+ * polygon array and each entry is either undefined or contains a list of
39788
+ * indices of corresponding output polygons. Exact means that all of the
39789
+ * points in the input polygon are in the output polygon. Multiple inputs
39790
+ * can refer to the same output.
39791
+ * @property {number} [tolerance] A tolerance value to pass to features,
39792
+ * annotations, or other object-based polygon generators to specify how
39793
+ * closely non-polygons are converted to polygons. This is in the feature's
39794
+ * gcs coordinate system.
39795
+ * @property {number} [pixelTolerance] A tolerance value to pass to features,
39796
+ * annotations, or other object-based polygon generators to specify how
39797
+ * closely non-polygons are converted to polygons. This is interpreted in
39798
+ * the feature's map's display coordinates.
39799
+ */
39800
+
39801
+
39802
+ var AlternateOpNames = {
39803
+ '+': 'union',
39804
+ '|': 'union',
39805
+ add: 'union',
39806
+ '-': 'difference',
39807
+ sub: 'difference',
39808
+ subtract: 'difference',
39809
+ minus: 'difference',
39810
+ '*': 'intersect',
39811
+ '&': 'intersect',
39812
+ mul: 'intersect',
39813
+ multiply: 'intersect',
39814
+ x: 'xor',
39815
+ '^': 'xor'
39816
+ };
39817
+ /**
39818
+ * Convert a segment list to a polygon list.
39819
+ *
39820
+ * @param {object[]} seglist A PolyBool segment list.
39821
+ * @returns {geo.polygonList} A polygon list.
39822
+ */
39823
+
39824
+ function seglistToPolygonList(seglist) {
39825
+ // This single line doesn't arrange holes correctly
39826
+ // return seglist.map((s) => PolyBool.polygon(s).regions);
39827
+ var polys = [];
39828
+ seglist.forEach(function (s) {
39829
+ var geojson = PolyBool.polygonToGeoJSON(PolyBool.polygon(s));
39830
+
39831
+ if (geojson.type === 'MultiPolygon') {
39832
+ geojson.coordinates.forEach(function (p) {
39833
+ polys.push(p.map(function (h) {
39834
+ return h.slice(0, h.length - 1);
39835
+ }));
39836
+ });
39837
+ } else if (geojson.type === 'Polygon') {
39838
+ polys.push(geojson.coordinates.map(function (h) {
39839
+ return h.slice(0, h.length - 1);
39840
+ }));
39841
+ }
39842
+ });
39843
+ return polys;
39844
+ }
39845
+ /**
39846
+ * Perform an boolean operation on a seglist from polygons.
39847
+ *
39848
+ * @param {string} op One of 'union', 'intersect', or other value PolyBool
39849
+ * supports.
39850
+ * @param {number} epsilon Precision for calculations. In degrees, 1e-9 is
39851
+ * around 0.11 mm in ground distance.
39852
+ * @param {object} seglist A seglist array as used by the polybool library.
39853
+ * @returns {object} A seglist array.
39854
+ */
39855
+
39856
+
39857
+ function polygonOperationSeglist(op, epsilon, seglist) {
39858
+ op = 'select' + op.charAt(0).toUpperCase() + op.slice(1);
39859
+ PolyBool.epsilon(epsilon);
39860
+
39861
+ while (seglist.length > 1) {
39862
+ var newlist = [];
39863
+ var half = Math.ceil(seglist.length / 2);
39864
+
39865
+ for (var i = 0; i < half; i += 1) {
39866
+ var segments = seglist[i];
39867
+
39868
+ if (i + half < seglist.length) {
39869
+ var nextseg = seglist[i + half];
39870
+
39871
+ try {
39872
+ segments = PolyBool.combine(segments, nextseg);
39873
+ } catch (err) {
39874
+ segments = PolyBool.segments(PolyBool.polygon(segments));
39875
+ nextseg = PolyBool.segments(PolyBool.polygon(nextseg));
39876
+
39877
+ for (var j = 20; j >= 6; j -= 1) {
39878
+ PolyBool.epsilon(Math.pow(0.1, j));
39879
+
39880
+ try {
39881
+ segments = PolyBool.combine(segments, nextseg);
39882
+ break;
39883
+ } catch (err) {}
39884
+ }
39885
+
39886
+ PolyBool.epsilon(epsilon);
39887
+ }
39888
+
39889
+ if (segments.combined) {
39890
+ segments.combined = segments.combined.filter(function (s) {
39891
+ return Math.abs(s.start[0] - s.end[0]) > epsilon || Math.abs(s.start[1] - s.end[1]) > epsilon;
39892
+ });
39893
+ segments = PolyBool[op](segments);
39894
+ } else {
39895
+ console.warn('Failed in polygon functions.');
39896
+ }
39897
+
39898
+ segments.segments = segments.segments.filter(function (s) {
39899
+ return Math.abs(s.start[0] - s.end[0]) > epsilon || Math.abs(s.start[1] - s.end[1]) > epsilon;
39900
+ });
39901
+ }
39902
+
39903
+ newlist.push(segments);
39904
+ }
39905
+
39906
+ seglist = newlist;
39907
+ }
39908
+
39909
+ return seglist;
39910
+ }
39911
+ /**
39912
+ * Convert a polygon in any of several formats to a polygon list. Each polygon
39913
+ * in the list is a list of polylines. Each polyline is a list of points.
39914
+ * Each point is a list of two coordinates. The input can be a variety of
39915
+ * formats:
39916
+ * - object, flat: a list of {x, y} or [x, y]
39917
+ * - object-list, flat-list: a list of lists of {x, y} or [x, y]
39918
+ * - object-listlist, flat-listlist: a list if lists of lists of {x, y} or
39919
+ * [x, y]
39920
+ * - object-listlist-outer, flat-listlist-outer: {outer: {x, y}, inner:
39921
+ * [{x, y}]} or {outer: [x, y], inner: [[x, y]]}
39922
+ * - object-listlist-outer-list, flat-listlist-outer-list: a list of objects
39923
+ * in outer/inner object or outer/inner list form
39924
+ * The actual format is stored in the mode object.
39925
+ *
39926
+ * @param {geo.polygonAny} poly A polygon in one of the above formats to
39927
+ * convert.
39928
+ * @param {object} mode An object that is modified with information about
39929
+ * the conversion. This includes style: the input polygon format; min: a
39930
+ * 2-item list with minimum values in x, y; max: a 2-item list with
39931
+ * maximum values in x, y; epsilon: a recommended value for epsilon in other
39932
+ * functions.
39933
+ * @param {geo.util.polyop.spec} [opts] Options for the operation. Only used
39934
+ * if poly is an object with a toPolygonList method.
39935
+ * @returns {geo.polygonList} A list of polygons.
39936
+ */
39937
+
39938
+
39939
+ function toPolygonList(poly, mode, opts) {
39940
+ mode = mode || {};
39941
+
39942
+ if (poly.toPolygonList) {
39943
+ mode.style = poly;
39944
+ poly = poly.toPolygonList(opts);
39945
+
39946
+ if (!poly.length) {
39947
+ mode.min = mode.max = [0, 0];
39948
+ mode.epsilon = 1e-10;
39949
+ return poly;
39950
+ }
39951
+ } else {
39952
+ mode.style = '';
39953
+
39954
+ if (poly.outer) {
39955
+ mode.style = '-outer';
39956
+ poly = [[poly.outer].concat(_toConsumableArray(poly.inner || []))];
39957
+ } else if (poly.length && poly[0].outer) {
39958
+ mode.style = '-outer-list';
39959
+ poly = poly.map(function (p) {
39960
+ return [p.outer].concat(_toConsumableArray(p.inner || []));
39961
+ });
39962
+ }
39963
+
39964
+ if (!poly.length) {
39965
+ mode.style = 'flat-listlist' + mode.style;
39966
+ mode.min = mode.max = [0, 0];
39967
+ mode.epsilon = 1e-10;
39968
+ return poly;
39969
+ }
39970
+
39971
+ if (poly[0].x !== undefined) {
39972
+ mode.style = 'object';
39973
+ poly = [[poly.map(function (pt) {
39974
+ return [pt.x, pt.y];
39975
+ })]];
39976
+ } else if (poly[0][0].x !== undefined) {
39977
+ mode.style = 'object-list' + mode.style;
39978
+ poly = [poly.map(function (p) {
39979
+ return p.map(function (pt) {
39980
+ return [pt.x, pt.y];
39981
+ });
39982
+ })];
39983
+ } else if (poly[0][0][0] === undefined) {
39984
+ mode.style = 'flat';
39985
+ poly = [[poly]];
39986
+ } else if (poly[0][0][0].x !== undefined) {
39987
+ mode.style = 'object-listlist' + mode.style;
39988
+ poly = poly.map(function (p) {
39989
+ return p.map(function (l) {
39990
+ return l.map(function (pt) {
39991
+ return [pt.x, pt.y];
39992
+ });
39993
+ });
39994
+ });
39995
+ } else if (poly[0][0][0][0] === undefined) {
39996
+ mode.style = 'flat-list';
39997
+ poly = [poly];
39998
+ } else {
39999
+ mode.style = 'flat-listlist' + mode.style;
40000
+ }
40001
+ }
40002
+
40003
+ mode.min = [poly[0][0][0][0], poly[0][0][0][1]];
40004
+ mode.max = [poly[0][0][0][0], poly[0][0][0][1]];
40005
+ poly.forEach(function (p) {
40006
+ return p.forEach(function (l) {
40007
+ return l.forEach(function (pt) {
40008
+ if (pt[0] < mode.min[0]) {
40009
+ mode.min[0] = pt[0];
40010
+ }
40011
+
40012
+ if (pt[0] > mode.max[0]) {
40013
+ mode.max[0] = pt[0];
40014
+ }
40015
+
40016
+ if (pt[1] < mode.min[1]) {
40017
+ mode.min[1] = pt[1];
40018
+ }
40019
+
40020
+ if (pt[1] > mode.max[1]) {
40021
+ mode.max[1] = pt[1];
40022
+ }
40023
+ });
40024
+ });
40025
+ });
40026
+ mode.epsilon = Math.max(Math.max(mode.max[0], mode.max[1]), Math.max(Math.abs(mode.min[0]), Math.abs(mode.min[1]))) * 1e-10;
40027
+ return poly;
40028
+ }
40029
+ /**
40030
+ * Convert a polygon list to another format.
40031
+ *
40032
+ * @param {geo.polygonList} poly A list of polygons.
40033
+ * @param {object} mode An object that is modified with information about the
40034
+ * conversion. This includes style: the input polygon format; min: a 2-item
40035
+ * list with minimum values in x, y; max: a 2-item list with maximum values
40036
+ * in x, y; epsilon: a recommended value for epsilon in other functions.
40037
+ * @param {geo.util.polyop.spec} [opts] Options for the operation. Only used
40038
+ * if ``mode.style`` is an object with a fromPolygonList method.
40039
+ * @returns {geo.polygonAny} A polygon in one of several formats.
40040
+ */
40041
+
40042
+
40043
+ function fromPolygonList(poly, mode, opts) {
40044
+ if (mode.style.fromPolygonList) {
40045
+ return mode.style.fromPolygonList(poly, opts);
40046
+ }
40047
+
40048
+ if (mode.style.includes('object')) {
40049
+ poly = poly.map(function (p) {
40050
+ return p.map(function (h) {
40051
+ return h.map(function (pt) {
40052
+ return {
40053
+ x: pt[0],
40054
+ y: pt[1]
40055
+ };
40056
+ });
40057
+ });
40058
+ });
40059
+ }
40060
+
40061
+ if (mode.style.includes('outer')) {
40062
+ poly = [poly.map(function (p) {
40063
+ return {
40064
+ outer: p[0],
40065
+ inner: p.slice(1)
40066
+ };
40067
+ })];
40068
+ }
40069
+
40070
+ if (!mode.style.endsWith('listlist')) {
40071
+ if (mode.style.endsWith('list')) {
40072
+ poly = poly[0];
40073
+ } else {
40074
+ poly = poly[0][0];
40075
+ }
40076
+ }
40077
+
40078
+ return poly;
40079
+ }
40080
+ /**
40081
+ * Use a minimum style for output to include all of the results.
40082
+ *
40083
+ * @param {geo.polygonList} polylist A list of polygons.
40084
+ * @param {string} style the proposed style.
40085
+ * @returns {string} The preferred style.
40086
+ */
40087
+
40088
+
40089
+ function minimumPolygonStyle(polylist, style) {
40090
+ if (style.fromPolygonList) {
40091
+ return style;
40092
+ }
40093
+
40094
+ if (polylist.length > 1) {
40095
+ if (style.includes('outer')) {
40096
+ return style + (style.endsWith('list') ? '' : '-list');
40097
+ }
40098
+
40099
+ if (style.endsWith('listlist')) {
40100
+ return style;
40101
+ }
40102
+
40103
+ return style + (style.endsWith('list') ? 'list' : '-listlist');
40104
+ }
40105
+
40106
+ if (polylist.length === 1 && polylist[0].length > 1) {
40107
+ if (style.includes('outer') || style.endsWith('list')) {
40108
+ return style;
40109
+ }
40110
+
40111
+ return style + '-list';
40112
+ }
40113
+
40114
+ return style;
40115
+ }
40116
+ /**
40117
+ * Generate the correspondence between the source polygons and the output
40118
+ * polygons. A polygon corresponds if it has at least two points in common.
40119
+ *
40120
+ * @param {geo.polygonList} poly1 First set of source polygons.
40121
+ * @param {geo.polygonList} poly2 Second set of source polygons.
40122
+ * @param {geo.polygonList} newpoly Output polygons.
40123
+ * @param {object} results An object to add results to.
40124
+ */
40125
+
40126
+
40127
+ function generateCorrespondence(poly1, poly2, newpoly, results) {
40128
+ var pts = {};
40129
+ var counts = [];
40130
+ newpoly.forEach(function (p, idx) {
40131
+ return p.forEach(function (h) {
40132
+ return h.forEach(function (pt) {
40133
+ var key = '_' + pt[0] + '_' + pt[1];
40134
+
40135
+ if (pts[key]) {
40136
+ if (pts[key].indexOf(idx) === -1) {
40137
+ pts[key].push(idx);
40138
+ }
40139
+ } else {
40140
+ pts[key] = [idx];
40141
+ }
40142
+
40143
+ if (counts.length <= idx) {
40144
+ counts.push(0);
40145
+ }
40146
+
40147
+ counts[idx] += 1;
40148
+ });
40149
+ });
40150
+ });
40151
+ ['poly1', 'poly2'].forEach(function (pkey) {
40152
+ var poly = pkey === 'poly1' ? poly1 : poly2;
40153
+ var ekey = pkey === 'poly1' ? 'exact1' : 'exact2';
40154
+ results[pkey] = Array(poly.length);
40155
+ results[ekey] = Array(poly.length);
40156
+ poly.forEach(function (p, idx) {
40157
+ var found = {};
40158
+ p.forEach(function (h) {
40159
+ return h.forEach(function (pt) {
40160
+ var key = '_' + pt[0] + '_' + pt[1];
40161
+
40162
+ if (pts[key]) {
40163
+ pts[key].forEach(function (val) {
40164
+ found[val] = (found[val] || 0) + 1;
40165
+ });
40166
+ }
40167
+ });
40168
+ });
40169
+ Object.keys(found).forEach(function (nidx) {
40170
+ if (found[nidx] === counts[+nidx]) {
40171
+ if (!results[ekey][idx]) {
40172
+ results[ekey][idx] = [];
40173
+ }
40174
+
40175
+ results[ekey][idx].push(+nidx);
40176
+ }
40177
+
40178
+ if (found[nidx] >= 2) {
40179
+ if (!results[pkey][idx]) {
40180
+ results[pkey][idx] = [];
40181
+ }
40182
+
40183
+ results[pkey][idx].push(+nidx);
40184
+ }
40185
+ });
40186
+ });
40187
+ });
40188
+ }
40189
+ /**
40190
+ * Perform a general operation of a set of polygons.
40191
+ *
40192
+ * @param {string} op The operation to handle. One of union, intersect,
40193
+ * difference, or xor.
40194
+ * @param {geo.polygonAny|geo.util.polyop.spec} poly1 Either the first polygon
40195
+ * set or an object containing all parameters for the function.
40196
+ * @param {geo.polygonAny} [poly2] If the poly1 parameter is not a complete
40197
+ * options object, the second polygon set for the operation.
40198
+ * @param {geo.util.polyop.spec} [opts] If the poly1 parameter is not a
40199
+ * complete options object, the options for the operation.
40200
+ * @returns {geo.polygonAny} A polygon set in the same style as poly1.
40201
+ */
40202
+
40203
+
40204
+ function generalOperationProcess(op, poly1, poly2, opts) {
40205
+ var transform = __webpack_require__(6853);
40206
+
40207
+ op = AlternateOpNames[op] || op;
40208
+
40209
+ if (poly1.poly1) {
40210
+ opts = poly1;
40211
+ poly1 = opts.poly1;
40212
+ poly2 = opts.poly2;
40213
+ }
40214
+
40215
+ opts = opts || {};
40216
+ var ingcs1 = opts.ingcs || (opts.map ? opts.map.ingcs() : poly1.gcs ? poly1.gcs() : poly1.layer && poly1.layer().gcs ? poly1.layer().gcs() : poly1.layer ? poly1.layer().map().ingcs() : poly1.map instanceof geo_map ? poly1.map().ingcs() : undefined);
40217
+ var ingcs2 = opts.ingcs || (opts.map ? opts.map.ingcs() : poly2.gcs ? poly2.gcs() : poly2.layer && poly2.layer().gcs ? poly2.layer().gcs() : poly2.layer ? poly2.layer().map().ingcs() : poly2.map instanceof geo_map ? poly2.map().ingcs() : ingcs1);
40218
+ var gcs = opts.gcs || (opts.map ? opts.map.gcs() : poly1.layer ? poly1.layer().map().gcs() : poly1.map instanceof geo_map ? poly1.map().gcs() : undefined);
40219
+ var mode1 = {};
40220
+ var mode2 = {};
40221
+ poly1 = toPolygonList(poly1, mode1, opts);
40222
+ poly2 = toPolygonList(poly2, mode2, opts);
40223
+ mode1.epsilon = opts.epsilon1 || mode1.epsilon;
40224
+ mode2.epsilon = opts.epsilon2 || mode1.epsilon;
40225
+
40226
+ if (ingcs1 && gcs && ingcs1 !== gcs) {
40227
+ poly1 = poly1.map(function (p) {
40228
+ return p.map(function (h) {
40229
+ return transform.transformCoordinates(ingcs1, gcs, h);
40230
+ });
40231
+ });
40232
+ }
40233
+
40234
+ if (ingcs2 && gcs && ingcs2 !== gcs) {
40235
+ poly2 = poly2.map(function (p) {
40236
+ return p.map(function (h) {
40237
+ return transform.transformCoordinates(ingcs2, gcs, h);
40238
+ });
40239
+ });
40240
+ }
40241
+
40242
+ var seglist1 = poly1.map(function (p) {
40243
+ return PolyBool.segments({
40244
+ regions: p
40245
+ });
40246
+ });
40247
+ var seglist2 = poly2.map(function (p) {
40248
+ return PolyBool.segments({
40249
+ regions: p
40250
+ });
40251
+ });
40252
+ seglist1 = polygonOperationSeglist(opts.innerOperation || 'union', mode1.epsilon, seglist1);
40253
+ seglist2 = polygonOperationSeglist(opts.innerOperation || 'union', mode2.epsilon, seglist2);
40254
+ var seglist = seglist1;
40255
+
40256
+ if (seglist1[0] && seglist2[0]) {
40257
+ /* We need to do the main operation with the same inversion flags */
40258
+ seglist1[0].inverted = false;
40259
+ seglist2[0].inverted = false;
40260
+ seglist = polygonOperationSeglist(op, Math.max(mode1.epsilon, mode2.epsilon), [seglist1[0], seglist2[0]]);
40261
+ } else if (seglist2[0]) {
40262
+ seglist = seglist2;
40263
+ }
40264
+
40265
+ var newpoly = seglistToPolygonList(seglist);
40266
+
40267
+ if (opts.correspond) {
40268
+ generateCorrespondence(poly1, poly2, newpoly, opts.correspond);
40269
+ }
40270
+
40271
+ if (ingcs1 && gcs && ingcs1 !== gcs) {
40272
+ newpoly = newpoly.map(function (p) {
40273
+ return p.map(function (h) {
40274
+ return transform.transformCoordinates(gcs, ingcs1, h);
40275
+ });
40276
+ });
40277
+ }
40278
+
40279
+ var mode = {
40280
+ style: opts.style || minimumPolygonStyle(newpoly, mode1.style)
40281
+ };
40282
+ return fromPolygonList(newpoly, mode, opts);
40283
+ }
40284
+ /**
40285
+ * Generate a polygon function for a specific operation.
40286
+ *
40287
+ * @param {string} op The operation to handle. One of union, intersect,
40288
+ * difference, or xor.
40289
+ * @returns {function} a function for the polygons.
40290
+ */
40291
+
40292
+
40293
+ function generalOperation(op) {
40294
+ return function (poly1, poly2, opts) {
40295
+ return generalOperationProcess(op, poly1, poly2, opts);
40296
+ };
40297
+ }
40298
+
40299
+ module.exports = {
40300
+ union: generalOperation('union'),
40301
+ intersect: generalOperation('intersect'),
40302
+ difference: generalOperation('difference'),
40303
+ xor: generalOperation('xor'),
40304
+ toPolygonList: toPolygonList,
40305
+ fromPolygonList: fromPolygonList
40306
+ };
40307
+
40308
+ /***/ }),
40309
+
39208
40310
  /***/ 9215:
39209
40311
  /***/ (function(module) {
39210
40312
 
@@ -39581,7 +40683,7 @@ module.exports = vectorFeature;
39581
40683
  * @constant
39582
40684
  * @type {string}
39583
40685
  */
39584
- module.exports = "1.8.10";
40686
+ module.exports = "1.9.2";
39585
40687
 
39586
40688
  /***/ }),
39587
40689
 
@@ -45314,12 +46416,23 @@ module.exports = {
45314
46416
  /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
45315
46417
  /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3476);
45316
46418
  /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
46419
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1678);
46420
+ /* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__);
45317
46421
  // Imports
45318
46422
 
45319
46423
 
46424
+
46425
+ var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(3554), __webpack_require__.b);
46426
+ var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(4144), __webpack_require__.b);
46427
+ var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(237), __webpack_require__.b);
46428
+ var ___CSS_LOADER_URL_IMPORT_3___ = new URL(/* asset import */ __webpack_require__(9490), __webpack_require__.b);
45320
46429
  var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
46430
+ var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___);
46431
+ var ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___);
46432
+ var ___CSS_LOADER_URL_REPLACEMENT_2___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___);
46433
+ var ___CSS_LOADER_URL_REPLACEMENT_3___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_3___);
45321
46434
  // Module
45322
- ___CSS_LOADER_EXPORT___.push([module.id, ".geojs-map{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden}.geojs-map .geo-attribution{position:absolute;right:0;bottom:0;padding-right:5px;cursor:auto;font:11px/1.5 \"Helvetica Neue\",Arial,Helvetica,sans-serif;z-index:1001;background:rgba(255,255,255,0.7);clear:both;display:block;pointer-events:auto}.geojs-map .geo-attribution .geo-attribution-layer{padding-left:5px}.geojs-map .canvas-canvas{display:block;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.geojs-map .webgl-canvas{display:block}.geojs-map .geojs-layer{position:absolute;width:100%;height:100%;left:0;top:0;pointer-events:none}.geojs-map .geojs-layer.active:not(.hidden) > *{pointer-events:auto}.geojs-map .geojs-layer.hidden{display:none}.geojs-map .geojs-layer.hidden[renderer=\"webgl\"]{display:inherit}.geojs-map .geo-tile-layer{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;line-height:0;font-size:0}.geojs-map.annotation-input{cursor:crosshair}.geojs-map.highlight-focus:after{content:\"\";display:block;position:absolute;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;left:0;top:0;right:0;bottom:0;border:3px solid Highlight;opacity:1;-ms-filter:none;filter:none;-webkit-transition:opacity 0s;-moz-transition:opacity 0s;-o-transition:opacity 0s;-ms-transition:opacity 0s;transition:opacity 0s;visibility:hidden}.geojs-map.highlight-focus:focus:after{visibility:visible;-webkit-transition:opacity 2.5s ease-in;-moz-transition:opacity 2.5s ease-in;-o-transition:opacity 2.5s ease-in;-ms-transition:opacity 2.5s ease-in;transition:opacity 2.5s ease-in;opacity:0;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";filter:alpha(opacity=0)}.geo-tile-container{position:absolute}.geo-tile-container.crop{overflow:hidden}", "",{"version":3,"sources":["webpack://./main.styl","webpack://./../node_modules/nib/lib/nib/vendor.styl","webpack://./../node_modules/nib/lib/nib/overflow.styl","webpack://./../node_modules/nib/lib/nib/flex.styl","webpack://./../node_modules/nib/lib/nib/border.styl"],"names":[],"mappings":"AAEA,WACE,iBAAS,CCwCO,wBAAG,CAAH,qBAAG,CAAH,oBAAG,CARN,gBAAG,CChBd,eAAU,CFZZ,4BACE,iBAAS,CACT,OAAM,CACN,QAAO,CACP,iBAAc,CCmfd,WAAO,CDjfP,yDAA8B,CAC9B,YAAQ,CCoeR,gCAAW,CDleX,UAAM,CGMN,aAAS,CHJT,mBAAe,CAEf,mDACE,gBAAa,CAEjB,0BGDE,aAAS,CFqBK,4BAAG,CAAH,yBAAG,CAAH,uBAAG,CAAH,wBAAG,CARN,oBAAG,CDThB,yBGJE,aAAS,CHOX,wBACE,iBAAS,CACT,UAAM,CACN,WAAO,CACP,MAAK,CACL,KAAI,CACJ,mBAAe,CAEb,gDACE,mBAAe,CACnB,+BGjBA,YAAS,CHmBT,iDGnBA,eAAS,CHsBX,2BCDgB,4BAAG,CAAH,yBAAG,CAAH,uBAAG,CAAH,wBAAG,CARN,oBAAG,CDWd,aAAY,CACZ,WAAU,CAEZ,4BC6cE,gBAAO,CDzcP,iCACE,UAAQ,CGhCV,aAAS,CHkCP,iBAAS,CCbG,6BAAG,CAAH,0BAAG,CARN,qBAAG,CDuBZ,MAAK,CACL,KAAI,CACJ,OAAM,CACN,QAAO,CIpDT,0BAAQ,CHmQV,SAAS,CAQH,eAAY,CACZ,WAAQ,CA5OE,6BAAG,CAAH,0BAAG,CAAH,wBAAG,CAAH,yBAAG,CARN,qBAAG,CDkCZ,iBAAW,CACb,uCACE,kBAAW,CC5BC,uCAAG,CAAH,oCAAG,CAAH,kCAAG,CAAH,mCAAG,CARN,+BAAG,CA2OhB,SAAS,CAWH,+DAAyE,CACzE,uBAAiC,CD/MzC,oBACE,iBAAS,CACT,yBExDE,eAAU","sourcesContent":["@import '~nib/index.styl'\n\n.geojs-map\n position relative\n user-select none\n overflow hidden\n\n .geo-attribution\n position absolute\n right 0\n bottom 0\n padding-right 5px\n cursor auto\n font 11px/1.5 \"Helvetica Neue\", Arial, Helvetica, sans-serif\n z-index 1001\n background rgba(255,255,255,0.7)\n clear both\n display block\n pointer-events auto\n\n .geo-attribution-layer\n padding-left 5px\n\n .canvas-canvas\n display block\n transform-origin 0px 0px\n .webgl-canvas\n display block\n\n .geojs-layer\n position absolute\n width 100%\n height 100%\n left 0\n top 0\n pointer-events none\n &.active:not(.hidden)\n > *\n pointer-events auto\n &.hidden\n display none\n &.hidden[renderer=\"webgl\"]\n display inherit\n\n .geo-tile-layer\n transform-origin 0px 0px\n line-height 0\n font-size 0\n\n &.annotation-input\n cursor crosshair\n\n &.highlight-focus\n &:after\n content \"\"\n display block\n position absolute\n box-sizing border-box\n left 0px\n top 0px\n right 0px\n bottom 0px\n // Highlight is technically a css2 color. We may need to specify it\n // explicitly. #3B66A6 seems close\n border 3px solid Highlight\n opacity 1\n transition opacity 0s\n visibility hidden\n &:focus:after\n visibility visible\n transition opacity 2.5s ease-in\n opacity 0\n\n.geo-tile-container\n position absolute\n &.crop\n overflow hidden\n","use('../nodes/vendor-helpers.js')\n@import 'config'\n\n/*\n * Alias \"nowrap\" as \"no-wrap\".\n */\n\nno-wrap = unquote('nowrap')\n\n/*\n * Helper to find out if a given value is a width\n */\n\nis-width(val)\n if auto == val\n return true\n else if val && 'unit' == type(val)\n // Stylus does not short circuit so we need to perform this as a distinct\n // operation to prevent errors\n return '' != unit(val)\n return false\n\n/*\n * Vendor support for the given prop / arguments, optionally specifying the\n * only prefixes to utilize, or those which should be ignored.\n */\n\nvendor(prop, args, only = null, ignore = null, vendor-property = true)\n need_normalize = !vendor-property or prop in ('transition' 'transition-property' 'border-image' 'border-image-slice')\n for prefix in vendor-prefixes\n unless (only and !(prefix in only)) or (ignore and prefix in ignore)\n if official == prefix\n if need_normalize\n {prop}: normalize(prop,('%s' % args))\n else\n {prop}: args\n else\n newprop = prop\n newprop = '-' + prefix + '-' + prop if vendor-property\n\n if need_normalize\n {newprop}: normalize(prop,('%s' % args),prefix)\n else\n {newprop}: args\n/*\n * Vendorize the given value.\n */\n\nvendor-value(arg, only = null, ignore = null)\n prop = current-property[0]\n for prefix in vendor-prefixes\n unless (only and !(prefix in only)) or (ignore and prefix in ignore) or official == prefix\n add-property(prop, '-%s-%s' % (prefix arg))\n arg\n\n/*\n * Vendor \"box-shadow\" support.\n */\n\nbox-shadow()\n vendor('box-shadow', arguments, only: webkit official)\n\n/*\n * Vendor \"user-select\" support.\n */\n\nuser-select()\n vendor('user-select', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"column-count\" support.\n */\n\ncolumn-count()\n vendor('column-count', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-gap\" support.\n */\n\ncolumn-gap()\n vendor('column-gap', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule\" support.\n */\n\ncolumn-rule()\n vendor('column-rule', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-color\" support.\n */\n\ncolumn-rule-color()\n vendor('column-rule-color', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-width\" support.\n */\n\ncolumn-rule-width()\n vendor('column-rule-width', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-style\" support.\n */\n\ncolumn-rule-style()\n vendor('column-rule-style', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-width\" support.\n */\n\ncolumn-width()\n vendor('column-width', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-span\" support.\n */\n\ncolumn-span()\n vendor('column-span', arguments, only: webkit official)\n\n/*\n * Vendor \"column-fill\" support.\n */\n\ncolumn-fill()\n vendor('column-fill', arguments, only: moz)\n\n/*\n * Legacy syntax support for background-clip and background-origin\n */\n\nlegacy-bg-values(property, args)\n legacy_args = ()\n importance = unquote('')\n for subargs in args\n for arg in subargs\n if arg in (border-box padding-box content-box)\n arg = unquote('border') if arg == border-box\n arg = unquote('padding') if arg == padding-box\n arg = unquote('content') if arg == content-box\n if arg != '!important'\n push(legacy_args,arg)\n else\n importance = !important\n vendor(property, unquote(join(', ',legacy_args)) importance, only: moz webkit)\n\n/*\n * Vendor \"background-clip\" support.\n */\n\nbackground-clip()\n if arguments[0] == text\n vendor('background-clip', arguments, only: webkit)\n else\n legacy-bg-values('background-clip', arguments)\n background-clip: arguments\n\n/*\n * Vendor \"background-origin\" support.\n */\n\nbackground-origin()\n legacy-bg-values('background-origin', arguments)\n background-origin: arguments\n\n/*\n * Vendor \"background-size\" support.\n */\n\nbackground-size()\n vendor('background-size', arguments, only: webkit moz official)\n\n/*\n * Vendor \"transform\" support.\n */\n\ntransform()\n vendor('transform', arguments)\n\n/*\n * Vendor \"transform-origin\" support.\n */\ntransform-origin()\n vendor('transform-origin', arguments)\n\n/*\n * Vendor \"transform-style\" support.\n */\n\ntransform-style()\n vendor('transform-style', arguments)\n\n/*\n * Vendor \"border-image\" support.\n */\n\nborder-image()\n vendor('border-image', arguments, only: webkit moz o official)\n\n/*\n * Vendor \"transition\" support.\n */\n\ntransition()\n vendor('transition', arguments)\n\n/*\n * Vendor \"transition-property\" support.\n */\n\ntransition-property()\n vendor('transition-property', arguments)\n\n/*\n * Vendor \"transition-duration\" support.\n */\n\ntransition-duration()\n vendor('transition-duration', arguments)\n\n/*\n * Vendor \"transition-timing-function\" support.\n */\n\ntransition-timing-function()\n vendor('transition-timing-function', arguments)\n\n/*\n * Vendor \"transition-delay\" support.\n */\n\ntransition-delay()\n vendor('transition-delay', arguments)\n\n/*\n * Vendor \"backface-visibility\" support.\n */\n\nbackface-visibility()\n vendor('backface-visibility', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"perspective\" support.\n */\n\nperspective()\n if mixin\n vendor('perspective', arguments, only: webkit moz ms official)\n else\n 'perspective(%s)' % arguments\n\n/*\n * Vendor \"perspective-origin\" support.\n */\n\nperspective-origin()\n vendor('perspective-origin', arguments, only: webkit moz ms official)\n\n/*\n * Opacity with conditional IE support.\n */\n\nopacity(n, args...)\n opacity: n args\n if support-for-ie\n if n == inherit or n == initial\n -ms-filter: n args\n filter: n args\n else\n val = round(n * 100)\n if val == 100\n -ms-filter: none args\n filter: none args\n else\n -ms-filter: '\"progid:DXImageTransform.Microsoft.Alpha(Opacity=%s)\"' % val args\n filter: 'alpha(opacity=%s)' % val args\n\n/*\n * Vendor \"text-size-adjust\"\n */\n\ntext-size-adjust()\n vendor('text-size-adjust', arguments)\n\n/*\n * Alias the \"white-space\" property.\n */\n\nwhitespace()\n white-space: arguments\n\n/*\n * Vendor \"box-sizing\" support.\n */\n\nbox-sizing()\n vendor('box-sizing', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-orient\" support.\n */\n\nbox-orient()\n vendor('box-orient', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-flex-group\" support.\n */\n\nbox-flex-group()\n vendor('box-flex-group', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-ordinal-group\" support.\n */\n\nbox-ordinal-group()\n vendor('box-ordinal-group', arguments, only: webkit moz ms official)\n\n\n/*\n * Vendor \"box-align\" support.\n */\n\nbox-align()\n vendor('box-align', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"box-pack\" support.\n */\n\nbox-pack()\n vendor('box-pack', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"box-direction\" support.\n */\n\nbox-direction()\n vendor('box-direction', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"animation\" support.\n */\n\nanimation()\n vendor('animation', arguments)\n\n\n/*\n * Vendor \"animation-name\" support.\n */\n\nanimation-name()\n vendor('animation-name', arguments)\n\n/*\n * Vendor \"animation-duration\" support.\n */\n\nanimation-duration()\n vendor('animation-duration', arguments)\n\n/*\n * Vendor \"animation-delay\" support.\n */\n\nanimation-delay()\n vendor('animation-delay', arguments)\n\n/*\n * Vendor \"animation-direction\" support.\n */\n\nanimation-direction()\n vendor('animation-direction', arguments)\n\n/*\n * Vendor \"animation-iteration-count\" support.\n */\n\nanimation-iteration-count()\n vendor('animation-iteration-count', arguments)\n\n/*\n * Vendor \"animation-timing-function\" support.\n */\n\nanimation-timing-function()\n vendor('animation-timing-function', arguments)\n\n/*\n * Vendor \"animation-play-state\" support.\n */\n\nanimation-play-state()\n vendor('animation-play-state', arguments)\n\n/*\n * Vendor \"animation-fill-mode\" support.\n */\n\nanimation-fill-mode()\n vendor('animation-fill-mode', arguments)\n\n/*\n * Vendor \"hyphens\" support.\n */\n\nhyphens()\n vendor('hyphens', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"appearance\" support.\n */\n\nappearance()\n vendor('appearance', arguments, only: webkit moz official)\n\n/*\n * Vendor \"tab-size\" support.\n */\n\ntab-size()\n vendor('tab-size', arguments, only: moz o official)\n\n/*\n * Vendor \"overflow-scrolling\" support.\n */\n\noverflow-scrolling()\n vendor('overflow-scrolling', arguments, only: webkit official)\n\n/*\n * Vendor \"text-overflow\" support, , -o- for opera 9.* - 10.*\n */\n\ntext-overflow()\n vendor('text-overflow', arguments, only: official o)\n\n/*\n * Vendor \"text-size-adjust\" support.\n */\ntext-size-adjust()\n vendor('text-size-adjust', arguments, only: official webkit ms)\n\n/*\n * Vendor \"font-smoothing\" support, webkit only.\n */\nfont-smoothing()\n vendor('font-smoothing', arguments, only: webkit)\n\n\n/**\n * Vendor input-placeholder/placeholder support.\n *\n * Examples:\n * // Default syntax\n * body\n * placeholder(color #333, font-weight normal)\n *\n * // The comma is important\n * .placeholder-red\n * placeholder(color red,)\n *\n * // We can pass a function\n * green-placeholder()\n * color green\n * .placeholder-green\n * placeholder(green-placeholder)\n *\n * // We can pass a hash\n * textarea\n * placeholder((font-style italic) (font-weight bold) (padding '4px 10px'))\n */\nplaceholder()\n for v in ':-webkit-input' '-moz' ':-moz' '-ms-input'\n &:{v}-placeholder\n for pair in arguments\n if typeof(pair) == 'function'\n pair()\n else if pair is not null && pair[0] is not null\n {pair[0]}: type(pair[1]) == 'string' ? s(pair[1]) : pair[1]\ninput-placeholder = placeholder\n\n/*\n * Vendor background support (gradients).\n */\n\nbackground()\n if match('-gradient\\(', ''+arguments)\n vendor('background', arguments, vendor-property: false)\n else\n background arguments\n\nbackground-image()\n if match('-gradient\\(', ''+arguments)\n vendor('background-image', arguments, vendor-property: false)\n else\n background-image arguments\n\ncursor()\n if match('-gradient\\(', ''+arguments)\n vendor('cursor', arguments, vendor-property: false)\n else\n cursor arguments\n\nlist-style()\n if match('-gradient\\(', ''+arguments)\n vendor('list-style', arguments, vendor-property: false)\n else\n list-style arguments\n\nlist-style-image()\n if match('-gradient\\(', ''+arguments)\n vendor('list-style-image', arguments, vendor-property: false)\n else\n list-style-image arguments\n","/*\n * Overflow utility. Maps to regular overflow, and adds an ellipsis value.\n *\n * Synopsis:\n *\n * overflow: <type>\n *\n * Examples:\n *\n * overflow: auto\n * overflow: hidden\n * overflow: ellipsis\n *\n */\n\noverflow()\n if arguments[0] == ellipsis\n ellipsis()\n else\n overflow: arguments\n","/*\n * Vendor \"display: flex\" support with fallback to obsolete versions.\n */\n\nflex-version ?= box flex\n\n//\n// 1. Display values\n// - http://www.w3.org/TR/css3-flexbox/#flex-containers\n//\ndisplay(type, args...)\n if flex == type || inline-flex == type\n if box in flex-version\n if flex == type\n display: -ms-flexbox args\n display: vendor-value(box args, only: moz webkit)\n else\n display: -ms-inline-flexbox args\n display: vendor-value(inline-box args, only: moz webkit)\n if flex in flex-version\n display: vendor-value(arguments, only: webkit official) // overwrites old webkit\n else\n display: arguments\n\n/*\n * New syntax for browsers like Google Chrome.\n * Plus a translation to the old syntax, if possible.\n */\n\n\n//\n// 5. Ordering and Orientation\n// - http://www.w3.org/TR/css3-flexbox/#ordering-and-orientation\n//\n-flex-obsolete-direction(direction)\n if box in flex-version\n if row-reverse == direction || column-reverse == direction\n vendor('box-direction', reverse, ignore: ms official)\n\n if row == direction || row-reverse == direction\n vendor('box-orient', horizontal, ignore: ms official)\n else if column == direction || column-reverse == direction\n vendor('box-orient', vertical, ignore: ms official)\n\n-flex-obsolete-wrap(value)\n if box in flex-version\n // WARN: wrap-reverse does not have a box equivalent. This will render in different manners\n // on box vs. flex values.\n if 'wrap' == value || wrap-reverse == value\n vendor('box-lines', multiple, ignore: ms official)\n else if nowrap == value\n vendor('box-lines', single, ignore: ms official)\n\nflex-direction(direction)\n // obsolete\n -flex-obsolete-direction(direction)\n\n // new\n if flex in flex-version\n vendor('flex-direction', arguments, only: webkit ms official)\n\nflex-wrap(value)\n // obsolete\n -flex-obsolete-wrap(value)\n\n if flex in flex-version\n vendor('flex-wrap', arguments, only: webkit ms official)\n\nflex-flow()\n // obsolete\n -flex-obsolete-direction(arguments[0])\n -flex-obsolete-direction(arguments[1])\n -flex-obsolete-wrap(arguments[0])\n -flex-obsolete-wrap(arguments[1])\n\n // new\n if flex in flex-version\n vendor('flex-flow', arguments, only: webkit ms official)\n\n\norder()\n // obsolete\n if box in flex-version\n vendor('box-ordinal-group', arguments, ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-order', arguments, only: ms)\n vendor('order', arguments, only: webkit official)\n\n\n//\n// 7. Flexibility\n// - http://www.w3.org/TR/css3-flexbox/#flexibility\n//\nflex-grow(growth)\n // obsolete\n if box in flex-version\n vendor('box-flex', growth)\n\n // new\n if flex in flex-version\n vendor('flex-grow', arguments, only: webkit official)\n\nflex-basis()\n if flex in flex-version\n vendor('flex-basis', arguments, only: webkit official)\n\nflex-shrink()\n if flex in flex-version\n vendor('flex-shrink', arguments, only: webkit official)\n\nflex(growth)\n\n // obsolete\n if box in flex-version\n shrink = 1\n\n if none == growth || initial == growth\n // Well known values\n shrink = 0 if none == growth\n growth = 0\n else if is-width(growth) == true\n // Basis is defined as the first parameter\n growth = arguments[1] || 0\n shrink = arguments[2] if 3 <= length(arguments)\n else if arguments[1] && is-width(arguments[1]) == false\n // Growth is first and shrink is second\n shrink = arguments[1]\n\n // Since we can't make the distinction between growing and shrinking in the box model, take\n // the one that provides the most flexibility.\n vendor('box-flex', max(growth, shrink), ignore: ms)\n\n // new\n if flex in flex-version\n vendor('flex', arguments, only: webkit ms official)\n\n\n// converts the justification alignment\n-convert-justify(align)\n if flex-start == align\n return start\n else if flex-end == align\n return end\n else if space-around == align\n return distribute\n else if space-between == align\n return justify\n else\n return align\n\n//\n// 8. Alignment\n// - http://www.w3.org/TR/css3-flexbox/#alignment\n//\njustify-content(align)\n // obsolete\n if box in flex-version\n vendor('box-pack', -convert-justify(align), ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-pack', -convert-justify(align), only: ms)\n vendor('justify-content', align, only: webkit official)\n\nalign-content(align)\n // WARN: Obsolete spec does not allow for adjustment here\n if flex in flex-version\n vendor('flex-line-pack', -convert-justify(align), only: ms)\n vendor('align-content', align, only: webkit official)\n\n// converts alignment from 'flex' to normal value\n-convert-alignment(align)\n if flex-start == align\n return start\n else if flex-end == align\n return end\n else\n return align\n\nalign-items(align)\n // obsolete\n if box in flex-version\n vendor('box-align', -convert-alignment(align), ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-align', -convert-alignment(align), only: ms)\n vendor('align-items', arguments, only: webkit official)\n\nalign-self(align)\n // WARN: Obsolete spec does not allow for overriding alignment on individual items.\n if flex in flex-version\n vendor('align-self', align, only: webkit official)\n vendor('flex-item-align', -convert-alignment(align), only: ms)\n","/*\n * border: <color>\n * border: ...\n */\n\nborder(color, args...)\n if color is a 'color'\n border: 1px solid color args\n else\n border: arguments\n"],"sourceRoot":""}]);
46435
+ ___CSS_LOADER_EXPORT___.push([module.id, ".geojs-map{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden}.geojs-map .geo-attribution{position:absolute;right:0;bottom:0;padding-right:5px;cursor:auto;font:11px/1.5 \"Helvetica Neue\",Arial,Helvetica,sans-serif;z-index:1001;background:rgba(255,255,255,0.7);clear:both;display:block;pointer-events:auto}.geojs-map .geo-attribution .geo-attribution-layer{padding-left:5px}.geojs-map .canvas-canvas{display:block;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.geojs-map .webgl-canvas{display:block}.geojs-map .geojs-layer{position:absolute;width:100%;height:100%;left:0;top:0;pointer-events:none}.geojs-map .geojs-layer.active:not(.hidden) > *{pointer-events:auto}.geojs-map .geojs-layer.hidden{display:none}.geojs-map .geojs-layer.hidden[renderer=\"webgl\"]{display:inherit}.geojs-map .geo-tile-layer{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;line-height:0;font-size:0}.geojs-map.annotation-input{cursor:crosshair}.geojs-map.annotation-input.annotation-intersect{cursor:url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ") 12 12,crosshair}.geojs-map.annotation-input.annotation-difference{cursor:url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ") 12 12,crosshair}.geojs-map.annotation-input.annotation-union{cursor:url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + ") 12 12,crosshair}.geojs-map.annotation-input.annotation-xor{cursor:url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + ") 12 12,crosshair}.geojs-map.highlight-focus:after{content:\"\";display:block;position:absolute;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;left:0;top:0;right:0;bottom:0;border:3px solid Highlight;opacity:1;-ms-filter:none;filter:none;-webkit-transition:opacity 0s;-moz-transition:opacity 0s;-o-transition:opacity 0s;-ms-transition:opacity 0s;transition:opacity 0s;visibility:hidden}.geojs-map.highlight-focus:focus:after{visibility:visible;-webkit-transition:opacity 2.5s ease-in;-moz-transition:opacity 2.5s ease-in;-o-transition:opacity 2.5s ease-in;-ms-transition:opacity 2.5s ease-in;transition:opacity 2.5s ease-in;opacity:0;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";filter:alpha(opacity=0)}.geo-tile-container{position:absolute}.geo-tile-container.crop{overflow:hidden}", "",{"version":3,"sources":["webpack://./main.styl","webpack://./../node_modules/nib/lib/nib/vendor.styl","webpack://./../node_modules/nib/lib/nib/overflow.styl","webpack://./../node_modules/nib/lib/nib/flex.styl","webpack://./../node_modules/nib/lib/nib/border.styl"],"names":[],"mappings":"AAEA,WACE,iBAAS,CCwCO,wBAAG,CAAH,qBAAG,CAAH,oBAAG,CARN,gBAAG,CChBd,eAAU,CFZZ,4BACE,iBAAS,CACT,OAAM,CACN,QAAO,CACP,iBAAc,CC4ed,WAAO,CD1eP,yDAA8B,CAC9B,YAAQ,CC6dR,gCAAW,CD3dX,UAAM,CGMN,aAAS,CHJT,mBAAe,CAEf,mDACE,gBAAa,CAEjB,0BGDE,aAAS,CFqBK,4BAAG,CAAH,yBAAG,CAAH,uBAAG,CAAH,wBAAG,CARN,oBAAG,CDThB,yBGJE,aAAS,CHOX,wBACE,iBAAS,CACT,UAAM,CACN,WAAO,CACP,MAAK,CACL,KAAI,CACJ,mBAAe,CAEb,gDACE,mBAAe,CACnB,+BGjBA,YAAS,CHmBT,iDGnBA,eAAS,CHsBX,2BCDgB,4BAAG,CAAH,yBAAG,CAAH,uBAAG,CAAH,wBAAG,CARN,oBAAG,CDWd,aAAY,CACZ,WAAU,CAEZ,4BCscE,gBAAO,CDpcP,iDCocA,8DAAO,CDlcP,kDCkcA,8DAAO,CDhcP,6CCgcA,8DAAO,CD9bP,2CC8bA,8DAAO,CD1bP,iCACE,UAAQ,CGxCV,aAAS,CH0CP,iBAAS,CCrBG,6BAAG,CAAH,0BAAG,CARN,qBAAG,CD+BZ,MAAK,CACL,KAAI,CACJ,OAAM,CACN,QAAO,CI5DT,0BAAQ,CH4PV,SAAS,CAQH,eAAY,CACZ,WAAQ,CArOE,6BAAG,CAAH,0BAAG,CAAH,wBAAG,CAAH,yBAAG,CARN,qBAAG,CD0CZ,iBAAW,CACb,uCACE,kBAAW,CCpCC,uCAAG,CAAH,oCAAG,CAAH,kCAAG,CAAH,mCAAG,CARN,+BAAG,CAoOhB,SAAS,CAWH,+DAAyE,CACzE,uBAAiC,CDhMzC,oBACE,iBAAS,CACT,yBEhEE,eAAU","sourcesContent":["@import '~nib/index.styl'\n\n.geojs-map\n position relative\n user-select none\n overflow hidden\n\n .geo-attribution\n position absolute\n right 0\n bottom 0\n padding-right 5px\n cursor auto\n font 11px/1.5 \"Helvetica Neue\", Arial, Helvetica, sans-serif\n z-index 1001\n background rgba(255,255,255,0.7)\n clear both\n display block\n pointer-events auto\n\n .geo-attribution-layer\n padding-left 5px\n\n .canvas-canvas\n display block\n transform-origin 0px 0px\n .webgl-canvas\n display block\n\n .geojs-layer\n position absolute\n width 100%\n height 100%\n left 0\n top 0\n pointer-events none\n &.active:not(.hidden)\n > *\n pointer-events auto\n &.hidden\n display none\n &.hidden[renderer=\"webgl\"]\n display inherit\n\n .geo-tile-layer\n transform-origin 0px 0px\n line-height 0\n font-size 0\n\n &.annotation-input\n cursor crosshair\n &.annotation-intersect\n cursor embedurl(\"./css/cursor-crosshair-intersect.svg\") 12 12,crosshair\n &.annotation-difference\n cursor embedurl(\"./css/cursor-crosshair-difference.svg\") 12 12,crosshair\n &.annotation-union\n cursor embedurl(\"./css/cursor-crosshair-union.svg\") 12 12,crosshair\n &.annotation-xor\n cursor embedurl(\"./css/cursor-crosshair-xor.svg\") 12 12,crosshair\n\n &.highlight-focus\n &:after\n content \"\"\n display block\n position absolute\n box-sizing border-box\n left 0px\n top 0px\n right 0px\n bottom 0px\n // Highlight is technically a css2 color. We may need to specify it\n // explicitly. #3B66A6 seems close\n border 3px solid Highlight\n opacity 1\n transition opacity 0s\n visibility hidden\n &:focus:after\n visibility visible\n transition opacity 2.5s ease-in\n opacity 0\n\n.geo-tile-container\n position absolute\n &.crop\n overflow hidden\n","use('../nodes/vendor-helpers.js')\n@import 'config'\n\n/*\n * Alias \"nowrap\" as \"no-wrap\".\n */\n\nno-wrap = unquote('nowrap')\n\n/*\n * Helper to find out if a given value is a width\n */\n\nis-width(val)\n if auto == val\n return true\n else if val && 'unit' == type(val)\n // Stylus does not short circuit so we need to perform this as a distinct\n // operation to prevent errors\n return '' != unit(val)\n return false\n\n/*\n * Vendor support for the given prop / arguments, optionally specifying the\n * only prefixes to utilize, or those which should be ignored.\n */\n\nvendor(prop, args, only = null, ignore = null, vendor-property = true)\n need_normalize = !vendor-property or prop in ('transition' 'transition-property' 'border-image' 'border-image-slice')\n for prefix in vendor-prefixes\n unless (only and !(prefix in only)) or (ignore and prefix in ignore)\n if official == prefix\n if need_normalize\n {prop}: normalize(prop,('%s' % args))\n else\n {prop}: args\n else\n newprop = prop\n newprop = '-' + prefix + '-' + prop if vendor-property\n\n if need_normalize\n {newprop}: normalize(prop,('%s' % args),prefix)\n else\n {newprop}: args\n/*\n * Vendorize the given value.\n */\n\nvendor-value(arg, only = null, ignore = null)\n prop = current-property[0]\n for prefix in vendor-prefixes\n unless (only and !(prefix in only)) or (ignore and prefix in ignore) or official == prefix\n add-property(prop, '-%s-%s' % (prefix arg))\n arg\n\n/*\n * Vendor \"box-shadow\" support.\n */\n\nbox-shadow()\n vendor('box-shadow', arguments, only: webkit official)\n\n/*\n * Vendor \"user-select\" support.\n */\n\nuser-select()\n vendor('user-select', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"column-count\" support.\n */\n\ncolumn-count()\n vendor('column-count', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-gap\" support.\n */\n\ncolumn-gap()\n vendor('column-gap', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule\" support.\n */\n\ncolumn-rule()\n vendor('column-rule', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-color\" support.\n */\n\ncolumn-rule-color()\n vendor('column-rule-color', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-width\" support.\n */\n\ncolumn-rule-width()\n vendor('column-rule-width', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-style\" support.\n */\n\ncolumn-rule-style()\n vendor('column-rule-style', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-width\" support.\n */\n\ncolumn-width()\n vendor('column-width', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-span\" support.\n */\n\ncolumn-span()\n vendor('column-span', arguments, only: webkit official)\n\n/*\n * Vendor \"column-fill\" support.\n */\n\ncolumn-fill()\n vendor('column-fill', arguments, only: moz official)\n\n/*\n * Legacy syntax support for background-clip and background-origin\n */\n\nlegacy-bg-values(property, args)\n legacy_args = ()\n importance = unquote('')\n for subargs in args\n for arg in subargs\n if arg in (border-box padding-box content-box)\n arg = unquote('border') if arg == border-box\n arg = unquote('padding') if arg == padding-box\n arg = unquote('content') if arg == content-box\n if arg != '!important'\n push(legacy_args,arg)\n else\n importance = !important\n vendor(property, unquote(join(', ',legacy_args)) importance, only: moz webkit)\n\n/*\n * Vendor \"background-clip\" support.\n */\n\nbackground-clip()\n if arguments[0] == text\n vendor('background-clip', arguments, only: webkit)\n else\n legacy-bg-values('background-clip', arguments)\n background-clip: arguments\n\n/*\n * Vendor \"background-origin\" support.\n */\n\nbackground-origin()\n legacy-bg-values('background-origin', arguments)\n background-origin: arguments\n\n/*\n * Vendor \"transform\" support.\n */\n\ntransform()\n vendor('transform', arguments)\n\n/*\n * Vendor \"transform-origin\" support.\n */\ntransform-origin()\n vendor('transform-origin', arguments)\n\n/*\n * Vendor \"transform-style\" support.\n */\n\ntransform-style()\n vendor('transform-style', arguments)\n\n/*\n * Vendor \"border-image\" support.\n */\n\nborder-image()\n vendor('border-image', arguments, only: webkit moz o official)\n\n/*\n * Vendor \"transition\" support.\n */\n\ntransition()\n vendor('transition', arguments)\n\n/*\n * Vendor \"transition-property\" support.\n */\n\ntransition-property()\n vendor('transition-property', arguments)\n\n/*\n * Vendor \"transition-duration\" support.\n */\n\ntransition-duration()\n vendor('transition-duration', arguments)\n\n/*\n * Vendor \"transition-timing-function\" support.\n */\n\ntransition-timing-function()\n vendor('transition-timing-function', arguments)\n\n/*\n * Vendor \"transition-delay\" support.\n */\n\ntransition-delay()\n vendor('transition-delay', arguments)\n\n/*\n * Vendor \"backface-visibility\" support.\n */\n\nbackface-visibility()\n vendor('backface-visibility', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"perspective\" support.\n */\n\nperspective()\n if mixin\n vendor('perspective', arguments, only: webkit moz ms official)\n else\n 'perspective(%s)' % arguments\n\n/*\n * Vendor \"perspective-origin\" support.\n */\n\nperspective-origin()\n vendor('perspective-origin', arguments, only: webkit moz ms official)\n\n/*\n * Opacity with conditional IE support.\n */\n\nopacity(n, args...)\n opacity: n args\n if support-for-ie\n if n == inherit or n == initial\n -ms-filter: n args\n filter: n args\n else\n val = round(n * 100)\n if val == 100\n -ms-filter: none args\n filter: none args\n else\n -ms-filter: '\"progid:DXImageTransform.Microsoft.Alpha(Opacity=%s)\"' % val args\n filter: 'alpha(opacity=%s)' % val args\n\n/*\n * Vendor \"text-size-adjust\"\n */\n\ntext-size-adjust()\n vendor('text-size-adjust', arguments)\n\n/*\n * Alias the \"white-space\" property.\n */\n\nwhitespace()\n white-space: arguments\n\n/*\n * Vendor \"box-sizing\" support.\n */\n\nbox-sizing()\n vendor('box-sizing', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-orient\" support.\n */\n\nbox-orient()\n vendor('box-orient', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-flex-group\" support.\n */\n\nbox-flex-group()\n vendor('box-flex-group', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-ordinal-group\" support.\n */\n\nbox-ordinal-group()\n vendor('box-ordinal-group', arguments, only: webkit moz ms official)\n\n\n/*\n * Vendor \"box-align\" support.\n */\n\nbox-align()\n vendor('box-align', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"box-pack\" support.\n */\n\nbox-pack()\n vendor('box-pack', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"box-direction\" support.\n */\n\nbox-direction()\n vendor('box-direction', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"animation\" support.\n */\n\nanimation()\n vendor('animation', arguments)\n\n\n/*\n * Vendor \"animation-name\" support.\n */\n\nanimation-name()\n vendor('animation-name', arguments)\n\n/*\n * Vendor \"animation-duration\" support.\n */\n\nanimation-duration()\n vendor('animation-duration', arguments)\n\n/*\n * Vendor \"animation-delay\" support.\n */\n\nanimation-delay()\n vendor('animation-delay', arguments)\n\n/*\n * Vendor \"animation-direction\" support.\n */\n\nanimation-direction()\n vendor('animation-direction', arguments)\n\n/*\n * Vendor \"animation-iteration-count\" support.\n */\n\nanimation-iteration-count()\n vendor('animation-iteration-count', arguments)\n\n/*\n * Vendor \"animation-timing-function\" support.\n */\n\nanimation-timing-function()\n vendor('animation-timing-function', arguments)\n\n/*\n * Vendor \"animation-play-state\" support.\n */\n\nanimation-play-state()\n vendor('animation-play-state', arguments)\n\n/*\n * Vendor \"animation-fill-mode\" support.\n */\n\nanimation-fill-mode()\n vendor('animation-fill-mode', arguments)\n\n/*\n * Vendor \"hyphens\" support.\n */\n\nhyphens()\n vendor('hyphens', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"appearance\" support.\n */\n\nappearance()\n vendor('appearance', arguments, only: webkit moz official)\n\n/*\n * Vendor \"tab-size\" support.\n */\n\ntab-size()\n vendor('tab-size', arguments, only: moz o official)\n\n/*\n * Vendor \"overflow-scrolling\" support.\n */\n\noverflow-scrolling()\n vendor('overflow-scrolling', arguments, only: webkit official)\n\n/*\n * Vendor \"text-overflow\" support, , -o- for opera 9.* - 10.*\n */\n\ntext-overflow()\n vendor('text-overflow', arguments, only: official o)\n\n/*\n * Vendor \"text-size-adjust\" support.\n */\ntext-size-adjust()\n vendor('text-size-adjust', arguments, only: official webkit ms)\n\n/*\n * Vendor \"font-smoothing\" support, webkit only.\n */\nfont-smoothing()\n vendor('font-smoothing', arguments, only: webkit)\n\n\n/**\n * Vendor input-placeholder/placeholder support.\n *\n * Examples:\n * // Default syntax\n * body\n * placeholder(color #333, font-weight normal)\n *\n * // The comma is important\n * .placeholder-red\n * placeholder(color red,)\n *\n * // We can pass a function\n * green-placeholder()\n * color green\n * .placeholder-green\n * placeholder(green-placeholder)\n *\n * // We can pass a hash\n * textarea\n * placeholder((font-style italic) (font-weight bold) (padding '4px 10px'))\n */\nplaceholder()\n for v in ':-webkit-input' '-moz' ':-moz' '-ms-input'\n &:{v}-placeholder\n for pair in arguments\n if typeof(pair) == 'function'\n pair()\n else if pair is not null && pair[0] is not null\n {pair[0]}: type(pair[1]) == 'string' ? s(pair[1]) : pair[1]\ninput-placeholder = placeholder\n\n/*\n * Vendor background support (gradients).\n */\n\nbackground()\n if match('-gradient\\(', ''+arguments)\n vendor('background', arguments, vendor-property: false)\n else\n background arguments\n\nbackground-image()\n if match('-gradient\\(', ''+arguments)\n vendor('background-image', arguments, vendor-property: false)\n else\n background-image arguments\n\ncursor()\n if match('-gradient\\(', ''+arguments)\n vendor('cursor', arguments, vendor-property: false)\n else\n cursor arguments\n\nlist-style()\n if match('-gradient\\(', ''+arguments)\n vendor('list-style', arguments, vendor-property: false)\n else\n list-style arguments\n\nlist-style-image()\n if match('-gradient\\(', ''+arguments)\n vendor('list-style-image', arguments, vendor-property: false)\n else\n list-style-image arguments\n","/*\n * Overflow utility. Maps to regular overflow, and adds an ellipsis value.\n *\n * Synopsis:\n *\n * overflow: <type>\n *\n * Examples:\n *\n * overflow: auto\n * overflow: hidden\n * overflow: ellipsis\n *\n */\n\noverflow()\n if arguments[0] == ellipsis\n ellipsis()\n else\n overflow: arguments\n","/*\n * Vendor \"display: flex\" support with fallback to obsolete versions.\n */\n\nflex-version ?= box flex\n\n//\n// 1. Display values\n// - http://www.w3.org/TR/css3-flexbox/#flex-containers\n//\ndisplay(type, args...)\n if flex == type || inline-flex == type\n if box in flex-version\n if flex == type\n display: -ms-flexbox args\n display: vendor-value(box args, only: moz webkit)\n else\n display: -ms-inline-flexbox args\n display: vendor-value(inline-box args, only: moz webkit)\n if flex in flex-version\n display: vendor-value(arguments, only: webkit official) // overwrites old webkit\n else\n display: arguments\n\n/*\n * New syntax for browsers like Google Chrome.\n * Plus a translation to the old syntax, if possible.\n */\n\n\n//\n// 5. Ordering and Orientation\n// - http://www.w3.org/TR/css3-flexbox/#ordering-and-orientation\n//\n-flex-obsolete-direction(direction)\n if box in flex-version\n if row-reverse == direction || column-reverse == direction\n vendor('box-direction', reverse, ignore: ms official)\n\n if row == direction || row-reverse == direction\n vendor('box-orient', horizontal, ignore: ms official)\n else if column == direction || column-reverse == direction\n vendor('box-orient', vertical, ignore: ms official)\n\n-flex-obsolete-wrap(value)\n if box in flex-version\n // WARN: wrap-reverse does not have a box equivalent. This will render in different manners\n // on box vs. flex values.\n if 'wrap' == value || wrap-reverse == value\n vendor('box-lines', multiple, ignore: ms official)\n else if nowrap == value\n vendor('box-lines', single, ignore: ms official)\n\nflex-direction(direction)\n // obsolete\n -flex-obsolete-direction(direction)\n\n // new\n if flex in flex-version\n vendor('flex-direction', arguments, only: webkit ms official)\n\nflex-wrap(value)\n // obsolete\n -flex-obsolete-wrap(value)\n\n if flex in flex-version\n vendor('flex-wrap', arguments, only: webkit ms official)\n\nflex-flow()\n // obsolete\n -flex-obsolete-direction(arguments[0])\n -flex-obsolete-direction(arguments[1])\n -flex-obsolete-wrap(arguments[0])\n -flex-obsolete-wrap(arguments[1])\n\n // new\n if flex in flex-version\n vendor('flex-flow', arguments, only: webkit ms official)\n\n\norder()\n // obsolete\n if box in flex-version\n vendor('box-ordinal-group', arguments, ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-order', arguments, only: ms)\n vendor('order', arguments, only: webkit official)\n\n\n//\n// 7. Flexibility\n// - http://www.w3.org/TR/css3-flexbox/#flexibility\n//\nflex-grow(growth)\n // obsolete\n if box in flex-version\n vendor('box-flex', growth)\n\n // new\n if flex in flex-version\n vendor('flex-grow', arguments, only: webkit official)\n\nflex-basis()\n if flex in flex-version\n vendor('flex-basis', arguments, only: webkit official)\n\nflex-shrink()\n if flex in flex-version\n vendor('flex-shrink', arguments, only: webkit official)\n\nflex(growth)\n\n // obsolete\n if box in flex-version\n shrink = 1\n\n if none == growth || initial == growth\n // Well known values\n shrink = 0 if none == growth\n growth = 0\n else if is-width(growth) == true\n // Basis is defined as the first parameter\n growth = arguments[1] || 0\n shrink = arguments[2] if 3 <= length(arguments)\n else if arguments[1] && is-width(arguments[1]) == false\n // Growth is first and shrink is second\n shrink = arguments[1]\n\n // Since we can't make the distinction between growing and shrinking in the box model, take\n // the one that provides the most flexibility.\n vendor('box-flex', max(growth, shrink), ignore: ms)\n\n // new\n if flex in flex-version\n vendor('flex', arguments, only: webkit ms official)\n\n\n// converts the justification alignment\n-convert-justify(align)\n if flex-start == align\n return start\n else if flex-end == align\n return end\n else if space-around == align\n return distribute\n else if space-between == align\n return justify\n else\n return align\n\n//\n// 8. Alignment\n// - http://www.w3.org/TR/css3-flexbox/#alignment\n//\njustify-content(align)\n // obsolete\n if box in flex-version\n vendor('box-pack', -convert-justify(align), ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-pack', -convert-justify(align), only: ms)\n vendor('justify-content', align, only: webkit official)\n\nalign-content(align)\n // WARN: Obsolete spec does not allow for adjustment here\n if flex in flex-version\n vendor('flex-line-pack', -convert-justify(align), only: ms)\n vendor('align-content', align, only: webkit official)\n\n// converts alignment from 'flex' to normal value\n-convert-alignment(align)\n if flex-start == align\n return start\n else if flex-end == align\n return end\n else\n return align\n\nalign-items(align)\n // obsolete\n if box in flex-version\n vendor('box-align', -convert-alignment(align), ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-align', -convert-alignment(align), only: ms)\n vendor('align-items', arguments, only: webkit official)\n\nalign-self(align)\n // WARN: Obsolete spec does not allow for overriding alignment on individual items.\n if flex in flex-version\n vendor('align-self', align, only: webkit official)\n vendor('flex-item-align', -convert-alignment(align), only: ms)\n","/*\n * border: <color>\n * border: ...\n */\n\nborder(color, args...)\n if color is a 'color'\n border: 1px solid color args\n else\n border: arguments\n"],"sourceRoot":""}]);
45323
46436
  // Exports
45324
46437
  /* harmony default export */ __webpack_exports__["Z"] = (___CSS_LOADER_EXPORT___);
45325
46438
 
@@ -45475,6 +46588,42 @@ module.exports = function (cssWithMappingToString) {
45475
46588
 
45476
46589
  /***/ }),
45477
46590
 
46591
+ /***/ 1678:
46592
+ /***/ (function(module) {
46593
+
46594
+ "use strict";
46595
+
46596
+
46597
+ module.exports = function (url, options) {
46598
+ if (!options) {
46599
+ options = {};
46600
+ }
46601
+
46602
+ if (!url) {
46603
+ return url;
46604
+ }
46605
+
46606
+ url = String(url.__esModule ? url.default : url); // If url is already wrapped in quotes, remove them
46607
+
46608
+ if (/^['"].*['"]$/.test(url)) {
46609
+ url = url.slice(1, -1);
46610
+ }
46611
+
46612
+ if (options.hash) {
46613
+ url += options.hash;
46614
+ } // Should url be wrapped?
46615
+ // See https://drafts.csswg.org/css-values-3/#urls
46616
+
46617
+
46618
+ if (/["'() \t\n]|(%20)/.test(url) || options.needQuotes) {
46619
+ return "\"".concat(url.replace(/"/g, '\\"').replace(/\n/g, "\\n"), "\"");
46620
+ }
46621
+
46622
+ return url;
46623
+ };
46624
+
46625
+ /***/ }),
46626
+
45478
46627
  /***/ 559:
45479
46628
  /***/ (function(module) {
45480
46629
 
@@ -74518,6 +75667,1671 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/*global define:false */
74518
75667
  }) (typeof window !== 'undefined' ? window : null, typeof window !== 'undefined' ? document : null);
74519
75668
 
74520
75669
 
75670
+ /***/ }),
75671
+
75672
+ /***/ 3291:
75673
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
75674
+
75675
+ /*
75676
+ * @copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc
75677
+ * @license MIT
75678
+ * @preserve Project Home: https://github.com/voidqk/polybooljs
75679
+ */
75680
+
75681
+ var BuildLog = __webpack_require__(1009);
75682
+ var Epsilon = __webpack_require__(1835);
75683
+ var Intersecter = __webpack_require__(7671);
75684
+ var SegmentChainer = __webpack_require__(9048);
75685
+ var SegmentSelector = __webpack_require__(571);
75686
+ var GeoJSON = __webpack_require__(3928);
75687
+
75688
+ var buildLog = false;
75689
+ var epsilon = Epsilon();
75690
+
75691
+ var PolyBool;
75692
+ PolyBool = {
75693
+ // getter/setter for buildLog
75694
+ buildLog: function(bl){
75695
+ if (bl === true)
75696
+ buildLog = BuildLog();
75697
+ else if (bl === false)
75698
+ buildLog = false;
75699
+ return buildLog === false ? false : buildLog.list;
75700
+ },
75701
+ // getter/setter for epsilon
75702
+ epsilon: function(v){
75703
+ return epsilon.epsilon(v);
75704
+ },
75705
+
75706
+ // core API
75707
+ segments: function(poly){
75708
+ var i = Intersecter(true, epsilon, buildLog);
75709
+ poly.regions.forEach(i.addRegion);
75710
+ return {
75711
+ segments: i.calculate(poly.inverted),
75712
+ inverted: poly.inverted
75713
+ };
75714
+ },
75715
+ combine: function(segments1, segments2){
75716
+ var i3 = Intersecter(false, epsilon, buildLog);
75717
+ return {
75718
+ combined: i3.calculate(
75719
+ segments1.segments, segments1.inverted,
75720
+ segments2.segments, segments2.inverted
75721
+ ),
75722
+ inverted1: segments1.inverted,
75723
+ inverted2: segments2.inverted
75724
+ };
75725
+ },
75726
+ selectUnion: function(combined){
75727
+ return {
75728
+ segments: SegmentSelector.union(combined.combined, buildLog),
75729
+ inverted: combined.inverted1 || combined.inverted2
75730
+ }
75731
+ },
75732
+ selectIntersect: function(combined){
75733
+ return {
75734
+ segments: SegmentSelector.intersect(combined.combined, buildLog),
75735
+ inverted: combined.inverted1 && combined.inverted2
75736
+ }
75737
+ },
75738
+ selectDifference: function(combined){
75739
+ return {
75740
+ segments: SegmentSelector.difference(combined.combined, buildLog),
75741
+ inverted: combined.inverted1 && !combined.inverted2
75742
+ }
75743
+ },
75744
+ selectDifferenceRev: function(combined){
75745
+ return {
75746
+ segments: SegmentSelector.differenceRev(combined.combined, buildLog),
75747
+ inverted: !combined.inverted1 && combined.inverted2
75748
+ }
75749
+ },
75750
+ selectXor: function(combined){
75751
+ return {
75752
+ segments: SegmentSelector.xor(combined.combined, buildLog),
75753
+ inverted: combined.inverted1 !== combined.inverted2
75754
+ }
75755
+ },
75756
+ polygon: function(segments){
75757
+ return {
75758
+ regions: SegmentChainer(segments.segments, epsilon, buildLog),
75759
+ inverted: segments.inverted
75760
+ };
75761
+ },
75762
+
75763
+ // GeoJSON converters
75764
+ polygonFromGeoJSON: function(geojson){
75765
+ return GeoJSON.toPolygon(PolyBool, geojson);
75766
+ },
75767
+ polygonToGeoJSON: function(poly){
75768
+ return GeoJSON.fromPolygon(PolyBool, epsilon, poly);
75769
+ },
75770
+
75771
+ // helper functions for common operations
75772
+ union: function(poly1, poly2){
75773
+ return operate(poly1, poly2, PolyBool.selectUnion);
75774
+ },
75775
+ intersect: function(poly1, poly2){
75776
+ return operate(poly1, poly2, PolyBool.selectIntersect);
75777
+ },
75778
+ difference: function(poly1, poly2){
75779
+ return operate(poly1, poly2, PolyBool.selectDifference);
75780
+ },
75781
+ differenceRev: function(poly1, poly2){
75782
+ return operate(poly1, poly2, PolyBool.selectDifferenceRev);
75783
+ },
75784
+ xor: function(poly1, poly2){
75785
+ return operate(poly1, poly2, PolyBool.selectXor);
75786
+ }
75787
+ };
75788
+
75789
+ function operate(poly1, poly2, selector){
75790
+ var seg1 = PolyBool.segments(poly1);
75791
+ var seg2 = PolyBool.segments(poly2);
75792
+ var comb = PolyBool.combine(seg1, seg2);
75793
+ var seg3 = selector(comb);
75794
+ return PolyBool.polygon(seg3);
75795
+ }
75796
+
75797
+ if (typeof window === 'object')
75798
+ window.PolyBool = PolyBool;
75799
+
75800
+ module.exports = PolyBool;
75801
+
75802
+
75803
+ /***/ }),
75804
+
75805
+ /***/ 1009:
75806
+ /***/ (function(module) {
75807
+
75808
+ // (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
75809
+ // MIT License
75810
+ // Project Home: https://github.com/voidqk/polybooljs
75811
+
75812
+ //
75813
+ // used strictly for logging the processing of the algorithm... only useful if you intend on
75814
+ // looking under the covers (for pretty UI's or debugging)
75815
+ //
75816
+
75817
+ function BuildLog(){
75818
+ var my;
75819
+ var nextSegmentId = 0;
75820
+ var curVert = false;
75821
+
75822
+ function push(type, data){
75823
+ my.list.push({
75824
+ type: type,
75825
+ data: data ? JSON.parse(JSON.stringify(data)) : void 0
75826
+ });
75827
+ return my;
75828
+ }
75829
+
75830
+ my = {
75831
+ list: [],
75832
+ segmentId: function(){
75833
+ return nextSegmentId++;
75834
+ },
75835
+ checkIntersection: function(seg1, seg2){
75836
+ return push('check', { seg1: seg1, seg2: seg2 });
75837
+ },
75838
+ segmentChop: function(seg, end){
75839
+ push('div_seg', { seg: seg, pt: end });
75840
+ return push('chop', { seg: seg, pt: end });
75841
+ },
75842
+ statusRemove: function(seg){
75843
+ return push('pop_seg', { seg: seg });
75844
+ },
75845
+ segmentUpdate: function(seg){
75846
+ return push('seg_update', { seg: seg });
75847
+ },
75848
+ segmentNew: function(seg, primary){
75849
+ return push('new_seg', { seg: seg, primary: primary });
75850
+ },
75851
+ segmentRemove: function(seg){
75852
+ return push('rem_seg', { seg: seg });
75853
+ },
75854
+ tempStatus: function(seg, above, below){
75855
+ return push('temp_status', { seg: seg, above: above, below: below });
75856
+ },
75857
+ rewind: function(seg){
75858
+ return push('rewind', { seg: seg });
75859
+ },
75860
+ status: function(seg, above, below){
75861
+ return push('status', { seg: seg, above: above, below: below });
75862
+ },
75863
+ vert: function(x){
75864
+ if (x === curVert)
75865
+ return my;
75866
+ curVert = x;
75867
+ return push('vert', { x: x });
75868
+ },
75869
+ log: function(data){
75870
+ if (typeof data !== 'string')
75871
+ data = JSON.stringify(data, false, ' ');
75872
+ return push('log', { txt: data });
75873
+ },
75874
+ reset: function(){
75875
+ return push('reset');
75876
+ },
75877
+ selected: function(segs){
75878
+ return push('selected', { segs: segs });
75879
+ },
75880
+ chainStart: function(seg){
75881
+ return push('chain_start', { seg: seg });
75882
+ },
75883
+ chainRemoveHead: function(index, pt){
75884
+ return push('chain_rem_head', { index: index, pt: pt });
75885
+ },
75886
+ chainRemoveTail: function(index, pt){
75887
+ return push('chain_rem_tail', { index: index, pt: pt });
75888
+ },
75889
+ chainNew: function(pt1, pt2){
75890
+ return push('chain_new', { pt1: pt1, pt2: pt2 });
75891
+ },
75892
+ chainMatch: function(index){
75893
+ return push('chain_match', { index: index });
75894
+ },
75895
+ chainClose: function(index){
75896
+ return push('chain_close', { index: index });
75897
+ },
75898
+ chainAddHead: function(index, pt){
75899
+ return push('chain_add_head', { index: index, pt: pt });
75900
+ },
75901
+ chainAddTail: function(index, pt){
75902
+ return push('chain_add_tail', { index: index, pt: pt, });
75903
+ },
75904
+ chainConnect: function(index1, index2){
75905
+ return push('chain_con', { index1: index1, index2: index2 });
75906
+ },
75907
+ chainReverse: function(index){
75908
+ return push('chain_rev', { index: index });
75909
+ },
75910
+ chainJoin: function(index1, index2){
75911
+ return push('chain_join', { index1: index1, index2: index2 });
75912
+ },
75913
+ done: function(){
75914
+ return push('done');
75915
+ }
75916
+ };
75917
+ return my;
75918
+ }
75919
+
75920
+ module.exports = BuildLog;
75921
+
75922
+
75923
+ /***/ }),
75924
+
75925
+ /***/ 1835:
75926
+ /***/ (function(module) {
75927
+
75928
+ // (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
75929
+ // MIT License
75930
+ // Project Home: https://github.com/voidqk/polybooljs
75931
+
75932
+ //
75933
+ // provides the raw computation functions that takes epsilon into account
75934
+ //
75935
+ // zero is defined to be between (-epsilon, epsilon) exclusive
75936
+ //
75937
+
75938
+ function Epsilon(eps){
75939
+ if (typeof eps !== 'number')
75940
+ eps = 0.0000000001; // sane default? sure why not
75941
+ var my = {
75942
+ epsilon: function(v){
75943
+ if (typeof v === 'number')
75944
+ eps = v;
75945
+ return eps;
75946
+ },
75947
+ pointAboveOrOnLine: function(pt, left, right){
75948
+ var Ax = left[0];
75949
+ var Ay = left[1];
75950
+ var Bx = right[0];
75951
+ var By = right[1];
75952
+ var Cx = pt[0];
75953
+ var Cy = pt[1];
75954
+ var ABx = Bx - Ax;
75955
+ var ABy = By - Ay;
75956
+ var AB = Math.sqrt(ABx * ABx + ABy * ABy);
75957
+ // algebraic distance of 'pt' to ('left', 'right') line is:
75958
+ // [ABx * (Cy - Ay) - ABy * (Cx - Ax)] / AB
75959
+ return ABx * (Cy - Ay) - ABy * (Cx - Ax) >= -eps * AB;
75960
+ },
75961
+ pointBetween: function(p, left, right){
75962
+ // p must be collinear with left->right
75963
+ // returns false if p == left, p == right, or left == right
75964
+ if (my.pointsSame(p, left) || my.pointsSame(p, right)) return false;
75965
+ var d_py_ly = p[1] - left[1];
75966
+ var d_rx_lx = right[0] - left[0];
75967
+ var d_px_lx = p[0] - left[0];
75968
+ var d_ry_ly = right[1] - left[1];
75969
+
75970
+ var dot = d_px_lx * d_rx_lx + d_py_ly * d_ry_ly;
75971
+ // dot < 0 is p is to the left of 'left'
75972
+ if (dot < 0) return false;
75973
+ var sqlen = d_rx_lx * d_rx_lx + d_ry_ly * d_ry_ly;
75974
+ // dot <= sqlen is p is to the left of 'right'
75975
+ return dot <= sqlen;
75976
+ },
75977
+ pointsSameX: function(p1, p2){
75978
+ return Math.abs(p1[0] - p2[0]) < eps;
75979
+ },
75980
+ pointsSameY: function(p1, p2){
75981
+ return Math.abs(p1[1] - p2[1]) < eps;
75982
+ },
75983
+ pointsSame: function(p1, p2){
75984
+ return my.pointsSameX(p1, p2) && my.pointsSameY(p1, p2);
75985
+ },
75986
+ pointsCompare: function(p1, p2){
75987
+ // returns -1 if p1 is smaller, 1 if p2 is smaller, 0 if equal
75988
+ if (my.pointsSameX(p1, p2))
75989
+ return my.pointsSameY(p1, p2) ? 0 : (p1[1] < p2[1] ? -1 : 1);
75990
+ return p1[0] < p2[0] ? -1 : 1;
75991
+ },
75992
+ pointsCollinear: function(pt1, pt2, pt3){
75993
+ // does pt1->pt2->pt3 make a straight line?
75994
+ // essentially this is just checking to see if the slope(pt1->pt2) === slope(pt2->pt3)
75995
+ // if slopes are equal, then they must be collinear, because they share pt2
75996
+ var dx1 = pt1[0] - pt2[0];
75997
+ var dy1 = pt1[1] - pt2[1];
75998
+ var dx2 = pt2[0] - pt3[0];
75999
+ var dy2 = pt2[1] - pt3[1];
76000
+ var n1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);
76001
+ var n2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);
76002
+ // Assuming det(u, v) = 0, we have:
76003
+ // |det(u + u_err, v + v_err)| = |det(u + u_err, v + v_err) - det(u,v)|
76004
+ // =|det(u, v_err) + det(u_err. v) + det(u_err, v_err)|
76005
+ // <= |det(u, v_err)| + |det(u_err, v)| + |det(u_err, v_err)|
76006
+ // <= N(u)N(v_err) + N(u_err)N(v) + N(u_err)N(v_err)
76007
+ // <= eps * (N(u) + N(v) + eps)
76008
+ // We have N(u) ~ N(u + u_err) and N(v) ~ N(v + v_err).
76009
+ // Assuming eps << N(u) and eps << N(v), we end with:
76010
+ // |det(u + u_err, v + v_err)| <= eps * (N(u + u_err) + N(v + v_err))
76011
+ return Math.abs(dx1 * dy2 - dx2 * dy1) <= eps * (n1 + n2);
76012
+ },
76013
+ linesIntersect: function(a0, a1, b0, b1){
76014
+ // returns false if the lines are coincident (e.g., parallel or on top of each other)
76015
+ //
76016
+ // returns an object if the lines intersect:
76017
+ // {
76018
+ // pt: [x, y], where the intersection point is at
76019
+ // alongA: where intersection point is along A,
76020
+ // alongB: where intersection point is along B
76021
+ // }
76022
+ //
76023
+ // alongA and alongB will each be one of: -2, -1, 0, 1, 2
76024
+ //
76025
+ // with the following meaning:
76026
+ //
76027
+ // -2 intersection point is before segment's first point
76028
+ // -1 intersection point is directly on segment's first point
76029
+ // 0 intersection point is between segment's first and second points (exclusive)
76030
+ // 1 intersection point is directly on segment's second point
76031
+ // 2 intersection point is after segment's second point
76032
+ var adx = a1[0] - a0[0];
76033
+ var ady = a1[1] - a0[1];
76034
+ var bdx = b1[0] - b0[0];
76035
+ var bdy = b1[1] - b0[1];
76036
+
76037
+ var axb = adx * bdy - ady * bdx;
76038
+ var n1 = Math.sqrt(adx * adx + ady * ady);
76039
+ var n2 = Math.sqrt(bdx * bdx + bdy * bdy);
76040
+ if (Math.abs(axb) <= eps * (n1 + n2))
76041
+ return false; // lines are coincident
76042
+
76043
+ var dx = a0[0] - b0[0];
76044
+ var dy = a0[1] - b0[1];
76045
+
76046
+ var A = (bdx * dy - bdy * dx) / axb;
76047
+ var B = (adx * dy - ady * dx) / axb;
76048
+ var pt = [
76049
+ a0[0] + A * adx,
76050
+ a0[1] + A * ady
76051
+ ];
76052
+
76053
+ var ret = {
76054
+ alongA: 0,
76055
+ alongB: 0,
76056
+ pt: pt
76057
+ };
76058
+
76059
+ // categorize where intersection point is along A and B
76060
+ if (my.pointsSame(pt, a0))
76061
+ ret.alongA = -1;
76062
+ else if (my.pointsSame(pt, a1))
76063
+ ret.alongA = 1;
76064
+ else if (A < 0)
76065
+ ret.alongA = -2;
76066
+ else if (A > 1)
76067
+ ret.alongA = 2;
76068
+
76069
+ if (my.pointsSame(pt, b0))
76070
+ ret.alongB = -1;
76071
+ else if (my.pointsSame(pt, b1))
76072
+ ret.alongB = 1;
76073
+ else if (B < 0)
76074
+ ret.alongB = -2;
76075
+ else if (B > 1)
76076
+ ret.alongB = 2;
76077
+
76078
+ return ret;
76079
+ },
76080
+ pointInsideRegion: function(pt, region){
76081
+ var x = pt[0];
76082
+ var y = pt[1];
76083
+ var last_x = region[region.length - 1][0];
76084
+ var last_y = region[region.length - 1][1];
76085
+ var inside = false;
76086
+ for (var i = 0; i < region.length; i++){
76087
+ var curr_x = region[i][0];
76088
+ var curr_y = region[i][1];
76089
+
76090
+ // if y is between curr_y and last_y, and
76091
+ // x is to the right of the boundary created by the line
76092
+ if ((curr_y - y > eps) != (last_y - y > eps) &&
76093
+ (last_x - curr_x) * (y - curr_y) / (last_y - curr_y) + curr_x - x > eps)
76094
+ inside = !inside
76095
+
76096
+ last_x = curr_x;
76097
+ last_y = curr_y;
76098
+ }
76099
+ return inside;
76100
+ }
76101
+ };
76102
+ return my;
76103
+ }
76104
+
76105
+ module.exports = Epsilon;
76106
+
76107
+
76108
+ /***/ }),
76109
+
76110
+ /***/ 3928:
76111
+ /***/ (function(module) {
76112
+
76113
+ // (c) Copyright 2017, Sean Connelly (@voidqk), http://syntheti.cc
76114
+ // MIT License
76115
+ // Project Home: https://github.com/voidqk/polybooljs
76116
+
76117
+ //
76118
+ // convert between PolyBool polygon format and GeoJSON formats (Polygon and MultiPolygon)
76119
+ //
76120
+
76121
+ var GeoJSON = {
76122
+ // convert a GeoJSON object to a PolyBool polygon
76123
+ toPolygon: function(PolyBool, geojson){
76124
+
76125
+ // converts list of LineString's to segments
76126
+ function GeoPoly(coords){
76127
+ // check for empty coords
76128
+ if (coords.length <= 0)
76129
+ return PolyBool.segments({ inverted: false, regions: [] });
76130
+
76131
+ // convert LineString to segments
76132
+ function LineString(ls){
76133
+ // remove tail which should be the same as head
76134
+ var reg = ls.slice(0, ls.length - 1);
76135
+ return PolyBool.segments({ inverted: false, regions: [reg] });
76136
+ }
76137
+
76138
+ // the first LineString is considered the outside
76139
+ var out = LineString(coords[0]);
76140
+
76141
+ // the rest of the LineStrings are considered interior holes, so subtract them from the
76142
+ // current result
76143
+ for (var i = 1; i < coords.length; i++)
76144
+ out = PolyBool.selectDifference(PolyBool.combine(out, LineString(coords[i])));
76145
+
76146
+ return out;
76147
+ }
76148
+
76149
+ if (geojson.type === 'Polygon'){
76150
+ // single polygon, so just convert it and we're done
76151
+ return PolyBool.polygon(GeoPoly(geojson.coordinates));
76152
+ }
76153
+ else if (geojson.type === 'MultiPolygon'){
76154
+ // multiple polygons, so union all the polygons together
76155
+ var out = PolyBool.segments({ inverted: false, regions: [] });
76156
+ for (var i = 0; i < geojson.coordinates.length; i++)
76157
+ out = PolyBool.selectUnion(PolyBool.combine(out, GeoPoly(geojson.coordinates[i])));
76158
+ return PolyBool.polygon(out);
76159
+ }
76160
+ throw new Error('PolyBool: Cannot convert GeoJSON object to PolyBool polygon');
76161
+ },
76162
+
76163
+ // convert a PolyBool polygon to a GeoJSON object
76164
+ fromPolygon: function(PolyBool, eps, poly){
76165
+ // make sure out polygon is clean
76166
+ poly = PolyBool.polygon(PolyBool.segments(poly));
76167
+
76168
+ // test if r1 is inside r2
76169
+ function regionInsideRegion(r1, r2){
76170
+ // we're guaranteed no lines intersect (because the polygon is clean), but a vertex
76171
+ // could be on the edge -- so we just average pt[0] and pt[1] to produce a point on the
76172
+ // edge of the first line, which cannot be on an edge
76173
+ return eps.pointInsideRegion([
76174
+ (r1[0][0] + r1[1][0]) * 0.5,
76175
+ (r1[0][1] + r1[1][1]) * 0.5
76176
+ ], r2);
76177
+ }
76178
+
76179
+ // calculate inside heirarchy
76180
+ //
76181
+ // _____________________ _______ roots -> A -> F
76182
+ // | A | | F | | |
76183
+ // | _______ _______ | | ___ | +-- B +-- G
76184
+ // | | B | | C | | | | | | | |
76185
+ // | | ___ | | ___ | | | | | | | +-- D
76186
+ // | | | D | | | | E | | | | | G | | |
76187
+ // | | |___| | | |___| | | | | | | +-- C
76188
+ // | |_______| |_______| | | |___| | |
76189
+ // |_____________________| |_______| +-- E
76190
+
76191
+ function newNode(region){
76192
+ return {
76193
+ region: region,
76194
+ children: []
76195
+ };
76196
+ }
76197
+
76198
+ var roots = newNode(null);
76199
+
76200
+ function addChild(root, region){
76201
+ // first check if we're inside any children
76202
+ for (var i = 0; i < root.children.length; i++){
76203
+ var child = root.children[i];
76204
+ if (regionInsideRegion(region, child.region)){
76205
+ // we are, so insert inside them instead
76206
+ addChild(child, region);
76207
+ return;
76208
+ }
76209
+ }
76210
+
76211
+ // not inside any children, so check to see if any children are inside us
76212
+ var node = newNode(region);
76213
+ for (var i = 0; i < root.children.length; i++){
76214
+ var child = root.children[i];
76215
+ if (regionInsideRegion(child.region, region)){
76216
+ // oops... move the child beneath us, and remove them from root
76217
+ node.children.push(child);
76218
+ root.children.splice(i, 1);
76219
+ i--;
76220
+ }
76221
+ }
76222
+
76223
+ // now we can add ourselves
76224
+ root.children.push(node);
76225
+ }
76226
+
76227
+ // add all regions to the root
76228
+ for (var i = 0; i < poly.regions.length; i++){
76229
+ var region = poly.regions[i];
76230
+ if (region.length < 3) // regions must have at least 3 points (sanity check)
76231
+ continue;
76232
+ addChild(roots, region);
76233
+ }
76234
+
76235
+ // with our heirarchy, we can distinguish between exterior borders, and interior holes
76236
+ // the root nodes are exterior, children are interior, children's children are exterior,
76237
+ // children's children's children are interior, etc
76238
+
76239
+ // while we're at it, exteriors are counter-clockwise, and interiors are clockwise
76240
+
76241
+ function forceWinding(region, clockwise){
76242
+ // first, see if we're clockwise or counter-clockwise
76243
+ // https://en.wikipedia.org/wiki/Shoelace_formula
76244
+ var winding = 0;
76245
+ var last_x = region[region.length - 1][0];
76246
+ var last_y = region[region.length - 1][1];
76247
+ var copy = [];
76248
+ for (var i = 0; i < region.length; i++){
76249
+ var curr_x = region[i][0];
76250
+ var curr_y = region[i][1];
76251
+ copy.push([curr_x, curr_y]); // create a copy while we're at it
76252
+ winding += curr_y * last_x - curr_x * last_y;
76253
+ last_x = curr_x;
76254
+ last_y = curr_y;
76255
+ }
76256
+ // this assumes Cartesian coordinates (Y is positive going up)
76257
+ var isclockwise = winding < 0;
76258
+ if (isclockwise !== clockwise)
76259
+ copy.reverse();
76260
+ // while we're here, the last point must be the first point...
76261
+ copy.push([copy[0][0], copy[0][1]]);
76262
+ return copy;
76263
+ }
76264
+
76265
+ var geopolys = [];
76266
+
76267
+ function addExterior(node){
76268
+ var poly = [forceWinding(node.region, false)];
76269
+ geopolys.push(poly);
76270
+ // children of exteriors are interior
76271
+ for (var i = 0; i < node.children.length; i++)
76272
+ poly.push(getInterior(node.children[i]));
76273
+ }
76274
+
76275
+ function getInterior(node){
76276
+ // children of interiors are exterior
76277
+ for (var i = 0; i < node.children.length; i++)
76278
+ addExterior(node.children[i]);
76279
+ // return the clockwise interior
76280
+ return forceWinding(node.region, true);
76281
+ }
76282
+
76283
+ // root nodes are exterior
76284
+ for (var i = 0; i < roots.children.length; i++)
76285
+ addExterior(roots.children[i]);
76286
+
76287
+ // lastly, construct the approrpriate GeoJSON object
76288
+
76289
+ if (geopolys.length <= 0) // empty GeoJSON Polygon
76290
+ return { type: 'Polygon', coordinates: [] };
76291
+ if (geopolys.length == 1) // use a GeoJSON Polygon
76292
+ return { type: 'Polygon', coordinates: geopolys[0] };
76293
+ return { // otherwise, use a GeoJSON MultiPolygon
76294
+ type: 'MultiPolygon',
76295
+ coordinates: geopolys
76296
+ };
76297
+ }
76298
+ };
76299
+
76300
+ module.exports = GeoJSON;
76301
+
76302
+
76303
+ /***/ }),
76304
+
76305
+ /***/ 7671:
76306
+ /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
76307
+
76308
+ // (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
76309
+ // MIT License
76310
+ // Project Home: https://github.com/voidqk/polybooljs
76311
+
76312
+ //
76313
+ // this is the core work-horse
76314
+ //
76315
+
76316
+ var LinkedList = __webpack_require__(9186);
76317
+
76318
+ function Intersecter(selfIntersection, eps, buildLog){
76319
+ // selfIntersection is true/false depending on the phase of the overall algorithm
76320
+
76321
+ //
76322
+ // segment creation
76323
+ //
76324
+
76325
+ function segmentNew(start, end){
76326
+ return {
76327
+ id: buildLog ? buildLog.segmentId() : -1,
76328
+ start: start,
76329
+ end: end,
76330
+ myFill: {
76331
+ above: null, // is there fill above us?
76332
+ below: null // is there fill below us?
76333
+ },
76334
+ otherFill: null
76335
+ };
76336
+ }
76337
+
76338
+ function segmentCopy(start, end, seg){
76339
+ return {
76340
+ id: buildLog ? buildLog.segmentId() : -1,
76341
+ start: start,
76342
+ end: end,
76343
+ myFill: {
76344
+ above: seg.myFill.above,
76345
+ below: seg.myFill.below
76346
+ },
76347
+ otherFill: null
76348
+ };
76349
+ }
76350
+
76351
+ //
76352
+ // event logic
76353
+ //
76354
+
76355
+ var event_root = LinkedList.create();
76356
+
76357
+ function eventCompare(p1_isStart, p1_1, p1_2, p2_isStart, p2_1, p2_2){
76358
+ // compare the selected points first
76359
+ var comp = eps.pointsCompare(p1_1, p2_1);
76360
+ if (comp !== 0)
76361
+ return comp;
76362
+ // the selected points are the same
76363
+
76364
+ if (eps.pointsSame(p1_2, p2_2)) // if the non-selected points are the same too...
76365
+ return 0; // then the segments are equal
76366
+
76367
+ if (p1_isStart !== p2_isStart) // if one is a start and the other isn't...
76368
+ return p1_isStart ? 1 : -1; // favor the one that isn't the start
76369
+
76370
+ // otherwise, we'll have to calculate which one is below the other manually
76371
+ return eps.pointAboveOrOnLine(p1_2,
76372
+ p2_isStart ? p2_1 : p2_2, // order matters
76373
+ p2_isStart ? p2_2 : p2_1
76374
+ ) ? 1 : -1;
76375
+ }
76376
+
76377
+ function eventAdd(ev, other_pt){
76378
+ event_root.insertBefore(ev, function(here){
76379
+ // should ev be inserted before here?
76380
+ var comp = eventCompare(
76381
+ ev .isStart, ev .pt, other_pt,
76382
+ here.isStart, here.pt, here.other.pt
76383
+ );
76384
+ return comp < 0;
76385
+ });
76386
+ }
76387
+
76388
+ function eventAddSegmentStart(seg, primary){
76389
+ var ev_start = LinkedList.node({
76390
+ isStart: true,
76391
+ pt: seg.start,
76392
+ seg: seg,
76393
+ primary: primary,
76394
+ other: null,
76395
+ status: null
76396
+ });
76397
+ eventAdd(ev_start, seg.end);
76398
+ return ev_start;
76399
+ }
76400
+
76401
+ function eventAddSegmentEnd(ev_start, seg, primary){
76402
+ var ev_end = LinkedList.node({
76403
+ isStart: false,
76404
+ pt: seg.end,
76405
+ seg: seg,
76406
+ primary: primary,
76407
+ other: ev_start,
76408
+ status: null
76409
+ });
76410
+ ev_start.other = ev_end;
76411
+ eventAdd(ev_end, ev_start.pt);
76412
+ }
76413
+
76414
+ function eventAddSegment(seg, primary){
76415
+ var ev_start = eventAddSegmentStart(seg, primary);
76416
+ eventAddSegmentEnd(ev_start, seg, primary);
76417
+ return ev_start;
76418
+ }
76419
+
76420
+ function eventUpdateEnd(ev, end){
76421
+ // slides an end backwards
76422
+ // (start)------------(end) to:
76423
+ // (start)---(end)
76424
+
76425
+ if (buildLog)
76426
+ buildLog.segmentChop(ev.seg, end);
76427
+
76428
+ ev.other.remove();
76429
+ ev.seg.end = end;
76430
+ ev.other.pt = end;
76431
+ eventAdd(ev.other, ev.pt);
76432
+ }
76433
+
76434
+ function eventDivide(ev, pt){
76435
+ var ns = segmentCopy(pt, ev.seg.end, ev.seg);
76436
+ eventUpdateEnd(ev, pt);
76437
+ return eventAddSegment(ns, ev.primary);
76438
+ }
76439
+
76440
+ function calculate(primaryPolyInverted, secondaryPolyInverted){
76441
+ // if selfIntersection is true then there is no secondary polygon, so that isn't used
76442
+
76443
+ //
76444
+ // status logic
76445
+ //
76446
+
76447
+ var status_root = LinkedList.create();
76448
+
76449
+ function statusCompare(ev1, ev2){
76450
+ var a1 = ev1.seg.start;
76451
+ var a2 = ev1.seg.end;
76452
+ var b1 = ev2.seg.start;
76453
+ var b2 = ev2.seg.end;
76454
+
76455
+ if (eps.pointsCollinear(a1, b1, b2)){
76456
+ if (eps.pointsCollinear(a2, b1, b2))
76457
+ return 1;//eventCompare(true, a1, a2, true, b1, b2);
76458
+ return eps.pointAboveOrOnLine(a2, b1, b2) ? 1 : -1;
76459
+ }
76460
+ return eps.pointAboveOrOnLine(a1, b1, b2) ? 1 : -1;
76461
+ }
76462
+
76463
+ function statusFindSurrounding(ev){
76464
+ return status_root.findTransition(function(here){
76465
+ var comp = statusCompare(ev, here.ev);
76466
+ return comp > 0;
76467
+ });
76468
+ }
76469
+
76470
+ function checkIntersection(ev1, ev2){
76471
+ // returns the segment equal to ev1, or false if nothing equal
76472
+
76473
+ var seg1 = ev1.seg;
76474
+ var seg2 = ev2.seg;
76475
+ var a1 = seg1.start;
76476
+ var a2 = seg1.end;
76477
+ var b1 = seg2.start;
76478
+ var b2 = seg2.end;
76479
+
76480
+ if (buildLog)
76481
+ buildLog.checkIntersection(seg1, seg2);
76482
+
76483
+ var i = eps.linesIntersect(a1, a2, b1, b2);
76484
+
76485
+ if (i === false){
76486
+ // segments are parallel or coincident
76487
+
76488
+ // if points aren't collinear, then the segments are parallel, so no intersections
76489
+ if (!eps.pointsCollinear(a1, a2, b1))
76490
+ return false;
76491
+ // otherwise, segments are on top of each other somehow (aka coincident)
76492
+
76493
+ if (eps.pointsSame(a1, b2) || eps.pointsSame(a2, b1))
76494
+ return false; // segments touch at endpoints... no intersection
76495
+
76496
+ var a1_equ_b1 = eps.pointsSame(a1, b1);
76497
+ var a2_equ_b2 = eps.pointsSame(a2, b2);
76498
+
76499
+ if (a1_equ_b1 && a2_equ_b2)
76500
+ return ev2; // segments are exactly equal
76501
+
76502
+ var a1_between = !a1_equ_b1 && eps.pointBetween(a1, b1, b2);
76503
+ var a2_between = !a2_equ_b2 && eps.pointBetween(a2, b1, b2);
76504
+
76505
+ // handy for debugging:
76506
+ // buildLog.log({
76507
+ // a1_equ_b1: a1_equ_b1,
76508
+ // a2_equ_b2: a2_equ_b2,
76509
+ // a1_between: a1_between,
76510
+ // a2_between: a2_between
76511
+ // });
76512
+
76513
+ if (a1_equ_b1){
76514
+ if (a2_between){
76515
+ // (a1)---(a2)
76516
+ // (b1)----------(b2)
76517
+ eventDivide(ev2, a2);
76518
+ }
76519
+ else{
76520
+ // (a1)----------(a2)
76521
+ // (b1)---(b2)
76522
+ eventDivide(ev1, b2);
76523
+ }
76524
+ return ev2;
76525
+ }
76526
+ else if (a1_between){
76527
+ if (!a2_equ_b2){
76528
+ // make a2 equal to b2
76529
+ if (a2_between){
76530
+ // (a1)---(a2)
76531
+ // (b1)-----------------(b2)
76532
+ eventDivide(ev2, a2);
76533
+ }
76534
+ else{
76535
+ // (a1)----------(a2)
76536
+ // (b1)----------(b2)
76537
+ eventDivide(ev1, b2);
76538
+ }
76539
+ }
76540
+
76541
+ // (a1)---(a2)
76542
+ // (b1)----------(b2)
76543
+ eventDivide(ev2, a1);
76544
+ }
76545
+ }
76546
+ else{
76547
+ // otherwise, lines intersect at i.pt, which may or may not be between the endpoints
76548
+
76549
+ // is A divided between its endpoints? (exclusive)
76550
+ if (i.alongA === 0){
76551
+ if (i.alongB === -1) // yes, at exactly b1
76552
+ eventDivide(ev1, b1);
76553
+ else if (i.alongB === 0) // yes, somewhere between B's endpoints
76554
+ eventDivide(ev1, i.pt);
76555
+ else if (i.alongB === 1) // yes, at exactly b2
76556
+ eventDivide(ev1, b2);
76557
+ }
76558
+
76559
+ // is B divided between its endpoints? (exclusive)
76560
+ if (i.alongB === 0){
76561
+ if (i.alongA === -1) // yes, at exactly a1
76562
+ eventDivide(ev2, a1);
76563
+ else if (i.alongA === 0) // yes, somewhere between A's endpoints (exclusive)
76564
+ eventDivide(ev2, i.pt);
76565
+ else if (i.alongA === 1) // yes, at exactly a2
76566
+ eventDivide(ev2, a2);
76567
+ }
76568
+ }
76569
+ return false;
76570
+ }
76571
+
76572
+ //
76573
+ // main event loop
76574
+ //
76575
+ var segments = [];
76576
+ while (!event_root.isEmpty()){
76577
+ var ev = event_root.getHead();
76578
+
76579
+ if (buildLog)
76580
+ buildLog.vert(ev.pt[0]);
76581
+
76582
+ if (ev.isStart){
76583
+
76584
+ if (buildLog)
76585
+ buildLog.segmentNew(ev.seg, ev.primary);
76586
+
76587
+ var surrounding = statusFindSurrounding(ev);
76588
+ var above = surrounding.before ? surrounding.before.ev : null;
76589
+ var below = surrounding.after ? surrounding.after.ev : null;
76590
+
76591
+ if (buildLog){
76592
+ buildLog.tempStatus(
76593
+ ev.seg,
76594
+ above ? above.seg : false,
76595
+ below ? below.seg : false
76596
+ );
76597
+ }
76598
+
76599
+ function checkBothIntersections(){
76600
+ if (above){
76601
+ var eve = checkIntersection(ev, above);
76602
+ if (eve)
76603
+ return eve;
76604
+ }
76605
+ if (below)
76606
+ return checkIntersection(ev, below);
76607
+ return false;
76608
+ }
76609
+
76610
+ var eve = checkBothIntersections();
76611
+ if (eve){
76612
+ // ev and eve are equal
76613
+ // we'll keep eve and throw away ev
76614
+
76615
+ // merge ev.seg's fill information into eve.seg
76616
+
76617
+ if (selfIntersection){
76618
+ var toggle; // are we a toggling edge?
76619
+ if (ev.seg.myFill.below === null)
76620
+ toggle = true;
76621
+ else
76622
+ toggle = ev.seg.myFill.above !== ev.seg.myFill.below;
76623
+
76624
+ // merge two segments that belong to the same polygon
76625
+ // think of this as sandwiching two segments together, where `eve.seg` is
76626
+ // the bottom -- this will cause the above fill flag to toggle
76627
+ if (toggle)
76628
+ eve.seg.myFill.above = !eve.seg.myFill.above;
76629
+ }
76630
+ else{
76631
+ // merge two segments that belong to different polygons
76632
+ // each segment has distinct knowledge, so no special logic is needed
76633
+ // note that this can only happen once per segment in this phase, because we
76634
+ // are guaranteed that all self-intersections are gone
76635
+ eve.seg.otherFill = ev.seg.myFill;
76636
+ }
76637
+
76638
+ if (buildLog)
76639
+ buildLog.segmentUpdate(eve.seg);
76640
+
76641
+ ev.other.remove();
76642
+ ev.remove();
76643
+ }
76644
+
76645
+ if (event_root.getHead() !== ev){
76646
+ // something was inserted before us in the event queue, so loop back around and
76647
+ // process it before continuing
76648
+ if (buildLog)
76649
+ buildLog.rewind(ev.seg);
76650
+ continue;
76651
+ }
76652
+
76653
+ //
76654
+ // calculate fill flags
76655
+ //
76656
+ if (selfIntersection){
76657
+ var toggle; // are we a toggling edge?
76658
+ if (ev.seg.myFill.below === null) // if we are a new segment...
76659
+ toggle = true; // then we toggle
76660
+ else // we are a segment that has previous knowledge from a division
76661
+ toggle = ev.seg.myFill.above !== ev.seg.myFill.below; // calculate toggle
76662
+
76663
+ // next, calculate whether we are filled below us
76664
+ if (!below){ // if nothing is below us...
76665
+ // we are filled below us if the polygon is inverted
76666
+ ev.seg.myFill.below = primaryPolyInverted;
76667
+ }
76668
+ else{
76669
+ // otherwise, we know the answer -- it's the same if whatever is below
76670
+ // us is filled above it
76671
+ ev.seg.myFill.below = below.seg.myFill.above;
76672
+ }
76673
+
76674
+ // since now we know if we're filled below us, we can calculate whether
76675
+ // we're filled above us by applying toggle to whatever is below us
76676
+ if (toggle)
76677
+ ev.seg.myFill.above = !ev.seg.myFill.below;
76678
+ else
76679
+ ev.seg.myFill.above = ev.seg.myFill.below;
76680
+ }
76681
+ else{
76682
+ // now we fill in any missing transition information, since we are all-knowing
76683
+ // at this point
76684
+
76685
+ if (ev.seg.otherFill === null){
76686
+ // if we don't have other information, then we need to figure out if we're
76687
+ // inside the other polygon
76688
+ var inside;
76689
+ if (!below){
76690
+ // if nothing is below us, then we're inside if the other polygon is
76691
+ // inverted
76692
+ inside =
76693
+ ev.primary ? secondaryPolyInverted : primaryPolyInverted;
76694
+ }
76695
+ else{ // otherwise, something is below us
76696
+ // so copy the below segment's other polygon's above
76697
+ if (ev.primary === below.primary)
76698
+ inside = below.seg.otherFill.above;
76699
+ else
76700
+ inside = below.seg.myFill.above;
76701
+ }
76702
+ ev.seg.otherFill = {
76703
+ above: inside,
76704
+ below: inside
76705
+ };
76706
+ }
76707
+ }
76708
+
76709
+ if (buildLog){
76710
+ buildLog.status(
76711
+ ev.seg,
76712
+ above ? above.seg : false,
76713
+ below ? below.seg : false
76714
+ );
76715
+ }
76716
+
76717
+ // insert the status and remember it for later removal
76718
+ ev.other.status = surrounding.insert(LinkedList.node({ ev: ev }));
76719
+ }
76720
+ else{
76721
+ var st = ev.status;
76722
+
76723
+ if (st === null){
76724
+ throw new Error('PolyBool: Zero-length segment detected; your epsilon is ' +
76725
+ 'probably too small or too large');
76726
+ }
76727
+
76728
+ // removing the status will create two new adjacent edges, so we'll need to check
76729
+ // for those
76730
+ if (status_root.exists(st.prev) && status_root.exists(st.next))
76731
+ checkIntersection(st.prev.ev, st.next.ev);
76732
+
76733
+ if (buildLog)
76734
+ buildLog.statusRemove(st.ev.seg);
76735
+
76736
+ // remove the status
76737
+ st.remove();
76738
+
76739
+ // if we've reached this point, we've calculated everything there is to know, so
76740
+ // save the segment for reporting
76741
+ if (!ev.primary){
76742
+ // make sure `seg.myFill` actually points to the primary polygon though
76743
+ var s = ev.seg.myFill;
76744
+ ev.seg.myFill = ev.seg.otherFill;
76745
+ ev.seg.otherFill = s;
76746
+ }
76747
+ segments.push(ev.seg);
76748
+ }
76749
+
76750
+ // remove the event and continue
76751
+ event_root.getHead().remove();
76752
+ }
76753
+
76754
+ if (buildLog)
76755
+ buildLog.done();
76756
+
76757
+ return segments;
76758
+ }
76759
+
76760
+ // return the appropriate API depending on what we're doing
76761
+ if (!selfIntersection){
76762
+ // performing combination of polygons, so only deal with already-processed segments
76763
+ return {
76764
+ calculate: function(segments1, inverted1, segments2, inverted2){
76765
+ // segmentsX come from the self-intersection API, or this API
76766
+ // invertedX is whether we treat that list of segments as an inverted polygon or not
76767
+ // returns segments that can be used for further operations
76768
+ segments1.forEach(function(seg){
76769
+ eventAddSegment(segmentCopy(seg.start, seg.end, seg), true);
76770
+ });
76771
+ segments2.forEach(function(seg){
76772
+ eventAddSegment(segmentCopy(seg.start, seg.end, seg), false);
76773
+ });
76774
+ return calculate(inverted1, inverted2);
76775
+ }
76776
+ };
76777
+ }
76778
+
76779
+ // otherwise, performing self-intersection, so deal with regions
76780
+ return {
76781
+ addRegion: function(region){
76782
+ // regions are a list of points:
76783
+ // [ [0, 0], [100, 0], [50, 100] ]
76784
+ // you can add multiple regions before running calculate
76785
+ var pt1;
76786
+ var pt2 = region[region.length - 1];
76787
+ for (var i = 0; i < region.length; i++){
76788
+ pt1 = pt2;
76789
+ pt2 = region[i];
76790
+
76791
+ var forward = eps.pointsCompare(pt1, pt2);
76792
+ if (forward === 0) // points are equal, so we have a zero-length segment
76793
+ continue; // just skip it
76794
+
76795
+ eventAddSegment(
76796
+ segmentNew(
76797
+ forward < 0 ? pt1 : pt2,
76798
+ forward < 0 ? pt2 : pt1
76799
+ ),
76800
+ true
76801
+ );
76802
+ }
76803
+ },
76804
+ calculate: function(inverted){
76805
+ // is the polygon inverted?
76806
+ // returns segments
76807
+ return calculate(inverted, false);
76808
+ }
76809
+ };
76810
+ }
76811
+
76812
+ module.exports = Intersecter;
76813
+
76814
+
76815
+ /***/ }),
76816
+
76817
+ /***/ 9186:
76818
+ /***/ (function(module) {
76819
+
76820
+ // (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
76821
+ // MIT License
76822
+ // Project Home: https://github.com/voidqk/polybooljs
76823
+
76824
+ //
76825
+ // simple linked list implementation that allows you to traverse down nodes and save positions
76826
+ //
76827
+
76828
+ var LinkedList = {
76829
+ create: function(){
76830
+ var my = {
76831
+ root: { root: true, next: null },
76832
+ exists: function(node){
76833
+ if (node === null || node === my.root)
76834
+ return false;
76835
+ return true;
76836
+ },
76837
+ isEmpty: function(){
76838
+ return my.root.next === null;
76839
+ },
76840
+ getHead: function(){
76841
+ return my.root.next;
76842
+ },
76843
+ insertBefore: function(node, check){
76844
+ var last = my.root;
76845
+ var here = my.root.next;
76846
+ while (here !== null){
76847
+ if (check(here)){
76848
+ node.prev = here.prev;
76849
+ node.next = here;
76850
+ here.prev.next = node;
76851
+ here.prev = node;
76852
+ return;
76853
+ }
76854
+ last = here;
76855
+ here = here.next;
76856
+ }
76857
+ last.next = node;
76858
+ node.prev = last;
76859
+ node.next = null;
76860
+ },
76861
+ findTransition: function(check){
76862
+ var prev = my.root;
76863
+ var here = my.root.next;
76864
+ while (here !== null){
76865
+ if (check(here))
76866
+ break;
76867
+ prev = here;
76868
+ here = here.next;
76869
+ }
76870
+ return {
76871
+ before: prev === my.root ? null : prev,
76872
+ after: here,
76873
+ insert: function(node){
76874
+ node.prev = prev;
76875
+ node.next = here;
76876
+ prev.next = node;
76877
+ if (here !== null)
76878
+ here.prev = node;
76879
+ return node;
76880
+ }
76881
+ };
76882
+ }
76883
+ };
76884
+ return my;
76885
+ },
76886
+ node: function(data){
76887
+ data.prev = null;
76888
+ data.next = null;
76889
+ data.remove = function(){
76890
+ data.prev.next = data.next;
76891
+ if (data.next)
76892
+ data.next.prev = data.prev;
76893
+ data.prev = null;
76894
+ data.next = null;
76895
+ };
76896
+ return data;
76897
+ }
76898
+ };
76899
+
76900
+ module.exports = LinkedList;
76901
+
76902
+
76903
+ /***/ }),
76904
+
76905
+ /***/ 9048:
76906
+ /***/ (function(module) {
76907
+
76908
+ // (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
76909
+ // MIT License
76910
+ // Project Home: https://github.com/voidqk/polybooljs
76911
+
76912
+ //
76913
+ // converts a list of segments into a list of regions, while also removing unnecessary verticies
76914
+ //
76915
+
76916
+ function SegmentChainer(segments, eps, buildLog){
76917
+ var chains = [];
76918
+ var regions = [];
76919
+
76920
+ segments.forEach(function(seg){
76921
+ var pt1 = seg.start;
76922
+ var pt2 = seg.end;
76923
+ if (eps.pointsSame(pt1, pt2)){
76924
+ console.warn('PolyBool: Warning: Zero-length segment detected; your epsilon is ' +
76925
+ 'probably too small or too large');
76926
+ return;
76927
+ }
76928
+
76929
+ if (buildLog)
76930
+ buildLog.chainStart(seg);
76931
+
76932
+ // search for two chains that this segment matches
76933
+ var first_match = {
76934
+ index: 0,
76935
+ matches_head: false,
76936
+ matches_pt1: false
76937
+ };
76938
+ var second_match = {
76939
+ index: 0,
76940
+ matches_head: false,
76941
+ matches_pt1: false
76942
+ };
76943
+ var next_match = first_match;
76944
+ function setMatch(index, matches_head, matches_pt1){
76945
+ // return true if we've matched twice
76946
+ next_match.index = index;
76947
+ next_match.matches_head = matches_head;
76948
+ next_match.matches_pt1 = matches_pt1;
76949
+ if (next_match === first_match){
76950
+ next_match = second_match;
76951
+ return false;
76952
+ }
76953
+ next_match = null;
76954
+ return true; // we've matched twice, we're done here
76955
+ }
76956
+ for (var i = 0; i < chains.length; i++){
76957
+ var chain = chains[i];
76958
+ var head = chain[0];
76959
+ var head2 = chain[1];
76960
+ var tail = chain[chain.length - 1];
76961
+ var tail2 = chain[chain.length - 2];
76962
+ if (eps.pointsSame(head, pt1)){
76963
+ if (setMatch(i, true, true))
76964
+ break;
76965
+ }
76966
+ else if (eps.pointsSame(head, pt2)){
76967
+ if (setMatch(i, true, false))
76968
+ break;
76969
+ }
76970
+ else if (eps.pointsSame(tail, pt1)){
76971
+ if (setMatch(i, false, true))
76972
+ break;
76973
+ }
76974
+ else if (eps.pointsSame(tail, pt2)){
76975
+ if (setMatch(i, false, false))
76976
+ break;
76977
+ }
76978
+ }
76979
+
76980
+ if (next_match === first_match){
76981
+ // we didn't match anything, so create a new chain
76982
+ chains.push([ pt1, pt2 ]);
76983
+ if (buildLog)
76984
+ buildLog.chainNew(pt1, pt2);
76985
+ return;
76986
+ }
76987
+
76988
+ if (next_match === second_match){
76989
+ // we matched a single chain
76990
+
76991
+ if (buildLog)
76992
+ buildLog.chainMatch(first_match.index);
76993
+
76994
+ // add the other point to the apporpriate end, and check to see if we've closed the
76995
+ // chain into a loop
76996
+
76997
+ var index = first_match.index;
76998
+ var pt = first_match.matches_pt1 ? pt2 : pt1; // if we matched pt1, then we add pt2, etc
76999
+ var addToHead = first_match.matches_head; // if we matched at head, then add to the head
77000
+
77001
+ var chain = chains[index];
77002
+ var grow = addToHead ? chain[0] : chain[chain.length - 1];
77003
+ var grow2 = addToHead ? chain[1] : chain[chain.length - 2];
77004
+ var oppo = addToHead ? chain[chain.length - 1] : chain[0];
77005
+ var oppo2 = addToHead ? chain[chain.length - 2] : chain[1];
77006
+
77007
+ if (eps.pointsCollinear(grow2, grow, pt)){
77008
+ // grow isn't needed because it's directly between grow2 and pt:
77009
+ // grow2 ---grow---> pt
77010
+ if (addToHead){
77011
+ if (buildLog)
77012
+ buildLog.chainRemoveHead(first_match.index, pt);
77013
+ chain.shift();
77014
+ }
77015
+ else{
77016
+ if (buildLog)
77017
+ buildLog.chainRemoveTail(first_match.index, pt);
77018
+ chain.pop();
77019
+ }
77020
+ grow = grow2; // old grow is gone... new grow is what grow2 was
77021
+ }
77022
+
77023
+ if (eps.pointsSame(oppo, pt)){
77024
+ // we're closing the loop, so remove chain from chains
77025
+ chains.splice(index, 1);
77026
+
77027
+ if (eps.pointsCollinear(oppo2, oppo, grow)){
77028
+ // oppo isn't needed because it's directly between oppo2 and grow:
77029
+ // oppo2 ---oppo--->grow
77030
+ if (addToHead){
77031
+ if (buildLog)
77032
+ buildLog.chainRemoveTail(first_match.index, grow);
77033
+ chain.pop();
77034
+ }
77035
+ else{
77036
+ if (buildLog)
77037
+ buildLog.chainRemoveHead(first_match.index, grow);
77038
+ chain.shift();
77039
+ }
77040
+ }
77041
+
77042
+ if (buildLog)
77043
+ buildLog.chainClose(first_match.index);
77044
+
77045
+ // we have a closed chain!
77046
+ regions.push(chain);
77047
+ return;
77048
+ }
77049
+
77050
+ // not closing a loop, so just add it to the apporpriate side
77051
+ if (addToHead){
77052
+ if (buildLog)
77053
+ buildLog.chainAddHead(first_match.index, pt);
77054
+ chain.unshift(pt);
77055
+ }
77056
+ else{
77057
+ if (buildLog)
77058
+ buildLog.chainAddTail(first_match.index, pt);
77059
+ chain.push(pt);
77060
+ }
77061
+ return;
77062
+ }
77063
+
77064
+ // otherwise, we matched two chains, so we need to combine those chains together
77065
+
77066
+ function reverseChain(index){
77067
+ if (buildLog)
77068
+ buildLog.chainReverse(index);
77069
+ chains[index].reverse(); // gee, that's easy
77070
+ }
77071
+
77072
+ function appendChain(index1, index2){
77073
+ // index1 gets index2 appended to it, and index2 is removed
77074
+ var chain1 = chains[index1];
77075
+ var chain2 = chains[index2];
77076
+ var tail = chain1[chain1.length - 1];
77077
+ var tail2 = chain1[chain1.length - 2];
77078
+ var head = chain2[0];
77079
+ var head2 = chain2[1];
77080
+
77081
+ if (eps.pointsCollinear(tail2, tail, head)){
77082
+ // tail isn't needed because it's directly between tail2 and head
77083
+ // tail2 ---tail---> head
77084
+ if (buildLog)
77085
+ buildLog.chainRemoveTail(index1, tail);
77086
+ chain1.pop();
77087
+ tail = tail2; // old tail is gone... new tail is what tail2 was
77088
+ }
77089
+
77090
+ if (eps.pointsCollinear(tail, head, head2)){
77091
+ // head isn't needed because it's directly between tail and head2
77092
+ // tail ---head---> head2
77093
+ if (buildLog)
77094
+ buildLog.chainRemoveHead(index2, head);
77095
+ chain2.shift();
77096
+ }
77097
+
77098
+ if (buildLog)
77099
+ buildLog.chainJoin(index1, index2);
77100
+ chains[index1] = chain1.concat(chain2);
77101
+ chains.splice(index2, 1);
77102
+ }
77103
+
77104
+ var F = first_match.index;
77105
+ var S = second_match.index;
77106
+
77107
+ if (buildLog)
77108
+ buildLog.chainConnect(F, S);
77109
+
77110
+ var reverseF = chains[F].length < chains[S].length; // reverse the shorter chain, if needed
77111
+ if (first_match.matches_head){
77112
+ if (second_match.matches_head){
77113
+ if (reverseF){
77114
+ // <<<< F <<<< --- >>>> S >>>>
77115
+ reverseChain(F);
77116
+ // >>>> F >>>> --- >>>> S >>>>
77117
+ appendChain(F, S);
77118
+ }
77119
+ else{
77120
+ // <<<< F <<<< --- >>>> S >>>>
77121
+ reverseChain(S);
77122
+ // <<<< F <<<< --- <<<< S <<<< logically same as:
77123
+ // >>>> S >>>> --- >>>> F >>>>
77124
+ appendChain(S, F);
77125
+ }
77126
+ }
77127
+ else{
77128
+ // <<<< F <<<< --- <<<< S <<<< logically same as:
77129
+ // >>>> S >>>> --- >>>> F >>>>
77130
+ appendChain(S, F);
77131
+ }
77132
+ }
77133
+ else{
77134
+ if (second_match.matches_head){
77135
+ // >>>> F >>>> --- >>>> S >>>>
77136
+ appendChain(F, S);
77137
+ }
77138
+ else{
77139
+ if (reverseF){
77140
+ // >>>> F >>>> --- <<<< S <<<<
77141
+ reverseChain(F);
77142
+ // <<<< F <<<< --- <<<< S <<<< logically same as:
77143
+ // >>>> S >>>> --- >>>> F >>>>
77144
+ appendChain(S, F);
77145
+ }
77146
+ else{
77147
+ // >>>> F >>>> --- <<<< S <<<<
77148
+ reverseChain(S);
77149
+ // >>>> F >>>> --- >>>> S >>>>
77150
+ appendChain(F, S);
77151
+ }
77152
+ }
77153
+ }
77154
+ });
77155
+
77156
+ return regions;
77157
+ }
77158
+
77159
+ module.exports = SegmentChainer;
77160
+
77161
+
77162
+ /***/ }),
77163
+
77164
+ /***/ 571:
77165
+ /***/ (function(module) {
77166
+
77167
+ // (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
77168
+ // MIT License
77169
+ // Project Home: https://github.com/voidqk/polybooljs
77170
+
77171
+ //
77172
+ // filter a list of segments based on boolean operations
77173
+ //
77174
+
77175
+ function select(segments, selection, buildLog){
77176
+ var result = [];
77177
+ segments.forEach(function(seg){
77178
+ var index =
77179
+ (seg.myFill.above ? 8 : 0) +
77180
+ (seg.myFill.below ? 4 : 0) +
77181
+ ((seg.otherFill && seg.otherFill.above) ? 2 : 0) +
77182
+ ((seg.otherFill && seg.otherFill.below) ? 1 : 0);
77183
+ if (selection[index] !== 0){
77184
+ // copy the segment to the results, while also calculating the fill status
77185
+ result.push({
77186
+ id: buildLog ? buildLog.segmentId() : -1,
77187
+ start: seg.start,
77188
+ end: seg.end,
77189
+ myFill: {
77190
+ above: selection[index] === 1, // 1 if filled above
77191
+ below: selection[index] === 2 // 2 if filled below
77192
+ },
77193
+ otherFill: null
77194
+ });
77195
+ }
77196
+ });
77197
+
77198
+ if (buildLog)
77199
+ buildLog.selected(result);
77200
+
77201
+ return result;
77202
+ }
77203
+
77204
+ var SegmentSelector = {
77205
+ union: function(segments, buildLog){ // primary | secondary
77206
+ // above1 below1 above2 below2 Keep? Value
77207
+ // 0 0 0 0 => no 0
77208
+ // 0 0 0 1 => yes filled below 2
77209
+ // 0 0 1 0 => yes filled above 1
77210
+ // 0 0 1 1 => no 0
77211
+ // 0 1 0 0 => yes filled below 2
77212
+ // 0 1 0 1 => yes filled below 2
77213
+ // 0 1 1 0 => no 0
77214
+ // 0 1 1 1 => no 0
77215
+ // 1 0 0 0 => yes filled above 1
77216
+ // 1 0 0 1 => no 0
77217
+ // 1 0 1 0 => yes filled above 1
77218
+ // 1 0 1 1 => no 0
77219
+ // 1 1 0 0 => no 0
77220
+ // 1 1 0 1 => no 0
77221
+ // 1 1 1 0 => no 0
77222
+ // 1 1 1 1 => no 0
77223
+ return select(segments, [
77224
+ 0, 2, 1, 0,
77225
+ 2, 2, 0, 0,
77226
+ 1, 0, 1, 0,
77227
+ 0, 0, 0, 0
77228
+ ], buildLog);
77229
+ },
77230
+ intersect: function(segments, buildLog){ // primary & secondary
77231
+ // above1 below1 above2 below2 Keep? Value
77232
+ // 0 0 0 0 => no 0
77233
+ // 0 0 0 1 => no 0
77234
+ // 0 0 1 0 => no 0
77235
+ // 0 0 1 1 => no 0
77236
+ // 0 1 0 0 => no 0
77237
+ // 0 1 0 1 => yes filled below 2
77238
+ // 0 1 1 0 => no 0
77239
+ // 0 1 1 1 => yes filled below 2
77240
+ // 1 0 0 0 => no 0
77241
+ // 1 0 0 1 => no 0
77242
+ // 1 0 1 0 => yes filled above 1
77243
+ // 1 0 1 1 => yes filled above 1
77244
+ // 1 1 0 0 => no 0
77245
+ // 1 1 0 1 => yes filled below 2
77246
+ // 1 1 1 0 => yes filled above 1
77247
+ // 1 1 1 1 => no 0
77248
+ return select(segments, [
77249
+ 0, 0, 0, 0,
77250
+ 0, 2, 0, 2,
77251
+ 0, 0, 1, 1,
77252
+ 0, 2, 1, 0
77253
+ ], buildLog);
77254
+ },
77255
+ difference: function(segments, buildLog){ // primary - secondary
77256
+ // above1 below1 above2 below2 Keep? Value
77257
+ // 0 0 0 0 => no 0
77258
+ // 0 0 0 1 => no 0
77259
+ // 0 0 1 0 => no 0
77260
+ // 0 0 1 1 => no 0
77261
+ // 0 1 0 0 => yes filled below 2
77262
+ // 0 1 0 1 => no 0
77263
+ // 0 1 1 0 => yes filled below 2
77264
+ // 0 1 1 1 => no 0
77265
+ // 1 0 0 0 => yes filled above 1
77266
+ // 1 0 0 1 => yes filled above 1
77267
+ // 1 0 1 0 => no 0
77268
+ // 1 0 1 1 => no 0
77269
+ // 1 1 0 0 => no 0
77270
+ // 1 1 0 1 => yes filled above 1
77271
+ // 1 1 1 0 => yes filled below 2
77272
+ // 1 1 1 1 => no 0
77273
+ return select(segments, [
77274
+ 0, 0, 0, 0,
77275
+ 2, 0, 2, 0,
77276
+ 1, 1, 0, 0,
77277
+ 0, 1, 2, 0
77278
+ ], buildLog);
77279
+ },
77280
+ differenceRev: function(segments, buildLog){ // secondary - primary
77281
+ // above1 below1 above2 below2 Keep? Value
77282
+ // 0 0 0 0 => no 0
77283
+ // 0 0 0 1 => yes filled below 2
77284
+ // 0 0 1 0 => yes filled above 1
77285
+ // 0 0 1 1 => no 0
77286
+ // 0 1 0 0 => no 0
77287
+ // 0 1 0 1 => no 0
77288
+ // 0 1 1 0 => yes filled above 1
77289
+ // 0 1 1 1 => yes filled above 1
77290
+ // 1 0 0 0 => no 0
77291
+ // 1 0 0 1 => yes filled below 2
77292
+ // 1 0 1 0 => no 0
77293
+ // 1 0 1 1 => yes filled below 2
77294
+ // 1 1 0 0 => no 0
77295
+ // 1 1 0 1 => no 0
77296
+ // 1 1 1 0 => no 0
77297
+ // 1 1 1 1 => no 0
77298
+ return select(segments, [
77299
+ 0, 2, 1, 0,
77300
+ 0, 0, 1, 1,
77301
+ 0, 2, 0, 2,
77302
+ 0, 0, 0, 0
77303
+ ], buildLog);
77304
+ },
77305
+ xor: function(segments, buildLog){ // primary ^ secondary
77306
+ // above1 below1 above2 below2 Keep? Value
77307
+ // 0 0 0 0 => no 0
77308
+ // 0 0 0 1 => yes filled below 2
77309
+ // 0 0 1 0 => yes filled above 1
77310
+ // 0 0 1 1 => no 0
77311
+ // 0 1 0 0 => yes filled below 2
77312
+ // 0 1 0 1 => no 0
77313
+ // 0 1 1 0 => no 0
77314
+ // 0 1 1 1 => yes filled above 1
77315
+ // 1 0 0 0 => yes filled above 1
77316
+ // 1 0 0 1 => no 0
77317
+ // 1 0 1 0 => no 0
77318
+ // 1 0 1 1 => yes filled below 2
77319
+ // 1 1 0 0 => no 0
77320
+ // 1 1 0 1 => yes filled above 1
77321
+ // 1 1 1 0 => yes filled below 2
77322
+ // 1 1 1 1 => no 0
77323
+ return select(segments, [
77324
+ 0, 2, 1, 0,
77325
+ 2, 0, 0, 1,
77326
+ 1, 0, 0, 2,
77327
+ 0, 1, 2, 0
77328
+ ], buildLog);
77329
+ }
77330
+ };
77331
+
77332
+ module.exports = SegmentSelector;
77333
+
77334
+
74521
77335
  /***/ }),
74522
77336
 
74523
77337
  /***/ 6886:
@@ -83957,6 +86771,38 @@ module.exports = styleTagTransform;
83957
86771
 
83958
86772
  /***/ }),
83959
86773
 
86774
+ /***/ 4144:
86775
+ /***/ (function(module) {
86776
+
86777
+ "use strict";
86778
+ module.exports = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAsMTFsMTEsMGwwLC0xMWwyLDBsMCwxMWwxMSwwbDAsMmwtMTEsMGwwLDExbC0yLDBsMCwtMTFsLTExLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+CjxwYXRoIGQ9Ik0yNCwyN2w4LDBsMCwybC04LDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+Cjwvc3ZnPgo=";
86779
+
86780
+ /***/ }),
86781
+
86782
+ /***/ 237:
86783
+ /***/ (function(module) {
86784
+
86785
+ "use strict";
86786
+ module.exports = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAsMTFsMTEsMGwwLC0xMWwyLDBsMCwxMWwxMSwwbDAsMmwtMTEsMGwwLDExbC0yLDBsMCwtMTFsLTExLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+CjxwYXRoIGQ9Ik0yNCwyN2wzLDBsMCwtM2wyLDBsMCwzbDMsMGwwLDJsLTMsMGwwLDNsLTIsMGwwLC0zbC0zLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+Cjwvc3ZnPgo=";
86787
+
86788
+ /***/ }),
86789
+
86790
+ /***/ 3554:
86791
+ /***/ (function(module) {
86792
+
86793
+ "use strict";
86794
+ module.exports = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAsMTFsMTEsMGwwLC0xMWwyLDBsMCwxMWwxMSwwbDAsMmwtMTEsMGwwLDExbC0yLDBsMCwtMTFsLTExLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+CjxwYXRoIGQ9Ik0yNCwzMmwwLC00YTQsNCwwLDAsMSw4LDBsMCw0bC0yLDBsMCwtNGEyLDIsMCwwLDAsLTQsMGwwLDR6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+Cjwvc3ZnPgo=";
86795
+
86796
+ /***/ }),
86797
+
86798
+ /***/ 9490:
86799
+ /***/ (function(module) {
86800
+
86801
+ "use strict";
86802
+ module.exports = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAsMTFsMTEsMGwwLC0xMWwyLDBsMCwxMWwxMSwwbDAsMmwtMTEsMGwwLDExbC0yLDBsMCwtMTFsLTExLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+CjxwYXRoIGQ9Ik0zMiwzMC41OWwtMS40MSwxLjQxbC0yLjEyLC0yLjEybC0yLjEyLDIuMTJsLTEuNDEsLTEuNDFsMi4xMiwtMi4xMmwtMi4xMiwtMi4xMmwxLjQxLC0xLjQxbDIuMTIsMi4xMmwyLjEyLC0yLjEybDEuNDEsMS40MWwtMi4xMiwyLjEyeiIgZmlsbD0iYmxhY2siIHN0cm9rZS13aWR0aD0iMCIvPgo8L3N2Zz4K";
86803
+
86804
+ /***/ }),
86805
+
83960
86806
  /***/ 9990:
83961
86807
  /***/ (function(module) {
83962
86808
 
@@ -84013,6 +86859,9 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__3877__;
84013
86859
  /******/ return module.exports;
84014
86860
  /******/ }
84015
86861
  /******/
86862
+ /******/ // expose the modules object (__webpack_modules__)
86863
+ /******/ __webpack_require__.m = __webpack_modules__;
86864
+ /******/
84016
86865
  /************************************************************************/
84017
86866
  /******/ /* webpack/runtime/compat get default export */
84018
86867
  /******/ !function() {
@@ -84066,6 +86915,38 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__3877__;
84066
86915
  /******/ };
84067
86916
  /******/ }();
84068
86917
  /******/
86918
+ /******/ /* webpack/runtime/jsonp chunk loading */
86919
+ /******/ !function() {
86920
+ /******/ __webpack_require__.b = document.baseURI || self.location.href;
86921
+ /******/
86922
+ /******/ // object to store loaded and loading chunks
86923
+ /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
86924
+ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
86925
+ /******/ var installedChunks = {
86926
+ /******/ 387: 0,
86927
+ /******/ 93: 0
86928
+ /******/ };
86929
+ /******/
86930
+ /******/ // no chunk on demand loading
86931
+ /******/
86932
+ /******/ // no prefetching
86933
+ /******/
86934
+ /******/ // no preloaded
86935
+ /******/
86936
+ /******/ // no HMR
86937
+ /******/
86938
+ /******/ // no HMR manifest
86939
+ /******/
86940
+ /******/ // no on chunks loaded
86941
+ /******/
86942
+ /******/ // no jsonp function
86943
+ /******/ }();
86944
+ /******/
86945
+ /******/ /* webpack/runtime/nonce */
86946
+ /******/ !function() {
86947
+ /******/ __webpack_require__.nc = undefined;
86948
+ /******/ }();
86949
+ /******/
84069
86950
  /************************************************************************/
84070
86951
  /******/
84071
86952
  /******/ // startup