/**
  * @classdesc
  * An asynchronous client-side geometry engine for testing, measuring, and analyzing the spatial relationship
  * between two or more 2D geometries. Read the following blog series to learn more about GeometryEngine:
  * * [ArcGIS Blog - GeometryEngine: Testing spatial relationships and editing](https://blogs.esri.com/esri/arcgis/2015/09/09/geometryengine-part-1-testing-spatial-relationships-and-editing/)
  * * [ArcGIS Blog - GeometryEngine: Measurement](https://blogs.esri.com/esri/arcgis/2015/09/16/geometryengine-part-2-measurement/)
  * * [ArcGIS Blog - GeometryEngine: Overlay analysis](https://blogs.esri.com/esri/arcgis/2015/09/23/geometryengine-part-3-overlay-analysis/)
  *
  * @module esri/geometry/geometryEngineAsync
  * @since 4.0
  * @see [Sample - Chaining Promises](../sample-code/chaining-promises/index.html)
  * @see module:esri/geometry/geometryEngine
  */





/**
  * Creates planar (or Euclidean) buffer polygons at a specified distance around the input geometries.
  *
  * The GeometryEngine has two methods for buffering geometries client-side: buffer and [geodesicBuffer](#geodesicBuffer).
  * Use caution when
  * deciding which method to use. As a general rule, use [geodesicBuffer](#geodesicBuffer) if the input geometries
  * have a spatial reference of either WGS84 (wkid: 4326) or {@link module:esri/geometry/SpatialReference#isWebMercator Web Mercator}. Only use buffer (this method)
  * when attempting to buffer geometries with a [projected coordinate system](http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#/Projected_coordinate_systems/02r3000000vt000000/) other than Web Mercator. If you need to buffer geometries
  * with a [geographic coordinate system](http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#/Geographic_coordinate_systems/02r300000105000000/) other than WGS84 (wkid: 4326), use
  * {@link module:esri/tasks/GeometryService#buffer GeometryService.buffer()}.
  *
  * @method buffer
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {(module:esri/geometry/Geometry | module:esri/geometry/Geometry[])} geometry - The buffer input geometry.
  *        The `geometry` and `distance` parameters must be specified as either both arrays or
  *        both non-arrays. Never specify one as an array and the other a non-array.
  * @param {(number|Array<number>)} distance - The specified distance(s) for buffering.
  *        The `geometry` and `distance` parameters must be specified as either both arrays or
  *        both non-arrays. Never specify one as an array and the other a non-array.
  *        <br><br>When using an array of geometries as input, the length of the geometry array does not have to
  *        equal the length of the `distance` array. For example, if you pass an array of four geometries:
  *        `[g1, g2, g3, g4]` and an array with one distance: `[d1]`, all four geometries will be buffered by the
  *        single distance value. If instead you use an array of three distances: `[d1, d2, d3]`, `g1` will be buffered by
  *        `d1`, `g2` by `d2`, and `g3` and `g4` will both be buffered by `d3`. The value of the geometry array will
  *        be matched one to one with those in the distance array until the final value of the distance array is reached,
  *        in which case that value will be applied to the remaining geometries.
  * @param {string | number} unit - Measurement unit of the distance(s).
  *        Defaults to the units of the input geometries.
  *        Use one of the possible values listed below or any of the
  *        [numeric codes for linear units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.LinearUnit.Code.CENTIMETER).
  *        <br><br>**Possible Values:** meters | feet | kilometers | miles | nautical-miles | yards
  * @param {boolean} [unionResults=false] - Determines whether the output geometries should be unioned into a single
  *        polygon.
  *
  * @return {Promise<module:esri/geometry/Polygon|module:esri/geometry/Polygon[]>} When resolved, the response is the resulting buffer(s).
  * The result will be an array if an array of geometries is used as input. It will be a single polygon if
  * a single geometry is input into the function.
  *
  * @see {@link module:esri/geometry/geometryEngine#buffer geometryEngine.buffer()}
  * @see {@link module:esri/geometry/geometryEngine#geodesicBuffer geometryEngine.geodesicBuffer()}
  * @see {@link module:esri/geometry/geometryEngineAsync#geodesicBuffer geometryEngineAsync.geodesicBuffer()}
  *
  * @example
  * // point is a Point geometry
  * geometryEngineAsync.buffer(point, 1000, "feet").then(function(response){
  *   console.log(response);   // response is a polygon geometry of a 1000ft buffer around the input point
  * });
  *
  *
  *
  */

/**
  * Calculates the clipped geometry from a target geometry by an envelope.
  *
  * @method clip
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The geometry to be clipped.
  * @param {module:esri/geometry/Extent} envelope - The envelope used to clip.
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the clipped geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#clip geometryEngine.clip()}
  *
  */

/**
  * Creates geodesic buffer polygons at a specified distance around the input geometries. When calculating distances,
  * this method takes the curvature of the earth into account, which provides highly accurate results when dealing with
  * very large geometries and/or geometries that spatially vary on a global scale where one projected coordinate
  * system could not accurately plot coordinates and measure distances for all the geometries.
  *
  * This method only works with WGS84 (wkid: 4326) and {@link module:esri/geometry/SpatialReference#isWebMercator Web Mercator} spatial references. In general,
  * if your input geometries are assigned one of those two spatial references, you should always use geodesicBuffer() to
  * obtain the most accurate results for those geometries. If needing to buffer points assigned a [projected coordinate
  * system other than Web Mercator](http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#/Projected_coordinate_systems/02r3000000vt000000/), use [buffer()](#buffer) instead. If the input geometries
  * have a [geographic coordinate system](http://resources.arcgis.com/en/help/arcgis-rest-api/index.html#/Geographic_coordinate_systems/02r300000105000000/) other than WGS84 (wkid: 4326), use
  * {@link module:esri/tasks/GeometryService#buffer GeometryService.buffer()}.
  *
  * @method geodesicBuffer
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {(module:esri/geometry/Geometry | module:esri/geometry/Geometry[])} geometry - The buffer input geometry.
  *        The `geometry` and `distance` parameters must be specified as either both arrays or
  *        both non-arrays. Never specify one as an array and the other a non-array.
  * @param {(number|Array<number>)} distance - The specified distance(s) for buffering.
  *        The `geometry` and `distance` parameters must be specified as either both arrays or
  *        both non-arrays. Never specify one as an array and the other a non-array.
  *        <br><br>When using an array of geometries as input, the length of the geometry array does not have to
  *        equal the length of the `distance` array. For example, if you pass an array of four geometries:
  *        `[g1, g2, g3, g4]` and an array with one distance: `[d1]`, all four geometries will be buffered by the
  *        single distance value. If instead you use an array of three distances: `[d1, d2, d3]`, `g1` will be buffered by
  *        `d1`, `g2` by `d2`, and `g3` and `g4` will both be buffered by `d3`. The value of the geometry array will
  *        be matched one to one with those in the distance array until the final value of the distance array is reached,
  *        in which case that value will be applied to the remaining geometries.
  * @param {string | number} unit - Measurement unit of the distance(s).
  *        Defaults to the units of the input geometries.
  *        Use one of the possible values listed below or any of the
  *        [numeric codes for linear units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.LinearUnit.Code.CENTIMETER).
  *        <br><br>**Possible Values:** meters | feet | kilometers | miles | nautical-miles | yards
  * @param {boolean} [unionResults=false] - Determines whether the output geometries should be unioned into a single
  *        polygon.
  *
  * @return {Promise<module:esri/geometry/Polygon|module:esri/geometry/Polygon[]>} When resolved, the response is the resulting buffer(s).
  * The result will be an array if an array of geometries is used as input. It will be a single polygon if
  * a single geometry is input into the function.
  *
  * @see {@link module:esri/geometry/geometryEngine#geodesicBuffer geometryEngine.geodesicBuffer()}
  * @see {@link module:esri/geometry/geometryEngine#buffer geometryEngine.buffer()}
  *
  * @example
  * // point is a Point geometry
  * geometryEngineAsync.geodesicBuffer(point, 1000, "kilometers").then(function(buffer){
  *   // buffer is a polygon representing a 1000ft buffer around the input point
  *   console.log(buffer);
  * });
  */

/**
  * Indicates if one geometry contains another geometry.
  *
  * @method contains
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} containerGeometry - The geometry that is tested for the "contains" relationship to the other geometry.
  *   Think of this geometry as the potential "container" of the `insideGeometry`.
  * @param {module:esri/geometry/Geometry} insideGeometry - The geometry that is tested for the "within" relationship to the `containerGeometry`.
  *
  * @return {Promise<Boolean>} Response is `true` if the `containerGeometry` contains the `insideGeometry`.
  *
  * @see {@link module:esri/geometry/geometryEngine#contains geometryEngine.contains()}
  *
  */

/**
  * Calculates the convex hull of the input geometry. A convex hull is the smallest convex polygon that encloses a group of Objects,
  * such as points. The input geometry can be a point, multipoint, polyline or polygon. The hull is typically a polygon but can also
  * be a polyline or point in degenerate cases.
  *
  * @method convexHull
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The input geometry.
  * @param {boolean=} merge - Dictates whether to merge output geometries.
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is usually a Polygon geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#convexHull geometryEngine.convexHull()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Indicates if one geometry crosses another geometry.
  *
  * @method crosses
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry1 - The geometry to cross.
  * @param {module:esri/geometry/Geometry} geometry2 - The geometry being crossed.
  *
  * @return {Promise<Boolean>} Responds `true` if geometry1 crosses geometry2.
  *
  * @see {@link module:esri/geometry/geometryEngine#crosses geometryEngine.crosses()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Split the input Polyline or Polygon where it crosses a cutting Polyline. For Polylines, all left cuts are
  * grouped together in the first Geometry. Right cuts and coincident cuts are grouped in the second Geometry and
  * each undefined cut, along with any uncut parts, are output as separate Polylines. For Polygons, all left cuts
  * are grouped in the first Polygon, all right cuts are grouped in the second Polygon, and each undefined cut, along with
  * any left-over parts after cutting, are output as a separate Polygon. If no cuts are returned then the array will
  * be empty. An undefined cut will only be produced if a left cut or right cut was produced and there was a part
  * left over after cutting, or a cut is bounded to the left and right of the cutter.
  *
  * @method cut
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The geometry to be cut.
  * @param {module:esri/geometry/Polyline} cutter - The polyline to cut the geometry.
  *
  * @return {Promise<module:esri/geometry/Geometry[]>} When resolved, response is an array of geometries created by cutting the input geometry with the cutter.
  *
  * @see {@link module:esri/geometry/geometryEngine#cut geometryEngine.cut()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Densify geometries by plotting points between existing vertices.
  *
  * @method densify
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The geometry to be densified.
  * @param {number} maxSegmentLength - The maximum segment length allowed. Must be a positive value.
  * @param {string | number} maxSegmentLengthUnit - Measurement unit for maxSegmentLength.
  * Defaults to the units of the input geometry.
  * Use one of the possible values listed below or any of the
  * [numeric codes for linear units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.LinearUnit.Code.CENTIMETER).
  * <br><br>**Possible Values:** meters | feet | kilometers | miles | nautical-miles | yards
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the densified geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#densify geometryEngine.densify()}
  * @see [geodesicDensify()](#geodesicDensify)
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Creates the difference of two geometries. The resultant geometry is the portion of inputGeometry not in the subtractor.
  * The dimension of the subtractor has to be equal to or greater than that of the inputGeometry.
  *
  * @method difference
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {(module:esri/geometry/Geometry | module:esri/geometry/Geometry[])} inputGeometry - The input geometry to subtract from.
  * @param {module:esri/geometry/Geometry} subtractor - The geometry being subtracted from inputGeometry.
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the geometry of inputGeometry minus the subtractor geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#difference geometryEngine.difference()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Indicates if one geometry is disjoint (doesn't intersect in any way) with another geometry.
  *
  * @method disjoint
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry1 - The base geometry that is tested for the "disjoint" relationship to the other geometry.
  * @param {module:esri/geometry/Geometry} geometry2 - The comparison geometry that is tested for the "disjoint" relationship to the other geometry.
  *
  * @return {Promise<Boolean>} When resolved, response is `true` if geometry1 and geometry2 are disjoint (don't intersect in any way).
  *
  * @see {@link module:esri/geometry/geometryEngine#disjoint geometryEngine.disjoint()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Calculates the shortest planar distance between two geometries. Distance is reported in the linear units specified by
  * `distanceUnit` or, if `distanceUnit` is null, the units of the spatialReference of input geometry.
  *
  * ::: esri-md class="panel trailer-1"
  * To calculate the geodesic distance between two points, first construct a
  * {@link module:esri/geometry/Polyline} using the two points of interest as the beginning
  * and ending points of a single path. Then use the polyline as input for the
  * [geodesicLength()](#geodesicLength) method.
  * :::
  *
  * @method distance
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry1 - First input geometry.
  * @param {module:esri/geometry/Geometry} geometry2 - Second input geometry.
  * @param {string | number} distanceUnit - Measurement unit of the return value.
  * Defaults to the units of the input geometries.
  * Use one of the possible values listed below or any of the
  * [numeric codes for linear units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.LinearUnit.Code.CENTIMETER).
  * <br><br>**Possible Values:** meters | feet | kilometers | miles | nautical-miles | yards
  *
  * @return {Promise<Number>} When resolved, response is the distance between the two input geometries.
  *
  * @see {@link module:esri/geometry/geometryEngine#distance geometryEngine.distance()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Indicates if two geometries are equal.
  *
  * @method equals
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry1 - First input geometry.
  * @param {module:esri/geometry/Geometry} geometry2 - Second input geometry.
  *
  * @return {Promise<Boolean>} When resolved, responds with `true` if the two input geometries are equal.
  *
  * @see {@link module:esri/geometry/geometryEngine#equals geometryEngine.equals()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Returns an Object containing additional information about the input spatial reference.
  *
  * @method extendedSpatialReferenceInfo
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/SpatialReference} spatialReference - The input spatial reference.
  *
  * @return {Promise<Object>} When resolved, response is an Object with the following properties:
  *
  * ```
  * {
  *   tolerance: <Number>,
  *   unitBaseFactor: <Number>,
  *   unitID: <Number>,
  *   unitSquareDerivative: <Number>,
  *   unitType: <Number>
  * }
  * ```
  *
  * @see {@link module:esri/geometry/geometryEngine#extendedSpatialReferenceInfo geometryEngine.extendedSpatialReferenceInfo()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Flips a geometry on the horizontal axis. Can optionally be flipped around a point.
  *
  * @method flipHorizontal
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The input geometry to be flipped.
  * @param {module:esri/geometry/Point=} flipOrigin - Point to flip the geometry around. Defaults to the centroid of the geometry.
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the flipped geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#flipHorizontal geometryEngine.flipHorizontal()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Flips a geometry on the vertical axis. Can optionally be flipped around a point.
  *
  * @method flipVertical
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The input geometry to be flipped.
  * @param {module:esri/geometry/Point=} flipOrigin - Point to flip the geometry around. Defaults to the centroid of the geometry.
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the flipped geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#flipVertical geometryEngine.flipVertical()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Performs the generalize operation on the geometries in the cursor. Point and Multipoint geometries are left unchanged.
  * Envelope is converted to a Polygon and then generalized.
  *
  * @method generalize
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The input geometry to be generalized.
  * @param {number} maxDeviation - The maximum allowed deviation from the generalized geometry to the original geometry.
  * @param {boolean=} removeDegenerateParts - When `true` the degenerate parts of the geometry will
  * be removed from the output (may be undesired for drawing).
  * @param {(string | number)=} maxDeviationUnit - Measurement unit for maxDeviation.
  * Defaults to the units of the input geometry.
  * Use one of the possible values listed below or any of the
  * [numeric codes for linear units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.LinearUnit.Code.CENTIMETER).
  * <br><br>**Possible Values:** meters | feet | kilometers | miles | nautical-miles | yards
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the generalized geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#generalize geometryEngine.generalize()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Calculates the area of the input geometry. As opposed to [planarArea()](#planarArea), geodesicArea takes into account
  * the curvature of the earth when performing this calculation. Therefore, when using input geometries with a
  * spatial reference of either WGS84 (wkid: 4326) or {@link module:esri/geometry/SpatialReference#isWebMercator Web Mercator}, it is best practice to
  * calculate areas using geodesicArea(). If the input geometries have a projected coordinate system other than
  * Web Mercator, use [planarArea()](#planarArea) instead.
  *
  * This method only works with WGS84 (wkid: 4326) and {@link module:esri/geometry/SpatialReference#isWebMercator Web Mercator} spatial references.
  *
  * @method geodesicArea
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Polygon} geometry - The input polygon.
  * @param {string | number} unit - Measurement unit of the return value.
  * Defaults to the units of the input geometries.
  * Use one of the possible values listed below or any of the
  * [numeric codes for area units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.AreaUnit.Code.ACRE).
  * <br><br>**Possible Values:** acres | ares | hectares | square-feet | square-meters | square-yards |
  * square-kilometers | square-miles
  *
  * @return {Promise<Number>} When resolved, response is the area of the input geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#geodesicArea geometryEngine.geodesicArea()}
  *
  */


/**
* Returns a geodesically densified version of the input geometry. Use this function to draw the line(s) of the geometry along great circles.
*
* @method geodesicDensify
* @memberof module:esri/geometry/geometryEngineAsync
* @instance
*
* @param {module:esri/geometry/Polyline | module:esri/geometry/Polygon} geometry - A polyline or polygon to densify.
* @param {number} maxSegmentLength - The maximum segment length allowed. This must be a positive value.
* @param {string|number} maxSegmentLengthUnit - Measurement unit for `maxSegmentLength`.
* If a unit is not specified, the units are considered to be the same as the units of the `geometry`.
* Use one of the possible values listed below or any of the
* [numeric codes for linear units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.LinearUnit.Code.CENTIMETER).
* <br><br>**Possible Values:** meters | feet | kilometers | miles | nautical-miles | yards
*
* @return {Promise<module:esri/geometry/Geometry>} Resolves to the densified geometry.
*
* @example
* // lineGeom is a line geometry
* geometryEngineAsync.geodesicDensify(lineGeom, 10000).then(function(response){
*   // Response is the densified version of lineGeom
* });
*
* @see {@link module:esri/geometry/geometryEngine#geodesicDensify geometryEngine.geodesicDensify()}
*
*
*
*
*/

/**
  * Calculates the length of the input geometry. As opposed to [planarLength()](#planarLength), geodesicLength() takes into account
  * the curvature of the earth when performing this calculation. Therefore, when using input geometries with a
  * spatial reference of either WGS84 (wkid: 4326) or {@link module:esri/geometry/SpatialReference#isWebMercator Web Mercator}, it is best practice to
  * calculate lengths using geodesicLength(). If the input geometries have a projected coordinate system other than
  * Web Mercator, use [planarLength()](#planarLength) instead.
  *
  * This method only works with WGS84 (wkid: 4326) and {@link module:esri/geometry/SpatialReference#isWebMercator Web Mercator} spatial references.
  *
  * @method geodesicLength
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The input geometry.
  * @param {string | number} unit - Measurement unit of the return value.
  * Defaults to the units of the input geometry.
  * Use one of the possible values listed below or any of the
  * [numeric codes for linear units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.LinearUnit.Code.CENTIMETER).
  * <br><br>**Possible Values:** meters | feet | kilometers | miles | nautical-miles | yards
  *
  * @return {Promise<Number>} When resolved, response is the length of the input geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#geodesicLength geometryEngine.geodesicLength()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Creates a new geometry through intersection between two geometries.
  *
  * @method intersect
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {(module:esri/geometry/Geometry | module:esri/geometry/Geometry[])} geometry - The input geometry(ies).
  * @param {module:esri/geometry/Geometry} intersector - The geometry being intersected.
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the intersection of the geometries.
  *
  * @see {@link module:esri/geometry/geometryEngine#intersect geometryEngine.intersect()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Indicates if one geometry intersects another geometry.
  *
  * @method intersects
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry1 - The geometry that is tested for the intersects relationship to the other geometry.
  * @param {module:esri/geometry/Geometry} geometry2 - The geometry being intersected.
  *
  * @return {Promise<Boolean>} When resolved, response is `true` if the input geometries intersect each other.
  *
  * @see {@link module:esri/geometry/geometryEngine#intersects geometryEngine.intersects()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Indicates if the given geometry is topologically simple.
  *
  * @method isSimple
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The input geometry.
  *
  * @return {Promise<Boolean>} When resolved, response is `true` if the geometry is topologically simple.
  *
  * @see {@link module:esri/geometry/geometryEngine#isSimple geometryEngine.isSimple()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Finds the coordinate of the geometry that is closest to the specified point.
  *
  * @method nearestCoordinate
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The geometry to consider.
  * @param {module:esri/geometry/Point} inputPoint - The point used to search the nearest coordinate in the geometry.
  *
  * @return {Promise<module:esri/geometry/geometryEngine~NearestPointResult>} Resolves to an instance of [NearestPointResult](esri-geometry-geometryEngine.html#NearestPointResult), containing
  * the nearest coordinate to the `inputPoint`.
  *
  * @see {@link module:esri/geometry/geometryEngine#nearestCoordinate geometryEngine.nearestCoordinate()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Finds vertex on the geometry nearest to the specified point.
  *
  * @method nearestVertex
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The geometry to consider.
  * @param {module:esri/geometry/Point} inputPoint - The point used to search the nearest vertex in the geometry.
  *
  * @return {Promise<module:esri/geometry/geometryEngine~NearestPointResult>} Resolves to an instance of [NearestPointResult](esri-geometry-geometryEngine.html#NearestPointResult), containing
  * the nearest vertex to the `inputPoint`.
  *
  * @see {@link module:esri/geometry/geometryEngine#nearestVertex geometryEngine.nearestVertex()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Finds all vertices in the given distance from the specified point, sorted from the closest to the furthest and
  * returns them as an array of Objects.
  *
  * @method nearestVertices
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The geometry to consider.
  * @param {module:esri/geometry/Point} inputPoint - The point from which to measure.
  * @param {number} searchRadius - The distance to search from the inputPoint in the units of the view's spatial reference.
  * @param {number} maxVertexCountToReturn - The maximum number of vertices to return.
  *
  * @return {Promise<module:esri/geometry/geometryEngine~NearestPointResult>} Resolves to an array of [NearestPointResult](esri-geometry-geometryEngine.html#NearestPointResult), containing
  * the nearest vertices to the `inputPoint`.
  *
  * @see {@link module:esri/geometry/geometryEngine#nearestVertices geometryEngine.nearestVertices()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * The offset operation creates a geometry that is a constant planar distance from an input
  * polyline or polygon. It is similar to buffering, but produces a one-sided result.
  *
  * @method offset
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {(module:esri/geometry/Geometry | module:esri/geometry/Geometry[])} geometry - The geometries to offset.
  * @param {number} offsetDistance - The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset
  * geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no
  * change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer
  * rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
  * @param {string | number} offsetUnit - Measurement unit of the offset distance.
  * Defaults to the units of the input geometries.
  * Use one of the possible values listed below or any of the
  * [numeric codes for linear units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.LinearUnit.Code.CENTIMETER).
  * <br><br>**Possible Values:** meters | feet | kilometers | miles | nautical-miles | yards
  * @param {string} joinType - The join type. <br><br>**Possible values:** round | bevel | miter | square
  * @param {number=} bevelRatio - Applicable when `joinType = 'miter'`; bevelRatio is multiplied by the offset distance and
  * the result determines how far a mitered offset intersection can be located before it is beveled.
  * @param {number=} flattenError - Applicable when `joinType = 'round'`; flattenError determines the maximum distance of the resulting
  * segments compared to the true circular arc. The algorithm never produces more than around 180 vertices for each round join.
  *
  * @return {Promise<module:esri/geometry/Geometry[]>} When resolved, response is the offset geometries.
  *
  * @see {@link module:esri/geometry/geometryEngine#offset geometryEngine.offset()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Indicates if one geometry overlaps another geometry.
  *
  * @method overlaps
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry1 - The base geometry that is tested for the "overlaps" relationship with the other geometry.
  * @param {module:esri/geometry/Geometry} geometry2 - The comparison geometry that is tested for the "overlaps" relationship with the other geometry.
  *
  * @return {Promise<Boolean>} When resolved, response is `true` if the two geometries overlap.
  *
  * @see {@link module:esri/geometry/geometryEngine#overlaps geometryEngine.overlaps()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Calculates the area of the input geometry. As opposed to [geodesicArea()](#geodesicArea), planarArea() performs
  * this calculation using projected coordinates and does not take into account the earth's curvature. When using input geometries with a
  * spatial reference of either WGS84 (wkid: 4326) or {@link module:esri/geometry/SpatialReference#isWebMercator Web Mercator}, it is best practice to
  * calculate areas using [geodesicArea()](#geodesicArea). If the input geometries have a projected coordinate system other than
  * Web Mercator, use planarArea() instead.
  *
  * @method planarArea
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Polygon} geometry - The input polygon.
  * @param {string | number} unit - Measurement unit of the return value.
  * Defaults to the units of the input geometries.
  * Use one of the possible values listed below or any of the
  * [numeric codes for area units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.AreaUnit.Code.ACRE).
  * <br><br>**Possible Values:** acres | ares | hectares | square-feet | square-meters | square-yards |
  * square-kilometers | square-miles
  *
  * @return {Promise<Number>} When resolved, response is the area of the input geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#planarArea geometryEngine.planarArea()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Calculates the length of the input geometry. As opposed to [geodesicLength()](#geodesicLength), planarLength() uses
  * projected coordinates and does not take into account
  * the curvature of the earth when performing this calculation. When using input geometries with a
  * spatial reference of either WGS84 (wkid: 4326) or {@link module:esri/geometry/SpatialReference#isWebMercator Web Mercator}, it is best practice to
  * calculate lengths using [geodesicLength()](#geodesicLength). If the input geometries have a projected coordinate system other than
  * Web Mercator, use planarLength() instead.
  *
  * @method planarLength
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The input geometry.
  * @param {string | number} unit - Measurement unit of the return value.
  * Defaults to the units of the input geometries.
  * Use one of the possible values listed below or any of the
  * [numeric codes for linear units](https://developers.arcgis.com/java/api-reference/constant-values.html#com.esri.core.geometry.LinearUnit.Code.CENTIMETER).
  * <br><br>**Possible Values:** meters | feet | kilometers | miles | nautical-miles | yards
  *
  * @return {Promise<Number>} When resolved, response is the length of the input geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#planarLength geometryEngine.planarLength()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Indicates if the given DE-9IM relation holds for the two geometries.
  *
  * @method relate
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry1 - The first geometry for the relation.
  * @param {module:esri/geometry/Geometry} geometry2 - The second geometry for the relation.
  * @param {string} relation - The Dimensionally Extended 9 Intersection Model (DE-9IM) matrix relation
  * (encoded as a string) to test against the relationship of the two geometries. This string contains the
  * test result of each intersection represented in the DE-9IM matrix. Each result is one character of the
  * string and may be represented as either a number (maximum dimension returned: `0`,`1`,`2`), a Boolean
  * value (`T` or `F`), or a mask character (for ignoring results: '\*').<br><br>Example: Each of the following
  * DE-9IM string codes are valid for testing whether a polygon geometry completely contains a line geometry:
  * `TTTFFTFFT` (Boolean), 'T\*\*\*\*\*FF\*' (ignore irrelevant intersections), or '102FF\*FF\*' (dimension form).
  * Each returns the same result.<br><br>See [this article](https://en.wikipedia.org/wiki/DE-9IM) and
  * [this ArcGIS help page](https://desktop.arcgis.com/en/arcmap/latest/manage-data/using-sql-with-gdbs/relational-functions-for-st-geometry.htm)
  * for more information about the DE-9IM model and how string codes are constructed.
  *
  * @return {Promise<Boolean>} When resolved, response is `true` if the relation of the input geometries holds.
  *
  * @see {@link module:esri/geometry/geometryEngine#relate geometryEngine.relate()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Rotates a geometry counterclockwise by the specified number of degrees.
  * Rotation is around the centroid, or a given rotation point.
  *
  * @method rotate
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The geometry to rotate.
  * @param {number} angle - The rotation angle in degrees.
  * @param {module:esri/geometry/Point} [rotationOrigin] - Point to rotate the geometry around. Defaults to the centroid of the geometry.
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the rotated geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#rotate geometryEngine.rotate()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Performs the simplify operation on the geometry which alters the given geometries to make their definitions
  * topologically legal with respect to their geometry type.
  *
  * @method simplify
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry - The geometry to be simplified.
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the simplified geometry.
  *
  * @see {@link module:esri/geometry/geometryEngine#simplify geometryEngine.simplify()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Creates the symmetric difference of two geometries. The symmetric difference includes the parts
  * that are in either of the sets, but not in both.
  *
  * @method symmetricDifference
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {(module:esri/geometry/Geometry | module:esri/geometry/Geometry[])} leftGeometry - One of the Geometry instances in the XOR operation.
  * @param {module:esri/geometry/Geometry} rightGeometry - One of the Geometry instances in the XOR operation.
  *
  * @return {Promise<module:esri/geometry/Geometry | module:esri/geometry/Geometry[]>} When resolved, response is the symmetric differences of the two geometries.
  *
  * @see {@link module:esri/geometry/geometryEngine#symmetricDifference geometryEngine.symmetricDifference()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * Indicates if one geometry touches another geometry.
  *
  * @method touches
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} geometry1 - The geometry to test the "touches" relationship with the other geometry.
  * @param {module:esri/geometry/Geometry} geometry2 - The geometry to be touched.
  *
  * @return {Promise<Boolean>} When resolved, response is `true` if geometry1 touches geometry2.
  *
  * @see {@link module:esri/geometry/geometryEngine#touches geometryEngine.touches()}
  *
  *
  *
  *
  *
  *
  *
  *
  */

/**
  * All inputs must be of the same type of geometries and share one spatial reference.
  *
  * @method union
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry[]} geometries - An array of Geometries to union.
  *
  * @return {Promise<module:esri/geometry/Geometry>} When resolved, response is the union of the geometries.
  *
  * @see {@link module:esri/geometry/geometryEngine#union geometryEngine.union()}
  *
  * @example
  * // pt1 and pt2 are point objects to union together
  * geometryEngine.union([pt1, pt2]).then(function(response){
  *   console.log(response);  // geometry representing the union of the input geometries
  * });
  *
  *
  *
  *
  *
  *
  */

/**
  * Indicates if one geometry is within another geometry.
  *
  * @method within
  * @memberof module:esri/geometry/geometryEngineAsync
  * @instance
  *
  * @param {module:esri/geometry/Geometry} innerGeometry - The base geometry that is tested for the "within" relationship to the other geometry.
  * @param {module:esri/geometry/Geometry} outerGeometry - The comparison geometry that is tested for the "contains" relationship to the other geometry.
  *
  * @return {Promise<Boolean>} When resolved, response is `true` if `innerGeometry` is within `outerGeometry`.
  *
  * @see {@link module:esri/geometry/geometryEngine#within geometryEngine.within()}
  *
  *
  *
  *
  *
  *
  *
  *
  */