@mappedin/mappedin-js 6.0.0-rc.2 → 6.0.0-rc.4

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.
Files changed (52) hide show
  1. package/THIRD_PARTY_LICENSES.txt +60 -21
  2. package/lib/esm/{GLTFExporter-Z6JPGY7L.js → GLTFExporter-22SRWSNV.js} +2 -2
  3. package/lib/esm/{GLTFLoader-QCSKNB7G.js → GLTFLoader-SWPNQTFP.js} +2 -2
  4. package/lib/esm/{browser-I5Q2RPA3.js → browser-GGPMSNFY.js} +2 -2
  5. package/lib/esm/chunk-3GOFR3M6.js +2 -0
  6. package/lib/esm/{chunk-AJPWEERG.js.map → chunk-3GOFR3M6.js.map} +1 -1
  7. package/lib/esm/chunk-AFELLAS6.js +193 -0
  8. package/lib/esm/chunk-AFELLAS6.js.map +7 -0
  9. package/lib/esm/chunk-GAHPB2XK.js +1992 -0
  10. package/lib/esm/chunk-GAHPB2XK.js.map +7 -0
  11. package/lib/esm/{chunk-7SIXH4EE.js → chunk-I32KNH7E.js} +2 -2
  12. package/lib/esm/{chunk-W5WDIXXO.js → chunk-MDSV6XJR.js} +2 -2
  13. package/lib/esm/{chunk-L4AKE3TV.js → chunk-VWOFYLSM.js} +2 -2
  14. package/lib/esm/index.css +1 -1
  15. package/lib/esm/index.css.map +3 -3
  16. package/lib/esm/index.d.ts +28029 -39106
  17. package/lib/esm/index.js +1 -1
  18. package/lib/esm/inspector-2XETNHYZ.css +2 -0
  19. package/lib/esm/inspector-2XETNHYZ.css.map +7 -0
  20. package/lib/esm/{inspector-YD6373IB.js → inspector-HQV23IML.js} +2 -2
  21. package/lib/esm/internal-MAULC22C.js +2 -0
  22. package/lib/esm/internal-MAULC22C.js.map +7 -0
  23. package/lib/esm/internal-R5XTRV7Q.css +2 -0
  24. package/lib/esm/internal-R5XTRV7Q.css.map +7 -0
  25. package/lib/esm/{outdoor-context-v5-TZEP6AEK.js → outdoor-context-v5-5KBHPW76.js} +2 -2
  26. package/lib/esm/text3d-AXM5ZHCS.css +2 -0
  27. package/lib/esm/text3d-AXM5ZHCS.css.map +7 -0
  28. package/lib/esm/{text3d-OX5R3UZU.js → text3d-HT6TS3WO.js} +2 -2
  29. package/lib/esm/{text3d-OX5R3UZU.js.map → text3d-HT6TS3WO.js.map} +1 -1
  30. package/lib/esm/workers/collision-worker.csp.js +1 -1
  31. package/lib/index-rn.js +195 -194
  32. package/lib/index.css +1 -1
  33. package/package.json +13 -10
  34. package/lib/esm/chunk-6KGIA4EU.js +0 -3
  35. package/lib/esm/chunk-6KGIA4EU.js.map +0 -7
  36. package/lib/esm/chunk-AJPWEERG.js +0 -2
  37. package/lib/esm/chunk-VI2AJVL2.js +0 -2343
  38. package/lib/esm/chunk-VI2AJVL2.js.map +0 -7
  39. package/lib/esm/inspector-T3HA7VGW.css +0 -2
  40. package/lib/esm/inspector-T3HA7VGW.css.map +0 -7
  41. package/lib/esm/internal-JKAX4KK2.js +0 -2
  42. package/lib/esm/internal-JKAX4KK2.js.map +0 -7
  43. package/lib/esm/internal-VKD5KMH3.css +0 -2
  44. package/lib/esm/internal-VKD5KMH3.css.map +0 -7
  45. /package/lib/esm/{GLTFExporter-Z6JPGY7L.js.map → GLTFExporter-22SRWSNV.js.map} +0 -0
  46. /package/lib/esm/{GLTFLoader-QCSKNB7G.js.map → GLTFLoader-SWPNQTFP.js.map} +0 -0
  47. /package/lib/esm/{browser-I5Q2RPA3.js.map → browser-GGPMSNFY.js.map} +0 -0
  48. /package/lib/esm/{chunk-7SIXH4EE.js.map → chunk-I32KNH7E.js.map} +0 -0
  49. /package/lib/esm/{chunk-W5WDIXXO.js.map → chunk-MDSV6XJR.js.map} +0 -0
  50. /package/lib/esm/{chunk-L4AKE3TV.js.map → chunk-VWOFYLSM.js.map} +0 -0
  51. /package/lib/esm/{inspector-YD6373IB.js.map → inspector-HQV23IML.js.map} +0 -0
  52. /package/lib/esm/{outdoor-context-v5-TZEP6AEK.js.map → outdoor-context-v5-5KBHPW76.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../node_modules/.pnpm/lodash.merge@4.6.2/node_modules/lodash.merge/index.js", "../../../../node_modules/.pnpm/js-clipper@1.0.1/node_modules/js-clipper/clipper.js", "../../../packages/common/Mappedin.Logger.ts", "../../../packages/common/utils.ts", "../../../../node_modules/.pnpm/jwt-decode@4.0.0/node_modules/jwt-decode/build/esm/index.js", "../../../packages/common/constants.ts", "../../../packages/common/math-utils.ts", "../../../packages/common/array-utils.ts", "../../../packages/common/async.ts", "../../../packages/common/index.ts", "../../../packages/common/errors.ts", "../../../packages/common/assert.ts", "../../../packages/common/random-id.ts", "../../../packages/common/pubsub.ts", "../../../packages/common/storage.ts", "../../../packages/common/color.ts", "../../../packages/common/interpolate.ts", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/external.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/errors.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/locales/en.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/ZodError.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/helpers/util.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/helpers/parseUtil.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/helpers/typeAliases.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/types.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/helpers/errorUtil.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/v3/index.js", "../../../../node_modules/.pnpm/zod@3.25.51/node_modules/zod/dist/esm/index.js", "../../../geojson/src/utils/math.ts", "../../../geojson/src/utils/index.ts", "../../../geojson/src/entities/group-container.ts", "../../../geojson/src/entities/geometry-group.ts", "../../../geojson/src/components/mesh.ts", "../../../geojson/src/components/utils.ts", "../../../../node_modules/.pnpm/@turf+bbox@6.5.0/node_modules/@turf/bbox/dist/es/index.js", "../../../../node_modules/.pnpm/@turf+meta@6.5.0/node_modules/@turf/meta/dist/es/index.js", "../../../../node_modules/.pnpm/@turf+helpers@6.5.0/node_modules/@turf/helpers/dist/es/index.js", "../../../geojson/src/components/styles/style.ts", "../../../geojson/src/systems/border/system.ts", "../../../geojson/src/entities/index.ts", "../../../geojson/src/entities/utils.ts", "../../../geojson/src/components/interaction.ts", "../../../geojson/src/components/label.ts", "../../../geojson/src/utils/collision-ranking-tier.ts", "../../../geojson/src/systems/2d-draw/constants.ts", "../../../geojson/src/components/label-utils.ts", "../../../geojson/src/types/interpolation.ts", "../../../../node_modules/.pnpm/tinycolor2@1.6.0/node_modules/tinycolor2/esm/tinycolor.js", "../../../geojson/src/components/marker.ts", "../../../geojson/src/components/marker-utils.ts", "../../../geojson/src/entities/geometry3d.ts", "../../../geojson/src/entities/geometry2d.ts", "../../../geojson/src/components/text3d.ts", "../../../geojson/src/systems/text3d/system.ts", "../../../geojson/src/components/outline.ts", "../../../geojson/src/systems/mesh-creation-and-optimization/utils.ts", "../../../geojson/src/systems/mesh-creation-and-optimization/batched-material.ts", "../../../geojson/src/systems/mesh-creation-and-optimization/batched-texture.ts", "../../../geojson/src/systems/mesh-creation-and-optimization/batched-lambert-vertex.glsl", "../../../geojson/src/systems/mesh-creation-and-optimization/batched-lambert-fragment.glsl", "../../../geojson/src/utils/constants.ts", "../../../geojson/src/systems/outline-interpolation/constants.ts", "../../../geojson/src/components/focusable.ts", "../../../geojson/src/components/border.ts", "../../../geojson/src/geometry/line-string.ts", "../../../packages/clipper-lib/ClipperLib.js", "../../../../node_modules/.pnpm/@turf+helpers@7.2.0/node_modules/@turf/helpers/index.ts", "../../../../node_modules/.pnpm/@turf+invariant@7.2.0/node_modules/@turf/invariant/index.ts", "../../../../node_modules/.pnpm/@turf+polygon-to-line@7.2.0/node_modules/@turf/polygon-to-line/index.ts", "../../../geojson/src/utils/object3d-destroy.ts", "../../../geojson/src/systems/border/utils.ts", "../../../geojson/src/utils/bounding-box.ts", "../../../geojson/src/utils/ecs.ts", "../../../geojson/src/utils/get-pixel-ratio.ts", "../../../geojson/src/utils/async.ts", "../../../geojson/src/utils/browser.ts", "../../../geojson/src/utils/fp.ts", "../../../geojson/src/utils/tranform-request.ts", "../../../geojson/src/components/styles/text-style.ts", "../../../geojson/src/components/styles/index.ts", "../../../geojson/src/components/styles/model-style.ts", "../../../geojson/src/components/styles/constants.ts"],
4
+ "sourcesContent": ["/**\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeMax = Math.max,\n nativeNow = Date.now;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = merge;\n", "// rev 452\n/********************************************************************************\n* *\n* Author : Angus Johnson *\n* Version : 6.1.3a *\n* Date : 22 January 2014 *\n* Website : http://www.angusj.com *\n* Copyright : Angus Johnson 2010-2014 *\n* *\n* License: *\n* Use, modification & distribution is subject to Boost Software License Ver 1. *\n* http://www.boost.org/LICENSE_1_0.txt *\n* *\n* Attributions: *\n* The code in this library is an extension of Bala Vatti's clipping algorithm: *\n* \"A generic solution to polygon clipping\" *\n* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. *\n* http://portal.acm.org/citation.cfm?id=129906 *\n* *\n* Computer graphics and geometric modeling: implementation and algorithms *\n* By Max K. Agoston *\n* Springer; 1 edition (January 4, 2005) *\n* http://books.google.com/books?q=vatti+clipping+agoston *\n* *\n* See also: *\n* \"Polygon Offsetting by Computing Winding Numbers\" *\n* Paper no. DETC2005-85513 pp. 565-575 *\n* ASME 2005 International Design Engineering Technical Conferences *\n* and Computers and Information in Engineering Conference (IDETC/CIE2005) *\n* September 24-28, 2005 , Long Beach, California, USA *\n* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf *\n* *\n*******************************************************************************/\n/*******************************************************************************\n* *\n* Author : Timo *\n* Version : 6.1.3.2 *\n* Date : 1 February 2014 *\n* *\n* This is a translation of the C# Clipper library to Javascript. *\n* Int128 struct of C# is implemented using JSBN of Tom Wu. *\n* Because Javascript lacks support for 64-bit integers, the space *\n* is a little more restricted than in C# version. *\n* *\n* C# version has support for coordinate space: *\n* +-4611686018427387903 ( sqrt(2^127 -1)/2 ) *\n* while Javascript version has support for space: *\n* +-4503599627370495 ( sqrt(2^106 -1)/2 ) *\n* *\n* Tom Wu's JSBN proved to be the fastest big integer library: *\n* http://jsperf.com/big-integer-library-test *\n* *\n* This class can be made simpler when (if ever) 64-bit integer support comes. *\n* *\n*******************************************************************************/\n/*******************************************************************************\n* *\n* Basic JavaScript BN library - subset useful for RSA encryption. *\n* http://www-cs-students.stanford.edu/~tjw/jsbn/ *\n* Copyright (c) 2005 Tom Wu *\n* All Rights Reserved. *\n* See \"LICENSE\" for details: *\n* http://www-cs-students.stanford.edu/~tjw/jsbn/LICENSE *\n* *\n*******************************************************************************/\n\n\"use strict\";\n//use_int32: When enabled 32bit ints are used instead of 64bit ints. This\n//improve performance but coordinate values are limited to the range +/- 46340\nvar use_int32 = false;\n//use_xyz: adds a Z member to IntPoint. Adds a minor cost to performance.\nvar use_xyz = false;\n//UseLines: Enables line clipping. Adds a very minor cost to performance.\nvar use_lines = true;\n//use_deprecated: Enables support for the obsolete OffsetPaths() function\n//which has been replace with the ClipperOffset class.\nvar use_deprecated = false;\n\nvar ClipperLib = {};\nvar isNode = false;\nif (typeof module !== 'undefined' && module.exports)\n{\n module.exports = ClipperLib;\n isNode = true;\n}\nelse\n{\n if (typeof (document) !== \"undefined\") window.ClipperLib = ClipperLib;\n else self['ClipperLib'] = ClipperLib;\n}\nvar navigator_appName;\nif (!isNode)\n{\n var nav = navigator.userAgent.toString().toLowerCase();\n navigator_appName = navigator.appName;\n}\nelse\n{\n var nav = \"chrome\"; // Node.js uses Chrome's V8 engine\n navigator_appName = \"Netscape\"; // Firefox, Chrome and Safari returns \"Netscape\", so Node.js should also\n}\n// Browser test to speedup performance critical functions\nvar browser = {};\nif (nav.indexOf(\"chrome\") != -1 && nav.indexOf(\"chromium\") == -1) browser.chrome = 1;\nelse browser.chrome = 0;\nif (nav.indexOf(\"chromium\") != -1) browser.chromium = 1;\nelse browser.chromium = 0;\nif (nav.indexOf(\"safari\") != -1 && nav.indexOf(\"chrome\") == -1 && nav.indexOf(\"chromium\") == -1) browser.safari = 1;\nelse browser.safari = 0;\nif (nav.indexOf(\"firefox\") != -1) browser.firefox = 1;\nelse browser.firefox = 0;\nif (nav.indexOf(\"firefox/17\") != -1) browser.firefox17 = 1;\nelse browser.firefox17 = 0;\nif (nav.indexOf(\"firefox/15\") != -1) browser.firefox15 = 1;\nelse browser.firefox15 = 0;\nif (nav.indexOf(\"firefox/3\") != -1) browser.firefox3 = 1;\nelse browser.firefox3 = 0;\nif (nav.indexOf(\"opera\") != -1) browser.opera = 1;\nelse browser.opera = 0;\nif (nav.indexOf(\"msie 10\") != -1) browser.msie10 = 1;\nelse browser.msie10 = 0;\nif (nav.indexOf(\"msie 9\") != -1) browser.msie9 = 1;\nelse browser.msie9 = 0;\nif (nav.indexOf(\"msie 8\") != -1) browser.msie8 = 1;\nelse browser.msie8 = 0;\nif (nav.indexOf(\"msie 7\") != -1) browser.msie7 = 1;\nelse browser.msie7 = 0;\nif (nav.indexOf(\"msie \") != -1) browser.msie = 1;\nelse browser.msie = 0;\nClipperLib.biginteger_used = null;\n// Copyright (c) 2005 Tom Wu\n// All Rights Reserved.\n// See \"LICENSE\" for details.\n// Basic JavaScript BN library - subset useful for RSA encryption.\n// Bits per digit\nvar dbits;\n// JavaScript engine analysis\nvar canary = 0xdeadbeefcafe;\nvar j_lm = ((canary & 0xffffff) == 0xefcafe);\n// (public) Constructor\nfunction BigInteger(a, b, c)\n{\n // This test variable can be removed,\n // but at least for performance tests it is useful piece of knowledge\n // This is the only ClipperLib related variable in BigInteger library\n ClipperLib.biginteger_used = 1;\n if (a != null)\n if (\"number\" == typeof a && \"undefined\" == typeof (b)) this.fromInt(a); // faster conversion\n else if (\"number\" == typeof a) this.fromNumber(a, b, c);\n else if (b == null && \"string\" != typeof a) this.fromString(a, 256);\n else this.fromString(a, b);\n}\n// return new, unset BigInteger\nfunction nbi()\n{\n return new BigInteger(null);\n}\n// am: Compute w_j += (x*this_i), propagate carries,\n// c is initial carry, returns final carry.\n// c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n// We need to select the fastest one that works in this environment.\n// am1: use a single mult and divide to get the high bits,\n// max digit bits should be 26 because\n// max internal value = 2*dvalue^2-2*dvalue (< 2^53)\nfunction am1(i, x, w, j, c, n)\n{\n while (--n >= 0)\n {\n var v = x * this[i++] + w[j] + c;\n c = Math.floor(v / 0x4000000);\n w[j++] = v & 0x3ffffff;\n }\n return c;\n}\n// am2 avoids a big mult-and-extract completely.\n// Max digit bits should be <= 30 because we do bitwise ops\n// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\nfunction am2(i, x, w, j, c, n)\n{\n var xl = x & 0x7fff,\n xh = x >> 15;\n while (--n >= 0)\n {\n var l = this[i] & 0x7fff;\n var h = this[i++] >> 15;\n var m = xh * l + h * xl;\n l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);\n c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);\n w[j++] = l & 0x3fffffff;\n }\n return c;\n}\n// Alternately, set max digit bits to 28 since some\n// browsers slow down when dealing with 32-bit numbers.\nfunction am3(i, x, w, j, c, n)\n{\n var xl = x & 0x3fff,\n xh = x >> 14;\n while (--n >= 0)\n {\n var l = this[i] & 0x3fff;\n var h = this[i++] >> 14;\n var m = xh * l + h * xl;\n l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;\n c = (l >> 28) + (m >> 14) + xh * h;\n w[j++] = l & 0xfffffff;\n }\n return c;\n}\nif (j_lm && (navigator_appName == \"Microsoft Internet Explorer\"))\n{\n BigInteger.prototype.am = am2;\n dbits = 30;\n}\nelse if (j_lm && (navigator_appName != \"Netscape\"))\n{\n BigInteger.prototype.am = am1;\n dbits = 26;\n}\nelse\n{ // Mozilla/Netscape seems to prefer am3\n BigInteger.prototype.am = am3;\n dbits = 28;\n}\nBigInteger.prototype.DB = dbits;\nBigInteger.prototype.DM = ((1 << dbits) - 1);\nBigInteger.prototype.DV = (1 << dbits);\nvar BI_FP = 52;\nBigInteger.prototype.FV = Math.pow(2, BI_FP);\nBigInteger.prototype.F1 = BI_FP - dbits;\nBigInteger.prototype.F2 = 2 * dbits - BI_FP;\n// Digit conversions\nvar BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\nvar BI_RC = new Array();\nvar rr, vv;\nrr = \"0\".charCodeAt(0);\nfor (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\nrr = \"a\".charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\nrr = \"A\".charCodeAt(0);\nfor (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\nfunction int2char(n)\n{\n return BI_RM.charAt(n);\n}\n\nfunction intAt(s, i)\n{\n var c = BI_RC[s.charCodeAt(i)];\n return (c == null) ? -1 : c;\n}\n// (protected) copy this to r\nfunction bnpCopyTo(r)\n{\n for (var i = this.t - 1; i >= 0; --i) r[i] = this[i];\n r.t = this.t;\n r.s = this.s;\n}\n// (protected) set from integer value x, -DV <= x < DV\nfunction bnpFromInt(x)\n{\n this.t = 1;\n this.s = (x < 0) ? -1 : 0;\n if (x > 0) this[0] = x;\n else if (x < -1) this[0] = x + this.DV;\n else this.t = 0;\n}\n// return bigint initialized to value\nfunction nbv(i)\n{\n var r = nbi();\n r.fromInt(i);\n return r;\n}\n// (protected) set from string and radix\nfunction bnpFromString(s, b)\n{\n var k;\n if (b == 16) k = 4;\n else if (b == 8) k = 3;\n else if (b == 256) k = 8; // byte array\n else if (b == 2) k = 1;\n else if (b == 32) k = 5;\n else if (b == 4) k = 2;\n else\n {\n this.fromRadix(s, b);\n return;\n }\n this.t = 0;\n this.s = 0;\n var i = s.length,\n mi = false,\n sh = 0;\n while (--i >= 0)\n {\n var x = (k == 8) ? s[i] & 0xff : intAt(s, i);\n if (x < 0)\n {\n if (s.charAt(i) == \"-\") mi = true;\n continue;\n }\n mi = false;\n if (sh == 0)\n this[this.t++] = x;\n else if (sh + k > this.DB)\n {\n this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;\n this[this.t++] = (x >> (this.DB - sh));\n }\n else\n this[this.t - 1] |= x << sh;\n sh += k;\n if (sh >= this.DB) sh -= this.DB;\n }\n if (k == 8 && (s[0] & 0x80) != 0)\n {\n this.s = -1;\n if (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;\n }\n this.clamp();\n if (mi) BigInteger.ZERO.subTo(this, this);\n}\n// (protected) clamp off excess high words\nfunction bnpClamp()\n{\n var c = this.s & this.DM;\n while (this.t > 0 && this[this.t - 1] == c)--this.t;\n}\n// (public) return string representation in given radix\nfunction bnToString(b)\n{\n if (this.s < 0) return \"-\" + this.negate().toString(b);\n var k;\n if (b == 16) k = 4;\n else if (b == 8) k = 3;\n else if (b == 2) k = 1;\n else if (b == 32) k = 5;\n else if (b == 4) k = 2;\n else return this.toRadix(b);\n var km = (1 << k) - 1,\n d, m = false,\n r = \"\",\n i = this.t;\n var p = this.DB - (i * this.DB) % k;\n if (i-- > 0)\n {\n if (p < this.DB && (d = this[i] >> p) > 0)\n {\n m = true;\n r = int2char(d);\n }\n while (i >= 0)\n {\n if (p < k)\n {\n d = (this[i] & ((1 << p) - 1)) << (k - p);\n d |= this[--i] >> (p += this.DB - k);\n }\n else\n {\n d = (this[i] >> (p -= k)) & km;\n if (p <= 0)\n {\n p += this.DB;\n --i;\n }\n }\n if (d > 0) m = true;\n if (m) r += int2char(d);\n }\n }\n return m ? r : \"0\";\n}\n// (public) -this\nfunction bnNegate()\n{\n var r = nbi();\n BigInteger.ZERO.subTo(this, r);\n return r;\n}\n// (public) |this|\nfunction bnAbs()\n{\n return (this.s < 0) ? this.negate() : this;\n}\n// (public) return + if this > a, - if this < a, 0 if equal\nfunction bnCompareTo(a)\n{\n var r = this.s - a.s;\n if (r != 0) return r;\n var i = this.t;\n r = i - a.t;\n if (r != 0) return (this.s < 0) ? -r : r;\n while (--i >= 0)\n if ((r = this[i] - a[i]) != 0) return r;\n return 0;\n}\n// returns bit length of the integer x\nfunction nbits(x)\n{\n var r = 1,\n t;\n if ((t = x >>> 16) != 0)\n {\n x = t;\n r += 16;\n }\n if ((t = x >> 8) != 0)\n {\n x = t;\n r += 8;\n }\n if ((t = x >> 4) != 0)\n {\n x = t;\n r += 4;\n }\n if ((t = x >> 2) != 0)\n {\n x = t;\n r += 2;\n }\n if ((t = x >> 1) != 0)\n {\n x = t;\n r += 1;\n }\n return r;\n}\n// (public) return the number of bits in \"this\"\nfunction bnBitLength()\n{\n if (this.t <= 0) return 0;\n return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));\n}\n// (protected) r = this << n*DB\nfunction bnpDLShiftTo(n, r)\n{\n var i;\n for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i];\n for (i = n - 1; i >= 0; --i) r[i] = 0;\n r.t = this.t + n;\n r.s = this.s;\n}\n// (protected) r = this >> n*DB\nfunction bnpDRShiftTo(n, r)\n{\n for (var i = n; i < this.t; ++i) r[i - n] = this[i];\n r.t = Math.max(this.t - n, 0);\n r.s = this.s;\n}\n// (protected) r = this << n\nfunction bnpLShiftTo(n, r)\n{\n var bs = n % this.DB;\n var cbs = this.DB - bs;\n var bm = (1 << cbs) - 1;\n var ds = Math.floor(n / this.DB),\n c = (this.s << bs) & this.DM,\n i;\n for (i = this.t - 1; i >= 0; --i)\n {\n r[i + ds + 1] = (this[i] >> cbs) | c;\n c = (this[i] & bm) << bs;\n }\n for (i = ds - 1; i >= 0; --i) r[i] = 0;\n r[ds] = c;\n r.t = this.t + ds + 1;\n r.s = this.s;\n r.clamp();\n}\n// (protected) r = this >> n\nfunction bnpRShiftTo(n, r)\n{\n r.s = this.s;\n var ds = Math.floor(n / this.DB);\n if (ds >= this.t)\n {\n r.t = 0;\n return;\n }\n var bs = n % this.DB;\n var cbs = this.DB - bs;\n var bm = (1 << bs) - 1;\n r[0] = this[ds] >> bs;\n for (var i = ds + 1; i < this.t; ++i)\n {\n r[i - ds - 1] |= (this[i] & bm) << cbs;\n r[i - ds] = this[i] >> bs;\n }\n if (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs;\n r.t = this.t - ds;\n r.clamp();\n}\n// (protected) r = this - a\nfunction bnpSubTo(a, r)\n{\n var i = 0,\n c = 0,\n m = Math.min(a.t, this.t);\n while (i < m)\n {\n c += this[i] - a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n if (a.t < this.t)\n {\n c -= a.s;\n while (i < this.t)\n {\n c += this[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else\n {\n c += this.s;\n while (i < a.t)\n {\n c -= a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c -= a.s;\n }\n r.s = (c < 0) ? -1 : 0;\n if (c < -1) r[i++] = this.DV + c;\n else if (c > 0) r[i++] = c;\n r.t = i;\n r.clamp();\n}\n// (protected) r = this * a, r != this,a (HAC 14.12)\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyTo(a, r)\n{\n var x = this.abs(),\n y = a.abs();\n var i = x.t;\n r.t = i + y.t;\n while (--i >= 0) r[i] = 0;\n for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);\n r.s = 0;\n r.clamp();\n if (this.s != a.s) BigInteger.ZERO.subTo(r, r);\n}\n// (protected) r = this^2, r != this (HAC 14.16)\nfunction bnpSquareTo(r)\n{\n var x = this.abs();\n var i = r.t = 2 * x.t;\n while (--i >= 0) r[i] = 0;\n for (i = 0; i < x.t - 1; ++i)\n {\n var c = x.am(i, x[i], r, 2 * i, 0, 1);\n if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV)\n {\n r[i + x.t] -= x.DV;\n r[i + x.t + 1] = 1;\n }\n }\n if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);\n r.s = 0;\n r.clamp();\n}\n// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n// r != q, this != m. q or r may be null.\nfunction bnpDivRemTo(m, q, r)\n{\n var pm = m.abs();\n if (pm.t <= 0) return;\n var pt = this.abs();\n if (pt.t < pm.t)\n {\n if (q != null) q.fromInt(0);\n if (r != null) this.copyTo(r);\n return;\n }\n if (r == null) r = nbi();\n var y = nbi(),\n ts = this.s,\n ms = m.s;\n var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus\n if (nsh > 0)\n {\n pm.lShiftTo(nsh, y);\n pt.lShiftTo(nsh, r);\n }\n else\n {\n pm.copyTo(y);\n pt.copyTo(r);\n }\n var ys = y.t;\n var y0 = y[ys - 1];\n if (y0 == 0) return;\n var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);\n var d1 = this.FV / yt,\n d2 = (1 << this.F1) / yt,\n e = 1 << this.F2;\n var i = r.t,\n j = i - ys,\n t = (q == null) ? nbi() : q;\n y.dlShiftTo(j, t);\n if (r.compareTo(t) >= 0)\n {\n r[r.t++] = 1;\n r.subTo(t, r);\n }\n BigInteger.ONE.dlShiftTo(ys, t);\n t.subTo(y, y); // \"negative\" y so we can replace sub with am later\n while (y.t < ys) y[y.t++] = 0;\n while (--j >= 0)\n {\n // Estimate quotient digit\n var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);\n if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd)\n { // Try it out\n y.dlShiftTo(j, t);\n r.subTo(t, r);\n while (r[i] < --qd) r.subTo(t, r);\n }\n }\n if (q != null)\n {\n r.drShiftTo(ys, q);\n if (ts != ms) BigInteger.ZERO.subTo(q, q);\n }\n r.t = ys;\n r.clamp();\n if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder\n if (ts < 0) BigInteger.ZERO.subTo(r, r);\n}\n// (public) this mod a\nfunction bnMod(a)\n{\n var r = nbi();\n this.abs().divRemTo(a, null, r);\n if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r);\n return r;\n}\n// Modular reduction using \"classic\" algorithm\nfunction Classic(m)\n{\n this.m = m;\n}\n\nfunction cConvert(x)\n{\n if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n else return x;\n}\n\nfunction cRevert(x)\n{\n return x;\n}\n\nfunction cReduce(x)\n{\n x.divRemTo(this.m, null, x);\n}\n\nfunction cMulTo(x, y, r)\n{\n x.multiplyTo(y, r);\n this.reduce(r);\n}\n\nfunction cSqrTo(x, r)\n{\n x.squareTo(r);\n this.reduce(r);\n}\nClassic.prototype.convert = cConvert;\nClassic.prototype.revert = cRevert;\nClassic.prototype.reduce = cReduce;\nClassic.prototype.mulTo = cMulTo;\nClassic.prototype.sqrTo = cSqrTo;\n// (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n// justification:\n// xy == 1 (mod m)\n// xy = 1+km\n// xy(2-xy) = (1+km)(1-km)\n// x[y(2-xy)] = 1-k^2m^2\n// x[y(2-xy)] == 1 (mod m^2)\n// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n// JS multiply \"overflows\" differently from C/C++, so care is needed here.\nfunction bnpInvDigit()\n{\n if (this.t < 1) return 0;\n var x = this[0];\n if ((x & 1) == 0) return 0;\n var y = x & 3; // y == 1/x mod 2^2\n y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4\n y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8\n y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16\n // last step - calculate inverse mod DV directly;\n // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits\n // we really want the negative inverse, and -DV < y < DV\n return (y > 0) ? this.DV - y : -y;\n}\n// Montgomery reduction\nfunction Montgomery(m)\n{\n this.m = m;\n this.mp = m.invDigit();\n this.mpl = this.mp & 0x7fff;\n this.mph = this.mp >> 15;\n this.um = (1 << (m.DB - 15)) - 1;\n this.mt2 = 2 * m.t;\n}\n// xR mod m\nfunction montConvert(x)\n{\n var r = nbi();\n x.abs().dlShiftTo(this.m.t, r);\n r.divRemTo(this.m, null, r);\n if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r);\n return r;\n}\n// x/R mod m\nfunction montRevert(x)\n{\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n}\n// x = x/R mod m (HAC 14.32)\nfunction montReduce(x)\n{\n while (x.t <= this.mt2) // pad x so am has enough room later\n x[x.t++] = 0;\n for (var i = 0; i < this.m.t; ++i)\n {\n // faster way of calculating u0 = x[i]*mp mod DV\n var j = x[i] & 0x7fff;\n var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;\n // use am to combine the multiply-shift-add into one call\n j = i + this.m.t;\n x[j] += this.m.am(0, u0, x, i, 0, this.m.t);\n // propagate carry\n while (x[j] >= x.DV)\n {\n x[j] -= x.DV;\n x[++j]++;\n }\n }\n x.clamp();\n x.drShiftTo(this.m.t, x);\n if (x.compareTo(this.m) >= 0) x.subTo(this.m, x);\n}\n// r = \"x^2/R mod m\"; x != r\nfunction montSqrTo(x, r)\n{\n x.squareTo(r);\n this.reduce(r);\n}\n// r = \"xy/R mod m\"; x,y != r\nfunction montMulTo(x, y, r)\n{\n x.multiplyTo(y, r);\n this.reduce(r);\n}\nMontgomery.prototype.convert = montConvert;\nMontgomery.prototype.revert = montRevert;\nMontgomery.prototype.reduce = montReduce;\nMontgomery.prototype.mulTo = montMulTo;\nMontgomery.prototype.sqrTo = montSqrTo;\n// (protected) true iff this is even\nfunction bnpIsEven()\n{\n return ((this.t > 0) ? (this[0] & 1) : this.s) == 0;\n}\n// (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\nfunction bnpExp(e, z)\n{\n if (e > 0xffffffff || e < 1) return BigInteger.ONE;\n var r = nbi(),\n r2 = nbi(),\n g = z.convert(this),\n i = nbits(e) - 1;\n g.copyTo(r);\n while (--i >= 0)\n {\n z.sqrTo(r, r2);\n if ((e & (1 << i)) > 0) z.mulTo(r2, g, r);\n else\n {\n var t = r;\n r = r2;\n r2 = t;\n }\n }\n return z.revert(r);\n}\n// (public) this^e % m, 0 <= e < 2^32\nfunction bnModPowInt(e, m)\n{\n var z;\n if (e < 256 || m.isEven()) z = new Classic(m);\n else z = new Montgomery(m);\n return this.exp(e, z);\n}\n// protected\nBigInteger.prototype.copyTo = bnpCopyTo;\nBigInteger.prototype.fromInt = bnpFromInt;\nBigInteger.prototype.fromString = bnpFromString;\nBigInteger.prototype.clamp = bnpClamp;\nBigInteger.prototype.dlShiftTo = bnpDLShiftTo;\nBigInteger.prototype.drShiftTo = bnpDRShiftTo;\nBigInteger.prototype.lShiftTo = bnpLShiftTo;\nBigInteger.prototype.rShiftTo = bnpRShiftTo;\nBigInteger.prototype.subTo = bnpSubTo;\nBigInteger.prototype.multiplyTo = bnpMultiplyTo;\nBigInteger.prototype.squareTo = bnpSquareTo;\nBigInteger.prototype.divRemTo = bnpDivRemTo;\nBigInteger.prototype.invDigit = bnpInvDigit;\nBigInteger.prototype.isEven = bnpIsEven;\nBigInteger.prototype.exp = bnpExp;\n// public\nBigInteger.prototype.toString = bnToString;\nBigInteger.prototype.negate = bnNegate;\nBigInteger.prototype.abs = bnAbs;\nBigInteger.prototype.compareTo = bnCompareTo;\nBigInteger.prototype.bitLength = bnBitLength;\nBigInteger.prototype.mod = bnMod;\nBigInteger.prototype.modPowInt = bnModPowInt;\n// \"constants\"\nBigInteger.ZERO = nbv(0);\nBigInteger.ONE = nbv(1);\n// Copyright (c) 2005-2009 Tom Wu\n// All Rights Reserved.\n// See \"LICENSE\" for details.\n// Extended JavaScript BN functions, required for RSA private ops.\n// Version 1.1: new BigInteger(\"0\", 10) returns \"proper\" zero\n// Version 1.2: square() API, isProbablePrime fix\n// (public)\nfunction bnClone()\n{\n var r = nbi();\n this.copyTo(r);\n return r;\n}\n// (public) return value as integer\nfunction bnIntValue()\n{\n if (this.s < 0)\n {\n if (this.t == 1) return this[0] - this.DV;\n else if (this.t == 0) return -1;\n }\n else if (this.t == 1) return this[0];\n else if (this.t == 0) return 0;\n // assumes 16 < DB < 32\n return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];\n}\n// (public) return value as byte\nfunction bnByteValue()\n{\n return (this.t == 0) ? this.s : (this[0] << 24) >> 24;\n}\n// (public) return value as short (assumes DB>=16)\nfunction bnShortValue()\n{\n return (this.t == 0) ? this.s : (this[0] << 16) >> 16;\n}\n// (protected) return x s.t. r^x < DV\nfunction bnpChunkSize(r)\n{\n return Math.floor(Math.LN2 * this.DB / Math.log(r));\n}\n// (public) 0 if this == 0, 1 if this > 0\nfunction bnSigNum()\n{\n if (this.s < 0) return -1;\n else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n else return 1;\n}\n// (protected) convert to radix string\nfunction bnpToRadix(b)\n{\n if (b == null) b = 10;\n if (this.signum() == 0 || b < 2 || b > 36) return \"0\";\n var cs = this.chunkSize(b);\n var a = Math.pow(b, cs);\n var d = nbv(a),\n y = nbi(),\n z = nbi(),\n r = \"\";\n this.divRemTo(d, y, z);\n while (y.signum() > 0)\n {\n r = (a + z.intValue()).toString(b).substr(1) + r;\n y.divRemTo(d, y, z);\n }\n return z.intValue().toString(b) + r;\n}\n// (protected) convert from radix string\nfunction bnpFromRadix(s, b)\n{\n this.fromInt(0);\n if (b == null) b = 10;\n var cs = this.chunkSize(b);\n var d = Math.pow(b, cs),\n mi = false,\n j = 0,\n w = 0;\n for (var i = 0; i < s.length; ++i)\n {\n var x = intAt(s, i);\n if (x < 0)\n {\n if (s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n continue;\n }\n w = b * w + x;\n if (++j >= cs)\n {\n this.dMultiply(d);\n this.dAddOffset(w, 0);\n j = 0;\n w = 0;\n }\n }\n if (j > 0)\n {\n this.dMultiply(Math.pow(b, j));\n this.dAddOffset(w, 0);\n }\n if (mi) BigInteger.ZERO.subTo(this, this);\n}\n// (protected) alternate constructor\nfunction bnpFromNumber(a, b, c)\n{\n if (\"number\" == typeof b)\n {\n // new BigInteger(int,int,RNG)\n if (a < 2) this.fromInt(1);\n else\n {\n this.fromNumber(a, c);\n if (!this.testBit(a - 1)) // force MSB set\n this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);\n if (this.isEven()) this.dAddOffset(1, 0); // force odd\n while (!this.isProbablePrime(b))\n {\n this.dAddOffset(2, 0);\n if (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);\n }\n }\n }\n else\n {\n // new BigInteger(int,RNG)\n var x = new Array(),\n t = a & 7;\n x.length = (a >> 3) + 1;\n b.nextBytes(x);\n if (t > 0) x[0] &= ((1 << t) - 1);\n else x[0] = 0;\n this.fromString(x, 256);\n }\n}\n// (public) convert to bigendian byte array\nfunction bnToByteArray()\n{\n var i = this.t,\n r = new Array();\n r[0] = this.s;\n var p = this.DB - (i * this.DB) % 8,\n d, k = 0;\n if (i-- > 0)\n {\n if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p)\n r[k++] = d | (this.s << (this.DB - p));\n while (i >= 0)\n {\n if (p < 8)\n {\n d = (this[i] & ((1 << p) - 1)) << (8 - p);\n d |= this[--i] >> (p += this.DB - 8);\n }\n else\n {\n d = (this[i] >> (p -= 8)) & 0xff;\n if (p <= 0)\n {\n p += this.DB;\n --i;\n }\n }\n if ((d & 0x80) != 0) d |= -256;\n if (k == 0 && (this.s & 0x80) != (d & 0x80))++k;\n if (k > 0 || d != this.s) r[k++] = d;\n }\n }\n return r;\n}\n\nfunction bnEquals(a)\n{\n return (this.compareTo(a) == 0);\n}\n\nfunction bnMin(a)\n{\n return (this.compareTo(a) < 0) ? this : a;\n}\n\nfunction bnMax(a)\n{\n return (this.compareTo(a) > 0) ? this : a;\n}\n// (protected) r = this op a (bitwise)\nfunction bnpBitwiseTo(a, op, r)\n{\n var i, f, m = Math.min(a.t, this.t);\n for (i = 0; i < m; ++i) r[i] = op(this[i], a[i]);\n if (a.t < this.t)\n {\n f = a.s & this.DM;\n for (i = m; i < this.t; ++i) r[i] = op(this[i], f);\n r.t = this.t;\n }\n else\n {\n f = this.s & this.DM;\n for (i = m; i < a.t; ++i) r[i] = op(f, a[i]);\n r.t = a.t;\n }\n r.s = op(this.s, a.s);\n r.clamp();\n}\n// (public) this & a\nfunction op_and(x, y)\n{\n return x & y;\n}\n\nfunction bnAnd(a)\n{\n var r = nbi();\n this.bitwiseTo(a, op_and, r);\n return r;\n}\n// (public) this | a\nfunction op_or(x, y)\n{\n return x | y;\n}\n\nfunction bnOr(a)\n{\n var r = nbi();\n this.bitwiseTo(a, op_or, r);\n return r;\n}\n// (public) this ^ a\nfunction op_xor(x, y)\n{\n return x ^ y;\n}\n\nfunction bnXor(a)\n{\n var r = nbi();\n this.bitwiseTo(a, op_xor, r);\n return r;\n}\n// (public) this & ~a\nfunction op_andnot(x, y)\n{\n return x & ~y;\n}\n\nfunction bnAndNot(a)\n{\n var r = nbi();\n this.bitwiseTo(a, op_andnot, r);\n return r;\n}\n// (public) ~this\nfunction bnNot()\n{\n var r = nbi();\n for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i];\n r.t = this.t;\n r.s = ~this.s;\n return r;\n}\n// (public) this << n\nfunction bnShiftLeft(n)\n{\n var r = nbi();\n if (n < 0) this.rShiftTo(-n, r);\n else this.lShiftTo(n, r);\n return r;\n}\n// (public) this >> n\nfunction bnShiftRight(n)\n{\n var r = nbi();\n if (n < 0) this.lShiftTo(-n, r);\n else this.rShiftTo(n, r);\n return r;\n}\n// return index of lowest 1-bit in x, x < 2^31\nfunction lbit(x)\n{\n if (x == 0) return -1;\n var r = 0;\n if ((x & 0xffff) == 0)\n {\n x >>= 16;\n r += 16;\n }\n if ((x & 0xff) == 0)\n {\n x >>= 8;\n r += 8;\n }\n if ((x & 0xf) == 0)\n {\n x >>= 4;\n r += 4;\n }\n if ((x & 3) == 0)\n {\n x >>= 2;\n r += 2;\n }\n if ((x & 1) == 0)++r;\n return r;\n}\n// (public) returns index of lowest 1-bit (or -1 if none)\nfunction bnGetLowestSetBit()\n{\n for (var i = 0; i < this.t; ++i)\n if (this[i] != 0) return i * this.DB + lbit(this[i]);\n if (this.s < 0) return this.t * this.DB;\n return -1;\n}\n// return number of 1 bits in x\nfunction cbit(x)\n{\n var r = 0;\n while (x != 0)\n {\n x &= x - 1;\n ++r;\n }\n return r;\n}\n// (public) return number of set bits\nfunction bnBitCount()\n{\n var r = 0,\n x = this.s & this.DM;\n for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x);\n return r;\n}\n// (public) true iff nth bit is set\nfunction bnTestBit(n)\n{\n var j = Math.floor(n / this.DB);\n if (j >= this.t) return (this.s != 0);\n return ((this[j] & (1 << (n % this.DB))) != 0);\n}\n// (protected) this op (1<<n)\nfunction bnpChangeBit(n, op)\n{\n var r = BigInteger.ONE.shiftLeft(n);\n this.bitwiseTo(r, op, r);\n return r;\n}\n// (public) this | (1<<n)\nfunction bnSetBit(n)\n{\n return this.changeBit(n, op_or);\n}\n// (public) this & ~(1<<n)\nfunction bnClearBit(n)\n{\n return this.changeBit(n, op_andnot);\n}\n// (public) this ^ (1<<n)\nfunction bnFlipBit(n)\n{\n return this.changeBit(n, op_xor);\n}\n// (protected) r = this + a\nfunction bnpAddTo(a, r)\n{\n var i = 0,\n c = 0,\n m = Math.min(a.t, this.t);\n while (i < m)\n {\n c += this[i] + a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n if (a.t < this.t)\n {\n c += a.s;\n while (i < this.t)\n {\n c += this[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c += this.s;\n }\n else\n {\n c += this.s;\n while (i < a.t)\n {\n c += a[i];\n r[i++] = c & this.DM;\n c >>= this.DB;\n }\n c += a.s;\n }\n r.s = (c < 0) ? -1 : 0;\n if (c > 0) r[i++] = c;\n else if (c < -1) r[i++] = this.DV + c;\n r.t = i;\n r.clamp();\n}\n// (public) this + a\nfunction bnAdd(a)\n{\n var r = nbi();\n this.addTo(a, r);\n return r;\n}\n// (public) this - a\nfunction bnSubtract(a)\n{\n var r = nbi();\n this.subTo(a, r);\n return r;\n}\n// (public) this * a\nfunction bnMultiply(a)\n{\n var r = nbi();\n this.multiplyTo(a, r);\n return r;\n}\n// (public) this^2\nfunction bnSquare()\n{\n var r = nbi();\n this.squareTo(r);\n return r;\n}\n// (public) this / a\nfunction bnDivide(a)\n{\n var r = nbi();\n this.divRemTo(a, r, null);\n return r;\n}\n// (public) this % a\nfunction bnRemainder(a)\n{\n var r = nbi();\n this.divRemTo(a, null, r);\n return r;\n}\n// (public) [this/a,this%a]\nfunction bnDivideAndRemainder(a)\n{\n var q = nbi(),\n r = nbi();\n this.divRemTo(a, q, r);\n return new Array(q, r);\n}\n// (protected) this *= n, this >= 0, 1 < n < DV\nfunction bnpDMultiply(n)\n{\n this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);\n ++this.t;\n this.clamp();\n}\n// (protected) this += n << w words, this >= 0\nfunction bnpDAddOffset(n, w)\n{\n if (n == 0) return;\n while (this.t <= w) this[this.t++] = 0;\n this[w] += n;\n while (this[w] >= this.DV)\n {\n this[w] -= this.DV;\n if (++w >= this.t) this[this.t++] = 0;\n ++this[w];\n }\n}\n// A \"null\" reducer\nfunction NullExp()\n{}\n\nfunction nNop(x)\n{\n return x;\n}\n\nfunction nMulTo(x, y, r)\n{\n x.multiplyTo(y, r);\n}\n\nfunction nSqrTo(x, r)\n{\n x.squareTo(r);\n}\nNullExp.prototype.convert = nNop;\nNullExp.prototype.revert = nNop;\nNullExp.prototype.mulTo = nMulTo;\nNullExp.prototype.sqrTo = nSqrTo;\n// (public) this^e\nfunction bnPow(e)\n{\n return this.exp(e, new NullExp());\n}\n// (protected) r = lower n words of \"this * a\", a.t <= n\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyLowerTo(a, n, r)\n{\n var i = Math.min(this.t + a.t, n);\n r.s = 0; // assumes a,this >= 0\n r.t = i;\n while (i > 0) r[--i] = 0;\n var j;\n for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);\n for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i);\n r.clamp();\n}\n// (protected) r = \"this * a\" without lower n words, n > 0\n// \"this\" should be the larger one if appropriate.\nfunction bnpMultiplyUpperTo(a, n, r)\n{\n --n;\n var i = r.t = this.t + a.t - n;\n r.s = 0; // assumes a,this >= 0\n while (--i >= 0) r[i] = 0;\n for (i = Math.max(n - this.t, 0); i < a.t; ++i)\n r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);\n r.clamp();\n r.drShiftTo(1, r);\n}\n// Barrett modular reduction\nfunction Barrett(m)\n{\n // setup Barrett\n this.r2 = nbi();\n this.q3 = nbi();\n BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);\n this.mu = this.r2.divide(m);\n this.m = m;\n}\n\nfunction barrettConvert(x)\n{\n if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m);\n else if (x.compareTo(this.m) < 0) return x;\n else\n {\n var r = nbi();\n x.copyTo(r);\n this.reduce(r);\n return r;\n }\n}\n\nfunction barrettRevert(x)\n{\n return x;\n}\n// x = x mod m (HAC 14.42)\nfunction barrettReduce(x)\n{\n x.drShiftTo(this.m.t - 1, this.r2);\n if (x.t > this.m.t + 1)\n {\n x.t = this.m.t + 1;\n x.clamp();\n }\n this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);\n this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);\n while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1);\n x.subTo(this.r2, x);\n while (x.compareTo(this.m) >= 0) x.subTo(this.m, x);\n}\n// r = x^2 mod m; x != r\nfunction barrettSqrTo(x, r)\n{\n x.squareTo(r);\n this.reduce(r);\n}\n// r = x*y mod m; x,y != r\nfunction barrettMulTo(x, y, r)\n{\n x.multiplyTo(y, r);\n this.reduce(r);\n}\nBarrett.prototype.convert = barrettConvert;\nBarrett.prototype.revert = barrettRevert;\nBarrett.prototype.reduce = barrettReduce;\nBarrett.prototype.mulTo = barrettMulTo;\nBarrett.prototype.sqrTo = barrettSqrTo;\n// (public) this^e % m (HAC 14.85)\nfunction bnModPow(e, m)\n{\n var i = e.bitLength(),\n k, r = nbv(1),\n z;\n if (i <= 0) return r;\n else if (i < 18) k = 1;\n else if (i < 48) k = 3;\n else if (i < 144) k = 4;\n else if (i < 768) k = 5;\n else k = 6;\n if (i < 8)\n z = new Classic(m);\n else if (m.isEven())\n z = new Barrett(m);\n else\n z = new Montgomery(m);\n // precomputation\n var g = new Array(),\n n = 3,\n k1 = k - 1,\n km = (1 << k) - 1;\n g[1] = z.convert(this);\n if (k > 1)\n {\n var g2 = nbi();\n z.sqrTo(g[1], g2);\n while (n <= km)\n {\n g[n] = nbi();\n z.mulTo(g2, g[n - 2], g[n]);\n n += 2;\n }\n }\n var j = e.t - 1,\n w, is1 = true,\n r2 = nbi(),\n t;\n i = nbits(e[j]) - 1;\n while (j >= 0)\n {\n if (i >= k1) w = (e[j] >> (i - k1)) & km;\n else\n {\n w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);\n if (j > 0) w |= e[j - 1] >> (this.DB + i - k1);\n }\n n = k;\n while ((w & 1) == 0)\n {\n w >>= 1;\n --n;\n }\n if ((i -= n) < 0)\n {\n i += this.DB;\n --j;\n }\n if (is1)\n { // ret == 1, don't bother squaring or multiplying it\n g[w].copyTo(r);\n is1 = false;\n }\n else\n {\n while (n > 1)\n {\n z.sqrTo(r, r2);\n z.sqrTo(r2, r);\n n -= 2;\n }\n if (n > 0) z.sqrTo(r, r2);\n else\n {\n t = r;\n r = r2;\n r2 = t;\n }\n z.mulTo(r2, g[w], r);\n }\n while (j >= 0 && (e[j] & (1 << i)) == 0)\n {\n z.sqrTo(r, r2);\n t = r;\n r = r2;\n r2 = t;\n if (--i < 0)\n {\n i = this.DB - 1;\n --j;\n }\n }\n }\n return z.revert(r);\n}\n// (public) gcd(this,a) (HAC 14.54)\nfunction bnGCD(a)\n{\n var x = (this.s < 0) ? this.negate() : this.clone();\n var y = (a.s < 0) ? a.negate() : a.clone();\n if (x.compareTo(y) < 0)\n {\n var t = x;\n x = y;\n y = t;\n }\n var i = x.getLowestSetBit(),\n g = y.getLowestSetBit();\n if (g < 0) return x;\n if (i < g) g = i;\n if (g > 0)\n {\n x.rShiftTo(g, x);\n y.rShiftTo(g, y);\n }\n while (x.signum() > 0)\n {\n if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x);\n if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y);\n if (x.compareTo(y) >= 0)\n {\n x.subTo(y, x);\n x.rShiftTo(1, x);\n }\n else\n {\n y.subTo(x, y);\n y.rShiftTo(1, y);\n }\n }\n if (g > 0) y.lShiftTo(g, y);\n return y;\n}\n// (protected) this % n, n < 2^26\nfunction bnpModInt(n)\n{\n if (n <= 0) return 0;\n var d = this.DV % n,\n r = (this.s < 0) ? n - 1 : 0;\n if (this.t > 0)\n if (d == 0) r = this[0] % n;\n else\n for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n;\n return r;\n}\n// (public) 1/this % m (HAC 14.61)\nfunction bnModInverse(m)\n{\n var ac = m.isEven();\n if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\n var u = m.clone(),\n v = this.clone();\n var a = nbv(1),\n b = nbv(0),\n c = nbv(0),\n d = nbv(1);\n while (u.signum() != 0)\n {\n while (u.isEven())\n {\n u.rShiftTo(1, u);\n if (ac)\n {\n if (!a.isEven() || !b.isEven())\n {\n a.addTo(this, a);\n b.subTo(m, b);\n }\n a.rShiftTo(1, a);\n }\n else if (!b.isEven()) b.subTo(m, b);\n b.rShiftTo(1, b);\n }\n while (v.isEven())\n {\n v.rShiftTo(1, v);\n if (ac)\n {\n if (!c.isEven() || !d.isEven())\n {\n c.addTo(this, c);\n d.subTo(m, d);\n }\n c.rShiftTo(1, c);\n }\n else if (!d.isEven()) d.subTo(m, d);\n d.rShiftTo(1, d);\n }\n if (u.compareTo(v) >= 0)\n {\n u.subTo(v, u);\n if (ac) a.subTo(c, a);\n b.subTo(d, b);\n }\n else\n {\n v.subTo(u, v);\n if (ac) c.subTo(a, c);\n d.subTo(b, d);\n }\n }\n if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\n if (d.compareTo(m) >= 0) return d.subtract(m);\n if (d.signum() < 0) d.addTo(m, d);\n else return d;\n if (d.signum() < 0) return d.add(m);\n else return d;\n}\nvar lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];\nvar lplim = (1 << 26) / lowprimes[lowprimes.length - 1];\n// (public) test primality with certainty >= 1-.5^t\nfunction bnIsProbablePrime(t)\n{\n var i, x = this.abs();\n if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1])\n {\n for (i = 0; i < lowprimes.length; ++i)\n if (x[0] == lowprimes[i]) return true;\n return false;\n }\n if (x.isEven()) return false;\n i = 1;\n while (i < lowprimes.length)\n {\n var m = lowprimes[i],\n j = i + 1;\n while (j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n m = x.modInt(m);\n while (i < j)\n if (m % lowprimes[i++] == 0) return false;\n }\n return x.millerRabin(t);\n}\n// (protected) true if probably prime (HAC 4.24, Miller-Rabin)\nfunction bnpMillerRabin(t)\n{\n var n1 = this.subtract(BigInteger.ONE);\n var k = n1.getLowestSetBit();\n if (k <= 0) return false;\n var r = n1.shiftRight(k);\n t = (t + 1) >> 1;\n if (t > lowprimes.length) t = lowprimes.length;\n var a = nbi();\n for (var i = 0; i < t; ++i)\n {\n //Pick bases at random, instead of starting at 2\n a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);\n var y = a.modPow(r, this);\n if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0)\n {\n var j = 1;\n while (j++ < k && y.compareTo(n1) != 0)\n {\n y = y.modPowInt(2, this);\n if (y.compareTo(BigInteger.ONE) == 0) return false;\n }\n if (y.compareTo(n1) != 0) return false;\n }\n }\n return true;\n}\n// protected\nBigInteger.prototype.chunkSize = bnpChunkSize;\nBigInteger.prototype.toRadix = bnpToRadix;\nBigInteger.prototype.fromRadix = bnpFromRadix;\nBigInteger.prototype.fromNumber = bnpFromNumber;\nBigInteger.prototype.bitwiseTo = bnpBitwiseTo;\nBigInteger.prototype.changeBit = bnpChangeBit;\nBigInteger.prototype.addTo = bnpAddTo;\nBigInteger.prototype.dMultiply = bnpDMultiply;\nBigInteger.prototype.dAddOffset = bnpDAddOffset;\nBigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\nBigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\nBigInteger.prototype.modInt = bnpModInt;\nBigInteger.prototype.millerRabin = bnpMillerRabin;\n// public\nBigInteger.prototype.clone = bnClone;\nBigInteger.prototype.intValue = bnIntValue;\nBigInteger.prototype.byteValue = bnByteValue;\nBigInteger.prototype.shortValue = bnShortValue;\nBigInteger.prototype.signum = bnSigNum;\nBigInteger.prototype.toByteArray = bnToByteArray;\nBigInteger.prototype.equals = bnEquals;\nBigInteger.prototype.min = bnMin;\nBigInteger.prototype.max = bnMax;\nBigInteger.prototype.and = bnAnd;\nBigInteger.prototype.or = bnOr;\nBigInteger.prototype.xor = bnXor;\nBigInteger.prototype.andNot = bnAndNot;\nBigInteger.prototype.not = bnNot;\nBigInteger.prototype.shiftLeft = bnShiftLeft;\nBigInteger.prototype.shiftRight = bnShiftRight;\nBigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\nBigInteger.prototype.bitCount = bnBitCount;\nBigInteger.prototype.testBit = bnTestBit;\nBigInteger.prototype.setBit = bnSetBit;\nBigInteger.prototype.clearBit = bnClearBit;\nBigInteger.prototype.flipBit = bnFlipBit;\nBigInteger.prototype.add = bnAdd;\nBigInteger.prototype.subtract = bnSubtract;\nBigInteger.prototype.multiply = bnMultiply;\nBigInteger.prototype.divide = bnDivide;\nBigInteger.prototype.remainder = bnRemainder;\nBigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\nBigInteger.prototype.modPow = bnModPow;\nBigInteger.prototype.modInverse = bnModInverse;\nBigInteger.prototype.pow = bnPow;\nBigInteger.prototype.gcd = bnGCD;\nBigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n// JSBN-specific extension\nBigInteger.prototype.square = bnSquare;\nvar Int128 = BigInteger;\n// BigInteger interfaces not implemented in jsbn:\n// BigInteger(int signum, byte[] magnitude)\n// double doubleValue()\n// float floatValue()\n// int hashCode()\n// long longValue()\n// static BigInteger valueOf(long val)\n// Helper functions to make BigInteger functions callable with two parameters\n// as in original C# Clipper\nInt128.prototype.IsNegative = function ()\n{\n if (this.compareTo(Int128.ZERO) == -1) return true;\n else return false;\n};\nInt128.op_Equality = function (val1, val2)\n{\n if (val1.compareTo(val2) == 0) return true;\n else return false;\n};\nInt128.op_Inequality = function (val1, val2)\n{\n if (val1.compareTo(val2) != 0) return true;\n else return false;\n};\nInt128.op_GreaterThan = function (val1, val2)\n{\n if (val1.compareTo(val2) > 0) return true;\n else return false;\n};\nInt128.op_LessThan = function (val1, val2)\n{\n if (val1.compareTo(val2) < 0) return true;\n else return false;\n};\nInt128.op_Addition = function (lhs, rhs)\n{\n return new Int128(lhs).add(new Int128(rhs));\n};\nInt128.op_Subtraction = function (lhs, rhs)\n{\n return new Int128(lhs).subtract(new Int128(rhs));\n};\nInt128.Int128Mul = function (lhs, rhs)\n{\n return new Int128(lhs).multiply(new Int128(rhs));\n};\nInt128.op_Division = function (lhs, rhs)\n{\n return lhs.divide(rhs);\n};\nInt128.prototype.ToDouble = function ()\n{\n return parseFloat(this.toString()); // This could be something faster\n};\n// end of Int128 section\n/*\n// Uncomment the following two lines if you want to use Int128 outside ClipperLib\nif (typeof(document) !== \"undefined\") window.Int128 = Int128;\nelse self.Int128 = Int128;\n*/\n// --------------------------------------------- \n// Here starts the actual Clipper library:\n// Helper function to support Inheritance in Javascript\nif (typeof (Inherit) == 'undefined')\n{\n var Inherit = function (ce, ce2)\n {\n var p;\n if (typeof (Object.getOwnPropertyNames) == 'undefined')\n {\n for (p in ce2.prototype)\n if (typeof (ce.prototype[p]) == 'undefined' || ce.prototype[p] == Object.prototype[p]) ce.prototype[p] = ce2.prototype[p];\n for (p in ce2)\n if (typeof (ce[p]) == 'undefined') ce[p] = ce2[p];\n ce.$baseCtor = ce2;\n }\n else\n {\n var props = Object.getOwnPropertyNames(ce2.prototype);\n for (var i = 0; i < props.length; i++)\n if (typeof (Object.getOwnPropertyDescriptor(ce.prototype, props[i])) == 'undefined') Object.defineProperty(ce.prototype, props[i], Object.getOwnPropertyDescriptor(ce2.prototype, props[i]));\n for (p in ce2)\n if (typeof (ce[p]) == 'undefined') ce[p] = ce2[p];\n ce.$baseCtor = ce2;\n }\n };\n}\nClipperLib.Path = function ()\n{\n return [];\n};\nClipperLib.Paths = function ()\n{\n return []; // Was previously [[]], but caused problems when pushed\n};\n// Preserves the calling way of original C# Clipper\n// Is essential due to compatibility, because DoublePoint is public class in original C# version\nClipperLib.DoublePoint = function ()\n{\n var a = arguments;\n this.X = 0;\n this.Y = 0;\n // public DoublePoint(DoublePoint dp)\n // public DoublePoint(IntPoint ip)\n if (a.length == 1)\n {\n this.X = a[0].X;\n this.Y = a[0].Y;\n }\n else if (a.length == 2)\n {\n this.X = a[0];\n this.Y = a[1];\n }\n}; // This is internal faster function when called without arguments\nClipperLib.DoublePoint0 = function ()\n{\n this.X = 0;\n this.Y = 0;\n};\n// This is internal faster function when called with 1 argument (dp or ip)\nClipperLib.DoublePoint1 = function (dp)\n{\n this.X = dp.X;\n this.Y = dp.Y;\n};\n// This is internal faster function when called with 2 arguments (x and y)\nClipperLib.DoublePoint2 = function (x, y)\n{\n this.X = x;\n this.Y = y;\n};\n// PolyTree & PolyNode start\n// -------------------------------\nClipperLib.PolyNode = function ()\n{\n this.m_Parent = null;\n this.m_polygon = new ClipperLib.Path();\n this.m_Index = 0;\n this.m_jointype = 0;\n this.m_endtype = 0;\n this.m_Childs = [];\n this.IsOpen = false;\n};\nClipperLib.PolyNode.prototype.IsHoleNode = function ()\n{\n var result = true;\n var node = this.m_Parent;\n while (node !== null)\n {\n result = !result;\n node = node.m_Parent;\n }\n return result;\n};\nClipperLib.PolyNode.prototype.ChildCount = function ()\n{\n return this.m_Childs.length;\n};\nClipperLib.PolyNode.prototype.Contour = function ()\n{\n return this.m_polygon;\n};\nClipperLib.PolyNode.prototype.AddChild = function (Child)\n{\n var cnt = this.m_Childs.length;\n this.m_Childs.push(Child);\n Child.m_Parent = this;\n Child.m_Index = cnt;\n};\nClipperLib.PolyNode.prototype.GetNext = function ()\n{\n if (this.m_Childs.length > 0)\n return this.m_Childs[0];\n else\n return this.GetNextSiblingUp();\n};\nClipperLib.PolyNode.prototype.GetNextSiblingUp = function ()\n{\n if (this.m_Parent === null)\n return null;\n else if (this.m_Index == this.m_Parent.m_Childs.length - 1)\n return this.m_Parent.GetNextSiblingUp();\n else\n return this.m_Parent.m_Childs[this.m_Index + 1];\n};\nClipperLib.PolyNode.prototype.Childs = function ()\n{\n return this.m_Childs;\n};\nClipperLib.PolyNode.prototype.Parent = function ()\n{\n return this.m_Parent;\n};\nClipperLib.PolyNode.prototype.IsHole = function ()\n{\n return this.IsHoleNode();\n};\n// PolyTree : PolyNode\nClipperLib.PolyTree = function ()\n{\n this.m_AllPolys = [];\n ClipperLib.PolyNode.call(this);\n};\nClipperLib.PolyTree.prototype.Clear = function ()\n{\n for (var i = 0, ilen = this.m_AllPolys.length; i < ilen; i++)\n this.m_AllPolys[i] = null;\n this.m_AllPolys.length = 0;\n this.m_Childs.length = 0;\n};\nClipperLib.PolyTree.prototype.GetFirst = function ()\n{\n if (this.m_Childs.length > 0)\n return this.m_Childs[0];\n else\n return null;\n};\nClipperLib.PolyTree.prototype.Total = function ()\n{\n return this.m_AllPolys.length;\n};\nInherit(ClipperLib.PolyTree, ClipperLib.PolyNode);\n// -------------------------------\n// PolyTree & PolyNode end\nClipperLib.Math_Abs_Int64 = ClipperLib.Math_Abs_Int32 = ClipperLib.Math_Abs_Double = function (a)\n{\n return Math.abs(a);\n};\nClipperLib.Math_Max_Int32_Int32 = function (a, b)\n{\n return Math.max(a, b);\n};\n/*\n-----------------------------------\ncast_32 speedtest: http://jsperf.com/truncate-float-to-integer/2\n-----------------------------------\n*/\nif (browser.msie || browser.opera || browser.safari) ClipperLib.Cast_Int32 = function (a)\n{\n return a | 0;\n};\nelse ClipperLib.Cast_Int32 = function (a)\n{ // eg. browser.chrome || browser.chromium || browser.firefox\n return~~ a;\n};\n/*\n--------------------------\ncast_64 speedtests: http://jsperf.com/truncate-float-to-integer\nChrome: bitwise_not_floor\nFirefox17: toInteger (typeof test)\nIE9: bitwise_or_floor\nIE7 and IE8: to_parseint\nChromium: to_floor_or_ceil\nFirefox3: to_floor_or_ceil\nFirefox15: to_floor_or_ceil\nOpera: to_floor_or_ceil\nSafari: to_floor_or_ceil\n--------------------------\n*/\nif (browser.chrome) ClipperLib.Cast_Int64 = function (a)\n{\n if (a < -2147483648 || a > 2147483647)\n return a < 0 ? Math.ceil(a) : Math.floor(a);\n else return~~ a;\n};\nelse if (browser.firefox && typeof (Number.toInteger) == \"function\") ClipperLib.Cast_Int64 = function (a)\n{\n return Number.toInteger(a);\n};\nelse if (browser.msie7 || browser.msie8) ClipperLib.Cast_Int64 = function (a)\n{\n return parseInt(a, 10);\n};\nelse if (browser.msie) ClipperLib.Cast_Int64 = function (a)\n{\n if (a < -2147483648 || a > 2147483647)\n return a < 0 ? Math.ceil(a) : Math.floor(a);\n return a | 0;\n};\n// eg. browser.chromium || browser.firefox || browser.opera || browser.safari\nelse ClipperLib.Cast_Int64 = function (a)\n{\n return a < 0 ? Math.ceil(a) : Math.floor(a);\n};\nClipperLib.Clear = function (a)\n{\n a.length = 0;\n};\n//ClipperLib.MaxSteps = 64; // How many steps at maximum in arc in BuildArc() function\nClipperLib.PI = 3.141592653589793;\nClipperLib.PI2 = 2 * 3.141592653589793;\nClipperLib.IntPoint = function ()\n{\n var a = arguments,\n alen = a.length;\n this.X = 0;\n this.Y = 0;\n if (use_xyz)\n {\n this.Z = 0;\n if (alen == 3) // public IntPoint(cInt x, cInt y, cInt z = 0)\n {\n this.X = a[0];\n this.Y = a[1];\n this.Z = a[2];\n }\n else if (alen == 2) // public IntPoint(cInt x, cInt y)\n {\n this.X = a[0];\n this.Y = a[1];\n this.Z = 0;\n }\n else if (alen == 1)\n {\n if (a[0] instanceof ClipperLib.DoublePoint) // public IntPoint(DoublePoint dp)\n {\n var dp = a[0];\n this.X = ClipperLib.Clipper.Round(dp.X);\n this.Y = ClipperLib.Clipper.Round(dp.Y);\n this.Z = 0;\n }\n else // public IntPoint(IntPoint pt)\n {\n var pt = a[0];\n if (typeof (pt.Z) == \"undefined\") pt.Z = 0;\n this.X = pt.X;\n this.Y = pt.Y;\n this.Z = pt.Z;\n }\n }\n else // public IntPoint()\n {\n this.X = 0;\n this.Y = 0;\n this.Z = 0;\n }\n }\n else // if (!use_xyz)\n {\n if (alen == 2) // public IntPoint(cInt X, cInt Y)\n {\n this.X = a[0];\n this.Y = a[1];\n }\n else if (alen == 1)\n {\n if (a[0] instanceof ClipperLib.DoublePoint) // public IntPoint(DoublePoint dp)\n {\n var dp = a[0];\n this.X = ClipperLib.Clipper.Round(dp.X);\n this.Y = ClipperLib.Clipper.Round(dp.Y);\n }\n else // public IntPoint(IntPoint pt)\n {\n var pt = a[0];\n this.X = pt.X;\n this.Y = pt.Y;\n }\n }\n else // public IntPoint(IntPoint pt)\n {\n this.X = 0;\n this.Y = 0;\n }\n }\n};\nClipperLib.IntPoint.op_Equality = function (a, b)\n{\n //return a == b;\n return a.X == b.X && a.Y == b.Y;\n};\nClipperLib.IntPoint.op_Inequality = function (a, b)\n{\n //return a != b;\n return a.X != b.X || a.Y != b.Y;\n};\n/*\nClipperLib.IntPoint.prototype.Equals = function (obj)\n{\n if (obj === null)\n return false;\n if (obj instanceof ClipperLib.IntPoint)\n {\n var a = Cast(obj, ClipperLib.IntPoint);\n return (this.X == a.X) && (this.Y == a.Y);\n }\n else\n return false;\n};\n*/\nif (use_xyz)\n{\n ClipperLib.IntPoint0 = function ()\n {\n this.X = 0;\n this.Y = 0;\n this.Z = 0;\n };\n ClipperLib.IntPoint1 = function (pt)\n {\n this.X = pt.X;\n this.Y = pt.Y;\n this.Z = pt.Z;\n };\n ClipperLib.IntPoint1dp = function (dp)\n {\n this.X = ClipperLib.Clipper.Round(dp.X);\n this.Y = ClipperLib.Clipper.Round(dp.Y);\n this.Z = 0;\n };\n ClipperLib.IntPoint2 = function (x, y)\n {\n this.X = x;\n this.Y = y;\n this.Z = 0;\n };\n ClipperLib.IntPoint3 = function (x, y, z)\n {\n this.X = x;\n this.Y = y;\n this.Z = z;\n };\n}\nelse // if (!use_xyz)\n{\n ClipperLib.IntPoint0 = function ()\n {\n this.X = 0;\n this.Y = 0;\n };\n ClipperLib.IntPoint1 = function (pt)\n {\n this.X = pt.X;\n this.Y = pt.Y;\n };\n ClipperLib.IntPoint1dp = function (dp)\n {\n this.X = ClipperLib.Clipper.Round(dp.X);\n this.Y = ClipperLib.Clipper.Round(dp.Y);\n };\n ClipperLib.IntPoint2 = function (x, y)\n {\n this.X = x;\n this.Y = y;\n };\n}\nClipperLib.IntRect = function ()\n{\n var a = arguments,\n alen = a.length;\n if (alen == 4) // function (l, t, r, b)\n {\n this.left = a[0];\n this.top = a[1];\n this.right = a[2];\n this.bottom = a[3];\n }\n else if (alen == 1) // function (ir)\n {\n this.left = ir.left;\n this.top = ir.top;\n this.right = ir.right;\n this.bottom = ir.bottom;\n }\n else // function ()\n {\n this.left = 0;\n this.top = 0;\n this.right = 0;\n this.bottom = 0;\n }\n};\nClipperLib.IntRect0 = function ()\n{\n this.left = 0;\n this.top = 0;\n this.right = 0;\n this.bottom = 0;\n};\nClipperLib.IntRect1 = function (ir)\n{\n this.left = ir.left;\n this.top = ir.top;\n this.right = ir.right;\n this.bottom = ir.bottom;\n};\nClipperLib.IntRect4 = function (l, t, r, b)\n{\n this.left = l;\n this.top = t;\n this.right = r;\n this.bottom = b;\n};\nClipperLib.ClipType = {\n ctIntersection: 0,\n ctUnion: 1,\n ctDifference: 2,\n ctXor: 3\n};\nClipperLib.PolyType = {\n ptSubject: 0,\n ptClip: 1\n};\nClipperLib.PolyFillType = {\n pftEvenOdd: 0,\n pftNonZero: 1,\n pftPositive: 2,\n pftNegative: 3\n};\nClipperLib.JoinType = {\n jtSquare: 0,\n jtRound: 1,\n jtMiter: 2\n};\nClipperLib.EndType = {\n etOpenSquare: 0,\n etOpenRound: 1,\n etOpenButt: 2,\n etClosedLine: 3,\n etClosedPolygon: 4\n};\nif (use_deprecated)\n ClipperLib.EndType_ = {\n etSquare: 0,\n etRound: 1,\n etButt: 2,\n etClosed: 3\n };\nClipperLib.EdgeSide = {\n esLeft: 0,\n esRight: 1\n};\nClipperLib.Direction = {\n dRightToLeft: 0,\n dLeftToRight: 1\n};\nClipperLib.TEdge = function ()\n{\n this.Bot = new ClipperLib.IntPoint();\n this.Curr = new ClipperLib.IntPoint();\n this.Top = new ClipperLib.IntPoint();\n this.Delta = new ClipperLib.IntPoint();\n this.Dx = 0;\n this.PolyTyp = ClipperLib.PolyType.ptSubject;\n this.Side = ClipperLib.EdgeSide.esLeft;\n this.WindDelta = 0;\n this.WindCnt = 0;\n this.WindCnt2 = 0;\n this.OutIdx = 0;\n this.Next = null;\n this.Prev = null;\n this.NextInLML = null;\n this.NextInAEL = null;\n this.PrevInAEL = null;\n this.NextInSEL = null;\n this.PrevInSEL = null;\n};\nClipperLib.IntersectNode = function ()\n{\n this.Edge1 = null;\n this.Edge2 = null;\n this.Pt = new ClipperLib.IntPoint();\n};\nClipperLib.MyIntersectNodeSort = function () {};\nClipperLib.MyIntersectNodeSort.Compare = function (node1, node2)\n{\n return (node2.Pt.Y - node1.Pt.Y);\n};\nClipperLib.LocalMinima = function ()\n{\n this.Y = 0;\n this.LeftBound = null;\n this.RightBound = null;\n this.Next = null;\n};\nClipperLib.Scanbeam = function ()\n{\n this.Y = 0;\n this.Next = null;\n};\nClipperLib.OutRec = function ()\n{\n this.Idx = 0;\n this.IsHole = false;\n this.IsOpen = false;\n this.FirstLeft = null;\n this.Pts = null;\n this.BottomPt = null;\n this.PolyNode = null;\n};\nClipperLib.OutPt = function ()\n{\n this.Idx = 0;\n this.Pt = new ClipperLib.IntPoint();\n this.Next = null;\n this.Prev = null;\n};\nClipperLib.Join = function ()\n{\n this.OutPt1 = null;\n this.OutPt2 = null;\n this.OffPt = new ClipperLib.IntPoint();\n};\nClipperLib.ClipperBase = function ()\n{\n this.m_MinimaList = null;\n this.m_CurrentLM = null;\n this.m_edges = new Array();\n this.m_UseFullRange = false;\n this.m_HasOpenPaths = false;\n this.PreserveCollinear = false;\n this.m_MinimaList = null;\n this.m_CurrentLM = null;\n this.m_UseFullRange = false;\n this.m_HasOpenPaths = false;\n};\n// Ranges are in original C# too high for Javascript (in current state 2013 september):\n// protected const double horizontal = -3.4E+38;\n// internal const cInt loRange = 0x3FFFFFFF; // = 1073741823 = sqrt(2^63 -1)/2\n// internal const cInt hiRange = 0x3FFFFFFFFFFFFFFFL; // = 4611686018427387903 = sqrt(2^127 -1)/2\n// So had to adjust them to more suitable for Javascript.\n// If JS some day supports truly 64-bit integers, then these ranges can be as in C#\n// and biginteger library can be more simpler (as then 128bit can be represented as two 64bit numbers)\nClipperLib.ClipperBase.horizontal = -9007199254740992; //-2^53\nClipperLib.ClipperBase.Skip = -2;\nClipperLib.ClipperBase.Unassigned = -1;\nClipperLib.ClipperBase.tolerance = 1E-20;\nif (use_int32)\n{\n ClipperLib.ClipperBase.loRange = 46340;\n ClipperLib.ClipperBase.hiRange = 46340;\n}\nelse\n{\n ClipperLib.ClipperBase.loRange = 47453132; // sqrt(2^53 -1)/2\n ClipperLib.ClipperBase.hiRange = 4503599627370495; // sqrt(2^106 -1)/2\n}\nClipperLib.ClipperBase.near_zero = function (val)\n{\n return (val > -ClipperLib.ClipperBase.tolerance) && (val < ClipperLib.ClipperBase.tolerance);\n};\nClipperLib.ClipperBase.IsHorizontal = function (e)\n{\n return e.Delta.Y === 0;\n};\nClipperLib.ClipperBase.prototype.PointIsVertex = function (pt, pp)\n{\n var pp2 = pp;\n do {\n if (ClipperLib.IntPoint.op_Equality(pp2.Pt, pt))\n return true;\n pp2 = pp2.Next;\n }\n while (pp2 != pp)\n return false;\n};\nClipperLib.ClipperBase.prototype.PointOnLineSegment = function (pt, linePt1, linePt2, UseFullRange)\n{\n if (UseFullRange)\n return ((pt.X == linePt1.X) && (pt.Y == linePt1.Y)) ||\n ((pt.X == linePt2.X) && (pt.Y == linePt2.Y)) ||\n (((pt.X > linePt1.X) == (pt.X < linePt2.X)) &&\n ((pt.Y > linePt1.Y) == (pt.Y < linePt2.Y)) &&\n (Int128.op_Equality(Int128.Int128Mul((pt.X - linePt1.X), (linePt2.Y - linePt1.Y)),\n Int128.Int128Mul((linePt2.X - linePt1.X), (pt.Y - linePt1.Y)))));\n else\n return ((pt.X == linePt1.X) && (pt.Y == linePt1.Y)) || ((pt.X == linePt2.X) && (pt.Y == linePt2.Y)) || (((pt.X > linePt1.X) == (pt.X < linePt2.X)) && ((pt.Y > linePt1.Y) == (pt.Y < linePt2.Y)) && ((pt.X - linePt1.X) * (linePt2.Y - linePt1.Y) == (linePt2.X - linePt1.X) * (pt.Y - linePt1.Y)));\n};\nClipperLib.ClipperBase.prototype.PointOnPolygon = function (pt, pp, UseFullRange)\n{\n var pp2 = pp;\n while (true)\n {\n if (this.PointOnLineSegment(pt, pp2.Pt, pp2.Next.Pt, UseFullRange))\n return true;\n pp2 = pp2.Next;\n if (pp2 == pp)\n break;\n }\n return false;\n};\nClipperLib.ClipperBase.prototype.SlopesEqual = ClipperLib.ClipperBase.SlopesEqual = function ()\n{\n var a = arguments,\n alen = a.length;\n var e1, e2, pt1, pt2, pt3, pt4, UseFullRange;\n if (alen == 3) // function (e1, e2, UseFullRange)\n {\n e1 = a[0];\n e2 = a[1];\n UseFullRange = a[2];\n if (UseFullRange)\n return Int128.op_Equality(Int128.Int128Mul(e1.Delta.Y, e2.Delta.X), Int128.Int128Mul(e1.Delta.X, e2.Delta.Y));\n else\n return ClipperLib.Cast_Int64((e1.Delta.Y) * (e2.Delta.X)) == ClipperLib.Cast_Int64((e1.Delta.X) * (e2.Delta.Y));\n }\n else if (alen == 4) // function (pt1, pt2, pt3, UseFullRange)\n {\n pt1 = a[0];\n pt2 = a[1];\n pt3 = a[2];\n UseFullRange = a[3];\n if (UseFullRange)\n return Int128.op_Equality(Int128.Int128Mul(pt1.Y - pt2.Y, pt2.X - pt3.X), Int128.Int128Mul(pt1.X - pt2.X, pt2.Y - pt3.Y));\n else\n return ClipperLib.Cast_Int64((pt1.Y - pt2.Y) * (pt2.X - pt3.X)) - ClipperLib.Cast_Int64((pt1.X - pt2.X) * (pt2.Y - pt3.Y)) === 0;\n }\n else // function (pt1, pt2, pt3, pt4, UseFullRange)\n {\n pt1 = a[0];\n pt2 = a[1];\n pt3 = a[2];\n pt4 = a[3];\n UseFullRange = a[4];\n if (UseFullRange)\n return Int128.op_Equality(Int128.Int128Mul(pt1.Y - pt2.Y, pt3.X - pt4.X), Int128.Int128Mul(pt1.X - pt2.X, pt3.Y - pt4.Y));\n else\n return ClipperLib.Cast_Int64((pt1.Y - pt2.Y) * (pt3.X - pt4.X)) - ClipperLib.Cast_Int64((pt1.X - pt2.X) * (pt3.Y - pt4.Y)) === 0;\n }\n};\nClipperLib.ClipperBase.SlopesEqual3 = function (e1, e2, UseFullRange)\n{\n if (UseFullRange)\n return Int128.op_Equality(Int128.Int128Mul(e1.Delta.Y, e2.Delta.X), Int128.Int128Mul(e1.Delta.X, e2.Delta.Y));\n else\n return ClipperLib.Cast_Int64((e1.Delta.Y) * (e2.Delta.X)) == ClipperLib.Cast_Int64((e1.Delta.X) * (e2.Delta.Y));\n};\nClipperLib.ClipperBase.SlopesEqual4 = function (pt1, pt2, pt3, UseFullRange)\n{\n if (UseFullRange)\n return Int128.op_Equality(Int128.Int128Mul(pt1.Y - pt2.Y, pt2.X - pt3.X), Int128.Int128Mul(pt1.X - pt2.X, pt2.Y - pt3.Y));\n else\n return ClipperLib.Cast_Int64((pt1.Y - pt2.Y) * (pt2.X - pt3.X)) - ClipperLib.Cast_Int64((pt1.X - pt2.X) * (pt2.Y - pt3.Y)) === 0;\n};\nClipperLib.ClipperBase.SlopesEqual5 = function (pt1, pt2, pt3, pt4, UseFullRange)\n{\n if (UseFullRange)\n return Int128.op_Equality(Int128.Int128Mul(pt1.Y - pt2.Y, pt3.X - pt4.X), Int128.Int128Mul(pt1.X - pt2.X, pt3.Y - pt4.Y));\n else\n return ClipperLib.Cast_Int64((pt1.Y - pt2.Y) * (pt3.X - pt4.X)) - ClipperLib.Cast_Int64((pt1.X - pt2.X) * (pt3.Y - pt4.Y)) === 0;\n};\nClipperLib.ClipperBase.prototype.Clear = function ()\n{\n this.DisposeLocalMinimaList();\n for (var i = 0, ilen = this.m_edges.length; i < ilen; ++i)\n {\n for (var j = 0, jlen = this.m_edges[i].length; j < jlen; ++j)\n this.m_edges[i][j] = null;\n ClipperLib.Clear(this.m_edges[i]);\n }\n ClipperLib.Clear(this.m_edges);\n this.m_UseFullRange = false;\n this.m_HasOpenPaths = false;\n};\nClipperLib.ClipperBase.prototype.DisposeLocalMinimaList = function ()\n{\n while (this.m_MinimaList !== null)\n {\n var tmpLm = this.m_MinimaList.Next;\n this.m_MinimaList = null;\n this.m_MinimaList = tmpLm;\n }\n this.m_CurrentLM = null;\n};\nClipperLib.ClipperBase.prototype.RangeTest = function (Pt, useFullRange)\n{\n if (useFullRange.Value)\n {\n if (Pt.X > ClipperLib.ClipperBase.hiRange || Pt.Y > ClipperLib.ClipperBase.hiRange || -Pt.X > ClipperLib.ClipperBase.hiRange || -Pt.Y > ClipperLib.ClipperBase.hiRange)\n ClipperLib.Error(\"Coordinate outside allowed range in RangeTest().\");\n }\n else if (Pt.X > ClipperLib.ClipperBase.loRange || Pt.Y > ClipperLib.ClipperBase.loRange || -Pt.X > ClipperLib.ClipperBase.loRange || -Pt.Y > ClipperLib.ClipperBase.loRange)\n {\n useFullRange.Value = true;\n this.RangeTest(Pt, useFullRange);\n }\n};\nClipperLib.ClipperBase.prototype.InitEdge = function (e, eNext, ePrev, pt)\n{\n e.Next = eNext;\n e.Prev = ePrev;\n //e.Curr = pt;\n e.Curr.X = pt.X;\n e.Curr.Y = pt.Y;\n e.OutIdx = -1;\n};\nClipperLib.ClipperBase.prototype.InitEdge2 = function (e, polyType)\n{\n if (e.Curr.Y >= e.Next.Curr.Y)\n {\n //e.Bot = e.Curr;\n e.Bot.X = e.Curr.X;\n e.Bot.Y = e.Curr.Y;\n //e.Top = e.Next.Curr;\n e.Top.X = e.Next.Curr.X;\n e.Top.Y = e.Next.Curr.Y;\n }\n else\n {\n //e.Top = e.Curr;\n e.Top.X = e.Curr.X;\n e.Top.Y = e.Curr.Y;\n //e.Bot = e.Next.Curr;\n e.Bot.X = e.Next.Curr.X;\n e.Bot.Y = e.Next.Curr.Y;\n }\n this.SetDx(e);\n e.PolyTyp = polyType;\n};\nClipperLib.ClipperBase.prototype.FindNextLocMin = function (E)\n{\n var E2;\n for (;;)\n {\n while (ClipperLib.IntPoint.op_Inequality(E.Bot, E.Prev.Bot) || ClipperLib.IntPoint.op_Equality(E.Curr, E.Top))\n E = E.Next;\n if (E.Dx != ClipperLib.ClipperBase.horizontal && E.Prev.Dx != ClipperLib.ClipperBase.horizontal)\n break;\n while (E.Prev.Dx == ClipperLib.ClipperBase.horizontal)\n E = E.Prev;\n E2 = E;\n while (E.Dx == ClipperLib.ClipperBase.horizontal)\n E = E.Next;\n if (E.Top.Y == E.Prev.Bot.Y)\n continue;\n //ie just an intermediate horz.\n if (E2.Prev.Bot.X < E.Bot.X)\n E = E2;\n break;\n }\n return E;\n};\nClipperLib.ClipperBase.prototype.ProcessBound = function (E, IsClockwise)\n{\n var EStart = E,\n Result = E;\n var Horz;\n var StartX;\n if (E.Dx == ClipperLib.ClipperBase.horizontal)\n {\n //it's possible for adjacent overlapping horz edges to start heading left\n //before finishing right, so ...\n if (IsClockwise)\n StartX = E.Prev.Bot.X;\n else\n StartX = E.Next.Bot.X;\n if (E.Bot.X != StartX)\n this.ReverseHorizontal(E);\n }\n if (Result.OutIdx != ClipperLib.ClipperBase.Skip)\n {\n if (IsClockwise)\n {\n while (Result.Top.Y == Result.Next.Bot.Y && Result.Next.OutIdx != ClipperLib.ClipperBase.Skip)\n Result = Result.Next;\n if (Result.Dx == ClipperLib.ClipperBase.horizontal && Result.Next.OutIdx != ClipperLib.ClipperBase.Skip)\n {\n //nb: at the top of a bound, horizontals are added to the bound\n //only when the preceding edge attaches to the horizontal's left vertex\n //unless a Skip edge is encountered when that becomes the top divide\n Horz = Result;\n while (Horz.Prev.Dx == ClipperLib.ClipperBase.horizontal)\n Horz = Horz.Prev;\n if (Horz.Prev.Top.X == Result.Next.Top.X)\n {\n if (!IsClockwise)\n Result = Horz.Prev;\n }\n else if (Horz.Prev.Top.X > Result.Next.Top.X)\n Result = Horz.Prev;\n }\n while (E != Result)\n {\n E.NextInLML = E.Next;\n if (E.Dx == ClipperLib.ClipperBase.horizontal && E != EStart && E.Bot.X != E.Prev.Top.X)\n this.ReverseHorizontal(E);\n E = E.Next;\n }\n if (E.Dx == ClipperLib.ClipperBase.horizontal && E != EStart && E.Bot.X != E.Prev.Top.X)\n this.ReverseHorizontal(E);\n Result = Result.Next;\n //move to the edge just beyond current bound\n }\n else\n {\n while (Result.Top.Y == Result.Prev.Bot.Y && Result.Prev.OutIdx != ClipperLib.ClipperBase.Skip)\n Result = Result.Prev;\n if (Result.Dx == ClipperLib.ClipperBase.horizontal && Result.Prev.OutIdx != ClipperLib.ClipperBase.Skip)\n {\n Horz = Result;\n while (Horz.Next.Dx == ClipperLib.ClipperBase.horizontal)\n Horz = Horz.Next;\n if (Horz.Next.Top.X == Result.Prev.Top.X)\n {\n if (!IsClockwise)\n Result = Horz.Next;\n }\n else if (Horz.Next.Top.X > Result.Prev.Top.X)\n Result = Horz.Next;\n }\n while (E != Result)\n {\n E.NextInLML = E.Prev;\n if (E.Dx == ClipperLib.ClipperBase.horizontal && E != EStart && E.Bot.X != E.Next.Top.X)\n this.ReverseHorizontal(E);\n E = E.Prev;\n }\n if (E.Dx == ClipperLib.ClipperBase.horizontal && E != EStart && E.Bot.X != E.Next.Top.X)\n this.ReverseHorizontal(E);\n Result = Result.Prev;\n //move to the edge just beyond current bound\n }\n }\n if (Result.OutIdx == ClipperLib.ClipperBase.Skip)\n {\n //if edges still remain in the current bound beyond the skip edge then\n //create another LocMin and call ProcessBound once more\n E = Result;\n if (IsClockwise)\n {\n while (E.Top.Y == E.Next.Bot.Y)\n E = E.Next;\n //don't include top horizontals when parsing a bound a second time,\n //they will be contained in the opposite bound ...\n while (E != Result && E.Dx == ClipperLib.ClipperBase.horizontal)\n E = E.Prev;\n }\n else\n {\n while (E.Top.Y == E.Prev.Bot.Y)\n E = E.Prev;\n while (E != Result && E.Dx == ClipperLib.ClipperBase.horizontal)\n E = E.Next;\n }\n if (E == Result)\n {\n if (IsClockwise)\n Result = E.Next;\n else\n Result = E.Prev;\n }\n else\n {\n //there are more edges in the bound beyond result starting with E\n if (IsClockwise)\n E = Result.Next;\n else\n E = Result.Prev;\n var locMin = new ClipperLib.LocalMinima();\n locMin.Next = null;\n locMin.Y = E.Bot.Y;\n locMin.LeftBound = null;\n locMin.RightBound = E;\n locMin.RightBound.WindDelta = 0;\n Result = this.ProcessBound(locMin.RightBound, IsClockwise);\n this.InsertLocalMinima(locMin);\n }\n }\n return Result;\n};\nClipperLib.ClipperBase.prototype.AddPath = function (pg, polyType, Closed)\n{\n if (use_lines)\n {\n if (!Closed && polyType == ClipperLib.PolyType.ptClip)\n ClipperLib.Error(\"AddPath: Open paths must be subject.\");\n }\n else\n {\n if (!Closed)\n ClipperLib.Error(\"AddPath: Open paths have been disabled.\");\n }\n var highI = pg.length - 1;\n if (Closed)\n while (highI > 0 && (ClipperLib.IntPoint.op_Equality(pg[highI], pg[0])))\n --highI;\n while (highI > 0 && (ClipperLib.IntPoint.op_Equality(pg[highI], pg[highI - 1])))\n --highI;\n if ((Closed && highI < 2) || (!Closed && highI < 1))\n return false;\n //create a new edge array ...\n var edges = new Array();\n for (var i = 0; i <= highI; i++)\n edges.push(new ClipperLib.TEdge());\n var IsFlat = true;\n //1. Basic (first) edge initialization ...\n\n //edges[1].Curr = pg[1];\n edges[1].Curr.X = pg[1].X;\n edges[1].Curr.Y = pg[1].Y;\n\n var $1 = {Value: this.m_UseFullRange};\n this.RangeTest(pg[0], $1);\n this.m_UseFullRange = $1.Value;\n\n $1.Value = this.m_UseFullRange;\n this.RangeTest(pg[highI], $1);\n this.m_UseFullRange = $1.Value;\n\n this.InitEdge(edges[0], edges[1], edges[highI], pg[0]);\n this.InitEdge(edges[highI], edges[0], edges[highI - 1], pg[highI]);\n for (var i = highI - 1; i >= 1; --i)\n {\n $1.Value = this.m_UseFullRange;\n this.RangeTest(pg[i], $1);\n this.m_UseFullRange = $1.Value;\n\n this.InitEdge(edges[i], edges[i + 1], edges[i - 1], pg[i]);\n }\n\n var eStart = edges[0];\n //2. Remove duplicate vertices, and (when closed) collinear edges ...\n var E = eStart,\n eLoopStop = eStart;\n for (;;)\n {\n if (ClipperLib.IntPoint.op_Equality(E.Curr, E.Next.Curr))\n {\n if (E == E.Next)\n break;\n if (E == eStart)\n eStart = E.Next;\n E = this.RemoveEdge(E);\n eLoopStop = E;\n continue;\n }\n if (E.Prev == E.Next)\n break;\n else if (Closed && ClipperLib.ClipperBase.SlopesEqual(E.Prev.Curr, E.Curr, E.Next.Curr, this.m_UseFullRange) && (!this.PreserveCollinear || !this.Pt2IsBetweenPt1AndPt3(E.Prev.Curr, E.Curr, E.Next.Curr)))\n {\n //Collinear edges are allowed for open paths but in closed paths\n //the default is to merge adjacent collinear edges into a single edge.\n //However, if the PreserveCollinear property is enabled, only overlapping\n //collinear edges (ie spikes) will be removed from closed paths.\n if (E == eStart)\n eStart = E.Next;\n E = this.RemoveEdge(E);\n E = E.Prev;\n eLoopStop = E;\n continue;\n }\n E = E.Next;\n if (E == eLoopStop)\n break;\n }\n if ((!Closed && (E == E.Next)) || (Closed && (E.Prev == E.Next)))\n return false;\n if (!Closed)\n {\n this.m_HasOpenPaths = true;\n eStart.Prev.OutIdx = ClipperLib.ClipperBase.Skip;\n }\n //3. Do second stage of edge initialization ...\n var eHighest = eStart;\n E = eStart;\n do {\n this.InitEdge2(E, polyType);\n E = E.Next;\n if (IsFlat && E.Curr.Y != eStart.Curr.Y)\n IsFlat = false;\n }\n while (E != eStart)\n //4. Finally, add edge bounds to LocalMinima list ...\n //Totally flat paths must be handled differently when adding them\n //to LocalMinima list to avoid endless loops etc ...\n if (IsFlat)\n {\n if (Closed)\n return false;\n E.Prev.OutIdx = ClipperLib.ClipperBase.Skip;\n if (E.Prev.Bot.X < E.Prev.Top.X)\n this.ReverseHorizontal(E.Prev);\n var locMin = new ClipperLib.LocalMinima();\n locMin.Next = null;\n locMin.Y = E.Bot.Y;\n locMin.LeftBound = null;\n locMin.RightBound = E;\n locMin.RightBound.Side = ClipperLib.EdgeSide.esRight;\n locMin.RightBound.WindDelta = 0;\n while (E.Next.OutIdx != ClipperLib.ClipperBase.Skip)\n {\n E.NextInLML = E.Next;\n if (E.Bot.X != E.Prev.Top.X)\n this.ReverseHorizontal(E);\n E = E.Next;\n }\n this.InsertLocalMinima(locMin);\n this.m_edges.push(edges);\n return true;\n }\n this.m_edges.push(edges);\n var clockwise;\n var EMin = null;\n for (;;)\n {\n E = this.FindNextLocMin(E);\n if (E == EMin)\n break;\n else if (EMin == null)\n EMin = E;\n //E and E.Prev now share a local minima (left aligned if horizontal).\n //Compare their slopes to find which starts which bound ...\n var locMin = new ClipperLib.LocalMinima();\n locMin.Next = null;\n locMin.Y = E.Bot.Y;\n if (E.Dx < E.Prev.Dx)\n {\n locMin.LeftBound = E.Prev;\n locMin.RightBound = E;\n clockwise = false;\n //Q.nextInLML = Q.prev\n }\n else\n {\n locMin.LeftBound = E;\n locMin.RightBound = E.Prev;\n clockwise = true;\n //Q.nextInLML = Q.next\n }\n locMin.LeftBound.Side = ClipperLib.EdgeSide.esLeft;\n locMin.RightBound.Side = ClipperLib.EdgeSide.esRight;\n if (!Closed)\n locMin.LeftBound.WindDelta = 0;\n else if (locMin.LeftBound.Next == locMin.RightBound)\n locMin.LeftBound.WindDelta = -1;\n else\n locMin.LeftBound.WindDelta = 1;\n locMin.RightBound.WindDelta = -locMin.LeftBound.WindDelta;\n E = this.ProcessBound(locMin.LeftBound, clockwise);\n var E2 = this.ProcessBound(locMin.RightBound, !clockwise);\n if (locMin.LeftBound.OutIdx == ClipperLib.ClipperBase.Skip)\n locMin.LeftBound = null;\n else if (locMin.RightBound.OutIdx == ClipperLib.ClipperBase.Skip)\n locMin.RightBound = null;\n this.InsertLocalMinima(locMin);\n if (!clockwise)\n E = E2;\n }\n return true;\n};\nClipperLib.ClipperBase.prototype.AddPaths = function (ppg, polyType, closed)\n{\n // console.log(\"-------------------------------------------\");\n // console.log(JSON.stringify(ppg));\n var result = false;\n for (var i = 0, ilen = ppg.length; i < ilen; ++i)\n if (this.AddPath(ppg[i], polyType, closed))\n result = true;\n return result;\n};\n//------------------------------------------------------------------------------\nClipperLib.ClipperBase.prototype.Pt2IsBetweenPt1AndPt3 = function (pt1, pt2, pt3)\n{\n if ((ClipperLib.IntPoint.op_Equality(pt1, pt3)) || (ClipperLib.IntPoint.op_Equality(pt1, pt2)) ||\n (ClipperLib.IntPoint.op_Equality(pt3, pt2)))\n return false;\n else if (pt1.X != pt3.X)\n return (pt2.X > pt1.X) == (pt2.X < pt3.X);\n else\n return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y);\n};\nClipperLib.ClipperBase.prototype.RemoveEdge = function (e)\n{\n //removes e from double_linked_list (but without removing from memory)\n e.Prev.Next = e.Next;\n e.Next.Prev = e.Prev;\n var result = e.Next;\n e.Prev = null; //flag as removed (see ClipperBase.Clear)\n return result;\n};\nClipperLib.ClipperBase.prototype.SetDx = function (e)\n{\n e.Delta.X = (e.Top.X - e.Bot.X);\n e.Delta.Y = (e.Top.Y - e.Bot.Y);\n if (e.Delta.Y === 0) e.Dx = ClipperLib.ClipperBase.horizontal;\n else e.Dx = (e.Delta.X) / (e.Delta.Y);\n};\nClipperLib.ClipperBase.prototype.InsertLocalMinima = function (newLm)\n{\n if (this.m_MinimaList === null)\n {\n this.m_MinimaList = newLm;\n }\n else if (newLm.Y >= this.m_MinimaList.Y)\n {\n newLm.Next = this.m_MinimaList;\n this.m_MinimaList = newLm;\n }\n else\n {\n var tmpLm = this.m_MinimaList;\n while (tmpLm.Next !== null && (newLm.Y < tmpLm.Next.Y))\n tmpLm = tmpLm.Next;\n newLm.Next = tmpLm.Next;\n tmpLm.Next = newLm;\n }\n};\nClipperLib.ClipperBase.prototype.PopLocalMinima = function ()\n{\n if (this.m_CurrentLM === null)\n return;\n this.m_CurrentLM = this.m_CurrentLM.Next;\n};\nClipperLib.ClipperBase.prototype.ReverseHorizontal = function (e)\n{\n //swap horizontal edges' top and bottom x's so they follow the natural\n //progression of the bounds - ie so their xbots will align with the\n //adjoining lower edge. [Helpful in the ProcessHorizontal() method.]\n var tmp = e.Top.X;\n e.Top.X = e.Bot.X;\n e.Bot.X = tmp;\n if (use_xyz)\n {\n tmp = e.Top.Z;\n e.Top.Z = e.Bot.Z;\n e.Bot.Z = tmp;\n }\n};\nClipperLib.ClipperBase.prototype.Reset = function ()\n{\n this.m_CurrentLM = this.m_MinimaList;\n if (this.m_CurrentLM == null)\n return;\n //ie nothing to process\n //reset all edges ...\n var lm = this.m_MinimaList;\n while (lm != null)\n {\n var e = lm.LeftBound;\n if (e != null)\n {\n //e.Curr = e.Bot;\n e.Curr.X = e.Bot.X;\n e.Curr.Y = e.Bot.Y;\n e.Side = ClipperLib.EdgeSide.esLeft;\n e.OutIdx = ClipperLib.ClipperBase.Unassigned;\n }\n e = lm.RightBound;\n if (e != null)\n {\n //e.Curr = e.Bot;\n e.Curr.X = e.Bot.X;\n e.Curr.Y = e.Bot.Y;\n e.Side = ClipperLib.EdgeSide.esRight;\n e.OutIdx = ClipperLib.ClipperBase.Unassigned;\n }\n lm = lm.Next;\n }\n};\nClipperLib.Clipper = function (InitOptions) // public Clipper(int InitOptions = 0)\n{\n if (typeof (InitOptions) == \"undefined\") InitOptions = 0;\n this.m_PolyOuts = null;\n this.m_ClipType = ClipperLib.ClipType.ctIntersection;\n this.m_Scanbeam = null;\n this.m_ActiveEdges = null;\n this.m_SortedEdges = null;\n this.m_IntersectList = null;\n this.m_IntersectNodeComparer = null;\n this.m_ExecuteLocked = false;\n this.m_ClipFillType = ClipperLib.PolyFillType.pftEvenOdd;\n this.m_SubjFillType = ClipperLib.PolyFillType.pftEvenOdd;\n this.m_Joins = null;\n this.m_GhostJoins = null;\n this.m_UsingPolyTree = false;\n this.ReverseSolution = false;\n this.StrictlySimple = false;\n ClipperLib.ClipperBase.call(this);\n this.m_Scanbeam = null;\n this.m_ActiveEdges = null;\n this.m_SortedEdges = null;\n this.m_IntersectList = new Array();\n this.m_IntersectNodeComparer = ClipperLib.MyIntersectNodeSort.Compare;\n this.m_ExecuteLocked = false;\n this.m_UsingPolyTree = false;\n this.m_PolyOuts = new Array();\n this.m_Joins = new Array();\n this.m_GhostJoins = new Array();\n this.ReverseSolution = (1 & InitOptions) !== 0;\n this.StrictlySimple = (2 & InitOptions) !== 0;\n this.PreserveCollinear = (4 & InitOptions) !== 0;\n if (use_xyz)\n {\n this.ZFillFunction = null; // function (IntPoint vert1, IntPoint vert2, ref IntPoint intersectPt);\n }\n};\nClipperLib.Clipper.ioReverseSolution = 1;\nClipperLib.Clipper.ioStrictlySimple = 2;\nClipperLib.Clipper.ioPreserveCollinear = 4;\n\nClipperLib.Clipper.prototype.Clear = function ()\n{\n if (this.m_edges.length === 0)\n return;\n //avoids problems with ClipperBase destructor\n this.DisposeAllPolyPts();\n ClipperLib.ClipperBase.prototype.Clear.call(this);\n};\n\nClipperLib.Clipper.prototype.DisposeScanbeamList = function ()\n{\n while (this.m_Scanbeam !== null)\n {\n var sb2 = this.m_Scanbeam.Next;\n this.m_Scanbeam = null;\n this.m_Scanbeam = sb2;\n }\n};\nClipperLib.Clipper.prototype.Reset = function ()\n{\n ClipperLib.ClipperBase.prototype.Reset.call(this);\n this.m_Scanbeam = null;\n this.m_ActiveEdges = null;\n this.m_SortedEdges = null;\n\n var lm = this.m_MinimaList;\n while (lm !== null)\n {\n this.InsertScanbeam(lm.Y);\n lm = lm.Next;\n }\n};\nClipperLib.Clipper.prototype.InsertScanbeam = function (Y)\n{\n if (this.m_Scanbeam === null)\n {\n this.m_Scanbeam = new ClipperLib.Scanbeam();\n this.m_Scanbeam.Next = null;\n this.m_Scanbeam.Y = Y;\n }\n else if (Y > this.m_Scanbeam.Y)\n {\n var newSb = new ClipperLib.Scanbeam();\n newSb.Y = Y;\n newSb.Next = this.m_Scanbeam;\n this.m_Scanbeam = newSb;\n }\n else\n {\n var sb2 = this.m_Scanbeam;\n while (sb2.Next !== null && (Y <= sb2.Next.Y))\n sb2 = sb2.Next;\n if (Y == sb2.Y)\n return;\n //ie ignores duplicates\n var newSb = new ClipperLib.Scanbeam();\n newSb.Y = Y;\n newSb.Next = sb2.Next;\n sb2.Next = newSb;\n }\n};\n// ************************************\nClipperLib.Clipper.prototype.Execute = function ()\n{\n var a = arguments,\n alen = a.length,\n ispolytree = a[1] instanceof ClipperLib.PolyTree;\n if (alen == 4 && !ispolytree) // function (clipType, solution, subjFillType, clipFillType)\n {\n var clipType = a[0],\n solution = a[1],\n subjFillType = a[2],\n clipFillType = a[3];\n if (this.m_ExecuteLocked)\n return false;\n if (this.m_HasOpenPaths)\n ClipperLib.Error(\"Error: PolyTree struct is need for open path clipping.\");\n this.m_ExecuteLocked = true;\n ClipperLib.Clear(solution);\n this.m_SubjFillType = subjFillType;\n this.m_ClipFillType = clipFillType;\n this.m_ClipType = clipType;\n this.m_UsingPolyTree = false;\n try\n {\n var succeeded = this.ExecuteInternal();\n //build the return polygons ...\n if (succeeded) this.BuildResult(solution);\n }\n finally\n {\n this.DisposeAllPolyPts();\n this.m_ExecuteLocked = false;\n }\n return succeeded;\n }\n else if (alen == 4 && ispolytree) // function (clipType, polytree, subjFillType, clipFillType)\n {\n var clipType = a[0],\n polytree = a[1],\n subjFillType = a[2],\n clipFillType = a[3];\n if (this.m_ExecuteLocked)\n return false;\n this.m_ExecuteLocked = true;\n this.m_SubjFillType = subjFillType;\n this.m_ClipFillType = clipFillType;\n this.m_ClipType = clipType;\n this.m_UsingPolyTree = true;\n try\n {\n var succeeded = this.ExecuteInternal();\n //build the return polygons ...\n if (succeeded) this.BuildResult2(polytree);\n }\n finally\n {\n this.DisposeAllPolyPts();\n this.m_ExecuteLocked = false;\n }\n return succeeded;\n }\n else if (alen == 2 && !ispolytree) // function (clipType, solution)\n {\n var clipType = a[0],\n solution = a[1];\n return this.Execute(clipType, solution, ClipperLib.PolyFillType.pftEvenOdd, ClipperLib.PolyFillType.pftEvenOdd);\n }\n else if (alen == 2 && ispolytree) // function (clipType, polytree)\n {\n var clipType = a[0],\n polytree = a[1];\n return this.Execute(clipType, polytree, ClipperLib.PolyFillType.pftEvenOdd, ClipperLib.PolyFillType.pftEvenOdd);\n }\n};\nClipperLib.Clipper.prototype.FixHoleLinkage = function (outRec)\n{\n //skip if an outermost polygon or\n //already already points to the correct FirstLeft ...\n if (outRec.FirstLeft === null || (outRec.IsHole != outRec.FirstLeft.IsHole && outRec.FirstLeft.Pts !== null))\n return;\n var orfl = outRec.FirstLeft;\n while (orfl !== null && ((orfl.IsHole == outRec.IsHole) || orfl.Pts === null))\n orfl = orfl.FirstLeft;\n outRec.FirstLeft = orfl;\n};\nClipperLib.Clipper.prototype.ExecuteInternal = function ()\n{\n try\n {\n this.Reset();\n if (this.m_CurrentLM === null)\n return false;\n var botY = this.PopScanbeam();\n do {\n this.InsertLocalMinimaIntoAEL(botY);\n ClipperLib.Clear(this.m_GhostJoins);\n this.ProcessHorizontals(false);\n if (this.m_Scanbeam === null)\n break;\n var topY = this.PopScanbeam();\n //console.log(\"botY:\" + botY + \", topY:\" + topY);\n if (!this.ProcessIntersections(botY, topY))\n return false;\n this.ProcessEdgesAtTopOfScanbeam(topY);\n botY = topY;\n }\n while (this.m_Scanbeam !== null || this.m_CurrentLM !== null)\n //fix orientations ...\n for (var i = 0, ilen = this.m_PolyOuts.length; i < ilen; i++)\n {\n var outRec = this.m_PolyOuts[i];\n if (outRec.Pts === null || outRec.IsOpen)\n continue;\n if ((outRec.IsHole ^ this.ReverseSolution) == (this.Area(outRec) > 0))\n this.ReversePolyPtLinks(outRec.Pts);\n }\n this.JoinCommonEdges();\n for (var i = 0, ilen = this.m_PolyOuts.length; i < ilen; i++)\n {\n var outRec = this.m_PolyOuts[i];\n if (outRec.Pts !== null && !outRec.IsOpen)\n this.FixupOutPolygon(outRec);\n }\n if (this.StrictlySimple)\n this.DoSimplePolygons();\n return true;\n }\n finally\n {\n ClipperLib.Clear(this.m_Joins);\n ClipperLib.Clear(this.m_GhostJoins);\n }\n};\nClipperLib.Clipper.prototype.PopScanbeam = function ()\n{\n var Y = this.m_Scanbeam.Y;\n var sb2 = this.m_Scanbeam;\n this.m_Scanbeam = this.m_Scanbeam.Next;\n sb2 = null;\n return Y;\n};\nClipperLib.Clipper.prototype.DisposeAllPolyPts = function ()\n{\n for (var i = 0, ilen = this.m_PolyOuts.length; i < ilen; ++i)\n this.DisposeOutRec(i);\n ClipperLib.Clear(this.m_PolyOuts);\n};\nClipperLib.Clipper.prototype.DisposeOutRec = function (index)\n{\n var outRec = this.m_PolyOuts[index];\n if (outRec.Pts !== null)\n this.DisposeOutPts(outRec.Pts);\n outRec = null;\n this.m_PolyOuts[index] = null;\n};\nClipperLib.Clipper.prototype.DisposeOutPts = function (pp)\n{\n if (pp === null)\n return;\n var tmpPp = null;\n pp.Prev.Next = null;\n while (pp !== null)\n {\n tmpPp = pp;\n pp = pp.Next;\n tmpPp = null;\n }\n};\nClipperLib.Clipper.prototype.AddJoin = function (Op1, Op2, OffPt)\n{\n var j = new ClipperLib.Join();\n j.OutPt1 = Op1;\n j.OutPt2 = Op2;\n //j.OffPt = OffPt;\n j.OffPt.X = OffPt.X;\n j.OffPt.Y = OffPt.Y;\n this.m_Joins.push(j);\n};\nClipperLib.Clipper.prototype.AddGhostJoin = function (Op, OffPt)\n{\n var j = new ClipperLib.Join();\n j.OutPt1 = Op;\n //j.OffPt = OffPt;\n j.OffPt.X = OffPt.X;\n j.OffPt.Y = OffPt.Y;\n this.m_GhostJoins.push(j);\n};\nif (use_xyz)\n{\n ClipperLib.Clipper.prototype.SetZ = function (pt, e)\n {\n pt.Z = 0;\n if (this.ZFillFunction !== null)\n {\n //put the 'preferred' point as first parameter ...\n if (e.OutIdx < 0)\n this.ZFillFunction(e.Bot, e.Top, pt); //outside a path so presume entering\n else\n this.ZFillFunction(e.Top, e.Bot, pt); //inside a path so presume exiting\n }\n };\n //------------------------------------------------------------------------------\n}\nClipperLib.Clipper.prototype.InsertLocalMinimaIntoAEL = function (botY)\n{\n while (this.m_CurrentLM !== null && (this.m_CurrentLM.Y == botY))\n {\n var lb = this.m_CurrentLM.LeftBound;\n var rb = this.m_CurrentLM.RightBound;\n this.PopLocalMinima();\n var Op1 = null;\n if (lb === null)\n {\n this.InsertEdgeIntoAEL(rb, null);\n this.SetWindingCount(rb);\n if (this.IsContributing(rb))\n Op1 = this.AddOutPt(rb, rb.Bot);\n }\n else if (rb == null)\n {\n this.InsertEdgeIntoAEL(lb, null);\n this.SetWindingCount(lb);\n if (this.IsContributing(lb))\n Op1 = this.AddOutPt(lb, lb.Bot);\n this.InsertScanbeam(lb.Top.Y);\n }\n else\n {\n this.InsertEdgeIntoAEL(lb, null);\n this.InsertEdgeIntoAEL(rb, lb);\n this.SetWindingCount(lb);\n rb.WindCnt = lb.WindCnt;\n rb.WindCnt2 = lb.WindCnt2;\n if (this.IsContributing(lb))\n Op1 = this.AddLocalMinPoly(lb, rb, lb.Bot);\n this.InsertScanbeam(lb.Top.Y);\n }\n if (rb != null)\n {\n if (ClipperLib.ClipperBase.IsHorizontal(rb))\n this.AddEdgeToSEL(rb);\n else\n this.InsertScanbeam(rb.Top.Y);\n }\n if (lb == null || rb == null) continue;\n //if output polygons share an Edge with a horizontal rb, they'll need joining later ...\n if (Op1 !== null && ClipperLib.ClipperBase.IsHorizontal(rb) && this.m_GhostJoins.length > 0 && rb.WindDelta !== 0)\n {\n for (var i = 0, ilen = this.m_GhostJoins.length; i < ilen; i++)\n {\n //if the horizontal Rb and a 'ghost' horizontal overlap, then convert\n //the 'ghost' join to a real join ready for later ...\n var j = this.m_GhostJoins[i];\n if (this.HorzSegmentsOverlap(j.OutPt1.Pt, j.OffPt, rb.Bot, rb.Top))\n this.AddJoin(j.OutPt1, Op1, j.OffPt);\n }\n }\n if (lb.OutIdx >= 0 && lb.PrevInAEL !== null &&\n lb.PrevInAEL.Curr.X == lb.Bot.X &&\n lb.PrevInAEL.OutIdx >= 0 &&\n ClipperLib.ClipperBase.SlopesEqual(lb.PrevInAEL, lb, this.m_UseFullRange) &&\n lb.WindDelta !== 0 && lb.PrevInAEL.WindDelta !== 0)\n {\n var Op2 = this.AddOutPt(lb.PrevInAEL, lb.Bot);\n this.AddJoin(Op1, Op2, lb.Top);\n }\n if (lb.NextInAEL != rb)\n {\n if (rb.OutIdx >= 0 && rb.PrevInAEL.OutIdx >= 0 &&\n ClipperLib.ClipperBase.SlopesEqual(rb.PrevInAEL, rb, this.m_UseFullRange) &&\n rb.WindDelta !== 0 && rb.PrevInAEL.WindDelta !== 0)\n {\n var Op2 = this.AddOutPt(rb.PrevInAEL, rb.Bot);\n this.AddJoin(Op1, Op2, rb.Top);\n }\n var e = lb.NextInAEL;\n if (e !== null)\n while (e != rb)\n {\n //nb: For calculating winding counts etc, IntersectEdges() assumes\n //that param1 will be to the right of param2 ABOVE the intersection ...\n this.IntersectEdges(rb, e, lb.Curr, false);\n //order important here\n e = e.NextInAEL;\n }\n }\n }\n};\nClipperLib.Clipper.prototype.InsertEdgeIntoAEL = function (edge, startEdge)\n{\n if (this.m_ActiveEdges === null)\n {\n edge.PrevInAEL = null;\n edge.NextInAEL = null;\n this.m_ActiveEdges = edge;\n }\n else if (startEdge === null && this.E2InsertsBeforeE1(this.m_ActiveEdges, edge))\n {\n edge.PrevInAEL = null;\n edge.NextInAEL = this.m_ActiveEdges;\n this.m_ActiveEdges.PrevInAEL = edge;\n this.m_ActiveEdges = edge;\n }\n else\n {\n if (startEdge === null)\n startEdge = this.m_ActiveEdges;\n while (startEdge.NextInAEL !== null && !this.E2InsertsBeforeE1(startEdge.NextInAEL, edge))\n startEdge = startEdge.NextInAEL;\n edge.NextInAEL = startEdge.NextInAEL;\n if (startEdge.NextInAEL !== null)\n startEdge.NextInAEL.PrevInAEL = edge;\n edge.PrevInAEL = startEdge;\n startEdge.NextInAEL = edge;\n }\n};\nClipperLib.Clipper.prototype.E2InsertsBeforeE1 = function (e1, e2)\n{\n if (e2.Curr.X == e1.Curr.X)\n {\n if (e2.Top.Y > e1.Top.Y)\n return e2.Top.X < ClipperLib.Clipper.TopX(e1, e2.Top.Y);\n else\n return e1.Top.X > ClipperLib.Clipper.TopX(e2, e1.Top.Y);\n }\n else\n return e2.Curr.X < e1.Curr.X;\n};\nClipperLib.Clipper.prototype.IsEvenOddFillType = function (edge)\n{\n if (edge.PolyTyp == ClipperLib.PolyType.ptSubject)\n return this.m_SubjFillType == ClipperLib.PolyFillType.pftEvenOdd;\n else\n return this.m_ClipFillType == ClipperLib.PolyFillType.pftEvenOdd;\n};\nClipperLib.Clipper.prototype.IsEvenOddAltFillType = function (edge)\n{\n if (edge.PolyTyp == ClipperLib.PolyType.ptSubject)\n return this.m_ClipFillType == ClipperLib.PolyFillType.pftEvenOdd;\n else\n return this.m_SubjFillType == ClipperLib.PolyFillType.pftEvenOdd;\n};\nClipperLib.Clipper.prototype.IsContributing = function (edge)\n{\n var pft, pft2;\n if (edge.PolyTyp == ClipperLib.PolyType.ptSubject)\n {\n pft = this.m_SubjFillType;\n pft2 = this.m_ClipFillType;\n }\n else\n {\n pft = this.m_ClipFillType;\n pft2 = this.m_SubjFillType;\n }\n switch (pft)\n {\n case ClipperLib.PolyFillType.pftEvenOdd:\n if (edge.WindDelta === 0 && edge.WindCnt != 1)\n return false;\n break;\n case ClipperLib.PolyFillType.pftNonZero:\n if (Math.abs(edge.WindCnt) != 1)\n return false;\n break;\n case ClipperLib.PolyFillType.pftPositive:\n if (edge.WindCnt != 1)\n return false;\n break;\n default:\n if (edge.WindCnt != -1)\n return false;\n break;\n }\n switch (this.m_ClipType)\n {\n case ClipperLib.ClipType.ctIntersection:\n switch (pft2)\n {\n case ClipperLib.PolyFillType.pftEvenOdd:\n case ClipperLib.PolyFillType.pftNonZero:\n return (edge.WindCnt2 !== 0);\n case ClipperLib.PolyFillType.pftPositive:\n return (edge.WindCnt2 > 0);\n default:\n return (edge.WindCnt2 < 0);\n }\n case ClipperLib.ClipType.ctUnion:\n switch (pft2)\n {\n case ClipperLib.PolyFillType.pftEvenOdd:\n case ClipperLib.PolyFillType.pftNonZero:\n return (edge.WindCnt2 === 0);\n case ClipperLib.PolyFillType.pftPositive:\n return (edge.WindCnt2 <= 0);\n default:\n return (edge.WindCnt2 >= 0);\n }\n case ClipperLib.ClipType.ctDifference:\n if (edge.PolyTyp == ClipperLib.PolyType.ptSubject)\n switch (pft2)\n {\n case ClipperLib.PolyFillType.pftEvenOdd:\n case ClipperLib.PolyFillType.pftNonZero:\n return (edge.WindCnt2 === 0);\n case ClipperLib.PolyFillType.pftPositive:\n return (edge.WindCnt2 <= 0);\n default:\n return (edge.WindCnt2 >= 0);\n }\n else\n switch (pft2)\n {\n case ClipperLib.PolyFillType.pftEvenOdd:\n case ClipperLib.PolyFillType.pftNonZero:\n return (edge.WindCnt2 !== 0);\n case ClipperLib.PolyFillType.pftPositive:\n return (edge.WindCnt2 > 0);\n default:\n return (edge.WindCnt2 < 0);\n }\n case ClipperLib.ClipType.ctXor:\n if (edge.WindDelta === 0)\n switch (pft2)\n {\n case ClipperLib.PolyFillType.pftEvenOdd:\n case ClipperLib.PolyFillType.pftNonZero:\n return (edge.WindCnt2 === 0);\n case ClipperLib.PolyFillType.pftPositive:\n return (edge.WindCnt2 <= 0);\n default:\n return (edge.WindCnt2 >= 0);\n }\n else\n return true;\n }\n return true;\n};\nClipperLib.Clipper.prototype.SetWindingCount = function (edge)\n{\n var e = edge.PrevInAEL;\n //find the edge of the same polytype that immediately preceeds 'edge' in AEL\n while (e !== null && ((e.PolyTyp != edge.PolyTyp) || (e.WindDelta === 0)))\n e = e.PrevInAEL;\n if (e === null)\n {\n edge.WindCnt = (edge.WindDelta === 0 ? 1 : edge.WindDelta);\n edge.WindCnt2 = 0;\n e = this.m_ActiveEdges;\n //ie get ready to calc WindCnt2\n }\n else if (edge.WindDelta === 0 && this.m_ClipType != ClipperLib.ClipType.ctUnion)\n {\n edge.WindCnt = 1;\n edge.WindCnt2 = e.WindCnt2;\n e = e.NextInAEL;\n //ie get ready to calc WindCnt2\n }\n else if (this.IsEvenOddFillType(edge))\n {\n //EvenOdd filling ...\n if (edge.WindDelta === 0)\n {\n //are we inside a subj polygon ...\n var Inside = true;\n var e2 = e.PrevInAEL;\n while (e2 !== null)\n {\n if (e2.PolyTyp == e.PolyTyp && e2.WindDelta !== 0)\n Inside = !Inside;\n e2 = e2.PrevInAEL;\n }\n edge.WindCnt = (Inside ? 0 : 1);\n }\n else\n {\n edge.WindCnt = edge.WindDelta;\n }\n edge.WindCnt2 = e.WindCnt2;\n e = e.NextInAEL;\n //ie get ready to calc WindCnt2\n }\n else\n {\n //nonZero, Positive or Negative filling ...\n if (e.WindCnt * e.WindDelta < 0)\n {\n //prev edge is 'decreasing' WindCount (WC) toward zero\n //so we're outside the previous polygon ...\n if (Math.abs(e.WindCnt) > 1)\n {\n //outside prev poly but still inside another.\n //when reversing direction of prev poly use the same WC \n if (e.WindDelta * edge.WindDelta < 0)\n edge.WindCnt = e.WindCnt;\n else\n edge.WindCnt = e.WindCnt + edge.WindDelta;\n }\n else\n edge.WindCnt = (edge.WindDelta === 0 ? 1 : edge.WindDelta);\n }\n else\n {\n //prev edge is 'increasing' WindCount (WC) away from zero\n //so we're inside the previous polygon ...\n if (edge.WindDelta === 0)\n edge.WindCnt = (e.WindCnt < 0 ? e.WindCnt - 1 : e.WindCnt + 1);\n else if (e.WindDelta * edge.WindDelta < 0)\n edge.WindCnt = e.WindCnt;\n else\n edge.WindCnt = e.WindCnt + edge.WindDelta;\n }\n edge.WindCnt2 = e.WindCnt2;\n e = e.NextInAEL;\n //ie get ready to calc WindCnt2\n }\n //update WindCnt2 ...\n if (this.IsEvenOddAltFillType(edge))\n {\n //EvenOdd filling ...\n while (e != edge)\n {\n if (e.WindDelta !== 0)\n edge.WindCnt2 = (edge.WindCnt2 === 0 ? 1 : 0);\n e = e.NextInAEL;\n }\n }\n else\n {\n //nonZero, Positive or Negative filling ...\n while (e != edge)\n {\n edge.WindCnt2 += e.WindDelta;\n e = e.NextInAEL;\n }\n }\n};\nClipperLib.Clipper.prototype.AddEdgeToSEL = function (edge)\n{\n //SEL pointers in PEdge are reused to build a list of horizontal edges.\n //However, we don't need to worry about order with horizontal edge processing.\n if (this.m_SortedEdges === null)\n {\n this.m_SortedEdges = edge;\n edge.PrevInSEL = null;\n edge.NextInSEL = null;\n }\n else\n {\n edge.NextInSEL = this.m_SortedEdges;\n edge.PrevInSEL = null;\n this.m_SortedEdges.PrevInSEL = edge;\n this.m_SortedEdges = edge;\n }\n};\nClipperLib.Clipper.prototype.CopyAELToSEL = function ()\n{\n var e = this.m_ActiveEdges;\n this.m_SortedEdges = e;\n while (e !== null)\n {\n e.PrevInSEL = e.PrevInAEL;\n e.NextInSEL = e.NextInAEL;\n e = e.NextInAEL;\n }\n};\nClipperLib.Clipper.prototype.SwapPositionsInAEL = function (edge1, edge2)\n{\n //check that one or other edge hasn't already been removed from AEL ...\n if (edge1.NextInAEL == edge1.PrevInAEL || edge2.NextInAEL == edge2.PrevInAEL)\n return;\n if (edge1.NextInAEL == edge2)\n {\n var next = edge2.NextInAEL;\n if (next !== null)\n next.PrevInAEL = edge1;\n var prev = edge1.PrevInAEL;\n if (prev !== null)\n prev.NextInAEL = edge2;\n edge2.PrevInAEL = prev;\n edge2.NextInAEL = edge1;\n edge1.PrevInAEL = edge2;\n edge1.NextInAEL = next;\n }\n else if (edge2.NextInAEL == edge1)\n {\n var next = edge1.NextInAEL;\n if (next !== null)\n next.PrevInAEL = edge2;\n var prev = edge2.PrevInAEL;\n if (prev !== null)\n prev.NextInAEL = edge1;\n edge1.PrevInAEL = prev;\n edge1.NextInAEL = edge2;\n edge2.PrevInAEL = edge1;\n edge2.NextInAEL = next;\n }\n else\n {\n var next = edge1.NextInAEL;\n var prev = edge1.PrevInAEL;\n edge1.NextInAEL = edge2.NextInAEL;\n if (edge1.NextInAEL !== null)\n edge1.NextInAEL.PrevInAEL = edge1;\n edge1.PrevInAEL = edge2.PrevInAEL;\n if (edge1.PrevInAEL !== null)\n edge1.PrevInAEL.NextInAEL = edge1;\n edge2.NextInAEL = next;\n if (edge2.NextInAEL !== null)\n edge2.NextInAEL.PrevInAEL = edge2;\n edge2.PrevInAEL = prev;\n if (edge2.PrevInAEL !== null)\n edge2.PrevInAEL.NextInAEL = edge2;\n }\n if (edge1.PrevInAEL === null)\n this.m_ActiveEdges = edge1;\n else if (edge2.PrevInAEL === null)\n this.m_ActiveEdges = edge2;\n};\nClipperLib.Clipper.prototype.SwapPositionsInSEL = function (edge1, edge2)\n{\n if (edge1.NextInSEL === null && edge1.PrevInSEL === null)\n return;\n if (edge2.NextInSEL === null && edge2.PrevInSEL === null)\n return;\n if (edge1.NextInSEL == edge2)\n {\n var next = edge2.NextInSEL;\n if (next !== null)\n next.PrevInSEL = edge1;\n var prev = edge1.PrevInSEL;\n if (prev !== null)\n prev.NextInSEL = edge2;\n edge2.PrevInSEL = prev;\n edge2.NextInSEL = edge1;\n edge1.PrevInSEL = edge2;\n edge1.NextInSEL = next;\n }\n else if (edge2.NextInSEL == edge1)\n {\n var next = edge1.NextInSEL;\n if (next !== null)\n next.PrevInSEL = edge2;\n var prev = edge2.PrevInSEL;\n if (prev !== null)\n prev.NextInSEL = edge1;\n edge1.PrevInSEL = prev;\n edge1.NextInSEL = edge2;\n edge2.PrevInSEL = edge1;\n edge2.NextInSEL = next;\n }\n else\n {\n var next = edge1.NextInSEL;\n var prev = edge1.PrevInSEL;\n edge1.NextInSEL = edge2.NextInSEL;\n if (edge1.NextInSEL !== null)\n edge1.NextInSEL.PrevInSEL = edge1;\n edge1.PrevInSEL = edge2.PrevInSEL;\n if (edge1.PrevInSEL !== null)\n edge1.PrevInSEL.NextInSEL = edge1;\n edge2.NextInSEL = next;\n if (edge2.NextInSEL !== null)\n edge2.NextInSEL.PrevInSEL = edge2;\n edge2.PrevInSEL = prev;\n if (edge2.PrevInSEL !== null)\n edge2.PrevInSEL.NextInSEL = edge2;\n }\n if (edge1.PrevInSEL === null)\n this.m_SortedEdges = edge1;\n else if (edge2.PrevInSEL === null)\n this.m_SortedEdges = edge2;\n};\nClipperLib.Clipper.prototype.AddLocalMaxPoly = function (e1, e2, pt)\n{\n this.AddOutPt(e1, pt);\n if (e2.WindDelta == 0) this.AddOutPt(e2, pt);\n if (e1.OutIdx == e2.OutIdx)\n {\n e1.OutIdx = -1;\n e2.OutIdx = -1;\n }\n else if (e1.OutIdx < e2.OutIdx)\n this.AppendPolygon(e1, e2);\n else\n this.AppendPolygon(e2, e1);\n};\nClipperLib.Clipper.prototype.AddLocalMinPoly = function (e1, e2, pt)\n{\n var result;\n var e, prevE;\n if (ClipperLib.ClipperBase.IsHorizontal(e2) || (e1.Dx > e2.Dx))\n {\n result = this.AddOutPt(e1, pt);\n e2.OutIdx = e1.OutIdx;\n e1.Side = ClipperLib.EdgeSide.esLeft;\n e2.Side = ClipperLib.EdgeSide.esRight;\n e = e1;\n if (e.PrevInAEL == e2)\n prevE = e2.PrevInAEL;\n else\n prevE = e.PrevInAEL;\n }\n else\n {\n result = this.AddOutPt(e2, pt);\n e1.OutIdx = e2.OutIdx;\n e1.Side = ClipperLib.EdgeSide.esRight;\n e2.Side = ClipperLib.EdgeSide.esLeft;\n e = e2;\n if (e.PrevInAEL == e1)\n prevE = e1.PrevInAEL;\n else\n prevE = e.PrevInAEL;\n }\n if (prevE !== null && prevE.OutIdx >= 0 && (ClipperLib.Clipper.TopX(prevE, pt.Y) == ClipperLib.Clipper.TopX(e, pt.Y)) && ClipperLib.ClipperBase.SlopesEqual(e, prevE, this.m_UseFullRange) && (e.WindDelta !== 0) && (prevE.WindDelta !== 0))\n {\n var outPt = this.AddOutPt(prevE, pt);\n this.AddJoin(result, outPt, e.Top);\n }\n return result;\n};\nClipperLib.Clipper.prototype.CreateOutRec = function ()\n{\n var result = new ClipperLib.OutRec();\n result.Idx = -1;\n result.IsHole = false;\n result.IsOpen = false;\n result.FirstLeft = null;\n result.Pts = null;\n result.BottomPt = null;\n result.PolyNode = null;\n this.m_PolyOuts.push(result);\n result.Idx = this.m_PolyOuts.length - 1;\n return result;\n};\nClipperLib.Clipper.prototype.AddOutPt = function (e, pt)\n{\n var ToFront = (e.Side == ClipperLib.EdgeSide.esLeft);\n if (e.OutIdx < 0)\n {\n var outRec = this.CreateOutRec();\n outRec.IsOpen = (e.WindDelta === 0);\n var newOp = new ClipperLib.OutPt();\n outRec.Pts = newOp;\n newOp.Idx = outRec.Idx;\n //newOp.Pt = pt;\n newOp.Pt.X = pt.X;\n newOp.Pt.Y = pt.Y;\n newOp.Next = newOp;\n newOp.Prev = newOp;\n if (!outRec.IsOpen)\n this.SetHoleState(e, outRec);\n if (use_xyz)\n {\n if (ClipperLib.IntPoint.op_Equality(pt, e.Bot))\n {\n //newOp.Pt = e.Bot;\n newOp.Pt.X = e.Bot.X;\n newOp.Pt.Y = e.Bot.Y;\n newOp.Pt.Z = e.Bot.Z;\n }\n else if (ClipperLib.IntPoint.op_Equality(pt, e.Top))\n {\n //newOp.Pt = e.Top;\n newOp.Pt.X = e.Top.X;\n newOp.Pt.Y = e.Top.Y;\n newOp.Pt.Z = e.Top.Z;\n }\n else\n this.SetZ(newOp.Pt, e);\n }\n e.OutIdx = outRec.Idx;\n //nb: do this after SetZ !\n return newOp;\n }\n else\n {\n var outRec = this.m_PolyOuts[e.OutIdx];\n //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most'\n var op = outRec.Pts;\n if (ToFront && ClipperLib.IntPoint.op_Equality(pt, op.Pt))\n return op;\n else if (!ToFront && ClipperLib.IntPoint.op_Equality(pt, op.Prev.Pt))\n return op.Prev;\n var newOp = new ClipperLib.OutPt();\n newOp.Idx = outRec.Idx;\n //newOp.Pt = pt;\n newOp.Pt.X = pt.X;\n newOp.Pt.Y = pt.Y;\n newOp.Next = op;\n newOp.Prev = op.Prev;\n newOp.Prev.Next = newOp;\n op.Prev = newOp;\n if (ToFront)\n outRec.Pts = newOp;\n if (use_xyz)\n {\n if (ClipperLib.IntPoint.op_Equality(pt, e.Bot))\n {\n //newOp.Pt = e.Bot;\n newOp.Pt.X = e.Bot.X;\n newOp.Pt.Y = e.Bot.Y;\n newOp.Pt.Z = e.Bot.Z;\n }\n else if (ClipperLib.IntPoint.op_Equality(pt, e.Top))\n {\n //newOp.Pt = e.Top;\n newOp.Pt.X = e.Top.X;\n newOp.Pt.Y = e.Top.Y;\n newOp.Pt.Z = e.Top.Z;\n }\n else\n this.SetZ(newOp.Pt, e);\n }\n return newOp;\n }\n};\nClipperLib.Clipper.prototype.SwapPoints = function (pt1, pt2)\n{\n var tmp = new ClipperLib.IntPoint(pt1.Value);\n //pt1.Value = pt2.Value;\n pt1.Value.X = pt2.Value.X;\n pt1.Value.Y = pt2.Value.Y;\n //pt2.Value = tmp;\n pt2.Value.X = tmp.X;\n pt2.Value.Y = tmp.Y;\n};\nClipperLib.Clipper.prototype.HorzSegmentsOverlap = function (Pt1a, Pt1b, Pt2a, Pt2b)\n{\n //precondition: both segments are horizontal\n if ((Pt1a.X > Pt2a.X) == (Pt1a.X < Pt2b.X))\n return true;\n else if ((Pt1b.X > Pt2a.X) == (Pt1b.X < Pt2b.X))\n return true;\n else if ((Pt2a.X > Pt1a.X) == (Pt2a.X < Pt1b.X))\n return true;\n else if ((Pt2b.X > Pt1a.X) == (Pt2b.X < Pt1b.X))\n return true;\n else if ((Pt1a.X == Pt2a.X) && (Pt1b.X == Pt2b.X))\n return true;\n else if ((Pt1a.X == Pt2b.X) && (Pt1b.X == Pt2a.X))\n return true;\n else\n return false;\n};\nClipperLib.Clipper.prototype.InsertPolyPtBetween = function (p1, p2, pt)\n{\n var result = new ClipperLib.OutPt();\n //result.Pt = pt;\n result.Pt.X = pt.X;\n result.Pt.Y = pt.Y;\n if (p2 == p1.Next)\n {\n p1.Next = result;\n p2.Prev = result;\n result.Next = p2;\n result.Prev = p1;\n }\n else\n {\n p2.Next = result;\n p1.Prev = result;\n result.Next = p1;\n result.Prev = p2;\n }\n return result;\n};\nClipperLib.Clipper.prototype.SetHoleState = function (e, outRec)\n{\n var isHole = false;\n var e2 = e.PrevInAEL;\n while (e2 !== null)\n {\n if (e2.OutIdx >= 0 && e2.WindDelta != 0)\n {\n isHole = !isHole;\n if (outRec.FirstLeft === null)\n outRec.FirstLeft = this.m_PolyOuts[e2.OutIdx];\n }\n e2 = e2.PrevInAEL;\n }\n if (isHole)\n outRec.IsHole = true;\n};\nClipperLib.Clipper.prototype.GetDx = function (pt1, pt2)\n{\n if (pt1.Y == pt2.Y)\n return ClipperLib.ClipperBase.horizontal;\n else\n return (pt2.X - pt1.X) / (pt2.Y - pt1.Y);\n};\nClipperLib.Clipper.prototype.FirstIsBottomPt = function (btmPt1, btmPt2)\n{\n var p = btmPt1.Prev;\n while ((ClipperLib.IntPoint.op_Equality(p.Pt, btmPt1.Pt)) && (p != btmPt1))\n p = p.Prev;\n var dx1p = Math.abs(this.GetDx(btmPt1.Pt, p.Pt));\n p = btmPt1.Next;\n while ((ClipperLib.IntPoint.op_Equality(p.Pt, btmPt1.Pt)) && (p != btmPt1))\n p = p.Next;\n var dx1n = Math.abs(this.GetDx(btmPt1.Pt, p.Pt));\n p = btmPt2.Prev;\n while ((ClipperLib.IntPoint.op_Equality(p.Pt, btmPt2.Pt)) && (p != btmPt2))\n p = p.Prev;\n var dx2p = Math.abs(this.GetDx(btmPt2.Pt, p.Pt));\n p = btmPt2.Next;\n while ((ClipperLib.IntPoint.op_Equality(p.Pt, btmPt2.Pt)) && (p != btmPt2))\n p = p.Next;\n var dx2n = Math.abs(this.GetDx(btmPt2.Pt, p.Pt));\n return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n);\n};\nClipperLib.Clipper.prototype.GetBottomPt = function (pp)\n{\n var dups = null;\n var p = pp.Next;\n while (p != pp)\n {\n if (p.Pt.Y > pp.Pt.Y)\n {\n pp = p;\n dups = null;\n }\n else if (p.Pt.Y == pp.Pt.Y && p.Pt.X <= pp.Pt.X)\n {\n if (p.Pt.X < pp.Pt.X)\n {\n dups = null;\n pp = p;\n }\n else\n {\n if (p.Next != pp && p.Prev != pp)\n dups = p;\n }\n }\n p = p.Next;\n }\n if (dups !== null)\n {\n //there appears to be at least 2 vertices at bottomPt so ...\n while (dups != p)\n {\n if (!this.FirstIsBottomPt(p, dups))\n pp = dups;\n dups = dups.Next;\n while (ClipperLib.IntPoint.op_Inequality(dups.Pt, pp.Pt))\n dups = dups.Next;\n }\n }\n return pp;\n};\nClipperLib.Clipper.prototype.GetLowermostRec = function (outRec1, outRec2)\n{\n //work out which polygon fragment has the correct hole state ...\n if (outRec1.BottomPt === null)\n outRec1.BottomPt = this.GetBottomPt(outRec1.Pts);\n if (outRec2.BottomPt === null)\n outRec2.BottomPt = this.GetBottomPt(outRec2.Pts);\n var bPt1 = outRec1.BottomPt;\n var bPt2 = outRec2.BottomPt;\n if (bPt1.Pt.Y > bPt2.Pt.Y)\n return outRec1;\n else if (bPt1.Pt.Y < bPt2.Pt.Y)\n return outRec2;\n else if (bPt1.Pt.X < bPt2.Pt.X)\n return outRec1;\n else if (bPt1.Pt.X > bPt2.Pt.X)\n return outRec2;\n else if (bPt1.Next == bPt1)\n return outRec2;\n else if (bPt2.Next == bPt2)\n return outRec1;\n else if (this.FirstIsBottomPt(bPt1, bPt2))\n return outRec1;\n else\n return outRec2;\n};\nClipperLib.Clipper.prototype.Param1RightOfParam2 = function (outRec1, outRec2)\n{\n do {\n outRec1 = outRec1.FirstLeft;\n if (outRec1 == outRec2)\n return true;\n }\n while (outRec1 !== null)\n return false;\n};\nClipperLib.Clipper.prototype.GetOutRec = function (idx)\n{\n var outrec = this.m_PolyOuts[idx];\n while (outrec != this.m_PolyOuts[outrec.Idx])\n outrec = this.m_PolyOuts[outrec.Idx];\n return outrec;\n};\nClipperLib.Clipper.prototype.AppendPolygon = function (e1, e2)\n{\n //get the start and ends of both output polygons ...\n var outRec1 = this.m_PolyOuts[e1.OutIdx];\n var outRec2 = this.m_PolyOuts[e2.OutIdx];\n var holeStateRec;\n if (this.Param1RightOfParam2(outRec1, outRec2))\n holeStateRec = outRec2;\n else if (this.Param1RightOfParam2(outRec2, outRec1))\n holeStateRec = outRec1;\n else\n holeStateRec = this.GetLowermostRec(outRec1, outRec2);\n var p1_lft = outRec1.Pts;\n var p1_rt = p1_lft.Prev;\n var p2_lft = outRec2.Pts;\n var p2_rt = p2_lft.Prev;\n var side;\n //join e2 poly onto e1 poly and delete pointers to e2 ...\n if (e1.Side == ClipperLib.EdgeSide.esLeft)\n {\n if (e2.Side == ClipperLib.EdgeSide.esLeft)\n {\n //z y x a b c\n this.ReversePolyPtLinks(p2_lft);\n p2_lft.Next = p1_lft;\n p1_lft.Prev = p2_lft;\n p1_rt.Next = p2_rt;\n p2_rt.Prev = p1_rt;\n outRec1.Pts = p2_rt;\n }\n else\n {\n //x y z a b c\n p2_rt.Next = p1_lft;\n p1_lft.Prev = p2_rt;\n p2_lft.Prev = p1_rt;\n p1_rt.Next = p2_lft;\n outRec1.Pts = p2_lft;\n }\n side = ClipperLib.EdgeSide.esLeft;\n }\n else\n {\n if (e2.Side == ClipperLib.EdgeSide.esRight)\n {\n //a b c z y x\n this.ReversePolyPtLinks(p2_lft);\n p1_rt.Next = p2_rt;\n p2_rt.Prev = p1_rt;\n p2_lft.Next = p1_lft;\n p1_lft.Prev = p2_lft;\n }\n else\n {\n //a b c x y z\n p1_rt.Next = p2_lft;\n p2_lft.Prev = p1_rt;\n p1_lft.Prev = p2_rt;\n p2_rt.Next = p1_lft;\n }\n side = ClipperLib.EdgeSide.esRight;\n }\n outRec1.BottomPt = null;\n if (holeStateRec == outRec2)\n {\n if (outRec2.FirstLeft != outRec1)\n outRec1.FirstLeft = outRec2.FirstLeft;\n outRec1.IsHole = outRec2.IsHole;\n }\n outRec2.Pts = null;\n outRec2.BottomPt = null;\n outRec2.FirstLeft = outRec1;\n var OKIdx = e1.OutIdx;\n var ObsoleteIdx = e2.OutIdx;\n e1.OutIdx = -1;\n //nb: safe because we only get here via AddLocalMaxPoly\n e2.OutIdx = -1;\n var e = this.m_ActiveEdges;\n while (e !== null)\n {\n if (e.OutIdx == ObsoleteIdx)\n {\n e.OutIdx = OKIdx;\n e.Side = side;\n break;\n }\n e = e.NextInAEL;\n }\n outRec2.Idx = outRec1.Idx;\n};\nClipperLib.Clipper.prototype.ReversePolyPtLinks = function (pp)\n{\n if (pp === null)\n return;\n var pp1;\n var pp2;\n pp1 = pp;\n do {\n pp2 = pp1.Next;\n pp1.Next = pp1.Prev;\n pp1.Prev = pp2;\n pp1 = pp2;\n }\n while (pp1 != pp)\n};\nClipperLib.Clipper.SwapSides = function (edge1, edge2)\n{\n var side = edge1.Side;\n edge1.Side = edge2.Side;\n edge2.Side = side;\n};\nClipperLib.Clipper.SwapPolyIndexes = function (edge1, edge2)\n{\n var outIdx = edge1.OutIdx;\n edge1.OutIdx = edge2.OutIdx;\n edge2.OutIdx = outIdx;\n};\nClipperLib.Clipper.prototype.IntersectEdges = function (e1, e2, pt, protect)\n{\n //e1 will be to the left of e2 BELOW the intersection. Therefore e1 is before\n //e2 in AEL except when e1 is being inserted at the intersection point ...\n var e1stops = !protect && e1.NextInLML === null &&\n e1.Top.X == pt.X && e1.Top.Y == pt.Y;\n var e2stops = !protect && e2.NextInLML === null &&\n e2.Top.X == pt.X && e2.Top.Y == pt.Y;\n var e1Contributing = (e1.OutIdx >= 0);\n var e2Contributing = (e2.OutIdx >= 0);\n if (use_lines)\n {\n //if either edge is on an OPEN path ...\n if (e1.WindDelta === 0 || e2.WindDelta === 0)\n {\n //ignore subject-subject open path intersections UNLESS they\n //are both open paths, AND they are both 'contributing maximas' ...\n if (e1.WindDelta === 0 && e2.WindDelta === 0)\n {\n if ((e1stops || e2stops) && e1Contributing && e2Contributing)\n this.AddLocalMaxPoly(e1, e2, pt);\n }\n //if intersecting a subj line with a subj poly ...\n else if (e1.PolyTyp == e2.PolyTyp &&\n e1.WindDelta != e2.WindDelta && this.m_ClipType == ClipperLib.ClipType.ctUnion)\n {\n if (e1.WindDelta === 0)\n {\n if (e2Contributing)\n {\n this.AddOutPt(e1, pt);\n if (e1Contributing)\n e1.OutIdx = -1;\n }\n }\n else\n {\n if (e1Contributing)\n {\n this.AddOutPt(e2, pt);\n if (e2Contributing)\n e2.OutIdx = -1;\n }\n }\n }\n else if (e1.PolyTyp != e2.PolyTyp)\n {\n if ((e1.WindDelta === 0) && Math.abs(e2.WindCnt) == 1 &&\n (this.m_ClipType != ClipperLib.ClipType.ctUnion || e2.WindCnt2 === 0))\n {\n this.AddOutPt(e1, pt);\n if (e1Contributing)\n e1.OutIdx = -1;\n }\n else if ((e2.WindDelta === 0) && (Math.abs(e1.WindCnt) == 1) &&\n (this.m_ClipType != ClipperLib.ClipType.ctUnion || e1.WindCnt2 === 0))\n {\n this.AddOutPt(e2, pt);\n if (e2Contributing)\n e2.OutIdx = -1;\n }\n }\n if (e1stops)\n if (e1.OutIdx < 0)\n this.DeleteFromAEL(e1);\n else\n ClipperLib.Error(\"Error intersecting polylines\");\n if (e2stops)\n if (e2.OutIdx < 0)\n this.DeleteFromAEL(e2);\n else\n ClipperLib.Error(\"Error intersecting polylines\");\n return;\n }\n }\n //update winding counts...\n //assumes that e1 will be to the Right of e2 ABOVE the intersection\n if (e1.PolyTyp == e2.PolyTyp)\n {\n if (this.IsEvenOddFillType(e1))\n {\n var oldE1WindCnt = e1.WindCnt;\n e1.WindCnt = e2.WindCnt;\n e2.WindCnt = oldE1WindCnt;\n }\n else\n {\n if (e1.WindCnt + e2.WindDelta === 0)\n e1.WindCnt = -e1.WindCnt;\n else\n e1.WindCnt += e2.WindDelta;\n if (e2.WindCnt - e1.WindDelta === 0)\n e2.WindCnt = -e2.WindCnt;\n else\n e2.WindCnt -= e1.WindDelta;\n }\n }\n else\n {\n if (!this.IsEvenOddFillType(e2))\n e1.WindCnt2 += e2.WindDelta;\n else\n e1.WindCnt2 = (e1.WindCnt2 === 0) ? 1 : 0;\n if (!this.IsEvenOddFillType(e1))\n e2.WindCnt2 -= e1.WindDelta;\n else\n e2.WindCnt2 = (e2.WindCnt2 === 0) ? 1 : 0;\n }\n var e1FillType, e2FillType, e1FillType2, e2FillType2;\n if (e1.PolyTyp == ClipperLib.PolyType.ptSubject)\n {\n e1FillType = this.m_SubjFillType;\n e1FillType2 = this.m_ClipFillType;\n }\n else\n {\n e1FillType = this.m_ClipFillType;\n e1FillType2 = this.m_SubjFillType;\n }\n if (e2.PolyTyp == ClipperLib.PolyType.ptSubject)\n {\n e2FillType = this.m_SubjFillType;\n e2FillType2 = this.m_ClipFillType;\n }\n else\n {\n e2FillType = this.m_ClipFillType;\n e2FillType2 = this.m_SubjFillType;\n }\n var e1Wc, e2Wc;\n switch (e1FillType)\n {\n case ClipperLib.PolyFillType.pftPositive:\n e1Wc = e1.WindCnt;\n break;\n case ClipperLib.PolyFillType.pftNegative:\n e1Wc = -e1.WindCnt;\n break;\n default:\n e1Wc = Math.abs(e1.WindCnt);\n break;\n }\n switch (e2FillType)\n {\n case ClipperLib.PolyFillType.pftPositive:\n e2Wc = e2.WindCnt;\n break;\n case ClipperLib.PolyFillType.pftNegative:\n e2Wc = -e2.WindCnt;\n break;\n default:\n e2Wc = Math.abs(e2.WindCnt);\n break;\n }\n if (e1Contributing && e2Contributing)\n {\n if (e1stops || e2stops || (e1Wc !== 0 && e1Wc != 1) || (e2Wc !== 0 && e2Wc != 1) ||\n (e1.PolyTyp != e2.PolyTyp && this.m_ClipType != ClipperLib.ClipType.ctXor))\n this.AddLocalMaxPoly(e1, e2, pt);\n else\n {\n this.AddOutPt(e1, pt);\n this.AddOutPt(e2, pt);\n ClipperLib.Clipper.SwapSides(e1, e2);\n ClipperLib.Clipper.SwapPolyIndexes(e1, e2);\n }\n }\n else if (e1Contributing)\n {\n if (e2Wc === 0 || e2Wc == 1)\n {\n this.AddOutPt(e1, pt);\n ClipperLib.Clipper.SwapSides(e1, e2);\n ClipperLib.Clipper.SwapPolyIndexes(e1, e2);\n }\n }\n else if (e2Contributing)\n {\n if (e1Wc === 0 || e1Wc == 1)\n {\n this.AddOutPt(e2, pt);\n ClipperLib.Clipper.SwapSides(e1, e2);\n ClipperLib.Clipper.SwapPolyIndexes(e1, e2);\n }\n }\n else if ((e1Wc === 0 || e1Wc == 1) &&\n (e2Wc === 0 || e2Wc == 1) && !e1stops && !e2stops)\n {\n //neither edge is currently contributing ...\n var e1Wc2, e2Wc2;\n switch (e1FillType2)\n {\n case ClipperLib.PolyFillType.pftPositive:\n e1Wc2 = e1.WindCnt2;\n break;\n case ClipperLib.PolyFillType.pftNegative:\n e1Wc2 = -e1.WindCnt2;\n break;\n default:\n e1Wc2 = Math.abs(e1.WindCnt2);\n break;\n }\n switch (e2FillType2)\n {\n case ClipperLib.PolyFillType.pftPositive:\n e2Wc2 = e2.WindCnt2;\n break;\n case ClipperLib.PolyFillType.pftNegative:\n e2Wc2 = -e2.WindCnt2;\n break;\n default:\n e2Wc2 = Math.abs(e2.WindCnt2);\n break;\n }\n if (e1.PolyTyp != e2.PolyTyp)\n this.AddLocalMinPoly(e1, e2, pt);\n else if (e1Wc == 1 && e2Wc == 1)\n switch (this.m_ClipType)\n {\n case ClipperLib.ClipType.ctIntersection:\n if (e1Wc2 > 0 && e2Wc2 > 0)\n this.AddLocalMinPoly(e1, e2, pt);\n break;\n case ClipperLib.ClipType.ctUnion:\n if (e1Wc2 <= 0 && e2Wc2 <= 0)\n this.AddLocalMinPoly(e1, e2, pt);\n break;\n case ClipperLib.ClipType.ctDifference:\n if (((e1.PolyTyp == ClipperLib.PolyType.ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) ||\n ((e1.PolyTyp == ClipperLib.PolyType.ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0)))\n this.AddLocalMinPoly(e1, e2, pt);\n break;\n case ClipperLib.ClipType.ctXor:\n this.AddLocalMinPoly(e1, e2, pt);\n break;\n }\n else\n ClipperLib.Clipper.SwapSides(e1, e2);\n }\n if ((e1stops != e2stops) &&\n ((e1stops && (e1.OutIdx >= 0)) || (e2stops && (e2.OutIdx >= 0))))\n {\n ClipperLib.Clipper.SwapSides(e1, e2);\n ClipperLib.Clipper.SwapPolyIndexes(e1, e2);\n }\n //finally, delete any non-contributing maxima edges ...\n if (e1stops)\n this.DeleteFromAEL(e1);\n if (e2stops)\n this.DeleteFromAEL(e2);\n};\nClipperLib.Clipper.prototype.DeleteFromAEL = function (e)\n{\n var AelPrev = e.PrevInAEL;\n var AelNext = e.NextInAEL;\n if (AelPrev === null && AelNext === null && (e != this.m_ActiveEdges))\n return;\n //already deleted\n if (AelPrev !== null)\n AelPrev.NextInAEL = AelNext;\n else\n this.m_ActiveEdges = AelNext;\n if (AelNext !== null)\n AelNext.PrevInAEL = AelPrev;\n e.NextInAEL = null;\n e.PrevInAEL = null;\n};\nClipperLib.Clipper.prototype.DeleteFromSEL = function (e)\n{\n var SelPrev = e.PrevInSEL;\n var SelNext = e.NextInSEL;\n if (SelPrev === null && SelNext === null && (e != this.m_SortedEdges))\n return;\n //already deleted\n if (SelPrev !== null)\n SelPrev.NextInSEL = SelNext;\n else\n this.m_SortedEdges = SelNext;\n if (SelNext !== null)\n SelNext.PrevInSEL = SelPrev;\n e.NextInSEL = null;\n e.PrevInSEL = null;\n};\nClipperLib.Clipper.prototype.UpdateEdgeIntoAEL = function (e)\n{\n if (e.NextInLML === null)\n ClipperLib.Error(\"UpdateEdgeIntoAEL: invalid call\");\n var AelPrev = e.PrevInAEL;\n var AelNext = e.NextInAEL;\n e.NextInLML.OutIdx = e.OutIdx;\n if (AelPrev !== null)\n AelPrev.NextInAEL = e.NextInLML;\n else\n this.m_ActiveEdges = e.NextInLML;\n if (AelNext !== null)\n AelNext.PrevInAEL = e.NextInLML;\n e.NextInLML.Side = e.Side;\n e.NextInLML.WindDelta = e.WindDelta;\n e.NextInLML.WindCnt = e.WindCnt;\n e.NextInLML.WindCnt2 = e.WindCnt2;\n e = e.NextInLML;\n // e.Curr = e.Bot;\n e.Curr.X = e.Bot.X;\n e.Curr.Y = e.Bot.Y;\n e.PrevInAEL = AelPrev;\n e.NextInAEL = AelNext;\n if (!ClipperLib.ClipperBase.IsHorizontal(e))\n this.InsertScanbeam(e.Top.Y);\n return e;\n};\nClipperLib.Clipper.prototype.ProcessHorizontals = function (isTopOfScanbeam)\n{\n var horzEdge = this.m_SortedEdges;\n while (horzEdge !== null)\n {\n this.DeleteFromSEL(horzEdge);\n this.ProcessHorizontal(horzEdge, isTopOfScanbeam);\n horzEdge = this.m_SortedEdges;\n }\n};\nClipperLib.Clipper.prototype.GetHorzDirection = function (HorzEdge, $var)\n{\n if (HorzEdge.Bot.X < HorzEdge.Top.X)\n {\n $var.Left = HorzEdge.Bot.X;\n $var.Right = HorzEdge.Top.X;\n $var.Dir = ClipperLib.Direction.dLeftToRight;\n }\n else\n {\n $var.Left = HorzEdge.Top.X;\n $var.Right = HorzEdge.Bot.X;\n $var.Dir = ClipperLib.Direction.dRightToLeft;\n }\n};\nClipperLib.Clipper.prototype.PrepareHorzJoins = function (horzEdge, isTopOfScanbeam)\n{\n //get the last Op for this horizontal edge\n //the point may be anywhere along the horizontal ...\n var outPt = this.m_PolyOuts[horzEdge.OutIdx].Pts;\n if (horzEdge.Side != ClipperLib.EdgeSide.esLeft)\n outPt = outPt.Prev;\n //First, match up overlapping horizontal edges (eg when one polygon's\n //intermediate horz edge overlaps an intermediate horz edge of another, or\n //when one polygon sits on top of another) ...\n //for (var i = 0, ilen = this.m_GhostJoins.length; i < ilen; ++i) {\n // var j = this.m_GhostJoins[i];\n // if (this.HorzSegmentsOverlap(j.OutPt1.Pt, j.OffPt, horzEdge.Bot, horzEdge.Top))\n // this.AddJoin(j.OutPt1, outPt, j.OffPt);\n //}\n\n //Also, since horizontal edges at the top of one SB are often removed from\n //the AEL before we process the horizontal edges at the bottom of the next,\n //we need to create 'ghost' Join records of 'contrubuting' horizontals that\n //we can compare with horizontals at the bottom of the next SB.\n if (isTopOfScanbeam)\n if (ClipperLib.IntPoint.op_Equality(outPt.Pt, horzEdge.Top))\n this.AddGhostJoin(outPt, horzEdge.Bot);\n else\n this.AddGhostJoin(outPt, horzEdge.Top);\n};\nClipperLib.Clipper.prototype.ProcessHorizontal = function (horzEdge, isTopOfScanbeam)\n{\n var $var = {Dir: null, Left: null, Right: null};\n this.GetHorzDirection(horzEdge, $var);\n var dir = $var.Dir;\n var horzLeft = $var.Left;\n var horzRight = $var.Right;\n\n var eLastHorz = horzEdge,\n eMaxPair = null;\n while (eLastHorz.NextInLML !== null && ClipperLib.ClipperBase.IsHorizontal(eLastHorz.NextInLML))\n eLastHorz = eLastHorz.NextInLML;\n if (eLastHorz.NextInLML === null)\n eMaxPair = this.GetMaximaPair(eLastHorz);\n for (;;)\n {\n var IsLastHorz = (horzEdge == eLastHorz);\n var e = this.GetNextInAEL(horzEdge, dir);\n while (e !== null)\n {\n //Break if we've got to the end of an intermediate horizontal edge ...\n //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal.\n if (e.Curr.X == horzEdge.Top.X && horzEdge.NextInLML !== null && e.Dx < horzEdge.NextInLML.Dx)\n break;\n var eNext = this.GetNextInAEL(e, dir);\n //saves eNext for later\n if ((dir == ClipperLib.Direction.dLeftToRight && e.Curr.X <= horzRight) || (dir == ClipperLib.Direction.dRightToLeft && e.Curr.X >= horzLeft))\n {\n\n if (horzEdge.OutIdx >= 0 && horzEdge.WindDelta != 0)\n this.PrepareHorzJoins(horzEdge, isTopOfScanbeam);\n\n //so far we're still in range of the horizontal Edge but make sure\n //we're at the last of consec. horizontals when matching with eMaxPair\n if (e == eMaxPair && IsLastHorz)\n {\n if (dir == ClipperLib.Direction.dLeftToRight)\n this.IntersectEdges(horzEdge, e, e.Top, false);\n else\n this.IntersectEdges(e, horzEdge, e.Top, false);\n if (eMaxPair.OutIdx >= 0)\n ClipperLib.Error(\"ProcessHorizontal error\");\n return;\n }\n else if (dir == ClipperLib.Direction.dLeftToRight)\n {\n var Pt = new ClipperLib.IntPoint(e.Curr.X, horzEdge.Curr.Y);\n this.IntersectEdges(horzEdge, e, Pt, true);\n }\n else\n {\n var Pt = new ClipperLib.IntPoint(e.Curr.X, horzEdge.Curr.Y);\n this.IntersectEdges(e, horzEdge, Pt, true);\n }\n this.SwapPositionsInAEL(horzEdge, e);\n }\n else if ((dir == ClipperLib.Direction.dLeftToRight && e.Curr.X >= horzRight) || (dir == ClipperLib.Direction.dRightToLeft && e.Curr.X <= horzLeft))\n break;\n e = eNext;\n }\n //end while\n if (horzEdge.OutIdx >= 0 && horzEdge.WindDelta !== 0)\n this.PrepareHorzJoins(horzEdge, isTopOfScanbeam);\n if (horzEdge.NextInLML !== null && ClipperLib.ClipperBase.IsHorizontal(horzEdge.NextInLML))\n {\n horzEdge = this.UpdateEdgeIntoAEL(horzEdge);\n if (horzEdge.OutIdx >= 0)\n this.AddOutPt(horzEdge, horzEdge.Bot);\n \n var $var = {Dir: dir, Left: horzLeft, Right: horzRight};\n this.GetHorzDirection(horzEdge, $var);\n dir = $var.Dir;\n horzLeft = $var.Left;\n horzRight = $var.Right;\n }\n else\n break;\n }\n //end for (;;)\n if (horzEdge.NextInLML !== null)\n {\n if (horzEdge.OutIdx >= 0)\n {\n var op1 = this.AddOutPt(horzEdge, horzEdge.Top);\n horzEdge = this.UpdateEdgeIntoAEL(horzEdge);\n if (horzEdge.WindDelta === 0)\n return;\n //nb: HorzEdge is no longer horizontal here\n var ePrev = horzEdge.PrevInAEL;\n var eNext = horzEdge.NextInAEL;\n if (ePrev !== null && ePrev.Curr.X == horzEdge.Bot.X &&\n ePrev.Curr.Y == horzEdge.Bot.Y && ePrev.WindDelta !== 0 &&\n (ePrev.OutIdx >= 0 && ePrev.Curr.Y > ePrev.Top.Y &&\n ClipperLib.ClipperBase.SlopesEqual(horzEdge, ePrev, this.m_UseFullRange)))\n {\n var op2 = this.AddOutPt(ePrev, horzEdge.Bot);\n this.AddJoin(op1, op2, horzEdge.Top);\n }\n else if (eNext !== null && eNext.Curr.X == horzEdge.Bot.X &&\n eNext.Curr.Y == horzEdge.Bot.Y && eNext.WindDelta !== 0 &&\n eNext.OutIdx >= 0 && eNext.Curr.Y > eNext.Top.Y &&\n ClipperLib.ClipperBase.SlopesEqual(horzEdge, eNext, this.m_UseFullRange))\n {\n var op2 = this.AddOutPt(eNext, horzEdge.Bot);\n this.AddJoin(op1, op2, horzEdge.Top);\n }\n }\n else horzEdge = this.UpdateEdgeIntoAEL(horzEdge);\n }\n else if (eMaxPair !== null)\n {\n if (eMaxPair.OutIdx >= 0)\n {\n if (dir == ClipperLib.Direction.dLeftToRight)\n this.IntersectEdges(horzEdge, eMaxPair, horzEdge.Top, false);\n else\n this.IntersectEdges(eMaxPair, horzEdge, horzEdge.Top, false);\n if (eMaxPair.OutIdx >= 0)\n ClipperLib.Error(\"ProcessHorizontal error\");\n }\n else\n {\n this.DeleteFromAEL(horzEdge);\n this.DeleteFromAEL(eMaxPair);\n }\n }\n else\n {\n if (horzEdge.OutIdx >= 0)\n this.AddOutPt(horzEdge, horzEdge.Top);\n this.DeleteFromAEL(horzEdge);\n }\n};\nClipperLib.Clipper.prototype.GetNextInAEL = function (e, Direction)\n{\n return Direction == ClipperLib.Direction.dLeftToRight ? e.NextInAEL : e.PrevInAEL;\n};\nClipperLib.Clipper.prototype.IsMinima = function (e)\n{\n return e !== null && (e.Prev.NextInLML != e) && (e.Next.NextInLML != e);\n};\nClipperLib.Clipper.prototype.IsMaxima = function (e, Y)\n{\n return (e !== null && e.Top.Y == Y && e.NextInLML === null);\n};\nClipperLib.Clipper.prototype.IsIntermediate = function (e, Y)\n{\n return (e.Top.Y == Y && e.NextInLML !== null);\n};\nClipperLib.Clipper.prototype.GetMaximaPair = function (e)\n{\n var result = null;\n if ((ClipperLib.IntPoint.op_Equality(e.Next.Top, e.Top)) && e.Next.NextInLML === null)\n result = e.Next;\n else if ((ClipperLib.IntPoint.op_Equality(e.Prev.Top, e.Top)) && e.Prev.NextInLML === null)\n result = e.Prev;\n if (result !== null && (result.OutIdx == -2 || (result.NextInAEL == result.PrevInAEL && !ClipperLib.ClipperBase.IsHorizontal(result))))\n return null;\n return result;\n};\nClipperLib.Clipper.prototype.ProcessIntersections = function (botY, topY)\n{\n if (this.m_ActiveEdges == null)\n return true;\n try\n {\n this.BuildIntersectList(botY, topY);\n if (this.m_IntersectList.length == 0)\n return true;\n if (this.m_IntersectList.length == 1 || this.FixupIntersectionOrder())\n this.ProcessIntersectList();\n else\n return false;\n }\n catch ($$e2)\n {\n this.m_SortedEdges = null;\n this.m_IntersectList.length = 0;\n ClipperLib.Error(\"ProcessIntersections error\");\n }\n this.m_SortedEdges = null;\n return true;\n};\nClipperLib.Clipper.prototype.BuildIntersectList = function (botY, topY)\n{\n if (this.m_ActiveEdges === null)\n return;\n //prepare for sorting ...\n var e = this.m_ActiveEdges;\n //console.log(JSON.stringify(JSON.decycle( e )));\n this.m_SortedEdges = e;\n while (e !== null)\n {\n e.PrevInSEL = e.PrevInAEL;\n e.NextInSEL = e.NextInAEL;\n e.Curr.X = ClipperLib.Clipper.TopX(e, topY);\n e = e.NextInAEL;\n }\n //bubblesort ...\n var isModified = true;\n while (isModified && this.m_SortedEdges !== null)\n {\n isModified = false;\n e = this.m_SortedEdges;\n while (e.NextInSEL !== null)\n {\n var eNext = e.NextInSEL;\n var pt = new ClipperLib.IntPoint();\n //console.log(\"e.Curr.X: \" + e.Curr.X + \" eNext.Curr.X\" + eNext.Curr.X);\n if (e.Curr.X > eNext.Curr.X)\n {\n if (!this.IntersectPoint(e, eNext, pt) && e.Curr.X > eNext.Curr.X + 1)\n {\n //console.log(\"e.Curr.X: \"+JSON.stringify(JSON.decycle( e.Curr.X )));\n //console.log(\"eNext.Curr.X+1: \"+JSON.stringify(JSON.decycle( eNext.Curr.X+1)));\n ClipperLib.Error(\"Intersection error\");\n }\n if (pt.Y > botY)\n {\n pt.Y = botY;\n if (Math.abs(e.Dx) > Math.abs(eNext.Dx))\n pt.X = ClipperLib.Clipper.TopX(eNext, botY);\n else\n pt.X = ClipperLib.Clipper.TopX(e, botY);\n }\n var newNode = new ClipperLib.IntersectNode();\n newNode.Edge1 = e;\n newNode.Edge2 = eNext;\n //newNode.Pt = pt;\n newNode.Pt.X = pt.X;\n newNode.Pt.Y = pt.Y;\n this.m_IntersectList.push(newNode);\n this.SwapPositionsInSEL(e, eNext);\n isModified = true;\n }\n else\n e = eNext;\n }\n if (e.PrevInSEL !== null)\n e.PrevInSEL.NextInSEL = null;\n else\n break;\n }\n this.m_SortedEdges = null;\n};\nClipperLib.Clipper.prototype.EdgesAdjacent = function (inode)\n{\n return (inode.Edge1.NextInSEL == inode.Edge2) || (inode.Edge1.PrevInSEL == inode.Edge2);\n};\nClipperLib.Clipper.IntersectNodeSort = function (node1, node2)\n{\n //the following typecast is safe because the differences in Pt.Y will\n //be limited to the height of the scanbeam.\n return (node2.Pt.Y - node1.Pt.Y);\n};\nClipperLib.Clipper.prototype.FixupIntersectionOrder = function ()\n{\n //pre-condition: intersections are sorted bottom-most first.\n //Now it's crucial that intersections are made only between adjacent edges,\n //so to ensure this the order of intersections may need adjusting ...\n this.m_IntersectList.sort(this.m_IntersectNodeComparer);\n this.CopyAELToSEL();\n var cnt = this.m_IntersectList.length;\n for (var i = 0; i < cnt; i++)\n {\n if (!this.EdgesAdjacent(this.m_IntersectList[i]))\n {\n var j = i + 1;\n while (j < cnt && !this.EdgesAdjacent(this.m_IntersectList[j]))\n j++;\n if (j == cnt)\n return false;\n var tmp = this.m_IntersectList[i];\n this.m_IntersectList[i] = this.m_IntersectList[j];\n this.m_IntersectList[j] = tmp;\n }\n this.SwapPositionsInSEL(this.m_IntersectList[i].Edge1, this.m_IntersectList[i].Edge2);\n }\n return true;\n};\nClipperLib.Clipper.prototype.ProcessIntersectList = function ()\n{\n for (var i = 0, ilen = this.m_IntersectList.length; i < ilen; i++)\n {\n var iNode = this.m_IntersectList[i];\n this.IntersectEdges(iNode.Edge1, iNode.Edge2, iNode.Pt, true);\n this.SwapPositionsInAEL(iNode.Edge1, iNode.Edge2);\n }\n this.m_IntersectList.length = 0;\n};\n/*\n--------------------------------\nRound speedtest: http://jsperf.com/fastest-round\n--------------------------------\n*/\nvar R1 = function (a)\n{\n return a < 0 ? Math.ceil(a - 0.5) : Math.round(a)\n};\nvar R2 = function (a)\n{\n return a < 0 ? Math.ceil(a - 0.5) : Math.floor(a + 0.5)\n};\nvar R3 = function (a)\n{\n return a < 0 ? -Math.round(Math.abs(a)) : Math.round(a)\n};\nvar R4 = function (a)\n{\n if (a < 0)\n {\n a -= 0.5;\n return a < -2147483648 ? Math.ceil(a) : a | 0;\n }\n else\n {\n a += 0.5;\n return a > 2147483647 ? Math.floor(a) : a | 0;\n }\n};\nif (browser.msie) ClipperLib.Clipper.Round = R1;\nelse if (browser.chromium) ClipperLib.Clipper.Round = R3;\nelse if (browser.safari) ClipperLib.Clipper.Round = R4;\nelse ClipperLib.Clipper.Round = R2; // eg. browser.chrome || browser.firefox || browser.opera\nClipperLib.Clipper.TopX = function (edge, currentY)\n{\n //if (edge.Bot == edge.Curr) alert (\"edge.Bot = edge.Curr\");\n //if (edge.Bot == edge.Top) alert (\"edge.Bot = edge.Top\");\n if (currentY == edge.Top.Y)\n return edge.Top.X;\n return edge.Bot.X + ClipperLib.Clipper.Round(edge.Dx * (currentY - edge.Bot.Y));\n};\nClipperLib.Clipper.prototype.IntersectPoint = function (edge1, edge2, ip)\n{\n ip.X = 0;\n ip.Y = 0;\n var b1, b2;\n //nb: with very large coordinate values, it's possible for SlopesEqual() to \n //return false but for the edge.Dx value be equal due to double precision rounding.\n if (ClipperLib.ClipperBase.SlopesEqual(edge1, edge2, this.m_UseFullRange) || edge1.Dx == edge2.Dx)\n {\n if (edge2.Bot.Y > edge1.Bot.Y)\n {\n ip.X = edge2.Bot.X;\n ip.Y = edge2.Bot.Y;\n }\n else\n {\n ip.X = edge1.Bot.X;\n ip.Y = edge1.Bot.Y;\n }\n return false;\n }\n else if (edge1.Delta.X === 0)\n {\n ip.X = edge1.Bot.X;\n if (ClipperLib.ClipperBase.IsHorizontal(edge2))\n {\n ip.Y = edge2.Bot.Y;\n }\n else\n {\n b2 = edge2.Bot.Y - (edge2.Bot.X / edge2.Dx);\n ip.Y = ClipperLib.Clipper.Round(ip.X / edge2.Dx + b2);\n }\n }\n else if (edge2.Delta.X === 0)\n {\n ip.X = edge2.Bot.X;\n if (ClipperLib.ClipperBase.IsHorizontal(edge1))\n {\n ip.Y = edge1.Bot.Y;\n }\n else\n {\n b1 = edge1.Bot.Y - (edge1.Bot.X / edge1.Dx);\n ip.Y = ClipperLib.Clipper.Round(ip.X / edge1.Dx + b1);\n }\n }\n else\n {\n b1 = edge1.Bot.X - edge1.Bot.Y * edge1.Dx;\n b2 = edge2.Bot.X - edge2.Bot.Y * edge2.Dx;\n var q = (b2 - b1) / (edge1.Dx - edge2.Dx);\n ip.Y = ClipperLib.Clipper.Round(q);\n if (Math.abs(edge1.Dx) < Math.abs(edge2.Dx))\n ip.X = ClipperLib.Clipper.Round(edge1.Dx * q + b1);\n else\n ip.X = ClipperLib.Clipper.Round(edge2.Dx * q + b2);\n }\n if (ip.Y < edge1.Top.Y || ip.Y < edge2.Top.Y)\n {\n if (edge1.Top.Y > edge2.Top.Y)\n {\n ip.Y = edge1.Top.Y;\n ip.X = ClipperLib.Clipper.TopX(edge2, edge1.Top.Y);\n return ip.X < edge1.Top.X;\n }\n else\n ip.Y = edge2.Top.Y;\n if (Math.abs(edge1.Dx) < Math.abs(edge2.Dx))\n ip.X = ClipperLib.Clipper.TopX(edge1, ip.Y);\n else\n ip.X = ClipperLib.Clipper.TopX(edge2, ip.Y);\n }\n return true;\n};\nClipperLib.Clipper.prototype.ProcessEdgesAtTopOfScanbeam = function (topY)\n{\n var e = this.m_ActiveEdges;\n while (e !== null)\n {\n //1. process maxima, treating them as if they're 'bent' horizontal edges,\n // but exclude maxima with horizontal edges. nb: e can't be a horizontal.\n var IsMaximaEdge = this.IsMaxima(e, topY);\n if (IsMaximaEdge)\n {\n var eMaxPair = this.GetMaximaPair(e);\n IsMaximaEdge = (eMaxPair === null || !ClipperLib.ClipperBase.IsHorizontal(eMaxPair));\n }\n if (IsMaximaEdge)\n {\n var ePrev = e.PrevInAEL;\n this.DoMaxima(e);\n if (ePrev === null)\n e = this.m_ActiveEdges;\n else\n e = ePrev.NextInAEL;\n }\n else\n {\n //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ...\n if (this.IsIntermediate(e, topY) && ClipperLib.ClipperBase.IsHorizontal(e.NextInLML))\n {\n e = this.UpdateEdgeIntoAEL(e);\n if (e.OutIdx >= 0)\n this.AddOutPt(e, e.Bot);\n this.AddEdgeToSEL(e);\n }\n else\n {\n e.Curr.X = ClipperLib.Clipper.TopX(e, topY);\n e.Curr.Y = topY;\n }\n if (this.StrictlySimple)\n {\n var ePrev = e.PrevInAEL;\n if ((e.OutIdx >= 0) && (e.WindDelta !== 0) && ePrev !== null &&\n (ePrev.OutIdx >= 0) && (ePrev.Curr.X == e.Curr.X) &&\n (ePrev.WindDelta !== 0))\n {\n var op = this.AddOutPt(ePrev, e.Curr);\n var op2 = this.AddOutPt(e, e.Curr);\n this.AddJoin(op, op2, e.Curr);\n //StrictlySimple (type-3) join\n }\n }\n e = e.NextInAEL;\n }\n }\n //3. Process horizontals at the Top of the scanbeam ...\n this.ProcessHorizontals(true);\n //4. Promote intermediate vertices ...\n e = this.m_ActiveEdges;\n while (e !== null)\n {\n if (this.IsIntermediate(e, topY))\n {\n var op = null;\n if (e.OutIdx >= 0)\n op = this.AddOutPt(e, e.Top);\n e = this.UpdateEdgeIntoAEL(e);\n //if output polygons share an edge, they'll need joining later ...\n var ePrev = e.PrevInAEL;\n var eNext = e.NextInAEL;\n if (ePrev !== null && ePrev.Curr.X == e.Bot.X &&\n ePrev.Curr.Y == e.Bot.Y && op !== null &&\n ePrev.OutIdx >= 0 && ePrev.Curr.Y > ePrev.Top.Y &&\n ClipperLib.ClipperBase.SlopesEqual(e, ePrev, this.m_UseFullRange) &&\n (e.WindDelta !== 0) && (ePrev.WindDelta !== 0))\n {\n var op2 = this.AddOutPt(ePrev, e.Bot);\n this.AddJoin(op, op2, e.Top);\n }\n else if (eNext !== null && eNext.Curr.X == e.Bot.X &&\n eNext.Curr.Y == e.Bot.Y && op !== null &&\n eNext.OutIdx >= 0 && eNext.Curr.Y > eNext.Top.Y &&\n ClipperLib.ClipperBase.SlopesEqual(e, eNext, this.m_UseFullRange) &&\n (e.WindDelta !== 0) && (eNext.WindDelta !== 0))\n {\n var op2 = this.AddOutPt(eNext, e.Bot);\n this.AddJoin(op, op2, e.Top);\n }\n }\n e = e.NextInAEL;\n }\n};\nClipperLib.Clipper.prototype.DoMaxima = function (e)\n{\n var eMaxPair = this.GetMaximaPair(e);\n if (eMaxPair === null)\n {\n if (e.OutIdx >= 0)\n this.AddOutPt(e, e.Top);\n this.DeleteFromAEL(e);\n return;\n }\n var eNext = e.NextInAEL;\n var use_lines = true;\n while (eNext !== null && eNext != eMaxPair)\n {\n this.IntersectEdges(e, eNext, e.Top, true);\n this.SwapPositionsInAEL(e, eNext);\n eNext = e.NextInAEL;\n }\n if (e.OutIdx == -1 && eMaxPair.OutIdx == -1)\n {\n this.DeleteFromAEL(e);\n this.DeleteFromAEL(eMaxPair);\n }\n else if (e.OutIdx >= 0 && eMaxPair.OutIdx >= 0)\n {\n this.IntersectEdges(e, eMaxPair, e.Top, false);\n }\n else if (use_lines && e.WindDelta === 0)\n {\n if (e.OutIdx >= 0)\n {\n this.AddOutPt(e, e.Top);\n e.OutIdx = -1;\n }\n this.DeleteFromAEL(e);\n if (eMaxPair.OutIdx >= 0)\n {\n this.AddOutPt(eMaxPair, e.Top);\n eMaxPair.OutIdx = -1;\n }\n this.DeleteFromAEL(eMaxPair);\n }\n else\n ClipperLib.Error(\"DoMaxima error\");\n};\nClipperLib.Clipper.ReversePaths = function (polys)\n{\n for (var i = 0, len = polys.length; i < len; i++)\n polys[i].reverse();\n};\nClipperLib.Clipper.Orientation = function (poly)\n{\n return ClipperLib.Clipper.Area(poly) >= 0;\n};\nClipperLib.Clipper.prototype.PointCount = function (pts)\n{\n if (pts === null)\n return 0;\n var result = 0;\n var p = pts;\n do {\n result++;\n p = p.Next;\n }\n while (p != pts)\n return result;\n};\nClipperLib.Clipper.prototype.BuildResult = function (polyg)\n{\n ClipperLib.Clear(polyg);\n for (var i = 0, ilen = this.m_PolyOuts.length; i < ilen; i++)\n {\n var outRec = this.m_PolyOuts[i];\n if (outRec.Pts === null)\n continue;\n var p = outRec.Pts.Prev;\n var cnt = this.PointCount(p);\n if (cnt < 2)\n continue;\n var pg = new Array(cnt);\n for (var j = 0; j < cnt; j++)\n {\n pg[j] = p.Pt;\n p = p.Prev;\n }\n polyg.push(pg);\n }\n};\nClipperLib.Clipper.prototype.BuildResult2 = function (polytree)\n{\n polytree.Clear();\n //add each output polygon/contour to polytree ...\n //polytree.m_AllPolys.set_Capacity(this.m_PolyOuts.length);\n for (var i = 0, ilen = this.m_PolyOuts.length; i < ilen; i++)\n {\n var outRec = this.m_PolyOuts[i];\n var cnt = this.PointCount(outRec.Pts);\n if ((outRec.IsOpen && cnt < 2) || (!outRec.IsOpen && cnt < 3))\n continue;\n this.FixHoleLinkage(outRec);\n var pn = new ClipperLib.PolyNode();\n polytree.m_AllPolys.push(pn);\n outRec.PolyNode = pn;\n pn.m_polygon.length = cnt;\n var op = outRec.Pts.Prev;\n for (var j = 0; j < cnt; j++)\n {\n pn.m_polygon[j] = op.Pt;\n op = op.Prev;\n }\n }\n //fixup PolyNode links etc ...\n //polytree.m_Childs.set_Capacity(this.m_PolyOuts.length);\n for (var i = 0, ilen = this.m_PolyOuts.length; i < ilen; i++)\n {\n var outRec = this.m_PolyOuts[i];\n if (outRec.PolyNode === null)\n continue;\n else if (outRec.IsOpen)\n {\n outRec.PolyNode.IsOpen = true;\n polytree.AddChild(outRec.PolyNode);\n }\n else if (outRec.FirstLeft !== null && outRec.FirstLeft.PolyNode != null)\n outRec.FirstLeft.PolyNode.AddChild(outRec.PolyNode);\n else\n polytree.AddChild(outRec.PolyNode);\n }\n};\nClipperLib.Clipper.prototype.FixupOutPolygon = function (outRec)\n{\n //FixupOutPolygon() - removes duplicate points and simplifies consecutive\n //parallel edges by removing the middle vertex.\n var lastOK = null;\n outRec.BottomPt = null;\n var pp = outRec.Pts;\n for (;;)\n {\n if (pp.Prev == pp || pp.Prev == pp.Next)\n {\n this.DisposeOutPts(pp);\n outRec.Pts = null;\n return;\n }\n //test for duplicate points and collinear edges ...\n if ((ClipperLib.IntPoint.op_Equality(pp.Pt, pp.Next.Pt)) || (ClipperLib.IntPoint.op_Equality(pp.Pt, pp.Prev.Pt)) ||\n (ClipperLib.ClipperBase.SlopesEqual(pp.Prev.Pt, pp.Pt, pp.Next.Pt, this.m_UseFullRange) &&\n (!this.PreserveCollinear || !this.Pt2IsBetweenPt1AndPt3(pp.Prev.Pt, pp.Pt, pp.Next.Pt))))\n {\n lastOK = null;\n var tmp = pp;\n pp.Prev.Next = pp.Next;\n pp.Next.Prev = pp.Prev;\n pp = pp.Prev;\n tmp = null;\n }\n else if (pp == lastOK)\n break;\n else\n {\n if (lastOK === null)\n lastOK = pp;\n pp = pp.Next;\n }\n }\n outRec.Pts = pp;\n};\nClipperLib.Clipper.prototype.DupOutPt = function (outPt, InsertAfter)\n{\n var result = new ClipperLib.OutPt();\n //result.Pt = outPt.Pt;\n result.Pt.X = outPt.Pt.X;\n result.Pt.Y = outPt.Pt.Y;\n result.Idx = outPt.Idx;\n if (InsertAfter)\n {\n result.Next = outPt.Next;\n result.Prev = outPt;\n outPt.Next.Prev = result;\n outPt.Next = result;\n }\n else\n {\n result.Prev = outPt.Prev;\n result.Next = outPt;\n outPt.Prev.Next = result;\n outPt.Prev = result;\n }\n return result;\n};\nClipperLib.Clipper.prototype.GetOverlap = function (a1, a2, b1, b2, $val)\n{\n if (a1 < a2)\n {\n if (b1 < b2)\n {\n $val.Left = Math.max(a1, b1);\n $val.Right = Math.min(a2, b2);\n }\n else\n {\n $val.Left = Math.max(a1, b2);\n $val.Right = Math.min(a2, b1);\n }\n }\n else\n {\n if (b1 < b2)\n {\n $val.Left = Math.max(a2, b1);\n $val.Right = Math.min(a1, b2);\n }\n else\n {\n $val.Left = Math.max(a2, b2);\n $val.Right = Math.min(a1, b1);\n }\n }\n return $val.Left < $val.Right;\n};\nClipperLib.Clipper.prototype.JoinHorz = function (op1, op1b, op2, op2b, Pt, DiscardLeft)\n{\n var Dir1 = (op1.Pt.X > op1b.Pt.X ? ClipperLib.Direction.dRightToLeft : ClipperLib.Direction.dLeftToRight);\n var Dir2 = (op2.Pt.X > op2b.Pt.X ? ClipperLib.Direction.dRightToLeft : ClipperLib.Direction.dLeftToRight);\n if (Dir1 == Dir2)\n return false;\n //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we\n //want Op1b to be on the Right. (And likewise with Op2 and Op2b.)\n //So, to facilitate this while inserting Op1b and Op2b ...\n //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b,\n //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.)\n if (Dir1 == ClipperLib.Direction.dLeftToRight)\n {\n while (op1.Next.Pt.X <= Pt.X &&\n op1.Next.Pt.X >= op1.Pt.X && op1.Next.Pt.Y == Pt.Y)\n op1 = op1.Next;\n if (DiscardLeft && (op1.Pt.X != Pt.X))\n op1 = op1.Next;\n op1b = this.DupOutPt(op1, !DiscardLeft);\n if (ClipperLib.IntPoint.op_Inequality(op1b.Pt, Pt))\n {\n op1 = op1b;\n //op1.Pt = Pt;\n op1.Pt.X = Pt.X;\n op1.Pt.Y = Pt.Y;\n op1b = this.DupOutPt(op1, !DiscardLeft);\n }\n }\n else\n {\n while (op1.Next.Pt.X >= Pt.X &&\n op1.Next.Pt.X <= op1.Pt.X && op1.Next.Pt.Y == Pt.Y)\n op1 = op1.Next;\n if (!DiscardLeft && (op1.Pt.X != Pt.X))\n op1 = op1.Next;\n op1b = this.DupOutPt(op1, DiscardLeft);\n if (ClipperLib.IntPoint.op_Inequality(op1b.Pt, Pt))\n {\n op1 = op1b;\n //op1.Pt = Pt;\n op1.Pt.X = Pt.X;\n op1.Pt.Y = Pt.Y;\n op1b = this.DupOutPt(op1, DiscardLeft);\n }\n }\n if (Dir2 == ClipperLib.Direction.dLeftToRight)\n {\n while (op2.Next.Pt.X <= Pt.X &&\n op2.Next.Pt.X >= op2.Pt.X && op2.Next.Pt.Y == Pt.Y)\n op2 = op2.Next;\n if (DiscardLeft && (op2.Pt.X != Pt.X))\n op2 = op2.Next;\n op2b = this.DupOutPt(op2, !DiscardLeft);\n if (ClipperLib.IntPoint.op_Inequality(op2b.Pt, Pt))\n {\n op2 = op2b;\n //op2.Pt = Pt;\n op2.Pt.X = Pt.X;\n op2.Pt.Y = Pt.Y;\n op2b = this.DupOutPt(op2, !DiscardLeft);\n }\n }\n else\n {\n while (op2.Next.Pt.X >= Pt.X &&\n op2.Next.Pt.X <= op2.Pt.X && op2.Next.Pt.Y == Pt.Y)\n op2 = op2.Next;\n if (!DiscardLeft && (op2.Pt.X != Pt.X))\n op2 = op2.Next;\n op2b = this.DupOutPt(op2, DiscardLeft);\n if (ClipperLib.IntPoint.op_Inequality(op2b.Pt, Pt))\n {\n op2 = op2b;\n //op2.Pt = Pt;\n op2.Pt.X = Pt.X;\n op2.Pt.Y = Pt.Y;\n op2b = this.DupOutPt(op2, DiscardLeft);\n }\n }\n if ((Dir1 == ClipperLib.Direction.dLeftToRight) == DiscardLeft)\n {\n op1.Prev = op2;\n op2.Next = op1;\n op1b.Next = op2b;\n op2b.Prev = op1b;\n }\n else\n {\n op1.Next = op2;\n op2.Prev = op1;\n op1b.Prev = op2b;\n op2b.Next = op1b;\n }\n return true;\n};\nClipperLib.Clipper.prototype.JoinPoints = function (j, outRec1, outRec2)\n{\n var op1 = j.OutPt1,\n op1b = new ClipperLib.OutPt();\n var op2 = j.OutPt2,\n op2b = new ClipperLib.OutPt();\n //There are 3 kinds of joins for output polygons ...\n //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are a vertices anywhere\n //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal).\n //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same\n //location at the Bottom of the overlapping segment (& Join.OffPt is above).\n //3. StrictlySimple joins where edges touch but are not collinear and where\n //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point.\n var isHorizontal = (j.OutPt1.Pt.Y == j.OffPt.Y);\n if (isHorizontal && (ClipperLib.IntPoint.op_Equality(j.OffPt, j.OutPt1.Pt)) && (ClipperLib.IntPoint.op_Equality(j.OffPt, j.OutPt2.Pt)))\n {\n //Strictly Simple join ...\n op1b = j.OutPt1.Next;\n while (op1b != op1 && (ClipperLib.IntPoint.op_Equality(op1b.Pt, j.OffPt)))\n op1b = op1b.Next;\n var reverse1 = (op1b.Pt.Y > j.OffPt.Y);\n op2b = j.OutPt2.Next;\n while (op2b != op2 && (ClipperLib.IntPoint.op_Equality(op2b.Pt, j.OffPt)))\n op2b = op2b.Next;\n var reverse2 = (op2b.Pt.Y > j.OffPt.Y);\n if (reverse1 == reverse2)\n return false;\n if (reverse1)\n {\n op1b = this.DupOutPt(op1, false);\n op2b = this.DupOutPt(op2, true);\n op1.Prev = op2;\n op2.Next = op1;\n op1b.Next = op2b;\n op2b.Prev = op1b;\n j.OutPt1 = op1;\n j.OutPt2 = op1b;\n return true;\n }\n else\n {\n op1b = this.DupOutPt(op1, true);\n op2b = this.DupOutPt(op2, false);\n op1.Next = op2;\n op2.Prev = op1;\n op1b.Prev = op2b;\n op2b.Next = op1b;\n j.OutPt1 = op1;\n j.OutPt2 = op1b;\n return true;\n }\n }\n else if (isHorizontal)\n {\n //treat horizontal joins differently to non-horizontal joins since with\n //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt\n //may be anywhere along the horizontal edge.\n op1b = op1;\n while (op1.Prev.Pt.Y == op1.Pt.Y && op1.Prev != op1b && op1.Prev != op2)\n op1 = op1.Prev;\n while (op1b.Next.Pt.Y == op1b.Pt.Y && op1b.Next != op1 && op1b.Next != op2)\n op1b = op1b.Next;\n if (op1b.Next == op1 || op1b.Next == op2)\n return false;\n //a flat 'polygon'\n op2b = op2;\n while (op2.Prev.Pt.Y == op2.Pt.Y && op2.Prev != op2b && op2.Prev != op1b)\n op2 = op2.Prev;\n while (op2b.Next.Pt.Y == op2b.Pt.Y && op2b.Next != op2 && op2b.Next != op1)\n op2b = op2b.Next;\n if (op2b.Next == op2 || op2b.Next == op1)\n return false;\n //a flat 'polygon'\n //Op1 -. Op1b & Op2 -. Op2b are the extremites of the horizontal edges\n\n var $val = {Left: null, Right: null};\n if (!this.GetOverlap(op1.Pt.X, op1b.Pt.X, op2.Pt.X, op2b.Pt.X, $val))\n return false;\n var Left = $val.Left;\n var Right = $val.Right;\n\n //DiscardLeftSide: when overlapping edges are joined, a spike will created\n //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up\n //on the discard Side as either may still be needed for other joins ...\n var Pt = new ClipperLib.IntPoint();\n var DiscardLeftSide;\n if (op1.Pt.X >= Left && op1.Pt.X <= Right)\n {\n //Pt = op1.Pt;\n Pt.X = op1.Pt.X;\n Pt.Y = op1.Pt.Y;\n DiscardLeftSide = (op1.Pt.X > op1b.Pt.X);\n }\n else if (op2.Pt.X >= Left && op2.Pt.X <= Right)\n {\n //Pt = op2.Pt;\n Pt.X = op2.Pt.X;\n Pt.Y = op2.Pt.Y;\n DiscardLeftSide = (op2.Pt.X > op2b.Pt.X);\n }\n else if (op1b.Pt.X >= Left && op1b.Pt.X <= Right)\n {\n //Pt = op1b.Pt;\n Pt.X = op1b.Pt.X;\n Pt.Y = op1b.Pt.Y;\n DiscardLeftSide = op1b.Pt.X > op1.Pt.X;\n }\n else\n {\n //Pt = op2b.Pt;\n Pt.X = op2b.Pt.X;\n Pt.Y = op2b.Pt.Y;\n DiscardLeftSide = (op2b.Pt.X > op2.Pt.X);\n }\n j.OutPt1 = op1;\n j.OutPt2 = op2;\n return this.JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide);\n }\n else\n {\n //nb: For non-horizontal joins ...\n // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y\n // 2. Jr.OutPt1.Pt > Jr.OffPt.Y\n //make sure the polygons are correctly oriented ...\n op1b = op1.Next;\n while ((ClipperLib.IntPoint.op_Equality(op1b.Pt, op1.Pt)) && (op1b != op1))\n op1b = op1b.Next;\n var Reverse1 = ((op1b.Pt.Y > op1.Pt.Y) || !ClipperLib.ClipperBase.SlopesEqual(op1.Pt, op1b.Pt, j.OffPt, this.m_UseFullRange));\n if (Reverse1)\n {\n op1b = op1.Prev;\n while ((ClipperLib.IntPoint.op_Equality(op1b.Pt, op1.Pt)) && (op1b != op1))\n op1b = op1b.Prev;\n if ((op1b.Pt.Y > op1.Pt.Y) || !ClipperLib.ClipperBase.SlopesEqual(op1.Pt, op1b.Pt, j.OffPt, this.m_UseFullRange))\n return false;\n }\n op2b = op2.Next;\n while ((ClipperLib.IntPoint.op_Equality(op2b.Pt, op2.Pt)) && (op2b != op2))\n op2b = op2b.Next;\n var Reverse2 = ((op2b.Pt.Y > op2.Pt.Y) || !ClipperLib.ClipperBase.SlopesEqual(op2.Pt, op2b.Pt, j.OffPt, this.m_UseFullRange));\n if (Reverse2)\n {\n op2b = op2.Prev;\n while ((ClipperLib.IntPoint.op_Equality(op2b.Pt, op2.Pt)) && (op2b != op2))\n op2b = op2b.Prev;\n if ((op2b.Pt.Y > op2.Pt.Y) || !ClipperLib.ClipperBase.SlopesEqual(op2.Pt, op2b.Pt, j.OffPt, this.m_UseFullRange))\n return false;\n }\n if ((op1b == op1) || (op2b == op2) || (op1b == op2b) ||\n ((outRec1 == outRec2) && (Reverse1 == Reverse2)))\n return false;\n if (Reverse1)\n {\n op1b = this.DupOutPt(op1, false);\n op2b = this.DupOutPt(op2, true);\n op1.Prev = op2;\n op2.Next = op1;\n op1b.Next = op2b;\n op2b.Prev = op1b;\n j.OutPt1 = op1;\n j.OutPt2 = op1b;\n return true;\n }\n else\n {\n op1b = this.DupOutPt(op1, true);\n op2b = this.DupOutPt(op2, false);\n op1.Next = op2;\n op2.Prev = op1;\n op1b.Prev = op2b;\n op2b.Next = op1b;\n j.OutPt1 = op1;\n j.OutPt2 = op1b;\n return true;\n }\n }\n};\nClipperLib.Clipper.GetBounds = function (paths)\n{\n var i = 0,\n cnt = paths.length;\n while (i < cnt && paths[i].length == 0) i++;\n if (i == cnt) return new ClipperLib.IntRect(0, 0, 0, 0);\n var result = new ClipperLib.IntRect();\n result.left = paths[i][0].X;\n result.right = result.left;\n result.top = paths[i][0].Y;\n result.bottom = result.top;\n for (; i < cnt; i++)\n for (var j = 0, jlen = paths[i].length; j < jlen; j++)\n {\n if (paths[i][j].X < result.left) result.left = paths[i][j].X;\n else if (paths[i][j].X > result.right) result.right = paths[i][j].X;\n if (paths[i][j].Y < result.top) result.top = paths[i][j].Y;\n else if (paths[i][j].Y > result.bottom) result.bottom = paths[i][j].Y;\n }\n return result;\n}\nClipperLib.Clipper.prototype.GetBounds2 = function (ops)\n{\n var opStart = ops;\n var result = new ClipperLib.IntRect();\n result.left = ops.Pt.X;\n result.right = ops.Pt.X;\n result.top = ops.Pt.Y;\n result.bottom = ops.Pt.Y;\n ops = ops.Next;\n while (ops != opStart)\n {\n if (ops.Pt.X < result.left)\n result.left = ops.Pt.X;\n if (ops.Pt.X > result.right)\n result.right = ops.Pt.X;\n if (ops.Pt.Y < result.top)\n result.top = ops.Pt.Y;\n if (ops.Pt.Y > result.bottom)\n result.bottom = ops.Pt.Y;\n ops = ops.Next;\n }\n return result;\n};\n\nClipperLib.Clipper.PointInPolygon = function (pt, path)\n{\n //returns 0 if false, +1 if true, -1 if pt ON polygon boundary\n //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf\n var result = 0,\n cnt = path.length;\n if (cnt < 3)\n return 0;\n var ip = path[0];\n for (var i = 1; i <= cnt; ++i)\n {\n var ipNext = (i == cnt ? path[0] : path[i]);\n if (ipNext.Y == pt.Y)\n {\n if ((ipNext.X == pt.X) || (ip.Y == pt.Y && ((ipNext.X > pt.X) == (ip.X < pt.X))))\n return -1;\n }\n if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y))\n {\n if (ip.X >= pt.X)\n {\n if (ipNext.X > pt.X)\n result = 1 - result;\n else\n {\n var d = (ip.X - pt.X) * (ipNext.Y - pt.Y) - (ipNext.X - pt.X) * (ip.Y - pt.Y);\n if (d == 0)\n return -1;\n else if ((d > 0) == (ipNext.Y > ip.Y))\n result = 1 - result;\n }\n }\n else\n {\n if (ipNext.X > pt.X)\n {\n var d = (ip.X - pt.X) * (ipNext.Y - pt.Y) - (ipNext.X - pt.X) * (ip.Y - pt.Y);\n if (d == 0)\n return -1;\n else if ((d > 0) == (ipNext.Y > ip.Y))\n result = 1 - result;\n }\n }\n }\n ip = ipNext;\n }\n return result;\n};\n \nClipperLib.Clipper.prototype.PointInPolygon = function (pt, op)\n{\n //returns 0 if false, +1 if true, -1 if pt ON polygon boundary\n //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf\n var result = 0;\n var startOp = op;\n for (;;)\n {\n var poly0x = op.Pt.X,\n poly0y = op.Pt.Y;\n var poly1x = op.Next.Pt.X,\n poly1y = op.Next.Pt.Y;\n if (poly1y == pt.Y)\n {\n if ((poly1x == pt.X) || (poly0y == pt.Y && ((poly1x > pt.X) == (poly0x < pt.X))))\n return -1;\n }\n if ((poly0y < pt.Y) != (poly1y < pt.Y))\n {\n if (poly0x >= pt.X)\n {\n if (poly1x > pt.X)\n result = 1 - result;\n else\n {\n var d = (poly0x - pt.X) * (poly1y - pt.Y) - (poly1x - pt.X) * (poly0y - pt.Y);\n if (d == 0)\n return -1;\n if ((d > 0) == (poly1y > poly0y))\n result = 1 - result;\n }\n }\n else\n {\n if (poly1x > pt.X)\n {\n var d = (poly0x - pt.X) * (poly1y - pt.Y) - (poly1x - pt.X) * (poly0y - pt.Y);\n if (d == 0)\n return -1;\n if ((d > 0) == (poly1y > poly0y))\n result = 1 - result;\n }\n }\n }\n op = op.Next;\n if (startOp == op)\n break;\n }\n return result;\n};\n\nClipperLib.Clipper.prototype.Poly2ContainsPoly1 = function (outPt1, outPt2)\n{\n var op = outPt1;\n do {\n var res = this.PointInPolygon(op.Pt, outPt2);\n if (res >= 0)\n return res != 0;\n op = op.Next;\n }\n while (op != outPt1)\n return true;\n};\nClipperLib.Clipper.prototype.FixupFirstLefts1 = function (OldOutRec, NewOutRec)\n{\n for (var i = 0, ilen = this.m_PolyOuts.length; i < ilen; i++)\n {\n var outRec = this.m_PolyOuts[i];\n if (outRec.Pts !== null && outRec.FirstLeft == OldOutRec)\n {\n if (this.Poly2ContainsPoly1(outRec.Pts, NewOutRec.Pts))\n outRec.FirstLeft = NewOutRec;\n }\n }\n};\nClipperLib.Clipper.prototype.FixupFirstLefts2 = function (OldOutRec, NewOutRec)\n{\n for (var $i2 = 0, $t2 = this.m_PolyOuts, $l2 = $t2.length, outRec = $t2[$i2]; $i2 < $l2; $i2++, outRec = $t2[$i2])\n if (outRec.FirstLeft == OldOutRec)\n outRec.FirstLeft = NewOutRec;\n};\nClipperLib.Clipper.ParseFirstLeft = function (FirstLeft)\n{\n while (FirstLeft != null && FirstLeft.Pts == null)\n FirstLeft = FirstLeft.FirstLeft;\n return FirstLeft;\n};\nClipperLib.Clipper.prototype.JoinCommonEdges = function ()\n{\n for (var i = 0, ilen = this.m_Joins.length; i < ilen; i++)\n {\n var join = this.m_Joins[i];\n var outRec1 = this.GetOutRec(join.OutPt1.Idx);\n var outRec2 = this.GetOutRec(join.OutPt2.Idx);\n if (outRec1.Pts == null || outRec2.Pts == null)\n continue;\n //get the polygon fragment with the correct hole state (FirstLeft)\n //before calling JoinPoints() ...\n var holeStateRec;\n if (outRec1 == outRec2)\n holeStateRec = outRec1;\n else if (this.Param1RightOfParam2(outRec1, outRec2))\n holeStateRec = outRec2;\n else if (this.Param1RightOfParam2(outRec2, outRec1))\n holeStateRec = outRec1;\n else\n holeStateRec = this.GetLowermostRec(outRec1, outRec2);\n\n if (!this.JoinPoints(join, outRec1, outRec2)) continue;\n\n if (outRec1 == outRec2)\n {\n //instead of joining two polygons, we've just created a new one by\n //splitting one polygon into two.\n outRec1.Pts = join.OutPt1;\n outRec1.BottomPt = null;\n outRec2 = this.CreateOutRec();\n outRec2.Pts = join.OutPt2;\n //update all OutRec2.Pts Idx's ...\n this.UpdateOutPtIdxs(outRec2);\n //We now need to check every OutRec.FirstLeft pointer. If it points\n //to OutRec1 it may need to point to OutRec2 instead ...\n if (this.m_UsingPolyTree)\n for (var j = 0, jlen = this.m_PolyOuts.length; j < jlen - 1; j++)\n {\n var oRec = this.m_PolyOuts[j];\n if (oRec.Pts == null || ClipperLib.Clipper.ParseFirstLeft(oRec.FirstLeft) != outRec1 || oRec.IsHole == outRec1.IsHole)\n continue;\n if (this.Poly2ContainsPoly1(oRec.Pts, join.OutPt2))\n oRec.FirstLeft = outRec2;\n }\n if (this.Poly2ContainsPoly1(outRec2.Pts, outRec1.Pts))\n {\n //outRec2 is contained by outRec1 ...\n outRec2.IsHole = !outRec1.IsHole;\n outRec2.FirstLeft = outRec1;\n //fixup FirstLeft pointers that may need reassigning to OutRec1\n if (this.m_UsingPolyTree)\n this.FixupFirstLefts2(outRec2, outRec1);\n if ((outRec2.IsHole ^ this.ReverseSolution) == (this.Area(outRec2) > 0))\n this.ReversePolyPtLinks(outRec2.Pts);\n }\n else if (this.Poly2ContainsPoly1(outRec1.Pts, outRec2.Pts))\n {\n //outRec1 is contained by outRec2 ...\n outRec2.IsHole = outRec1.IsHole;\n outRec1.IsHole = !outRec2.IsHole;\n outRec2.FirstLeft = outRec1.FirstLeft;\n outRec1.FirstLeft = outRec2;\n //fixup FirstLeft pointers that may need reassigning to OutRec1\n if (this.m_UsingPolyTree)\n this.FixupFirstLefts2(outRec1, outRec2);\n if ((outRec1.IsHole ^ this.ReverseSolution) == (this.Area(outRec1) > 0))\n this.ReversePolyPtLinks(outRec1.Pts);\n }\n else\n {\n //the 2 polygons are completely separate ...\n outRec2.IsHole = outRec1.IsHole;\n outRec2.FirstLeft = outRec1.FirstLeft;\n //fixup FirstLeft pointers that may need reassigning to OutRec2\n if (this.m_UsingPolyTree)\n this.FixupFirstLefts1(outRec1, outRec2);\n }\n }\n else\n {\n //joined 2 polygons together ...\n outRec2.Pts = null;\n outRec2.BottomPt = null;\n outRec2.Idx = outRec1.Idx;\n outRec1.IsHole = holeStateRec.IsHole;\n if (holeStateRec == outRec2)\n outRec1.FirstLeft = outRec2.FirstLeft;\n outRec2.FirstLeft = outRec1;\n //fixup FirstLeft pointers that may need reassigning to OutRec1\n if (this.m_UsingPolyTree)\n this.FixupFirstLefts2(outRec2, outRec1);\n }\n }\n};\nClipperLib.Clipper.prototype.UpdateOutPtIdxs = function (outrec)\n{\n var op = outrec.Pts;\n do {\n op.Idx = outrec.Idx;\n op = op.Prev;\n }\n while (op != outrec.Pts)\n};\nClipperLib.Clipper.prototype.DoSimplePolygons = function ()\n{\n var i = 0;\n while (i < this.m_PolyOuts.length)\n {\n var outrec = this.m_PolyOuts[i++];\n var op = outrec.Pts;\n if (op === null)\n continue;\n do //for each Pt in Polygon until duplicate found do ...\n {\n var op2 = op.Next;\n while (op2 != outrec.Pts)\n {\n if ((ClipperLib.IntPoint.op_Equality(op.Pt, op2.Pt)) && op2.Next != op && op2.Prev != op)\n {\n //split the polygon into two ...\n var op3 = op.Prev;\n var op4 = op2.Prev;\n op.Prev = op4;\n op4.Next = op;\n op2.Prev = op3;\n op3.Next = op2;\n outrec.Pts = op;\n var outrec2 = this.CreateOutRec();\n outrec2.Pts = op2;\n this.UpdateOutPtIdxs(outrec2);\n if (this.Poly2ContainsPoly1(outrec2.Pts, outrec.Pts))\n {\n //OutRec2 is contained by OutRec1 ...\n outrec2.IsHole = !outrec.IsHole;\n outrec2.FirstLeft = outrec;\n }\n else if (this.Poly2ContainsPoly1(outrec.Pts, outrec2.Pts))\n {\n //OutRec1 is contained by OutRec2 ...\n outrec2.IsHole = outrec.IsHole;\n outrec.IsHole = !outrec2.IsHole;\n outrec2.FirstLeft = outrec.FirstLeft;\n outrec.FirstLeft = outrec2;\n }\n else\n {\n //the 2 polygons are separate ...\n outrec2.IsHole = outrec.IsHole;\n outrec2.FirstLeft = outrec.FirstLeft;\n }\n op2 = op;\n //ie get ready for the next iteration\n }\n op2 = op2.Next;\n }\n op = op.Next;\n }\n while (op != outrec.Pts)\n }\n};\nClipperLib.Clipper.Area = function (poly)\n{\n var cnt = poly.length;\n if (cnt < 3)\n return 0;\n var a = 0;\n for (var i = 0, j = cnt - 1; i < cnt; ++i)\n {\n a += (poly[j].X + poly[i].X) * (poly[j].Y - poly[i].Y);\n j = i;\n }\n return -a * 0.5;\n};\nClipperLib.Clipper.prototype.Area = function (outRec)\n{\n var op = outRec.Pts;\n if (op == null)\n return 0;\n var a = 0;\n do {\n a = a + (op.Prev.Pt.X + op.Pt.X) * (op.Prev.Pt.Y - op.Pt.Y);\n op = op.Next;\n }\n while (op != outRec.Pts)\n return a * 0.5;\n};\nif (use_deprecated)\n{\n ClipperLib.Clipper.OffsetPaths = function (polys, delta, jointype, endtype, MiterLimit)\n {\n var result = new ClipperLib.Paths();\n var co = new ClipperLib.ClipperOffset(MiterLimit, MiterLimit);\n co.AddPaths(polys, jointype, endtype);\n co.Execute(result, delta);\n return result;\n };\n}\nClipperLib.Clipper.SimplifyPolygon = function (poly, fillType)\n{\n var result = new Array();\n var c = new ClipperLib.Clipper(0);\n c.StrictlySimple = true;\n c.AddPath(poly, ClipperLib.PolyType.ptSubject, true);\n c.Execute(ClipperLib.ClipType.ctUnion, result, fillType, fillType);\n return result;\n};\nClipperLib.Clipper.SimplifyPolygons = function (polys, fillType)\n{\n if (typeof (fillType) == \"undefined\") fillType = ClipperLib.PolyFillType.pftEvenOdd;\n var result = new Array();\n var c = new ClipperLib.Clipper(0);\n c.StrictlySimple = true;\n c.AddPaths(polys, ClipperLib.PolyType.ptSubject, true);\n c.Execute(ClipperLib.ClipType.ctUnion, result, fillType, fillType);\n return result;\n};\nClipperLib.Clipper.DistanceSqrd = function (pt1, pt2)\n{\n var dx = (pt1.X - pt2.X);\n var dy = (pt1.Y - pt2.Y);\n return (dx * dx + dy * dy);\n};\nClipperLib.Clipper.DistanceFromLineSqrd = function (pt, ln1, ln2)\n{\n //The equation of a line in general form (Ax + By + C = 0)\n //given 2 points (x\uFFFD,y\uFFFD) & (x\uFFFD,y\uFFFD) is ...\n //(y\uFFFD - y\uFFFD)x + (x\uFFFD - x\uFFFD)y + (y\uFFFD - y\uFFFD)x\uFFFD - (x\uFFFD - x\uFFFD)y\uFFFD = 0\n //A = (y\uFFFD - y\uFFFD); B = (x\uFFFD - x\uFFFD); C = (y\uFFFD - y\uFFFD)x\uFFFD - (x\uFFFD - x\uFFFD)y\uFFFD\n //perpendicular distance of point (x\uFFFD,y\uFFFD) = (Ax\uFFFD + By\uFFFD + C)/Sqrt(A\uFFFD + B\uFFFD)\n //see http://en.wikipedia.org/wiki/Perpendicular_distance\n var A = ln1.Y - ln2.Y;\n var B = ln2.X - ln1.X;\n var C = A * ln1.X + B * ln1.Y;\n C = A * pt.X + B * pt.Y - C;\n return (C * C) / (A * A + B * B);\n};\nClipperLib.Clipper.SlopesNearCollinear = function (pt1, pt2, pt3, distSqrd)\n{\n return ClipperLib.Clipper.DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd;\n};\nClipperLib.Clipper.PointsAreClose = function (pt1, pt2, distSqrd)\n{\n var dx = pt1.X - pt2.X;\n var dy = pt1.Y - pt2.Y;\n return ((dx * dx) + (dy * dy) <= distSqrd);\n};\n//------------------------------------------------------------------------------\nClipperLib.Clipper.ExcludeOp = function (op)\n{\n var result = op.Prev;\n result.Next = op.Next;\n op.Next.Prev = result;\n result.Idx = 0;\n return result;\n};\nClipperLib.Clipper.CleanPolygon = function (path, distance)\n{\n if (typeof (distance) == \"undefined\") distance = 1.415;\n //distance = proximity in units/pixels below which vertices will be stripped. \n //Default ~= sqrt(2) so when adjacent vertices or semi-adjacent vertices have \n //both x & y coords within 1 unit, then the second vertex will be stripped.\n var cnt = path.length;\n if (cnt == 0)\n return new Array();\n var outPts = new Array(cnt);\n for (var i = 0; i < cnt; ++i)\n outPts[i] = new ClipperLib.OutPt();\n for (var i = 0; i < cnt; ++i)\n {\n outPts[i].Pt = path[i];\n outPts[i].Next = outPts[(i + 1) % cnt];\n outPts[i].Next.Prev = outPts[i];\n outPts[i].Idx = 0;\n }\n var distSqrd = distance * distance;\n var op = outPts[0];\n while (op.Idx == 0 && op.Next != op.Prev)\n {\n if (ClipperLib.Clipper.PointsAreClose(op.Pt, op.Prev.Pt, distSqrd))\n {\n op = ClipperLib.Clipper.ExcludeOp(op);\n cnt--;\n }\n else if (ClipperLib.Clipper.PointsAreClose(op.Prev.Pt, op.Next.Pt, distSqrd))\n {\n ClipperLib.Clipper.ExcludeOp(op.Next);\n op = ClipperLib.Clipper.ExcludeOp(op);\n cnt -= 2;\n }\n else if (ClipperLib.Clipper.SlopesNearCollinear(op.Prev.Pt, op.Pt, op.Next.Pt, distSqrd))\n {\n op = ClipperLib.Clipper.ExcludeOp(op);\n cnt--;\n }\n else\n {\n op.Idx = 1;\n op = op.Next;\n }\n }\n if (cnt < 3)\n cnt = 0;\n var result = new Array(cnt);\n for (var i = 0; i < cnt; ++i)\n {\n result[i] = new ClipperLib.IntPoint(op.Pt);\n op = op.Next;\n }\n outPts = null;\n return result;\n};\nClipperLib.Clipper.CleanPolygons = function (polys, distance)\n{\n var result = new Array(polys.length);\n for (var i = 0, ilen = polys.length; i < ilen; i++)\n result[i] = ClipperLib.Clipper.CleanPolygon(polys[i], distance);\n return result;\n};\nClipperLib.Clipper.Minkowski = function (pattern, path, IsSum, IsClosed)\n{\n var delta = (IsClosed ? 1 : 0);\n var polyCnt = pattern.length;\n var pathCnt = path.length;\n var result = new Array();\n if (IsSum)\n for (var i = 0; i < pathCnt; i++)\n {\n var p = new Array(polyCnt);\n for (var j = 0, jlen = pattern.length, ip = pattern[j]; j < jlen; j++, ip = pattern[j])\n p[j] = new ClipperLib.IntPoint(path[i].X + ip.X, path[i].Y + ip.Y);\n result.push(p);\n }\n else\n for (var i = 0; i < pathCnt; i++)\n {\n var p = new Array(polyCnt);\n for (var j = 0, jlen = pattern.length, ip = pattern[j]; j < jlen; j++, ip = pattern[j])\n p[j] = new ClipperLib.IntPoint(path[i].X - ip.X, path[i].Y - ip.Y);\n result.push(p);\n }\n var quads = new Array();\n for (var i = 0; i < pathCnt - 1 + delta; i++)\n for (var j = 0; j < polyCnt; j++)\n {\n var quad = new Array();\n quad.push(result[i % pathCnt][j % polyCnt]);\n quad.push(result[(i + 1) % pathCnt][j % polyCnt]);\n quad.push(result[(i + 1) % pathCnt][(j + 1) % polyCnt]);\n quad.push(result[i % pathCnt][(j + 1) % polyCnt]);\n if (!ClipperLib.Clipper.Orientation(quad))\n quad.reverse();\n quads.push(quad);\n }\n var c = new ClipperLib.Clipper(0);\n c.AddPaths(quads, ClipperLib.PolyType.ptSubject, true);\n c.Execute(ClipperLib.ClipType.ctUnion, result, ClipperLib.PolyFillType.pftNonZero, ClipperLib.PolyFillType.pftNonZero);\n return result;\n};\n\nClipperLib.Clipper.MinkowskiSum = function ()\n{\n var a = arguments,\n alen = a.length;\n if (alen == 3) // MinkowskiSum(Path pattern, path, pathIsClosed)\n {\n var pattern = a[0],\n path = a[1],\n pathIsClosed = a[2];\n return ClipperLib.Clipper.Minkowski(pattern, path, true, pathIsClosed);\n }\n else if (alen == 4) // MinkowskiSum(pattern, paths, pathFillType, pathIsClosed)\n {\n var pattern = a[0],\n paths = a[1],\n pathFillType = a[2],\n pathIsClosed = a[3];\n var c = new ClipperLib.Clipper(),\n tmp;\n for (var i = 0, ilen = paths.length; i < ilen; ++i)\n {\n var tmp = ClipperLib.Clipper.Minkowski(pattern, paths[i], true, pathIsClosed);\n c.AddPaths(tmp, ClipperLib.PolyType.ptSubject, true);\n }\n if (pathIsClosed) c.AddPaths(paths, ClipperLib.PolyType.ptClip, true);\n var solution = new ClipperLib.Paths();\n c.Execute(ClipperLib.ClipType.ctUnion, solution, pathFillType, pathFillType);\n return solution;\n }\n};\n\nClipperLib.Clipper.MinkowskiDiff = function (pattern, path, pathIsClosed)\n{\n return ClipperLib.Clipper.Minkowski(pattern, path, false, pathIsClosed);\n};\n\nClipperLib.Clipper.PolyTreeToPaths = function (polytree)\n{\n var result = new Array();\n //result.set_Capacity(polytree.get_Total());\n ClipperLib.Clipper.AddPolyNodeToPaths(polytree, ClipperLib.Clipper.NodeType.ntAny, result);\n return result;\n};\nClipperLib.Clipper.AddPolyNodeToPaths = function (polynode, nt, paths)\n{\n var match = true;\n switch (nt)\n {\n case ClipperLib.Clipper.NodeType.ntOpen:\n return;\n case ClipperLib.Clipper.NodeType.ntClosed:\n match = !polynode.IsOpen;\n break;\n default:\n break;\n }\n if (polynode.m_polygon.length > 0 && match)\n paths.push(polynode.m_polygon);\n for (var $i3 = 0, $t3 = polynode.Childs(), $l3 = $t3.length, pn = $t3[$i3]; $i3 < $l3; $i3++, pn = $t3[$i3])\n ClipperLib.Clipper.AddPolyNodeToPaths(pn, nt, paths);\n};\nClipperLib.Clipper.OpenPathsFromPolyTree = function (polytree)\n{\n var result = new ClipperLib.Paths();\n //result.set_Capacity(polytree.ChildCount());\n for (var i = 0, ilen = polytree.ChildCount(); i < ilen; i++)\n if (polytree.Childs()[i].IsOpen)\n result.push(polytree.Childs()[i].m_polygon);\n return result;\n};\nClipperLib.Clipper.ClosedPathsFromPolyTree = function (polytree)\n{\n var result = new ClipperLib.Paths();\n //result.set_Capacity(polytree.Total());\n ClipperLib.Clipper.AddPolyNodeToPaths(polytree, ClipperLib.Clipper.NodeType.ntClosed, result);\n return result;\n};\nInherit(ClipperLib.Clipper, ClipperLib.ClipperBase);\nClipperLib.Clipper.NodeType = {\n ntAny: 0,\n ntOpen: 1,\n ntClosed: 2\n};\nClipperLib.ClipperOffset = function (miterLimit, arcTolerance)\n{\n if (typeof (miterLimit) == \"undefined\") miterLimit = 2;\n if (typeof (arcTolerance) == \"undefined\") arcTolerance = ClipperLib.ClipperOffset.def_arc_tolerance;\n this.m_destPolys = new ClipperLib.Paths();\n this.m_srcPoly = new ClipperLib.Path();\n this.m_destPoly = new ClipperLib.Path();\n this.m_normals = new Array();\n this.m_delta = 0;\n this.m_sinA = 0;\n this.m_sin = 0;\n this.m_cos = 0;\n this.m_miterLim = 0;\n this.m_StepsPerRad = 0;\n this.m_lowest = new ClipperLib.IntPoint();\n this.m_polyNodes = new ClipperLib.PolyNode();\n this.MiterLimit = miterLimit;\n this.ArcTolerance = arcTolerance;\n this.m_lowest.X = -1;\n};\nClipperLib.ClipperOffset.two_pi = 6.28318530717959;\nClipperLib.ClipperOffset.def_arc_tolerance = 0.25;\nClipperLib.ClipperOffset.prototype.Clear = function ()\n{\n ClipperLib.Clear(this.m_polyNodes.Childs());\n this.m_lowest.X = -1;\n};\nClipperLib.ClipperOffset.Round = ClipperLib.Clipper.Round;\nClipperLib.ClipperOffset.prototype.AddPath = function (path, joinType, endType)\n{\n var highI = path.length - 1;\n if (highI < 0)\n return;\n var newNode = new ClipperLib.PolyNode();\n newNode.m_jointype = joinType;\n newNode.m_endtype = endType;\n //strip duplicate points from path and also get index to the lowest point ...\n if (endType == ClipperLib.EndType.etClosedLine || endType == ClipperLib.EndType.etClosedPolygon)\n while (highI > 0 && ClipperLib.IntPoint.op_Equality(path[0], path[highI]))\n highI--;\n //newNode.m_polygon.set_Capacity(highI + 1);\n newNode.m_polygon.push(path[0]);\n var j = 0,\n k = 0;\n for (var i = 1; i <= highI; i++)\n if (ClipperLib.IntPoint.op_Inequality(newNode.m_polygon[j], path[i]))\n {\n j++;\n newNode.m_polygon.push(path[i]);\n if (path[i].Y > newNode.m_polygon[k].Y || (path[i].Y == newNode.m_polygon[k].Y && path[i].X < newNode.m_polygon[k].X))\n k = j;\n }\n if ((endType == ClipperLib.EndType.etClosedPolygon && j < 2) || (endType != ClipperLib.EndType.etClosedPolygon && j < 0))\n return;\n this.m_polyNodes.AddChild(newNode);\n //if this path's lowest pt is lower than all the others then update m_lowest\n if (endType != ClipperLib.EndType.etClosedPolygon)\n return;\n if (this.m_lowest.X < 0)\n this.m_lowest = new ClipperLib.IntPoint(0, k);\n else\n {\n var ip = this.m_polyNodes.Childs()[this.m_lowest.X].m_polygon[this.m_lowest.Y];\n if (newNode.m_polygon[k].Y > ip.Y || (newNode.m_polygon[k].Y == ip.Y && newNode.m_polygon[k].X < ip.X))\n this.m_lowest = new ClipperLib.IntPoint(this.m_polyNodes.ChildCount() - 1, k);\n }\n};\nClipperLib.ClipperOffset.prototype.AddPaths = function (paths, joinType, endType)\n{\n for (var i = 0, ilen = paths.length; i < ilen; i++)\n this.AddPath(paths[i], joinType, endType);\n};\nClipperLib.ClipperOffset.prototype.FixOrientations = function ()\n{\n //fixup orientations of all closed paths if the orientation of the\n //closed path with the lowermost vertex is wrong ...\n if (this.m_lowest.X >= 0 && !ClipperLib.Clipper.Orientation(this.m_polyNodes.Childs()[this.m_lowest.X].m_polygon))\n {\n for (var i = 0; i < this.m_polyNodes.ChildCount(); i++)\n {\n var node = this.m_polyNodes.Childs()[i];\n if (node.m_endtype == ClipperLib.EndType.etClosedPolygon || (node.m_endtype == ClipperLib.EndType.etClosedLine && ClipperLib.Clipper.Orientation(node.m_polygon)))\n node.m_polygon.reverse();\n }\n }\n else\n {\n for (var i = 0; i < this.m_polyNodes.ChildCount(); i++)\n {\n var node = this.m_polyNodes.Childs()[i];\n if (node.m_endtype == ClipperLib.EndType.etClosedLine && !ClipperLib.Clipper.Orientation(node.m_polygon))\n node.m_polygon.reverse();\n }\n }\n};\nClipperLib.ClipperOffset.GetUnitNormal = function (pt1, pt2)\n{\n var dx = (pt2.X - pt1.X);\n var dy = (pt2.Y - pt1.Y);\n if ((dx == 0) && (dy == 0))\n return new ClipperLib.DoublePoint(0, 0);\n var f = 1 / Math.sqrt(dx * dx + dy * dy);\n dx *= f;\n dy *= f;\n return new ClipperLib.DoublePoint(dy, -dx);\n};\nClipperLib.ClipperOffset.prototype.DoOffset = function (delta)\n{\n this.m_destPolys = new Array();\n this.m_delta = delta;\n //if Zero offset, just copy any CLOSED polygons to m_p and return ...\n if (ClipperLib.ClipperBase.near_zero(delta))\n {\n //this.m_destPolys.set_Capacity(this.m_polyNodes.ChildCount);\n for (var i = 0; i < this.m_polyNodes.ChildCount(); i++)\n {\n var node = this.m_polyNodes.Childs()[i];\n if (node.m_endtype == ClipperLib.EndType.etClosedPolygon)\n this.m_destPolys.push(node.m_polygon);\n }\n return;\n }\n //see offset_triginometry3.svg in the documentation folder ...\n if (this.MiterLimit > 2)\n this.m_miterLim = 2 / (this.MiterLimit * this.MiterLimit);\n else\n this.m_miterLim = 0.5;\n var y;\n if (this.ArcTolerance <= 0)\n y = ClipperLib.ClipperOffset.def_arc_tolerance;\n else if (this.ArcTolerance > Math.abs(delta) * ClipperLib.ClipperOffset.def_arc_tolerance)\n y = Math.abs(delta) * ClipperLib.ClipperOffset.def_arc_tolerance;\n else\n y = this.ArcTolerance;\n //see offset_triginometry2.svg in the documentation folder ...\n var steps = 3.14159265358979 / Math.acos(1 - y / Math.abs(delta));\n this.m_sin = Math.sin(ClipperLib.ClipperOffset.two_pi / steps);\n this.m_cos = Math.cos(ClipperLib.ClipperOffset.two_pi / steps);\n this.m_StepsPerRad = steps / ClipperLib.ClipperOffset.two_pi;\n if (delta < 0)\n this.m_sin = -this.m_sin;\n //this.m_destPolys.set_Capacity(this.m_polyNodes.ChildCount * 2);\n for (var i = 0; i < this.m_polyNodes.ChildCount(); i++)\n {\n var node = this.m_polyNodes.Childs()[i];\n this.m_srcPoly = node.m_polygon;\n var len = this.m_srcPoly.length;\n if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != ClipperLib.EndType.etClosedPolygon)))\n continue;\n this.m_destPoly = new Array();\n if (len == 1)\n {\n if (node.m_jointype == ClipperLib.JoinType.jtRound)\n {\n var X = 1,\n Y = 0;\n for (var j = 1; j <= steps; j++)\n {\n this.m_destPoly.push(new ClipperLib.IntPoint(ClipperLib.ClipperOffset.Round(this.m_srcPoly[0].X + X * delta), ClipperLib.ClipperOffset.Round(this.m_srcPoly[0].Y + Y * delta)));\n var X2 = X;\n X = X * this.m_cos - this.m_sin * Y;\n Y = X2 * this.m_sin + Y * this.m_cos;\n }\n }\n else\n {\n var X = -1,\n Y = -1;\n for (var j = 0; j < 4; ++j)\n {\n this.m_destPoly.push(new ClipperLib.IntPoint(ClipperLib.ClipperOffset.Round(this.m_srcPoly[0].X + X * delta), ClipperLib.ClipperOffset.Round(this.m_srcPoly[0].Y + Y * delta)));\n if (X < 0)\n X = 1;\n else if (Y < 0)\n Y = 1;\n else\n X = -1;\n }\n }\n this.m_destPolys.push(this.m_destPoly);\n continue;\n }\n //build m_normals ...\n this.m_normals.length = 0;\n //this.m_normals.set_Capacity(len);\n for (var j = 0; j < len - 1; j++)\n this.m_normals.push(ClipperLib.ClipperOffset.GetUnitNormal(this.m_srcPoly[j], this.m_srcPoly[j + 1]));\n if (node.m_endtype == ClipperLib.EndType.etClosedLine || node.m_endtype == ClipperLib.EndType.etClosedPolygon)\n this.m_normals.push(ClipperLib.ClipperOffset.GetUnitNormal(this.m_srcPoly[len - 1], this.m_srcPoly[0]));\n else\n this.m_normals.push(new ClipperLib.DoublePoint(this.m_normals[len - 2]));\n if (node.m_endtype == ClipperLib.EndType.etClosedPolygon)\n {\n var k = len - 1;\n for (var j = 0; j < len; j++)\n k = this.OffsetPoint(j, k, node.m_jointype);\n this.m_destPolys.push(this.m_destPoly);\n }\n else if (node.m_endtype == ClipperLib.EndType.etClosedLine)\n {\n var k = len - 1;\n for (var j = 0; j < len; j++)\n k = this.OffsetPoint(j, k, node.m_jointype);\n this.m_destPolys.push(this.m_destPoly);\n this.m_destPoly = new Array();\n //re-build m_normals ...\n var n = this.m_normals[len - 1];\n for (var j = len - 1; j > 0; j--)\n this.m_normals[j] = new ClipperLib.DoublePoint(-this.m_normals[j - 1].X, -this.m_normals[j - 1].Y);\n this.m_normals[0] = new ClipperLib.DoublePoint(-n.X, -n.Y);\n k = 0;\n for (var j = len - 1; j >= 0; j--)\n k = this.OffsetPoint(j, k, node.m_jointype);\n this.m_destPolys.push(this.m_destPoly);\n }\n else\n {\n var k = 0;\n for (var j = 1; j < len - 1; ++j)\n k = this.OffsetPoint(j, k, node.m_jointype);\n var pt1;\n if (node.m_endtype == ClipperLib.EndType.etOpenButt)\n {\n var j = len - 1;\n pt1 = new ClipperLib.IntPoint(ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].X + this.m_normals[j].X * delta), ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].Y + this.m_normals[j].Y * delta));\n this.m_destPoly.push(pt1);\n pt1 = new ClipperLib.IntPoint(ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].X - this.m_normals[j].X * delta), ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].Y - this.m_normals[j].Y * delta));\n this.m_destPoly.push(pt1);\n }\n else\n {\n var j = len - 1;\n k = len - 2;\n this.m_sinA = 0;\n this.m_normals[j] = new ClipperLib.DoublePoint(-this.m_normals[j].X, -this.m_normals[j].Y);\n if (node.m_endtype == ClipperLib.EndType.etOpenSquare)\n this.DoSquare(j, k);\n else\n this.DoRound(j, k);\n }\n //re-build m_normals ...\n for (var j = len - 1; j > 0; j--)\n this.m_normals[j] = new ClipperLib.DoublePoint(-this.m_normals[j - 1].X, -this.m_normals[j - 1].Y);\n this.m_normals[0] = new ClipperLib.DoublePoint(-this.m_normals[1].X, -this.m_normals[1].Y);\n k = len - 1;\n for (var j = k - 1; j > 0; --j)\n k = this.OffsetPoint(j, k, node.m_jointype);\n if (node.m_endtype == ClipperLib.EndType.etOpenButt)\n {\n pt1 = new ClipperLib.IntPoint(ClipperLib.ClipperOffset.Round(this.m_srcPoly[0].X - this.m_normals[0].X * delta), ClipperLib.ClipperOffset.Round(this.m_srcPoly[0].Y - this.m_normals[0].Y * delta));\n this.m_destPoly.push(pt1);\n pt1 = new ClipperLib.IntPoint(ClipperLib.ClipperOffset.Round(this.m_srcPoly[0].X + this.m_normals[0].X * delta), ClipperLib.ClipperOffset.Round(this.m_srcPoly[0].Y + this.m_normals[0].Y * delta));\n this.m_destPoly.push(pt1);\n }\n else\n {\n k = 1;\n this.m_sinA = 0;\n if (node.m_endtype == ClipperLib.EndType.etOpenSquare)\n this.DoSquare(0, 1);\n else\n this.DoRound(0, 1);\n }\n this.m_destPolys.push(this.m_destPoly);\n }\n }\n};\nClipperLib.ClipperOffset.prototype.Execute = function ()\n{\n var a = arguments,\n ispolytree = a[0] instanceof ClipperLib.PolyTree;\n if (!ispolytree) // function (solution, delta)\n {\n var solution = a[0],\n delta = a[1];\n ClipperLib.Clear(solution);\n this.FixOrientations();\n this.DoOffset(delta);\n //now clean up 'corners' ...\n var clpr = new ClipperLib.Clipper(0);\n clpr.AddPaths(this.m_destPolys, ClipperLib.PolyType.ptSubject, true);\n if (delta > 0)\n {\n clpr.Execute(ClipperLib.ClipType.ctUnion, solution, ClipperLib.PolyFillType.pftPositive, ClipperLib.PolyFillType.pftPositive);\n }\n else\n {\n var r = ClipperLib.Clipper.GetBounds(this.m_destPolys);\n var outer = new ClipperLib.Path();\n outer.push(new ClipperLib.IntPoint(r.left - 10, r.bottom + 10));\n outer.push(new ClipperLib.IntPoint(r.right + 10, r.bottom + 10));\n outer.push(new ClipperLib.IntPoint(r.right + 10, r.top - 10));\n outer.push(new ClipperLib.IntPoint(r.left - 10, r.top - 10));\n clpr.AddPath(outer, ClipperLib.PolyType.ptSubject, true);\n clpr.ReverseSolution = true;\n clpr.Execute(ClipperLib.ClipType.ctUnion, solution, ClipperLib.PolyFillType.pftNegative, ClipperLib.PolyFillType.pftNegative);\n if (solution.length > 0)\n solution.splice(0, 1);\n }\n //console.log(JSON.stringify(solution));\n }\n else // function (polytree, delta)\n {\n var solution = a[0],\n delta = a[1];\n solution.Clear();\n this.FixOrientations();\n this.DoOffset(delta);\n //now clean up 'corners' ...\n var clpr = new ClipperLib.Clipper(0);\n clpr.AddPaths(this.m_destPolys, ClipperLib.PolyType.ptSubject, true);\n if (delta > 0)\n {\n clpr.Execute(ClipperLib.ClipType.ctUnion, solution, ClipperLib.PolyFillType.pftPositive, ClipperLib.PolyFillType.pftPositive);\n }\n else\n {\n var r = ClipperLib.Clipper.GetBounds(this.m_destPolys);\n var outer = new ClipperLib.Path();\n outer.push(new ClipperLib.IntPoint(r.left - 10, r.bottom + 10));\n outer.push(new ClipperLib.IntPoint(r.right + 10, r.bottom + 10));\n outer.push(new ClipperLib.IntPoint(r.right + 10, r.top - 10));\n outer.push(new ClipperLib.IntPoint(r.left - 10, r.top - 10));\n clpr.AddPath(outer, ClipperLib.PolyType.ptSubject, true);\n clpr.ReverseSolution = true;\n clpr.Execute(ClipperLib.ClipType.ctUnion, solution, ClipperLib.PolyFillType.pftNegative, ClipperLib.PolyFillType.pftNegative);\n //remove the outer PolyNode rectangle ...\n if (solution.ChildCount() == 1 && solution.Childs()[0].ChildCount() > 0)\n {\n var outerNode = solution.Childs()[0];\n //solution.Childs.set_Capacity(outerNode.ChildCount);\n solution.Childs()[0] = outerNode.Childs()[0];\n for (var i = 1; i < outerNode.ChildCount(); i++)\n solution.AddChild(outerNode.Childs()[i]);\n }\n else\n solution.Clear();\n }\n }\n};\nClipperLib.ClipperOffset.prototype.OffsetPoint = function (j, k, jointype)\n{\n this.m_sinA = (this.m_normals[k].X * this.m_normals[j].Y - this.m_normals[j].X * this.m_normals[k].Y);\n if (this.m_sinA < 0.00005 && this.m_sinA > -0.00005)\n return k;\n else if (this.m_sinA > 1)\n this.m_sinA = 1.0;\n else if (this.m_sinA < -1)\n this.m_sinA = -1.0;\n if (this.m_sinA * this.m_delta < 0)\n {\n this.m_destPoly.push(new ClipperLib.IntPoint(ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].X + this.m_normals[k].X * this.m_delta),\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].Y + this.m_normals[k].Y * this.m_delta)));\n this.m_destPoly.push(new ClipperLib.IntPoint(this.m_srcPoly[j]));\n this.m_destPoly.push(new ClipperLib.IntPoint(ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].X + this.m_normals[j].X * this.m_delta),\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].Y + this.m_normals[j].Y * this.m_delta)));\n }\n else\n switch (jointype)\n {\n case ClipperLib.JoinType.jtMiter:\n {\n var r = 1 + (this.m_normals[j].X * this.m_normals[k].X + this.m_normals[j].Y * this.m_normals[k].Y);\n if (r >= this.m_miterLim)\n this.DoMiter(j, k, r);\n else\n this.DoSquare(j, k);\n break;\n }\n case ClipperLib.JoinType.jtSquare:\n this.DoSquare(j, k);\n break;\n case ClipperLib.JoinType.jtRound:\n this.DoRound(j, k);\n break;\n }\n k = j;\n return k;\n};\nClipperLib.ClipperOffset.prototype.DoSquare = function (j, k)\n{\n var dx = Math.tan(Math.atan2(this.m_sinA,\n this.m_normals[k].X * this.m_normals[j].X + this.m_normals[k].Y * this.m_normals[j].Y) / 4);\n this.m_destPoly.push(new ClipperLib.IntPoint(\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].X + this.m_delta * (this.m_normals[k].X - this.m_normals[k].Y * dx)),\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].Y + this.m_delta * (this.m_normals[k].Y + this.m_normals[k].X * dx))));\n this.m_destPoly.push(new ClipperLib.IntPoint(\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].X + this.m_delta * (this.m_normals[j].X + this.m_normals[j].Y * dx)),\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].Y + this.m_delta * (this.m_normals[j].Y - this.m_normals[j].X * dx))));\n};\nClipperLib.ClipperOffset.prototype.DoMiter = function (j, k, r)\n{\n var q = this.m_delta / r;\n this.m_destPoly.push(new ClipperLib.IntPoint(\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].X + (this.m_normals[k].X + this.m_normals[j].X) * q),\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].Y + (this.m_normals[k].Y + this.m_normals[j].Y) * q)));\n};\nClipperLib.ClipperOffset.prototype.DoRound = function (j, k)\n{\n var a = Math.atan2(this.m_sinA,\n this.m_normals[k].X * this.m_normals[j].X + this.m_normals[k].Y * this.m_normals[j].Y);\n var steps = ClipperLib.Cast_Int32(ClipperLib.ClipperOffset.Round(this.m_StepsPerRad * Math.abs(a)));\n var X = this.m_normals[k].X,\n Y = this.m_normals[k].Y,\n X2;\n for (var i = 0; i < steps; ++i)\n {\n this.m_destPoly.push(new ClipperLib.IntPoint(\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].X + X * this.m_delta),\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].Y + Y * this.m_delta)));\n X2 = X;\n X = X * this.m_cos - this.m_sin * Y;\n Y = X2 * this.m_sin + Y * this.m_cos;\n }\n this.m_destPoly.push(new ClipperLib.IntPoint(\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].X + this.m_normals[j].X * this.m_delta),\n ClipperLib.ClipperOffset.Round(this.m_srcPoly[j].Y + this.m_normals[j].Y * this.m_delta)));\n};\nClipperLib.Error = function (message)\n{\n try\n {\n throw new Error(message);\n }\n catch (err)\n {\n alert(err.message);\n }\n};\n// ---------------------------------\n// JS extension by Timo 2013\nClipperLib.JS = {};\nClipperLib.JS.AreaOfPolygon = function (poly, scale)\n{\n if (!scale) scale = 1;\n return ClipperLib.Clipper.Area(poly) / (scale * scale);\n};\nClipperLib.JS.AreaOfPolygons = function (poly, scale)\n{\n if (!scale) scale = 1;\n var area = 0;\n for (var i = 0; i < poly.length; i++)\n {\n area += ClipperLib.Clipper.Area(poly[i]);\n }\n return area / (scale * scale);\n};\nClipperLib.JS.BoundsOfPath = function (path, scale)\n{\n return ClipperLib.JS.BoundsOfPaths([path], scale);\n};\nClipperLib.JS.BoundsOfPaths = function (paths, scale)\n{\n if (!scale) scale = 1;\n var bounds = ClipperLib.Clipper.GetBounds(paths);\n bounds.left /= scale;\n bounds.bottom /= scale;\n bounds.right /= scale;\n bounds.top /= scale;\n return bounds;\n};\n// Clean() joins vertices that are too near each other\n// and causes distortion to offsetted polygons without cleaning\nClipperLib.JS.Clean = function (polygon, delta)\n{\n if (!(polygon instanceof Array)) return [];\n var isPolygons = polygon[0] instanceof Array;\n var polygon = ClipperLib.JS.Clone(polygon);\n if (typeof delta != \"number\" || delta === null)\n {\n ClipperLib.Error(\"Delta is not a number in Clean().\");\n return polygon;\n }\n if (polygon.length === 0 || (polygon.length == 1 && polygon[0].length === 0) || delta < 0) return polygon;\n if (!isPolygons) polygon = [polygon];\n var k_length = polygon.length;\n var len, poly, result, d, p, j, i;\n var results = [];\n for (var k = 0; k < k_length; k++)\n {\n poly = polygon[k];\n len = poly.length;\n if (len === 0) continue;\n else if (len < 3)\n {\n result = poly;\n results.push(result);\n continue;\n }\n result = poly;\n d = delta * delta;\n //d = Math.floor(c_delta * c_delta);\n p = poly[0];\n j = 1;\n for (i = 1; i < len; i++)\n {\n if ((poly[i].X - p.X) * (poly[i].X - p.X) +\n (poly[i].Y - p.Y) * (poly[i].Y - p.Y) <= d)\n continue;\n result[j] = poly[i];\n p = poly[i];\n j++;\n }\n p = poly[j - 1];\n if ((poly[0].X - p.X) * (poly[0].X - p.X) +\n (poly[0].Y - p.Y) * (poly[0].Y - p.Y) <= d)\n j--;\n if (j < len)\n result.splice(j, len - j);\n if (result.length) results.push(result);\n }\n if (!isPolygons && results.length) results = results[0];\n else if (!isPolygons && results.length === 0) results = [];\n else if (isPolygons && results.length === 0) results = [\n []\n ];\n return results;\n}\n// Make deep copy of Polygons or Polygon\n// so that also IntPoint objects are cloned and not only referenced\n// This should be the fastest way\nClipperLib.JS.Clone = function (polygon)\n{\n if (!(polygon instanceof Array)) return [];\n if (polygon.length === 0) return [];\n else if (polygon.length == 1 && polygon[0].length === 0) return [[]];\n var isPolygons = polygon[0] instanceof Array;\n if (!isPolygons) polygon = [polygon];\n var len = polygon.length,\n plen, i, j, result;\n var results = new Array(len);\n for (i = 0; i < len; i++)\n {\n plen = polygon[i].length;\n result = new Array(plen);\n for (j = 0; j < plen; j++)\n {\n result[j] = {\n X: polygon[i][j].X,\n Y: polygon[i][j].Y\n };\n }\n results[i] = result;\n }\n if (!isPolygons) results = results[0];\n return results;\n};\n// Removes points that doesn't affect much to the visual appearance.\n// If middle point is at or under certain distance (tolerance) of the line segment between \n// start and end point, the middle point is removed.\nClipperLib.JS.Lighten = function (polygon, tolerance)\n{\n if (!(polygon instanceof Array)) return [];\n if (typeof tolerance != \"number\" || tolerance === null)\n {\n ClipperLib.Error(\"Tolerance is not a number in Lighten().\")\n return ClipperLib.JS.Clone(polygon);\n }\n if (polygon.length === 0 || (polygon.length == 1 && polygon[0].length === 0) || tolerance < 0)\n {\n return ClipperLib.JS.Clone(polygon);\n }\n if (!(polygon[0] instanceof Array)) polygon = [polygon];\n var i, j, poly, k, poly2, plen, A, B, P, d, rem, addlast;\n var bxax, byay, l, ax, ay;\n var len = polygon.length;\n var toleranceSq = tolerance * tolerance;\n var results = [];\n for (i = 0; i < len; i++)\n {\n poly = polygon[i];\n plen = poly.length;\n if (plen == 0) continue;\n for (k = 0; k < 1000000; k++) // could be forever loop, but wiser to restrict max repeat count\n {\n poly2 = [];\n plen = poly.length;\n // the first have to added to the end, if first and last are not the same\n // this way we ensure that also the actual last point can be removed if needed\n if (poly[plen - 1].X != poly[0].X || poly[plen - 1].Y != poly[0].Y)\n {\n addlast = 1;\n poly.push(\n {\n X: poly[0].X,\n Y: poly[0].Y\n });\n plen = poly.length;\n }\n else addlast = 0;\n rem = []; // Indexes of removed points\n for (j = 0; j < plen - 2; j++)\n {\n A = poly[j]; // Start point of line segment\n P = poly[j + 1]; // Middle point. This is the one to be removed.\n B = poly[j + 2]; // End point of line segment\n ax = A.X;\n ay = A.Y;\n bxax = B.X - ax;\n byay = B.Y - ay;\n if (bxax !== 0 || byay !== 0) // To avoid Nan, when A==P && P==B. And to avoid peaks (A==B && A!=P), which have lenght, but not area.\n {\n l = ((P.X - ax) * bxax + (P.Y - ay) * byay) / (bxax * bxax + byay * byay);\n if (l > 1)\n {\n ax = B.X;\n ay = B.Y;\n }\n else if (l > 0)\n {\n ax += bxax * l;\n ay += byay * l;\n }\n }\n bxax = P.X - ax;\n byay = P.Y - ay;\n d = bxax * bxax + byay * byay;\n if (d <= toleranceSq)\n {\n rem[j + 1] = 1;\n j++; // when removed, transfer the pointer to the next one\n }\n }\n // add all unremoved points to poly2\n poly2.push(\n {\n X: poly[0].X,\n Y: poly[0].Y\n });\n for (j = 1; j < plen - 1; j++)\n if (!rem[j]) poly2.push(\n {\n X: poly[j].X,\n Y: poly[j].Y\n });\n poly2.push(\n {\n X: poly[plen - 1].X,\n Y: poly[plen - 1].Y\n });\n // if the first point was added to the end, remove it\n if (addlast) poly.pop();\n // break, if there was not anymore removed points\n if (!rem.length) break;\n // else continue looping using poly2, to check if there are points to remove\n else poly = poly2;\n }\n plen = poly2.length;\n // remove duplicate from end, if needed\n if (poly2[plen - 1].X == poly2[0].X && poly2[plen - 1].Y == poly2[0].Y)\n {\n poly2.pop();\n }\n if (poly2.length > 2) // to avoid two-point-polygons\n results.push(poly2);\n }\n if (!polygon[0] instanceof Array) results = results[0];\n if (typeof (results) == \"undefined\") results = [\n []\n ];\n return results;\n}\nClipperLib.JS.PerimeterOfPath = function (path, closed, scale)\n{\n if (typeof (path) == \"undefined\") return 0;\n var sqrt = Math.sqrt;\n var perimeter = 0.0;\n var p1, p2, p1x = 0.0,\n p1y = 0.0,\n p2x = 0.0,\n p2y = 0.0;\n var j = path.length;\n if (j < 2) return 0;\n if (closed)\n {\n path[j] = path[0];\n j++;\n }\n while (--j)\n {\n p1 = path[j];\n p1x = p1.X;\n p1y = p1.Y;\n p2 = path[j - 1];\n p2x = p2.X;\n p2y = p2.Y;\n perimeter += sqrt((p1x - p2x) * (p1x - p2x) + (p1y - p2y) * (p1y - p2y));\n }\n if (closed) path.pop();\n return perimeter / scale;\n};\nClipperLib.JS.PerimeterOfPaths = function (paths, closed, scale)\n{\n if (!scale) scale = 1;\n var perimeter = 0;\n for (var i = 0; i < paths.length; i++)\n {\n perimeter += ClipperLib.JS.PerimeterOfPath(paths[i], closed, scale);\n }\n return perimeter;\n};\nClipperLib.JS.ScaleDownPath = function (path, scale)\n{\n var i, p;\n if (!scale) scale = 1;\n i = path.length;\n while (i--)\n {\n p = path[i];\n p.X = p.X / scale;\n p.Y = p.Y / scale;\n }\n};\nClipperLib.JS.ScaleDownPaths = function (paths, scale)\n{\n var i, j, p, round = Math.round;\n if (!scale) scale = 1;\n i = paths.length;\n while (i--)\n {\n j = paths[i].length;\n while (j--)\n {\n p = paths[i][j];\n p.X = p.X / scale;\n p.Y = p.Y / scale;\n }\n }\n};\nClipperLib.JS.ScaleUpPath = function (path, scale)\n{\n var i, p, round = Math.round;\n if (!scale) scale = 1;\n i = path.length;\n while (i--)\n {\n p = path[i];\n p.X = round(p.X * scale);\n p.Y = round(p.Y * scale);\n }\n};\nClipperLib.JS.ScaleUpPaths = function (paths, scale)\n{\n var i, j, p, round = Math.round;\n if (!scale) scale = 1;\n i = paths.length;\n while (i--)\n {\n j = paths[i].length;\n while (j--)\n {\n p = paths[i][j];\n p.X = round(p.X * scale);\n p.Y = round(p.Y * scale);\n }\n }\n};\nClipperLib.ExPolygons = function ()\n{\n return [];\n}\nClipperLib.ExPolygon = function ()\n{\n this.outer = null;\n this.holes = null;\n};\nClipperLib.JS.AddOuterPolyNodeToExPolygons = function (polynode, expolygons)\n{\n var ep = new ClipperLib.ExPolygon();\n ep.outer = polynode.Contour();\n var childs = polynode.Childs();\n var ilen = childs.length;\n ep.holes = new Array(ilen);\n var node, n, i, j, childs2, jlen;\n for (i = 0; i < ilen; i++)\n {\n node = childs[i];\n ep.holes[i] = node.Contour();\n //Add outer polygons contained by (nested within) holes ...\n for (j = 0, childs2 = node.Childs(), jlen = childs2.length; j < jlen; j++)\n {\n n = childs2[j];\n ClipperLib.JS.AddOuterPolyNodeToExPolygons(n, expolygons);\n }\n }\n expolygons.push(ep);\n};\nClipperLib.JS.ExPolygonsToPaths = function (expolygons)\n{\n var a, i, alen, ilen;\n var paths = new ClipperLib.Paths();\n for (a = 0, alen = expolygons.length; a < alen; a++)\n {\n paths.push(expolygons[a].outer);\n for (i = 0, ilen = expolygons[a].holes.length; i < ilen; i++)\n {\n paths.push(expolygons[a].holes[i]);\n }\n }\n return paths;\n}\nClipperLib.JS.PolyTreeToExPolygons = function (polytree)\n{\n var expolygons = new ClipperLib.ExPolygons();\n var node, i, childs, ilen;\n for (i = 0, childs = polytree.Childs(), ilen = childs.length; i < ilen; i++)\n {\n node = childs[i];\n ClipperLib.JS.AddOuterPolyNodeToExPolygons(node, expolygons);\n }\n return expolygons;\n};\n\n\nmodule.exports = ClipperLib;", "/* eslint-disable no-console*/\nexport const MI_DEBUG_KEY = 'mi-debug';\nexport const MI_ERROR_LABEL = '[MappedinJS]';\n\nexport enum E_SDK_LOG_LEVEL {\n\tLOG,\n\tWARN,\n\tERROR,\n\tSILENT,\n}\n\nexport function createLogger(name = '', { prefix = MI_ERROR_LABEL } = {}) {\n\tconst label = `${prefix}${name ? `-${name}` : ''}`;\n\n\tconst rnDebug = (type: 'log' | 'warn' | 'error', args: any[]) => {\n\t\tif (typeof window !== 'undefined' && (window as any).rnDebug) {\n\t\t\tconst processed = args.map(arg => {\n\t\t\t\tif (arg instanceof Error && arg.stack) {\n\t\t\t\t\treturn `${arg.message}\\n${arg.stack}`;\n\t\t\t\t}\n\n\t\t\t\treturn arg;\n\t\t\t});\n\t\t\t(window as any).rnDebug(`${name} ${type}: ${processed.join(' ')}`);\n\t\t}\n\t};\n\n\treturn {\n\t\tlogState: process.env.NODE_ENV === 'test' ? E_SDK_LOG_LEVEL.SILENT : E_SDK_LOG_LEVEL.LOG,\n\n\t\tlog(...args: any[]) {\n\t\t\tif (this.logState <= E_SDK_LOG_LEVEL.LOG) {\n\t\t\t\tconsole.log(label, ...args);\n\t\t\t\trnDebug('log', args);\n\t\t\t}\n\t\t},\n\n\t\twarn(...args: any[]) {\n\t\t\tif (this.logState <= E_SDK_LOG_LEVEL.WARN) {\n\t\t\t\tconsole.warn(label, ...args);\n\t\t\t\trnDebug('warn', args);\n\t\t\t}\n\t\t},\n\n\t\terror(...args: any[]) {\n\t\t\tif (this.logState <= E_SDK_LOG_LEVEL.ERROR) {\n\t\t\t\tconsole.error(label, ...args);\n\n\t\t\t\trnDebug('error', args);\n\t\t\t}\n\t\t},\n\n\t\t// It's a bit tricky to prepend [MappedinJs] to assert and time because of how the output is structured in the console, so it is left out for simplicity\n\t\tassert(...args: any[]) {\n\t\t\tconsole.assert(...args);\n\t\t},\n\n\t\ttime(label: string) {\n\t\t\tconsole.time(label);\n\t\t},\n\n\t\ttimeEnd(label: string) {\n\t\t\tconsole.timeEnd(label);\n\t\t},\n\t\tsetLevel(level: E_SDK_LOG_LEVEL) {\n\t\t\tif (E_SDK_LOG_LEVEL.LOG <= level && level <= E_SDK_LOG_LEVEL.SILENT) {\n\t\t\t\tthis.logState = level;\n\t\t\t}\n\t\t},\n\t};\n}\n\nconst Logger = createLogger();\nexport function setLoggerLevel(level: E_SDK_LOG_LEVEL) {\n\tif (E_SDK_LOG_LEVEL.LOG <= level && level <= E_SDK_LOG_LEVEL.SILENT) {\n\t\tLogger.logState = level;\n\t}\n}\n\nexport default Logger;\n", "import type { JwtPayload } from 'jwt-decode';\nimport { jwtDecode } from 'jwt-decode';\nimport { EARTH_RADIUS_M } from './constants';\nimport { Box2 } from 'three';\nimport type { Box3 } from 'three';\n\nexport function findMapWithElevationClosestToZero<T extends { elevation?: number }>(maps: T[]): T | undefined {\n\tif (maps.length === 0) return;\n\tlet closestMap: T | undefined;\n\tfor (let map of maps) {\n\t\tif (typeof map.elevation !== 'number') {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!closestMap) {\n\t\t\tclosestMap = map;\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof closestMap.elevation !== 'number') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (Math.abs(map.elevation) === Math.abs(closestMap.elevation)) {\n\t\t\t// In case we have no 0 value, we want to favour positive values\n\t\t\tclosestMap = map.elevation > closestMap.elevation ? map : closestMap;\n\t\t} else {\n\t\t\tclosestMap = Math.abs(map.elevation) < Math.abs(closestMap.elevation) ? map : closestMap;\n\t\t}\n\t}\n\n\treturn closestMap;\n}\n\n/**\n * Omit properites from object\n */\nexport function omit<T extends Record<string, any>, K extends keyof T>(obj: T, keysToOmit: K[]): Omit<T, K> {\n\tconst result = {} as Omit<T, K>;\n\tconst toOmit = new Set(keysToOmit);\n\tlet key: string;\n\tfor (key in obj) {\n\t\tif (!toOmit.has(key as K)) {\n\t\t\tresult[key] = obj[key];\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function decodeAccessToken(accessToken: string) {\n\tconst decoded: JwtPayload & { capabilities: Record<string, any> } = jwtDecode(accessToken);\n\n\tif (decoded.sub == null) {\n\t\tthrow new Error('Access token is missing sub claim.');\n\t}\n\n\treturn {\n\t\tsub: decoded.sub,\n\t\taud: typeof decoded.aud === 'string' ? [decoded.aud] : decoded.aud ?? [],\n\t\tcapabilities: decoded.capabilities ?? {},\n\t};\n}\n\nexport function toRadians(degrees: number): number {\n\treturn degrees * (Math.PI / 180);\n}\n\nexport function toDegrees(radians: number): number {\n\treturn radians * (180 / Math.PI);\n}\n\nexport function round(value: number, decimals: number): number {\n\tconst factor = Math.pow(10, decimals);\n\n\treturn (Math.sign(value) * Math.round(Math.abs(value) * factor)) / factor;\n}\n\nexport function euclideanModulo(value: number, modulus: number): number {\n\treturn ((value % modulus) + modulus) % modulus;\n}\n\n/**\n * Position from our SDKs may be tuple of longitude and latitude optionally followed by altitude.\n */\ntype Position = [number, number] | [number, number, number?] | number[];\n\n/**\n * Calculates the approximate distance between two geographic coordinates on Earth's surface.\n *\n * This function uses the equirectangular approximation method to compute the distance, which simplifies\n * the math and speeds up calculations, but is less accurate over long distances compared to other methods\n * like the haversine formula.\n *\n * @param point1 - The first point's longitude and latitude as [longitude, latitude].\n * @param point1 - The second point's longitude and latitude as [longitude, latitude].\n * @return The approximate distance between the two points in meters.\n */\nexport function haversineDistance([lon1, lat1]: Position, [lon2, lat2]: Position): number {\n\tconst dLat = toRadians(lat2 - lat1);\n\tconst dLon = toRadians(lon2 - lon1);\n\n\tconst startLat = toRadians(lat1);\n\tconst destLat = toRadians(lat2);\n\n\tconst a =\n\t\tMath.sin(dLat / 2) * Math.sin(dLat / 2) +\n\t\tMath.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(startLat) * Math.cos(destLat);\n\tconst c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n\treturn EARTH_RADIUS_M * c;\n}\n\n/**\n * Calculates the bearing clockwise from North between two geographic coordinates on Earth's surface.\n * 0 is North, 90 is East, 180 is South, 270 is West.\n *\n * @param point1 - The first point's longitude and latitude as [longitude, latitude].\n * @param point2 - The second point's longitude and latitude as [longitude, latitude].\n * @returns The forward bearing in degrees from point1 to point2, measured clockwise from true North.\n */\nexport function getForwardBearing([lon1, lat1]: Position, [lon2, lat2]: Position): number {\n\tconst startLat = toRadians(lat1);\n\tconst startLon = toRadians(lon1);\n\tconst destLat = toRadians(lat2);\n\tconst destLon = toRadians(lon2);\n\n\tconst dLon = destLon - startLon;\n\n\tconst y = Math.sin(dLon) * Math.cos(destLat);\n\tconst x = Math.cos(startLat) * Math.sin(destLat) - Math.sin(startLat) * Math.cos(destLat) * Math.cos(dLon);\n\n\t// normalize to 0-360\n\treturn toDegrees((Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2));\n}\n\n/**\n *\n * Normalizes the start and end rotations to the range 0 to 2 PI and ensures the shortest path for rotation.\n *\n * @param startRotation - The start rotation in radians\n * @param targetRotation - The target rotation in radians\n * @returns Start and end rotations for the tween.\n */\nexport function shortestTweenRotation(startRotation: number, targetRotation: number) {\n\tconst startRotationMod2Pi = euclideanModulo(startRotation, Math.PI * 2);\n\tconst targetRotationMod2Pi = euclideanModulo(targetRotation, Math.PI * 2);\n\tconst delta = targetRotationMod2Pi - startRotationMod2Pi;\n\n\t// If delta > Math.PI rotate 2*PI clockwise\n\t// If delta < -Math.PI rotate 2*PI counterclockwise\n\t// Otherwise delta is already the shortest path\n\tconst endRotation = targetRotationMod2Pi + (delta > Math.PI ? -Math.PI * 2 : delta < -Math.PI ? Math.PI * 2 : 0);\n\n\treturn { start: startRotationMod2Pi, end: endRotation };\n}\n\nexport function isFiniteBox(box: Box2 | Box3) {\n\tif (box instanceof Box2) {\n\t\treturn (\n\t\t\tNumber.isFinite(box.min.x) &&\n\t\t\tNumber.isFinite(box.min.y) &&\n\t\t\tNumber.isFinite(box.max.x) &&\n\t\t\tNumber.isFinite(box.max.y)\n\t\t);\n\t}\n\n\treturn (\n\t\tNumber.isFinite(box.min.x) &&\n\t\tNumber.isFinite(box.min.y) &&\n\t\tNumber.isFinite(box.max.x) &&\n\t\tNumber.isFinite(box.max.y) &&\n\t\tNumber.isFinite(box.min.z) &&\n\t\tNumber.isFinite(box.max.z)\n\t);\n}\n\n// Re-export from separate files to avoid bundling three.js when not needed\nexport { clampWithWarning } from './math-utils';\nexport { arraysEqual } from './array-utils';\n\nexport function isBrowser(): boolean {\n\treturn typeof window !== 'undefined' && window !== null;\n}\n", "export class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }));\n}\nfunction base64UrlDecode(str) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n try {\n return b64DecodeUnicode(output);\n }\n catch (err) {\n return atob(output);\n }\n}\nexport function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n options || (options = {});\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n }\n let decoded;\n try {\n decoded = base64UrlDecode(part);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n }\n try {\n return JSON.parse(decoded);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n }\n}\n", "export const EARTH_RADIUS_M = 6371008.8;\n", "import Logger from './Mappedin.Logger';\n\n/**\n * Clamp a number between lower and upper bounds with a warning\n */\nexport function clampWithWarning(x: number, lower: number, upper: number, warning: string) {\n\tif (x < lower || x > upper) {\n\t\tLogger.warn(warning);\n\t}\n\n\treturn Math.min(upper, Math.max(lower, x));\n}\n", "/**\n * Compare two arrays for equality\n */\nexport function arraysEqual(arr1: any[] | null | undefined, arr2: any[] | null | undefined) {\n\tif (arr1 == null || arr2 == null) {\n\t\treturn arr1 === arr2;\n\t}\n\n\tif (arr1.length !== arr2.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0; i < arr1.length; i++) {\n\t\tif (arr1[i] !== arr2[i]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n", "export function debounce<T extends (...args: any[]) => void>(func: T, wait: number, immediate = false) {\n\tlet timeout: NodeJS.Timeout | null = null;\n\tlet called = 0; // called times between execution\n\n\treturn function (...args: Parameters<T>) {\n\t\tcalled++;\n\n\t\tif (called === 1 && immediate === true) {\n\t\t\tfunc(...args);\n\t\t}\n\n\t\tlet later = () => {\n\t\t\t// only execute if it's called more than once before timeout reset\n\t\t\tif (!immediate || called > 1) {\n\t\t\t\tfunc(...args);\n\t\t\t}\n\t\t\ttimeout = null;\n\t\t\tcalled = 0;\n\t\t};\n\n\t\tclearTimeout(timeout as NodeJS.Timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n", "import Logger from './Mappedin.Logger';\n\nexport * from './errors';\nexport * from './utils';\nexport * from './async';\nexport * from './assert';\nexport * from './random-id';\nexport { PubSub } from './pubsub';\nexport { SafeStorage, SESSION_ID_KEY, DEVICE_ID_KEY } from './storage';\nexport { Logger };\nexport * from './color';\nexport * from './interpolate';\n// Do not import these test utils due to circular import errors, these should be imported directly in tests\n// export * from './mapData-test-utils';\n", "import { MI_ERROR_LABEL } from '../common/Mappedin.Logger';\n\nfunction formatMessage(message: string, label: string): string {\n\treturn `${label} ${message}`;\n}\n\n/**\n * @internal\n */\nexport class MappedinError extends Error {\n\tconstructor(message: string, label = MI_ERROR_LABEL) {\n\t\tsuper(formatMessage(message, label));\n\t\tthis.name = 'MappedinError';\n\t}\n}\n\n/**\n * @internal\n */\nexport class MappedinRenderError extends MappedinError {\n\tconstructor(message: string, label = MI_ERROR_LABEL) {\n\t\tsuper(message, label);\n\t\tthis.name = 'MappedinRenderError';\n\t}\n}\n", "/**\n * Options for assertExists function\n */\nexport interface AssertExistsOptions {\n\t/** Name of the value being checked (for better error messages) */\n\tvalueName?: string;\n\t/** Custom error message to use instead of the default */\n\tcustomMessage?: string;\n\t/** Error class to use (defaults to AssertionError) */\n\terrorClass?: new (message: string) => Error;\n\t/** Whether to capture and format the stack trace (defaults to true) */\n\tcaptureStackTrace?: boolean;\n}\n\n/**\n * Custom error class for assertions to make stack traces more identifiable\n */\nexport class AssertionError extends Error {\n\tname = 'AssertionError';\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\n\t\t// Maintains proper stack trace for where the error was thrown (only in V8)\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, AssertionError);\n\t\t}\n\t}\n}\n\n/**\n * Asserts that a value is not null or undefined.\n * @param value The value to check\n * @param options Optional configuration for the assertion\n */\nexport function assertExists<T>(value: T, options?: AssertExistsOptions): asserts value is NonNullable<T> {\n\tif (value == null) {\n\t\t// Create a descriptive error message\n\t\tlet errorMessage: string;\n\t\tif (options?.customMessage) {\n\t\t\terrorMessage = options.customMessage;\n\t\t} else {\n\t\t\tconst nameInfo = options?.valueName ? `'${options.valueName}'` : 'value';\n\t\t\terrorMessage = `Expected ${nameInfo} to be defined, but received ${value}`;\n\t\t}\n\n\t\t// Create the error with the appropriate error class\n\t\tconst ErrorClass = options?.errorClass || AssertionError;\n\t\tconst error = new ErrorClass(errorMessage);\n\n\t\t// Capture stack trace to hide the assertExists call itself\n\t\tif (options?.captureStackTrace !== false && Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(error, assertExists);\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n\n/**\n * Asserts that an object is an instance of a specific class.\n * @param obj The object to check\n * @param className The class constructor to check against\n * @param errorMessage Optional custom error message\n */\nexport function assertInstanceOf<T>(\n\tobj: unknown,\n\tclassName: new (...args: any[]) => T,\n\terrorMessage?: string,\n): asserts obj is T {\n\tif (!(obj instanceof className)) {\n\t\tconst defaultMessage = `${obj} should be an instance of ${className.name} but it's a ${obj?.constructor.name}`;\n\t\tthrow new Error(errorMessage || defaultMessage);\n\t}\n}\n\n/**\n * Asserts that an object has a specific 'type' property value.\n * @param obj The object to check\n * @param expectedType The expected value of the 'type' property\n * @param errorMessage Optional custom error message\n */\nexport function assertType<T extends { type: string }, P extends T['type']>(\n\tobj: T | undefined,\n\texpectedType: P,\n\terrorMessage?: string,\n): asserts obj is Extract<T, { type: P }> {\n\tassertExists(obj);\n\tif (obj?.type !== expectedType) {\n\t\tconst defaultMessage = `Expected type ${expectedType} but got ${obj?.type}`;\n\t\tthrow new Error(errorMessage ?? defaultMessage);\n\t}\n}\n\n/**\n * Retrieves an entity from a map and asserts it is of a specific type.\n * @param map The map containing entities\n * @param entityId The ID of the entity to retrieve\n * @param expectedType The class constructor the entity should be an instance of\n * @returns The entity cast to the expected type\n */\nexport function getEntityAsType<T>(\n\tmap: Map<string | number, unknown>,\n\tentityId: string | number,\n\texpectedType: new (...args: any[]) => T,\n): T {\n\tconst entity = map.get(entityId);\n\tassertInstanceOf(entity, expectedType);\n\n\treturn entity;\n}\n", "const SLICE_POSITIONS = [0, 4, 6, 8, 10] as const;\n\n/**\n * Returns a UUIDv4-like ID without relying on a CSPRNG as we don't need it for these purposes.\n * @hidden\n */\nexport const randomId = () => {\n\tconst array: number[] = new Array(16).fill(0);\n\tlet seed = Math.random() * 0x100000000;\n\n\tfor (let i = 0; i < array.length; i++) {\n\t\tif (i > 0 && (i & 0x03) === 0) {\n\t\t\tseed = Math.random() * 0x100000000;\n\t\t}\n\t\tarray[i] = (seed >>> ((i & 0x03) << 3)) & 0xff;\n\t}\n\tconst hexArray = array.map(n => n.toString(16).padStart(2, '0'));\n\t// UUID's 3rd segment must start with a 4\n\n\thexArray[6] = '4' + hexArray[6][1];\n\t// UUID's 4th segment (for variant 1) must be an 8, 9, a or b\n\t// (due to needing the leading 2 bits in binary to be 10).\n\thexArray[8] = ['8', '9', 'a', 'b'].includes(hexArray[7][0]) ? hexArray[7] : 'a' + hexArray[7][1];\n\n\treturn SLICE_POSITIONS.map((v, i) =>\n\t\thexArray.slice(v, i === SLICE_POSITIONS.length - 1 ? undefined : SLICE_POSITIONS[i + 1]).join(''),\n\t).join('-');\n};\n\nexport function cyrb53(str: string, seed = 0): number {\n\tlet h1 = 0xdeadbeef ^ seed;\n\tlet h2 = 0x41c6ce57 ^ seed;\n\tfor (let i = 0, ch; i < str.length; i++) {\n\t\tch = str.charCodeAt(i);\n\t\th1 = Math.imul(h1 ^ ch, 2654435761);\n\t\th2 = Math.imul(h2 ^ ch, 1597334677);\n\t}\n\n\th1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n\th2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n\treturn 4294967296 * (2097151 & h2) + (h1 >>> 0);\n}\n\nlet counter = 0;\nexport function shortId() {\n\t// Hybrid ID generation: timestamp base36 + counter\n\tconst base = Date.now().toString(36);\n\treturn `${base}${(++counter).toString(36)}`;\n}\n", "/**\n * Generic PubSub class implementing the Publish-Subscribe pattern for event handling.\n *\n * @template EVENT_PAYLOAD - The type of the event payload.\n * @template EVENT - The type of the event.\n */\nexport class PubSub<EVENT_PAYLOAD, EVENT extends keyof EVENT_PAYLOAD = keyof EVENT_PAYLOAD> {\n\t/**\n\t * @private\n\t * @internal\n\t */\n\tprivate _subscribers: any = {};\n\t/**\n\t * @private\n\t * @internal\n\t */\n\tprivate _destroyed = false;\n\n\t/**\n\t * @private\n\t * @internal\n\t */\n\tpublish<EVENT_NAME extends EVENT>(eventName: EVENT_NAME, data?: EVENT_PAYLOAD[EVENT_NAME]) {\n\t\tif (!this._subscribers || !this._subscribers[eventName] || this._destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._subscribers[eventName]!.forEach(function (fn) {\n\t\t\tif (typeof fn !== 'function') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfn(data);\n\t\t});\n\t}\n\n\t/**\n\t * Subscribe a function to an event.\n\t *\n\t * @param eventName An event name which, when fired, will call the provided\n\t * function.\n\t * @param fn A callback that gets called when the corresponding event is fired. The\n\t * callback will get passed an argument with a type that's one of event payloads.\n\t * @example\n\t * // Subscribe to the 'click' event\n\t * const handler = (event) => {\n\t * const { coordinate } = event;\n\t * const { latitude, longitude } = coordinate;\n\t * \tconsole.log(`Map was clicked at ${latitude}, ${longitude}`);\n\t * };\n\t * map.on('click', handler);\n\t */\n\ton<EVENT_NAME extends EVENT>(\n\t\teventName: EVENT_NAME,\n\t\tfn: (\n\t\t\tpayload: EVENT_PAYLOAD[EVENT_NAME] extends {\n\t\t\t\tdata: null;\n\t\t\t}\n\t\t\t\t? EVENT_PAYLOAD[EVENT_NAME]['data']\n\t\t\t\t: EVENT_PAYLOAD[EVENT_NAME],\n\t\t) => void,\n\t) {\n\t\tif (!this._subscribers || this._destroyed) {\n\t\t\tthis._subscribers = {};\n\t\t}\n\t\tthis._subscribers[eventName] = this._subscribers[eventName] || [];\n\t\tthis._subscribers[eventName]!.push(fn);\n\t}\n\n\t/**\n\t * Unsubscribe a function previously subscribed with {@link on}\n\t *\n\t * @param eventName An event name to which the provided function was previously\n\t * subscribed.\n\t * @param fn A function that was previously passed to {@link on}. The function must\n\t * have the same reference as the function that was subscribed.\n\t * @example\n\t * // Unsubscribe from the 'click' event\n\t * const handler = (event) => {\n\t * \tconsole.log('Map was clicked', event);\n\t * };\n\t * map.off('click', handler);\n\t */\n\toff<EVENT_NAME extends EVENT>(\n\t\teventName: EVENT_NAME,\n\t\tfn: (\n\t\t\tpayload: EVENT_PAYLOAD[EVENT_NAME] extends {\n\t\t\t\tdata: null;\n\t\t\t}\n\t\t\t\t? EVENT_PAYLOAD[EVENT_NAME]['data']\n\t\t\t\t: EVENT_PAYLOAD[EVENT_NAME],\n\t\t) => void,\n\t) {\n\t\tif (!this._subscribers || this._subscribers[eventName] == null || this._destroyed) {\n\t\t\treturn;\n\t\t}\n\t\tconst itemIdx = this._subscribers[eventName]!.indexOf(fn);\n\n\t\tif (itemIdx !== -1) {\n\t\t\tthis._subscribers[eventName]!.splice(itemIdx, 1);\n\t\t}\n\t}\n\t/**\n\t * @private\n\t * @internal\n\t */\n\tdestroy() {\n\t\tthis._destroyed = true;\n\t\tthis._subscribers = {};\n\t}\n}\n", "import { randomId } from './random-id';\n\nexport const SESSION_DATA_KEY = 'mi-session-data' as const;\nexport const LOCAL_DATA_KEY = 'mi-local-data' as const;\n\nexport const SESSION_ID_KEY = 'id' as const;\nexport const DEVICE_ID_KEY = 'deviceId' as const;\n\nexport type SessionData = {\n\t[SESSION_ID_KEY]: string;\n\t[prop: string]: unknown;\n};\n\nexport type LocalData = {\n\t[DEVICE_ID_KEY]: string;\n\t[prop: string]: unknown;\n};\n\nexport class SafeStorage {\n\t// Store these in objects so they exist even if storage doesn't\n\tstatic #instance?: SafeStorage;\n\t#sessionData: SessionData;\n\t#localData: LocalData;\n\n\tprivate constructor() {\n\t\t// Using new keys for session + user data to avoid collisions.\n\t\ttry {\n\t\t\tconst sessionData = sessionStorage.getItem(SESSION_DATA_KEY);\n\n\t\t\tif (sessionData) {\n\t\t\t\tthis.#sessionData = JSON.parse(sessionData);\n\t\t\t} else {\n\t\t\t\tthis.#sessionData = { [SESSION_ID_KEY]: randomId() };\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.#sessionData = { [SESSION_ID_KEY]: randomId() };\n\t\t}\n\n\t\t// Using new keys for session + user data to avoid collisions.\n\t\ttry {\n\t\t\tconst localData = localStorage.getItem(LOCAL_DATA_KEY);\n\n\t\t\tif (localData) {\n\t\t\t\tthis.#localData = JSON.parse(localData);\n\t\t\t} else {\n\t\t\t\tthis.#localData = { [DEVICE_ID_KEY]: randomId() };\n\t\t\t}\n\t\t} catch {\n\t\t\tthis.#localData = { [DEVICE_ID_KEY]: randomId() };\n\t\t}\n\n\t\t// Just in case parsing either of these was successful, but for some\n\t\t// reason the parsed data does not contain an id/deviceId, we populate\n\t\t// with a random ID here.\n\t\tif (!this.#sessionData[SESSION_ID_KEY]) {\n\t\t\tthis.#sessionData[SESSION_ID_KEY] = randomId();\n\t\t}\n\t\tif (!this.#localData[DEVICE_ID_KEY]) {\n\t\t\tthis.#localData[DEVICE_ID_KEY] = randomId();\n\t\t}\n\t}\n\n\tstatic getInstance() {\n\t\tif (!this.#instance) {\n\t\t\tthis.#instance = new SafeStorage();\n\t\t}\n\n\t\treturn this.#instance;\n\t}\n\n\tstatic ___clearInstance() {\n\t\tthis.#instance = undefined;\n\t}\n\n\tsaveSessionData<T extends keyof SessionData>(key: T, data: SessionData[T]): boolean {\n\t\tthis.#sessionData[key] = data;\n\t\ttry {\n\t\t\tsessionStorage.setItem(SESSION_DATA_KEY, JSON.stringify(this.#sessionData));\n\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tloadSessionData<T extends keyof SessionData>(\n\t\tkey: T,\n\t): SessionData[T] extends undefined ? SessionData[T] | undefined : SessionData[T] {\n\t\tconst itemData = this.#sessionData[key];\n\n\t\tif (itemData != null) {\n\t\t\treturn itemData;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tsaveLocalData<T extends keyof LocalData>(key: T, data: LocalData[T]): boolean {\n\t\tthis.#localData[key] = data;\n\t\ttry {\n\t\t\tlocalStorage.setItem(LOCAL_DATA_KEY, JSON.stringify(this.#localData));\n\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tloadLocalData<T extends keyof LocalData>(\n\t\tkey: T,\n\t): LocalData[T] extends undefined ? LocalData[T] | undefined : LocalData[T] {\n\t\tconst itemData = this.#localData[key];\n\n\t\tif (itemData != null) {\n\t\t\treturn itemData;\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n", "import { Color } from 'three';\n\nexport const X11_COLOR_NAMES_SET = new Set(Object.keys(Color.NAMES));\n\nlet colorInstance: Color | undefined;\nfunction getColorInstance() {\n\tif (colorInstance == null) {\n\t\tcolorInstance = new Color();\n\t}\n\treturn colorInstance;\n}\n\n/**\n * Check if a string is a valid X11 color name, as defined in ThreeJS Color.NAMES\n * @param color - The color string to check.\n * @returns True if the color is a valid X11 color name, false otherwise.\n */\nexport const isX11Color = (color: string): boolean => {\n\treturn X11_COLOR_NAMES_SET.has(color.toLowerCase());\n};\n\n/**\n * Check if a string is a valid hex color.\n * @param color - The color string to check.\n * @returns True if the color is a valid hex color, false otherwise.\n */\nexport const isHexColor = (color: string): boolean => {\n\t/**\n\t * Check for valid hex colors using ThreeJS criteria\n\t * Adapted from https://github.com/mrdoob/three.js/blob/master/src/math/Color.js\n\t */\n\tif (!color.startsWith('#')) {\n\t\treturn false;\n\t}\n\n\tconst hex = color.slice(1);\n\n\t// Valid hex colors are 3 or 6 characters long\n\tif (hex.length !== 3 && hex.length !== 6) {\n\t\treturn false;\n\t}\n\n\t// Check if all characters are valid hex digits\n\tfor (let i = 0; i < hex.length; i++) {\n\t\tif (!((hex[i] >= '0' && hex[i] <= '9') || (hex[i] >= 'A' && hex[i] <= 'F') || (hex[i] >= 'a' && hex[i] <= 'f'))) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n};\n\n/**\n * Check if a string is a valid RGB/RGBA color.\n * @param color - The color string to check.\n * @returns True if the color is a valid RGB/RGBA color, false otherwise.\n */\nexport const isRgbColor = (color: string): boolean => {\n\t/**\n\t * Check for valid RGB/RGBA colors using ThreeJS criteria\n\t * Adapted from https://github.com/mrdoob/three.js/blob/master/src/math/Color.js\n\t */\n\tif (!color.startsWith('rgb(') && !color.startsWith('rgba(')) {\n\t\treturn false;\n\t}\n\n\t// Extract components between parentheses\n\tconst openParen = color.indexOf('(');\n\tconst closeParen = color.lastIndexOf(')');\n\n\tif (openParen === -1 || closeParen === -1 || closeParen <= openParen || closeParen !== color.length - 1) {\n\t\treturn false;\n\t}\n\n\tconst components = color.slice(openParen + 1, closeParen).split(',');\n\n\t// RGB should have 3 components, RGBA should have 4\n\tif (components.length !== 3 && components.length !== 4) {\n\t\treturn false;\n\t}\n\n\t// Check if all components are valid\n\tfor (let i = 0; i < components.length; i++) {\n\t\tconst component = components[i].trim();\n\n\t\tif (i < 3) {\n\t\t\t// RGB components can be numbers (0-255) or percentages (0-100%)\n\t\t\tif (component.endsWith('%')) {\n\t\t\t\tconst value = parseFloat(component.slice(0, -1));\n\t\t\t\tif (isNaN(value) || value < 0 || value > 100) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst value = parseInt(component, 10);\n\t\t\t\tif (isNaN(value) || value < 0 || value > 255) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Alpha component should be a decimal between 0 and 1\n\t\t\tconst value = parseFloat(component);\n\t\t\tif (isNaN(value) || value < 0 || value > 1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n\n/**\n * Check if a string is a valid HSL/HSLA color.\n * @param color - The color string to check.\n * @returns True if the color is a valid HSL/HSLA color, false otherwise.\n */\nexport const isHslColor = (color: string): boolean => {\n\t/**\n\t * Check for valid HSL/HSLA colors using ThreeJS criteria\n\t * Adapted from https://github.com/mrdoob/three.js/blob/master/src/math/Color.js\n\t */\n\tif (!color.startsWith('hsl(') && !color.startsWith('hsla(')) {\n\t\treturn false;\n\t}\n\n\t// Extract components between parentheses\n\tconst openParen = color.indexOf('(');\n\tconst closeParen = color.lastIndexOf(')');\n\n\tif (openParen === -1 || closeParen === -1 || closeParen <= openParen || closeParen !== color.length - 1) {\n\t\treturn false;\n\t}\n\n\tconst components = color.slice(openParen + 1, closeParen).split(',');\n\n\t// HSL should have 3 components, HSLA should have 4\n\tif (components.length !== 3 && components.length !== 4) {\n\t\treturn false;\n\t}\n\n\t// Check if all components are valid\n\tfor (let i = 0; i < components.length; i++) {\n\t\tconst component = components[i].trim();\n\n\t\tif (i === 0) {\n\t\t\t// Hue: any number (can be > 360, will wrap around)\n\t\t\tconst value = parseFloat(component);\n\t\t\tif (isNaN(value)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if (i < 3) {\n\t\t\t// Saturation and Lightness: percentages (0-100%)\n\t\t\tif (!component.endsWith('%')) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst value = parseFloat(component.slice(0, -1));\n\t\t\tif (isNaN(value) || value < 0 || value > 100) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\t// Alpha component should be a decimal between 0 and 1\n\t\t\tconst value = parseFloat(component);\n\t\t\tif (isNaN(value) || value < 0 || value > 1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n};\n\n/**\n * Check if a string is a valid ThreeJS color. Can be hex, rgb, rgba, hsl, hsla, or X11 color name.\n * @param color - The color string to check.\n * @returns True if the color is a valid ThreeJS color, false otherwise.\n */\nexport const isColor = (color: string): boolean => {\n\tif (color == null || typeof color !== 'string') {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check for valid hex colors\n\t */\n\tif (isHexColor(color)) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check for valid RGB/RGBA colors\n\t */\n\tif (isRgbColor(color)) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check for valid HSL/HSLA colors\n\t */\n\tif (isHslColor(color)) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check for valid X11 color names\n\t */\n\tif (isX11Color(color)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n/**\n * Convert a color string to an array of RGB values.\n * @param color - The color string to convert.\n * @returns The array of RGB values.\n */\nexport const stringToRgbArray = (color: string): [number, number, number] => {\n\tconst instance = getColorInstance();\n\tinstance.set(color);\n\n\treturn [instance.r, instance.g, instance.b];\n};\n\n/**\n * Convert an array of RGB values to a hex string.\n * @param rgb - The array of RGB values to convert.\n * @returns The hex string representation of the RGB values.\n */\nexport const rgbArrayToString = (rgb: [number, number, number]): string => {\n\tconst instance = getColorInstance();\n\tinstance.set(rgb[0], rgb[1], rgb[2]);\n\n\treturn '#' + instance.getHexString();\n};\n", "import { MappedinError } from './errors';\n\nexport const EASING_CURVES = ['ease-in', 'ease-out', 'ease-in-out', 'linear'] as const;\nexport type EasingCurve = (typeof EASING_CURVES)[number];\n\n/**\n * Validates if a value is a valid easing curve\n * @param value The value to validate\n * @returns True if the value is a valid easing curve\n */\nexport function isValidEasingCurve(value: unknown): value is EasingCurve {\n\treturn typeof value === 'string' && EASING_CURVES.includes(value as EasingCurve);\n}\n\nexport const linearEase = (t: number): number => t;\n\nexport const quadEaseIn = (t: number): number => t * t;\n\nexport const easeIn = (x: number) => 1 - Math.cos((x * Math.PI) / 2);\n\nexport const quadEaseOut = (t: number): number => 1 - (1 - t) * (1 - t);\n\nconst InterpolationEasingFns: { [key in EasingCurve]: (t: number) => number } = {\n\tlinear: linearEase,\n\t'ease-in': quadEaseIn,\n\t'ease-out': quadEaseOut,\n\t'ease-in-out': easeIn,\n};\n\nexport function interpolate(\n\tvalue: number,\n\tinputMin: number,\n\tinputMax: number,\n\toutputMin: number,\n\toutputMax: number,\n\teaseFunc: EasingCurve | ((t: number) => number) = linearEase,\n): number {\n\t// Handle zero range case\n\tif (inputMin === inputMax) {\n\t\treturn outputMax;\n\t}\n\n\t// Clamp x to the input range [a, b]\n\tvalue = Math.max(inputMin, Math.min(value, inputMax));\n\n\t// Normalize x to the range [0, 1]\n\tconst t = (value - Math.min(inputMin, inputMax)) / Math.abs(inputMax - inputMin);\n\n\t// Apply the easing function to t\n\tconst easedT = typeof easeFunc === 'function' ? easeFunc(t) : InterpolationEasingFns[easeFunc](t);\n\n\t// Interpolate the result y in the output range [c, d]\n\tconst y = outputMin + easedT * (outputMax - outputMin);\n\n\treturn y;\n}\n\n/**\n * Return the closest range within an ordered set of values that a given value falls within. If the given value is\n * exactly within a range, returns the index of the range. If the given value is less than the first value in the range,\n * returns 0. If the given value is greater than the last value in the range, returns the last range (lastIndex - 1).\n */\nexport function getInterpolationBreakpoint(value: number, range: number[]): number {\n\tlet breakpoint = 0;\n\tif (range.length < 2) {\n\t\treturn breakpoint;\n\t}\n\tconst increasing = range[0] < range[1];\n\tconst comparator = increasing ? (a, b) => a > b : (a, b) => a < b;\n\twhile (breakpoint < range.length - 1 && comparator(value, range[breakpoint + 1])) {\n\t\tbreakpoint++;\n\t}\n\n\t// Make sure to return a breakpoint within the ranges; there are only n-1 ranges in an n length array\n\treturn breakpoint > range.length - 2 ? Math.max(0, range.length - 2) : breakpoint;\n}\n\nexport function interpolateMulti(\n\tvalue: number,\n\tinputRange: number[],\n\toutputRange: number[],\n\teaseFunc: EasingCurve | ((t: number) => number) = 'ease-in',\n): number {\n\t// Ensure inputRange and outputRange have the same number of values\n\tif (inputRange.length !== outputRange.length) {\n\t\tthrow new MappedinError('Input and output ranges must have the same number of values.');\n\t}\n\n\t// Clamp x to the input range [a, b]\n\tvalue = Math.max(inputRange[0], Math.min(value, inputRange[inputRange.length - 1]));\n\n\t// Find the segment in which 'value' falls\n\tconst segment = getInterpolationBreakpoint(value, inputRange);\n\n\t// Normalize x within the segment\n\tconst t = (value - inputRange[segment]) / (inputRange[segment + 1] - inputRange[segment]);\n\n\t// Apply the easing function to t\n\tconst easedT = typeof easeFunc === 'function' ? easeFunc(t) : InterpolationEasingFns[easeFunc](t);\n\n\t// Interpolate the result y in the output range [c, d]\n\tconst y = outputRange[segment] + easedT * (outputRange[segment + 1] - outputRange[segment]);\n\n\treturn y;\n}\n", "export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n", "import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n", "import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n", "import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n", "export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n", "import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n", "export {};\n", "import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&\u2019*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n", "export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n", "import * as z from \"./external.js\";\nexport * from \"./external.js\";\nexport { z };\nexport default z;\n", "import z3 from \"./v3/index.js\";\nexport * from \"./v3/index.js\";\nexport default z3;\n", "export function normalizeAngle(angle: number): number {\n\treturn ((angle % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\n}\n", "import {\n\tLngLat,\n\tLngLatBounds,\n\ttype MercatorCoordinate,\n\ttype CustomLayerInterface,\n} from '../../../packages/outdoor-context-v5';\nimport type { BufferGeometry, Object3D, PerspectiveCamera, Camera as THREECamera } from 'three';\nimport { BoxGeometry, Matrix4, Mesh, MeshBasicMaterial, Vector2, Vector3, Box2 } from 'three';\nimport { GroupContainerObject3D } from '../entities/group-container';\nimport type { Geometry2D } from '../entities/geometry2d';\nimport { Geometry2DObject3D } from '../entities/geometry2d';\nimport type { Geometry3DTypes } from '../entities/geometry3d';\nimport { Geometry3DObject3D } from '../entities/geometry3d';\nimport type { InsetPadding, Position, RendererState } from '../renderer';\nimport { MAPPEDIN_LAYER_ID } from './constants';\nimport { EARTH_RADIUS_M } from '@packages/internal/common/constants';\nimport { GeometryGroupObject3D } from '../entities/geometry-group';\nexport { isFiniteBox } from '@packages/internal/common';\nimport type { Position as GeoJSONPosition } from 'geojson';\n\nexport function cartesianToGeographic(centerLat: number, centerLon: number, x: number, y: number) {\n\t// Earth's radius in meters\n\n\t// Convert meters to radians\n\tconst latRadian = centerLat * (Math.PI / 180);\n\n\t// Calculate the new latitude\n\tconst latDelta = y / EARTH_RADIUS_M;\n\tconst newLat = centerLat + (latDelta * 180) / Math.PI;\n\n\t// Calculate the new longitude\n\tconst lonDelta = x / EARTH_RADIUS_M / Math.cos(latRadian);\n\tconst newLon = centerLon + (lonDelta * 180) / Math.PI;\n\n\treturn { lat: newLat, lon: newLon };\n}\n\nexport function geographicToCartesian(centerLat: number, centerLon: number, targetLat: number, targetLon: number) {\n\t// Convert degrees to radians\n\tconst latRadian = targetLat * (Math.PI / 180);\n\tconst lonRadian = targetLon * (Math.PI / 180);\n\tconst centerLatRadian = centerLat * (Math.PI / 180);\n\tconst centerLonRadian = centerLon * (Math.PI / 180);\n\n\t// Calculate the differences in latitude and longitude\n\tconst latDelta = latRadian - centerLatRadian;\n\tconst lonDelta = lonRadian - centerLonRadian;\n\n\t// Calculate the Cartesian coordinates\n\tconst x = EARTH_RADIUS_M * lonDelta * Math.cos(centerLatRadian);\n\tconst y = EARTH_RADIUS_M * latDelta;\n\n\treturn { x, y };\n}\n\nexport const populateGeometry3DIdsInScene = (\n\ttree: GroupContainerObject3D['children'][0] | Object3D,\n\tentities: RendererState['geometry3DIdsInScene'],\n\tloadGeometryGroupIds: RendererState['geometryGroupIdsToLoad'],\n\tparentPreloaded = false,\n) => {\n\tconst isPreloadedContainer = tree instanceof GroupContainerObject3D && tree.userData.preloadGeometry;\n\t// Determine if preloaded geometry should be hidden (either parent is preloaded or this container is preloaded but not visible)\n\tconst preloadedHidden = parentPreloaded || (isPreloadedContainer && !tree.visible);\n\n\tif (tree.children && (tree.visible || isPreloadedContainer)) {\n\t\tfor (const child of tree.children) {\n\t\t\tif (child.visible && child.type && !preloadedHidden) {\n\t\t\t\tif ('entities3D' in child.userData && child.userData?.entities3D && child instanceof GeometryGroupObject3D) {\n\t\t\t\t\tentities.add(child.userData.entityId);\n\t\t\t\t\tfor (const entityId of child.userData.entities3D.values()) {\n\t\t\t\t\t\tentities.add(entityId);\n\t\t\t\t\t}\n\t\t\t\t} else if (child.type === 'group-container') {\n\t\t\t\t\tentities.add(child.userData.entityId);\n\t\t\t\t} else if (child.type === 'custom-geometry') {\n\t\t\t\t\tentities.add(child.userData.entityId);\n\t\t\t\t} else if (child instanceof Geometry3DObject3D) {\n\t\t\t\t\tentities.add(child.userData.entityId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// only add to loadGeometryGroupIds if the geometry group is dirty, meaning it needs to be loaded, regardless of visibility\n\t\t\tif (child instanceof GeometryGroupObject3D && child.userData.dirty) {\n\t\t\t\tloadGeometryGroupIds.add(child.userData.entityId);\n\t\t\t}\n\n\t\t\t// Recurse with updated hidden parent state\n\t\t\tpopulateGeometry3DIdsInScene(child, entities, loadGeometryGroupIds, preloadedHidden);\n\t\t}\n\t}\n\n\treturn entities;\n};\n\nexport const populateGeometry2DIdsInScene = (tree: any, entities: Set<Geometry2D['id']>) => {\n\tif (tree.children && tree.visible && !tree.userData?.hidden) {\n\t\tfor (const child of tree.children) {\n\t\t\tif (child.visible && child instanceof Geometry2DObject3D) {\n\t\t\t\tentities.add(child.userData.entityId);\n\t\t\t}\n\t\t\tpopulateGeometry2DIdsInScene(child, entities);\n\t\t}\n\t}\n\n\treturn entities;\n};\n\nexport function convertMapLibreStylePaintProps(paint) {\n\tlet {\n\t\t'fill-extrusion-color': color,\n\t\t'fill-extrusion-height': height,\n\t\t'fill-extrusion-base': altitude,\n\t\t'fill-extrusion-opacity': opacity,\n\t\t'fill-extrusion-outline': outline,\n\t} = paint;\n\n\treturn { color, height, altitude, opacity, outline };\n}\n\nexport function convertMapLibreLineStylePaintProps(paint) {\n\tconst {\n\t\t'line-color': color,\n\t\t'line-join': join,\n\t\t'line-opacity': opacity,\n\t\t'line-width': width,\n\t\t'line-cap': cap,\n\t} = paint;\n\n\treturn { color, join, opacity, width, cap };\n}\n\nexport function mergeObjects<T extends Record<string, any>>(obj1: T, obj2: T): T {\n\tfor (const key in obj2) {\n\t\t// Prevent prototype pollution\n\t\tif (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n\t\t\tcontinue;\n\t\t}\n\t\tif (obj2[key] == null) {\n\t\t\t// @ts-ignore\n\t\t\tobj1[key] = undefined;\n\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(obj2[key])) {\n\t\t\t// Arrays should be replaced\n\t\t\tobj1[key] = obj2[key];\n\t\t} else if (typeof obj2[key] === 'object') {\n\t\t\tmergeObjects(obj1[key], obj2[key]);\n\t\t} else {\n\t\t\tobj1[key] = obj2[key];\n\t\t}\n\t}\n\n\treturn obj1;\n}\n\nexport function createCustomLayer(\n\tmodelAsMercatorCoordinate: MercatorCoordinate,\n\tviewCamera: THREECamera,\n\tonRender: () => void,\n) {\n\t// transformation parameters to position, rotate and scale the 3D model onto the map\n\tconst modelTransform = {\n\t\ttranslateX: modelAsMercatorCoordinate.x,\n\t\ttranslateY: modelAsMercatorCoordinate.y,\n\t\ttranslateZ: modelAsMercatorCoordinate.z,\n\t\t/* Since our 3D model is in real world meters, a scale transform needs to be\n\t\t * applied since the CustomLayerInterface expects units in MercatorCoordinates.\n\t\t */\n\t\tscale: modelAsMercatorCoordinate.meterInMercatorCoordinateUnits(),\n\t};\n\n\tconst matrix1 = new Matrix4();\n\tconst scale = new Vector3(modelTransform.scale, -modelTransform.scale, modelTransform.scale);\n\tconst matrix2 = new Matrix4()\n\t\t.makeTranslation(modelTransform.translateX, modelTransform.translateY, modelTransform.translateZ)\n\t\t.scale(scale);\n\n\treturn {\n\t\tid: MAPPEDIN_LAYER_ID,\n\t\ttype: 'custom',\n\t\trenderingMode: '3d',\n\t\trender: (_gl, args) => {\n\t\t\tmatrix1.fromArray(args.defaultProjectionData.mainMatrix);\n\t\t\tviewCamera.projectionMatrix = matrix1.multiply(matrix2);\n\t\t\tonRender();\n\t\t},\n\t} as CustomLayerInterface;\n}\n\nfunction fetchToken(authURL: string) {\n\treturn fetch(authURL, {\n\t\tmethod: 'POST',\n\t\theaders: {\n\t\t\t'content-type': 'application/json',\n\t\t},\n\t\tbody: JSON.stringify({\n\t\t\tgrant_type: 'client_credentials',\n\t\t}),\n\t});\n}\n\nexport async function getRequestHeaders(authURL: string): Promise<{ 'x-mappedin-tiles-key': string }> {\n\tconst token = await fetchToken(authURL);\n\tconst { access_token } = await token.json();\n\n\treturn {\n\t\t'x-mappedin-tiles-key': access_token,\n\t};\n}\n\n// https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript\nexport function cyrb53(str: string, seed = 0): number {\n\tlet h1 = 0xdeadbeef ^ seed;\n\tlet h2 = 0x41c6ce57 ^ seed;\n\tfor (let i = 0, ch; i < str.length; i++) {\n\t\tch = str.charCodeAt(i);\n\t\th1 = Math.imul(h1 ^ ch, 2654435761);\n\t\th2 = Math.imul(h2 ^ ch, 1597334677);\n\t}\n\n\th1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n\th2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n\treturn 4294967296 * (2097151 & h2) + (h1 >>> 0);\n}\n\n/**\n/* getProjectionScaleFactor()\n/* finds the scale ratio between screen coordinates and 3D coordinates (in X-Z plane)\n/*\n\t * R\n\t * /|\n\t * C : Camera / |\n\t * PQ : Projection Plane / |\n\t * OR : Origin / |\n\t * F : FOV / |\n\t * Q / |\n\t * /| |\n\t * / | |\n\t * / | |\n\t * / | |\n\t * / | |\n\t * / F/2 | |\n\t * C ------------P------------ O\n\t *\n\t *\n\t * ProjectionScaleFactor = ( OR / PQ )\n\t * PQ = canvasHeight / 2\n\t * CQ = zoom\n\t *\n\t * OR / C0 = tan(F/2)\n\t * so OR = CO * tan(F/2)\n\t */\n\nexport function getProjectionScaleFactor(FOV: number, canvasHeight: number, zoom: number): number {\n\t// get halfFOV in radians\n\tconst halfFOV = (FOV * (Math.PI / 180)) / 2;\n\tconst PQ = canvasHeight / 2;\n\tconst CO = zoom;\n\tconst OR = CO * Math.tan(halfFOV);\n\tconst projectionScaleFactor = OR / PQ;\n\n\treturn projectionScaleFactor;\n}\n\nexport function getBoundingBoxCenter(bbox: Position[]): [number, number] {\n\treturn new LngLatBounds(new LngLat(bbox[0][0], bbox[0][1]), new LngLat(bbox[1][0], bbox[1][1])).getCenter().toArray();\n}\n\nexport { getCornersOfBoundingBox } from './bounding-box';\nexport { getGeometryByGeometryId } from './ecs';\nexport { getPixelRatio } from './get-pixel-ratio';\nexport { debounce } from './async';\nexport { shouldDisableOffscreenCanvas } from './browser';\nexport { noop, pick, isEmpty, type KeysOfUnion } from './fp';\nexport { transformRequest } from './tranform-request';\nexport { normalizeAngle } from './math';\n\n// NOTE: We should only expand minZoom and never shrink it. Except when it's the initial zoom.\nexport function shouldExpandZoomLevel(minZoomFromCurrentPanBounds: number, cameraZoomLevel: number) {\n\treturn minZoomFromCurrentPanBounds < cameraZoomLevel || cameraZoomLevel <= 12;\n}\n\nexport function getGroupContainerOpacity(entity: Geometry3DTypes | GeometryGroupObject3D) {\n\tlet containerOpacity = 1;\n\tif (entity.type === 'geometry-group' && entity.parent != null && entity.parent instanceof GroupContainerObject3D) {\n\t\tcontainerOpacity = entity.parent.userData.computedOpacity;\n\t} else if (\n\t\t(entity.type === 'geometry' || entity.type === 'custom-geometry' || entity.type === 'model') &&\n\t\tentity.parentObject3D != null &&\n\t\tentity.parentObject3D instanceof GeometryGroupObject3D &&\n\t\tentity.parentObject3D.parent != null &&\n\t\tentity.parentObject3D.parent instanceof GroupContainerObject3D\n\t) {\n\t\tcontainerOpacity = entity.parentObject3D.parent.userData.computedOpacity;\n\t}\n\n\treturn containerOpacity;\n}\n\n/**\n * Checks if two coordinate arrays are equal within a small tolerance to handle floating point precision issues.\n *\n * @param coord1 - First coordinate [longitude, latitude] or [longitude, latitude, altitude]\n * @param coord2 - Second coordinate [longitude, latitude] or [longitude, latitude, altitude]\n * @param tolerance - Tolerance for floating point comparison (default: 1e-10)\n * @returns True if coordinates are equal within tolerance\n */\nexport function coordinatesEqual(coord1: GeoJSONPosition, coord2: GeoJSONPosition, tolerance = 1e-10): boolean {\n\t// If one has altitude and the other doesn't, they're not equal\n\tif (coord1.length !== coord2.length) {\n\t\treturn false;\n\t}\n\n\tconst lonEqual = Math.abs(coord1[0] - coord2[0]) < tolerance;\n\tconst latEqual = Math.abs(coord1[1] - coord2[1]) < tolerance;\n\n\t// Check altitude if both coordinates have it\n\tif (coord1.length === 3 && coord2.length === 3) {\n\t\tconst altEqual = Math.abs(coord1[2] - coord2[2]) < tolerance;\n\n\t\treturn lonEqual && latEqual && altEqual;\n\t}\n\n\treturn lonEqual && latEqual;\n}\n\nexport const MAPLIBRE_FRUSTRUM_CULL_HACK_NAME = 'maplibre-frustum-culling-hack';\n/**\n * TODO: Find the actual root of the problem and fix it.\n * This is a hack to get around some geometry disappearing when we're added as a layer in maplibre.\n */\nexport function maplibreFrustrumCullHack() {\n\tconst geometry = new BoxGeometry(0.01, 0.01, 0.01);\n\tconst material = new MeshBasicMaterial({ opacity: 0, depthWrite: false, transparent: true });\n\tconst mesh = new Mesh(geometry, material);\n\tmesh.position.copy(new Vector3(0, 50, 0));\n\tmesh.frustumCulled = false;\n\tmesh.name = MAPLIBRE_FRUSTRUM_CULL_HACK_NAME;\n\treturn mesh;\n}\n\nconst tempVec = new Vector3();\nconst tempVec2 = new Vector2();\nexport function projectToBox2D(object: Object3D, camera: PerspectiveCamera, result = new Box2()): Box2 {\n\t// Traverse the object and project all vertices\n\tobject.traverse(child => {\n\t\tif (child instanceof Mesh) {\n\t\t\tconst geometry = child.geometry as BufferGeometry;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t// Skip if geometry is behind camera's near plane\n\t\t\tconst distance = camera.position.distanceTo(child.position);\n\t\t\tif (distance < camera.near) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < position.count; i++) {\n\t\t\t\ttempVec.fromBufferAttribute(position, i);\n\t\t\t\ttempVec.applyMatrix4(child.matrixWorld); // need world coord for project\n\t\t\t\ttempVec.applyMatrix4(camera.matrixWorldInverse);\n\t\t\t\ttempVec.applyMatrix4(camera.projectionMatrix);\n\t\t\t\t// culling off things are too far to behind camera\n\t\t\t\tif (tempVec.z < 1 && tempVec.z > 0) {\n\t\t\t\t\ttempVec2.set(tempVec.x, tempVec.y);\n\t\t\t\t\tresult.expandByPoint(tempVec2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\treturn result;\n}\n\n// DEBUG\nfunction ndcToScreen(ndc: Vector2, container: HTMLElement): Vector2 {\n\tconst width = container.clientWidth;\n\tconst height = container.clientHeight;\n\n\treturn new Vector2(((ndc.x + 1) * width) / 2, ((1 - ndc.y) * height) / 2);\n}\n\nexport function drawProjectedBox(box: Box2, color: string, container: HTMLElement) {\n\tconst div = document.createElement('div');\n\tdiv.style.position = 'absolute';\n\tdiv.style.border = `2px solid ${color}`;\n\tdiv.style.pointerEvents = 'none';\n\n\t// Convert NDC coordinates to screen coordinates\n\tconst min = ndcToScreen(new Vector2(box.min.x, box.min.y), container);\n\tconst max = ndcToScreen(new Vector2(box.max.x, box.max.y), container);\n\n\t// Set position and size\n\tdiv.style.left = `${min.x}px`;\n\tdiv.style.top = `${max.y}px`;\n\tconst width = Math.abs(max.x - min.x);\n\tconst height = Math.abs(max.y - min.y);\n\tdiv.style.width = `${width}px`;\n\tdiv.style.height = `${height}px`;\n\n\tcontainer.appendChild(div);\n\n\treturn div;\n}\n\n/**\n * The render order of objects in the scene.\n * Geometries are rendered as 0 by default. Images should render later than spaces since we assume image should always show on top of spaces.\n * We can't rely on camera sortOrder to decide the order of rendering as it may consider larger space (floor space) to be closer to camera than a imageMesh even imageMesh has a slightly higher z offset. ie, altitude offset needs be over 10 meters to ensure it can beat a giant floor space in venue such as battersea.\n * Hence, we give it a renderOrder that's later than floor.\n */\nexport enum SCENE_RENDER_ORDER {\n\tGeometry,\n\tImageMesh,\n}\n\n/**\n * Given a screen element and a set of screen offsets, return the x, y, w, h of the rectangle that represents the area contained within the screen offsets.\n */\nexport function rectFromScreenOffsets(\n\tel: HTMLElement,\n\tscreenOffsets?: Partial<InsetPadding>,\n): [number, number, number, number] {\n\tlet x = 0;\n\tlet y = 0;\n\tlet w = el.clientWidth;\n\tlet h = el.clientHeight;\n\tif (screenOffsets) {\n\t\tconst { left: _left, top: _top, right: _right, bottom: _bottom, type } = screenOffsets;\n\t\tconst left = _left ?? 0;\n\t\tconst top = _top ?? 0;\n\t\tconst right = _right ?? 0;\n\t\tconst bottom = _bottom ?? 0;\n\t\tif (type === 'portion') {\n\t\t\tx = left * w;\n\t\t\ty = top * h;\n\t\t\tw = w - x - right * w;\n\t\t\th = h - y - bottom * h;\n\t\t} else {\n\t\t\tx = left;\n\t\t\ty = top;\n\t\t\tw = w - x - right;\n\t\t\th = h - y - bottom;\n\t\t}\n\t}\n\n\treturn [x, y, w, h].map(v => Math.max(v, 0)) as [number, number, number, number];\n}\n", "import { Object3D } from 'three';\nimport type { GeometryGroupState } from './geometry-group';\nimport { GeometryGroupObject3D } from './geometry-group';\nimport { Geometry2D, Geometry2DObject3D } from './geometry2d';\nimport type { MarkerState } from '../components/marker';\nimport type { LabelState } from '../components/label';\nimport type { Geometry3DTypes } from './geometry3d';\nimport { Geometry3D } from './geometry3d';\nimport type { PathState } from '../components/path';\nimport type { InteractionComponent } from '../components/interaction';\nimport type { BatchedText } from '../services/text3d/text3d';\nimport type { EntityTypes } from '../renderer';\nimport type { Feature, MultiPolygon, Polygon } from 'geojson';\nimport type { FocusableComponent } from '../components/focusable';\n\nexport enum GroupContainerComponents {\n\tInteraction,\n\tFocusable,\n}\n\n/**\n * State representing a Group Container, which is a container for other Group Containers, Geometry Groups, Labels, Markers and Paths.\n */\nexport type GroupContainerState = {\n\treadonly id: string | number;\n\treadonly type: 'group-container';\n\t/**\n\t * The states of the children of the group container\n\t */\n\treadonly children: (PathState | MarkerState | LabelState | GroupContainerState | GeometryGroupState)[];\n\t/**\n\t * Whether the group container is visible\n\t */\n\tvisible: boolean;\n\t/**\n\t * The altitude of the group container above the ground in meters\n\t */\n\taltitude: number;\n\tinteractive: boolean;\n\t/**\n\t * The opacity of the group container, which sets the opacity of all its children\n\t */\n\topacity: number;\n\t/**\n\t * If true, the group container will preload geometry for its children even when invisible.\n\t */\n\treadonly preloadGeometry: boolean;\n\tfocusable: boolean;\n};\n\nexport class GroupContainerObject3D extends Object3D {\n\tchildrenIds: Set<string | number> = new Set();\n\t// TODO: outline\n\tchildren: (\n\t\t| GroupContainerObject3D\n\t\t| GeometryGroupObject3D\n\t\t| BatchedText\n\t\t| Geometry2D['object3d']\n\t\t| NonNullable<Geometry3D['object3d']>\n\t)[] = [];\n\treadonly type = 'group-container' as const;\n\tuserData: {\n\t\tentityId: string | number;\n\t\tentities2D: Set<string | number>;\n\t\tdirty: boolean;\n\t\toccluderDirty: boolean;\n\t\toccluderId?: number;\n\t\toccluderFeature?: Feature<Polygon | MultiPolygon, any>;\n\t\topacity: number;\n\t\t/** The effective opacity of the entity after all parent containers have been considered. */\n\t\tcomputedOpacity: number;\n\t\t/**\n\t\t * If true, the group container will preload geometry for its children even when invisible.\n\t\t */\n\t\tpreloadGeometry: boolean;\n\t} = {\n\t\tentityId: '',\n\t\tentities2D: new Set(),\n\t\tdirty: true,\n\t\toccluderDirty: false,\n\t\topacity: 1,\n\t\tcomputedOpacity: 1,\n\t\tpreloadGeometry: false,\n\t};\n\tcomponents: [InteractionComponent?, FocusableComponent?] = [];\n\tconstructor(id: string) {\n\t\tsuper();\n\t\tthis.userData.entityId = id;\n\t}\n\n\taddOccluderFeature(feature: Feature<Polygon | MultiPolygon, any>, occluderId: number) {\n\t\tthis.userData.occluderFeature = feature;\n\t\tthis.userData.occluderId = occluderId;\n\t\tthis.userData.occluderDirty = true;\n\t}\n\n\taddEntity(entityGroupOrContainer: GroupContainerObject3D | GeometryGroupObject3D | Geometry2D | Geometry3DTypes) {\n\t\tif (entityGroupOrContainer instanceof GroupContainerObject3D) {\n\t\t\tthis.childrenIds.add(entityGroupOrContainer.userData.entityId);\n\t\t\tthis.add(entityGroupOrContainer);\n\t\t} else if (entityGroupOrContainer instanceof Geometry2D) {\n\t\t\tthis.childrenIds.add(entityGroupOrContainer.id);\n\t\t\tthis.add(entityGroupOrContainer.object3d);\n\t\t\tthis.userData.entities2D.add(entityGroupOrContainer.id);\n\t\t\tentityGroupOrContainer.positionDirty = true;\n\t\t} else if (entityGroupOrContainer instanceof GeometryGroupObject3D) {\n\t\t\tthis.childrenIds.add(entityGroupOrContainer.userData.entityId);\n\t\t\tthis.add(entityGroupOrContainer);\n\t\t} else if (entityGroupOrContainer instanceof Geometry3D && entityGroupOrContainer.object3d) {\n\t\t\tthis.childrenIds.add(entityGroupOrContainer.id);\n\t\t\tthis.add(entityGroupOrContainer.object3d);\n\t\t}\n\t\tthis.dispatchEvent({ type: 'childadded', child: this });\n\t}\n\n\tremoveEntity(entityGroupOrContainer: EntityTypes) {\n\t\tif (entityGroupOrContainer instanceof GroupContainerObject3D) {\n\t\t\tthis.childrenIds.delete(entityGroupOrContainer.userData.entityId);\n\t\t\tthis.remove(entityGroupOrContainer);\n\t\t} else if (entityGroupOrContainer instanceof Geometry2D) {\n\t\t\tthis.childrenIds.delete(entityGroupOrContainer.id);\n\t\t\tthis.userData.entities2D.delete(entityGroupOrContainer.id);\n\t\t\tthis.remove(entityGroupOrContainer.object3d);\n\t\t} else if (entityGroupOrContainer instanceof GeometryGroupObject3D) {\n\t\t\tthis.childrenIds.delete(entityGroupOrContainer.userData.entityId);\n\t\t\tthis.remove(entityGroupOrContainer);\n\t\t} else if (entityGroupOrContainer instanceof Geometry3D && entityGroupOrContainer.object3d) {\n\t\t\tthis.childrenIds.delete(entityGroupOrContainer.id);\n\t\t\tthis.add(entityGroupOrContainer.object3d);\n\t\t}\n\t\tthis.dispatchEvent({ type: 'childremoved', child: this });\n\t}\n\n\tsetVisible(visible: boolean) {\n\t\tif (this.visible !== visible) {\n\t\t\tthis.visible = visible;\n\t\t\tthis.dispatchEvent({ type: 'childremoved', child: this });\n\t\t}\n\t}\n\n\tsetAltitude(altitude: number) {\n\t\tif (this.position.z !== altitude) {\n\t\t\tthis.position.z = altitude;\n\t\t\tthis.dispatchEvent({ type: 'childremoved', child: this });\n\t\t\tthis.set2DGeometryChildrenPositionDirty();\n\t\t}\n\t}\n\n\t// traverse the children and set the world position dirty for all 2d geometry children\n\t// to save on recalculating the world position for all 2d geometry children every frame\n\tset2DGeometryChildrenPositionDirty() {\n\t\tthis.children.forEach(child => {\n\t\t\tif (child instanceof Geometry2DObject3D) {\n\t\t\t\tchild.userData.worldPositionDirty = true;\n\t\t\t} else if (child instanceof GroupContainerObject3D) {\n\t\t\t\tchild.set2DGeometryChildrenPositionDirty();\n\t\t\t}\n\t\t});\n\t}\n\n\tget altitude() {\n\t\treturn this.position.z;\n\t}\n\n\tsetOpacity(opacity: number) {\n\t\tthis.userData.opacity = opacity;\n\t}\n\tget opacity() {\n\t\treturn this.userData.opacity;\n\t}\n}\n", "import type { BevelState, LineStyle, PaintStyle, Shading } from '../types';\nimport { Object3D } from 'three';\nimport { EntityBatchedMesh } from '../components/mesh';\nimport type { MaterialSide } from '../components/styles';\n/**\n * State representing a Geometry Group, which is a container for Geometries and Models.\n */\nexport type GeometryGroupState = {\n\treadonly id: string | number;\n\treadonly type: 'geometry-group';\n\t/**\n\t * The ids of the children of the geometry group\n\t */\n\treadonly children: (string | number)[];\n\t/**\n\t * Whether the geometry group is visible\n\t */\n\tvisible: boolean;\n\t/**\n\t * Whether the geometry group is interactive, which means it can be hovered over and clicked on.\n\t * This will affect all children of the geometry group and override their interactive state.\n\t *\n\t * @example\n\t * ```javascript\n\t * \trenderer.on('click', ({ geometry }) => {});\n\t * ```\n\t */\n\tinteractive: boolean;\n\t// @TODO: remove these once we have removed the geometry group as an external entity\n\taltitude?: number;\n\topacity?: number;\n\tcolor?: string;\n\theight?: number;\n\ttexture?: string;\n\ttopColor?: string;\n\ttopTexture?: string;\n\toutline?: boolean;\n\tshading?: Shading;\n\tside?: MaterialSide;\n\t/**\n\t * Bevel configuration for extruded shapes.\n\t */\n\tbevel?: BevelState;\n};\n\nexport type ChildUpdatable<T> = T extends LineStyle\n\t? Partial<Pick<LineStyle, 'color' | 'opacity' | 'visible'>>\n\t: Partial<Pick<PaintStyle, 'color' | 'opacity' | 'visible'>>;\n\nexport class GeometryGroupObject3D extends Object3D {\n\tvisible = true;\n\treadonly type = 'geometry-group' as const;\n\tcomponents = [];\n\tuserData: {\n\t\tentityId: string | number;\n\t\tentities3D: Set<string | number>;\n\t\tmodelURL?: string;\n\t\tdirty: boolean;\n\t\tshadingDirty: boolean;\n\t} = {\n\t\tentityId: '',\n\t\tentities3D: new Set(),\n\t\tdirty: true,\n\t\tshadingDirty: true,\n\t};\n\n\tsetVisible(visible: boolean) {\n\t\tif (this.visible !== visible) {\n\t\t\tthis.visible = visible;\n\t\t\tthis.dispatchEvent({ type: 'childremoved', child: this });\n\t\t}\n\t}\n\n\tremoveEntity() {\n\t\tthis.dispatchEvent({ type: 'childremoved', child: this });\n\t}\n\n\tconstructor(id: string) {\n\t\tsuper();\n\t\tthis.userData.entityId = id;\n\t}\n\t/**\n\t * Get first child entity of a group if it's a batched mesh\n\t * We use this logic a lot for getting the material of the group. since group does not have material and batched mesh does\n\t */\n\tgetfirstChildEntityId() {\n\t\tlet firstChild;\n\t\tfor (const child of this.children) {\n\t\t\tif (!child.userData.detached) {\n\t\t\t\tfirstChild = child;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!(firstChild instanceof EntityBatchedMesh)) return;\n\t\tconst childrenEntitiesIds = Object.values(firstChild.userData.entities);\n\n\t\treturn childrenEntitiesIds[0];\n\t}\n\n\tsetAltitude(altitude: number) {\n\t\tif (this.position.z !== altitude) {\n\t\t\tthis.position.z = altitude;\n\t\t\tthis.dispatchEvent({ type: 'childremoved', child: this });\n\t\t}\n\t}\n\n\tget altitude() {\n\t\treturn this.position.z;\n\t}\n}\n", "import type { Texture, BufferGeometry, Mesh, MeshLambertMaterial, BatchedMeshGeometryRange } from 'three';\nimport { BatchedMesh, Color, Vector3 } from 'three';\nimport type { BatchedStandardMaterial } from '../systems/mesh-creation-and-optimization/batched-material';\nimport type { BevelState, EntityId, Position, Shading } from '../types';\nimport type {\n\tFeature,\n\tLineString,\n\tMultiLineString,\n\tMultiPolygon,\n\tPolygon,\n\tPosition as GeoJsonPosition,\n\tBBox,\n} from 'geojson';\nimport { getBoundingBoxFromFeature } from './utils';\nimport type { MaterialSide } from './styles/style';\nimport { DEFAULT_HEIGHT } from './styles/style';\nimport { type ImageProperties } from './image';\nimport { type BaseTextAreaProperties, type EnterpriseTexture } from '@mappedin/mvf-v2';\nimport type { Text } from 'troika-three-text';\nimport type { GeometryGroupState } from '../entities/geometry-group';\nexport class EntityBatchedMesh extends BatchedMesh {\n\ttype = 'entityBatchedMesh' as const;\n\tuserData: {\n\t\tentities: {\n\t\t\t[key: number]: string | number;\n\t\t};\n\t\tdetached?: boolean;\n\t} = {\n\t\tentities: {},\n\t};\n}\n\nexport type MeshComponentProperties = {\n\tid: string;\n\timage?: ImageProperties & {\n\t\tposition: GeoJsonPosition;\n\t\tpath: string;\n\t};\n\ttextArea?: BaseTextAreaProperties & {\n\t\tposition: GeoJsonPosition;\n\t};\n\ttextures?: EnterpriseTexture[];\n\tbevel?: BevelState;\n};\n\n/**\n * State representing a Geometry\n */\nexport type GeometryState = {\n\treadonly id: string | number;\n\treadonly type: 'geometry';\n\t/**\n\t * The position of the geometry in [lon, lat]\n\t */\n\treadonly position: Position;\n\t/**\n\t * The parent group of the geometry\n\t */\n\treadonly parent: EntityId<GeometryGroupState>;\n\t/**\n\t * Whether the geometry is visible. This is independent of the visibility of the children, but will affect the visibility of the children if set to false.\n\t */\n\tvisible: boolean;\n\t/**\n\t * The initial color of the geometry. This is used to reset the color of the geometry to its initial value.\n\t */\n\tinitialColor: string;\n\t/**\n\t * The color of the geometry\n\t */\n\tcolor: string;\n\t/**\n\t * The initial top color of the geometry. This is used to reset the top color of the geometry to its initial value.\n\t */\n\tinitialTopColor?: string;\n\t/**\n\t * The color of geometry faces that are facing up\n\t */\n\ttopColor?: string;\n\t/**\n\t * The color of the geometry when hovered over with a mouse\n\t */\n\thoverColor?: string;\n\t/**\n\t * Whether the geometry is interactive, which means it can be hovered over and clicked on.\n\t *\n\t * @example\n\t * ```javascript\n\t * \trenderer.on('click', ({ geometry }) => {});\n\t * ```\n\t */\n\tinteractive: boolean;\n\t/**\n\t * Whether the geometry is outlined with a 30% darkened color. This effect adds lines around the geometry to make it stand out.\n\t */\n\toutline: boolean;\n\t/**\n\t * Show geometry image if present\n\t */\n\tshowImage: boolean;\n\t/**\n\t * Attempt to keep the image facing the camera as much as possible\n\t */\n\tflipImageToFaceCamera: boolean;\n\t/**\n\t * Whether the anchored image should collide with other images.\n\t */\n\tenableImageCollisions: boolean;\n\t/**\n\t * Whether the geometry should emit an event when focused on by the center of the camera\n\t */\n\tfocusable: boolean;\n\t/**\n\t * The opacity of the geometry\n\t */\n\topacity: number;\n\t/**\n\t * The height of the geometry\n\t */\n\theight: number;\n\t/**\n\t * The texture URL of the geometry\n\t */\n\ttexture?: string;\n\t/**\n\t * The top texture URL of the geometry\n\t */\n\ttopTexture?: string;\n\t/**\n\t * Whether the geometry is currently in hover state or not\n\t */\n\thovered: boolean;\n\t/**\n\t * The render order of the geometry\n\t */\n\trenderOrder?: number;\n\t/**\n\t * The altitude of the geometry element in meters.\n\t */\n\taltitude: number;\n\t/**\n\t * The shading of the geometry\n\t */\n\tshading?: Shading;\n\t/**\n\t * The side of the geometry\n\t */\n\tside?: MaterialSide;\n\t/**\n\t * Bevel configuration for extruded shapes.\n\t */\n\tbevel?: BevelState;\n\t/**\n\t * TODO: it's annoying that we have to store these here just so that they can be applied from mappedin-js. Let's think about a better way to do this.\n\t */\n\n\t/**\n\t * Whether the geometry has a border\n\t */\n\tborderVisible: boolean;\n\t/**\n\t * The color of the border\n\t */\n\tborderColor?: string;\n\t/**\n\t * The width of the border\n\t */\n\tborderWidth?: number;\n};\n\nexport class MeshComponent {\n\t// Pointer to mesh for this component, which is either the mesh itself or a merged geometry mesh\n\t// if this component was optimized\n\tmesh?: EntityBatchedMesh;\n\n\timageMesh?: Mesh;\n\t/**\n\t * holds a pointer to space label text if the polygon has label active.\n\t */\n\ttextMesh?: Text;\n\t// stores the entity id of text3d. To avoid creating label the mesh more than once\n\ttextEntityId?: string;\n\n\treadonly type = 'geometry';\n\t// Whether the geometry is dirty and needs to be updated\n\tdirty = true;\n\n\tdetached = false;\n\n\tinstanceIndex = -1;\n\tgeometry?: BufferGeometry;\n\tbatchedProps?: {\n\t\trange: BatchedMeshGeometryRange;\n\t\tpositionCount: number;\n\t\tgeometryId: number;\n\t} = undefined;\n\tmaterial?: BatchedStandardMaterial;\n\tfeature: Feature<Polygon | LineString | MultiPolygon | MultiLineString, MeshComponentProperties>;\n\tcurrentHeight = DEFAULT_HEIGHT;\n\n\tconstructor(feature: Feature<Polygon | LineString | MultiPolygon | MultiLineString, MeshComponentProperties>) {\n\t\tthis.feature = feature;\n\t}\n\n\tget visible() {\n\t\treturn this.mesh && this.instanceIndex !== -1 ? this.mesh.getVisibleAt(this.instanceIndex) : false;\n\t}\n\n\tset visible(visible: boolean) {\n\t\tif (this.mesh && this.instanceIndex !== -1) {\n\t\t\tthis.mesh.setVisibleAt(this.instanceIndex, visible);\n\t\t}\n\t}\n\n\tget renderOrder() {\n\t\treturn this.mesh ? this.mesh.renderOrder : 0;\n\t}\n\n\tset renderOrder(value: number) {\n\t\tif (this.mesh) {\n\t\t\tthis.mesh.renderOrder = value;\n\t\t}\n\t}\n\n\tcolor: Color = new Color();\n\ttopColor: Color = new Color();\n\tsetColor(color: string, topColor: string) {\n\t\tthis.color.set(color);\n\t\tthis.topColor.set(topColor);\n\t\tif (this.material) {\n\t\t\tthis.material.setColor(this.instanceIndex, this.color, this.topColor);\n\t\t}\n\t}\n\n\tgetColor() {\n\t\treturn this.material?.getColor(this.instanceIndex);\n\t}\n\n\tposition = new Vector3();\n\n\taltitude = 0;\n\t#opacity = 1;\n\tget opacity() {\n\t\treturn this.#opacity;\n\t}\n\n\tset opacity(value) {\n\t\tif (this.material) {\n\t\t\tthis.material.opacity = value;\n\t\t\tthis.material.transparent = value < 1;\n\t\t\tthis.material.needsUpdate = true;\n\t\t}\n\t\tif (this.imageMesh) {\n\t\t\tconst imageMaterials = Array.isArray(this.imageMesh.material)\n\t\t\t\t? this.imageMesh.material\n\t\t\t\t: [this.imageMesh.material];\n\t\t\tfor (const material of imageMaterials as MeshLambertMaterial[]) {\n\t\t\t\tmaterial.opacity = value;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t\tthis.#opacity = value;\n\t}\n\n\tget texture(): string {\n\t\treturn this.material?.texture?.image.src;\n\t}\n\n\tset texture(texture: Texture) {\n\t\tif (this.material) {\n\t\t\tthis.material.texture = texture;\n\t\t}\n\t}\n\n\tget textureInstance(): Texture | undefined {\n\t\treturn this.material?.texture;\n\t}\n\n\tset topTexture(texture: Texture) {\n\t\tif (this.material) {\n\t\t\tthis.material.topTexture = texture;\n\t\t}\n\t}\n\n\tget topTexture(): string {\n\t\treturn this.material?.topTexture?.image.src;\n\t}\n\n\tget topTextureInstance(): Texture | undefined {\n\t\treturn this.material?.topTexture;\n\t}\n\n\tset blendTexture(value: boolean) {\n\t\tif (this.material) {\n\t\t\tthis.material.blendTexture = value;\n\t\t}\n\t}\n\n\t#bbox?: BBox;\n\tget featureBbox(): BBox {\n\t\tif (this.#bbox) return this.#bbox;\n\n\t\tthis.#bbox = getBoundingBoxFromFeature(this.feature);\n\n\t\treturn this.#bbox;\n\t}\n\n\ttexturesVisible = false;\n\n\tshowTextures() {\n\t\tif (this.material) {\n\t\t\tthis.material.showTextures(this.instanceIndex);\n\t\t\tthis.texturesVisible = true;\n\t\t}\n\t}\n\thideTextures() {\n\t\tif (this.material) {\n\t\t\tthis.material.hideTextures(this.instanceIndex);\n\t\t\tthis.texturesVisible = false;\n\t\t}\n\t}\n\tremoveSideTexture() {\n\t\tif (this.material) {\n\t\t\tthis.material.removeSideTexture(this.instanceIndex);\n\t\t}\n\t}\n\tremoveTopTexture() {\n\t\tif (this.material) {\n\t\t\tthis.material.removeTopTexture(this.instanceIndex);\n\t\t}\n\t}\n}\n", "import type { BBox, Feature, LineString, MultiLineString, MultiPolygon, Polygon } from 'geojson';\nimport bbox from '@turf/bbox';\n\nexport function getBoundingBoxFromFeature(\n\tfeature: Feature<Polygon | LineString | MultiPolygon | MultiLineString>,\n): BBox {\n\treturn bbox(feature);\n}\n", "import { coordEach } from \"@turf/meta\";\n/**\n * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.\n *\n * @name bbox\n * @param {GeoJSON} geojson any GeoJSON object\n * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order\n * @example\n * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);\n * var bbox = turf.bbox(line);\n * var bboxPolygon = turf.bboxPolygon(bbox);\n *\n * //addToMap\n * var addToMap = [line, bboxPolygon]\n */\nfunction bbox(geojson) {\n var result = [Infinity, Infinity, -Infinity, -Infinity];\n coordEach(geojson, function (coord) {\n if (result[0] > coord[0]) {\n result[0] = coord[0];\n }\n if (result[1] > coord[1]) {\n result[1] = coord[1];\n }\n if (result[2] < coord[0]) {\n result[2] = coord[0];\n }\n if (result[3] < coord[1]) {\n result[3] = coord[1];\n }\n });\n return result;\n}\nbbox[\"default\"] = bbox;\nexport default bbox;\n", "import { feature, lineString, isObject, point } from '@turf/helpers';\n\n/**\n * Callback for coordEach\n *\n * @callback coordEachCallback\n * @param {Array<number>} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()\n *\n * @name coordEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction coordEach(geojson, callback, excludeWrapCoord) {\n // Handles null Geometry -- Skips this GeoJSON\n if (geojson === null) return;\n var j,\n k,\n l,\n geometry,\n stopG,\n coords,\n geometryMaybeCollection,\n wrapShrink = 0,\n coordIndex = 0,\n isGeometryCollection,\n type = geojson.type,\n isFeatureCollection = type === \"FeatureCollection\",\n isFeature = type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (var featureIndex = 0; featureIndex < stop; featureIndex++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[featureIndex].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {\n var multiFeatureIndex = 0;\n var geometryIndex = 0;\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[geomIndex]\n : geometryMaybeCollection;\n\n // Handles null Geometry -- Skips this geometry\n if (geometry === null) continue;\n coords = geometry.coordinates;\n var geomType = geometry.type;\n\n wrapShrink =\n excludeWrapCoord &&\n (geomType === \"Polygon\" || geomType === \"MultiPolygon\")\n ? 1\n : 0;\n\n switch (geomType) {\n case null:\n break;\n case \"Point\":\n if (\n callback(\n coords,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n multiFeatureIndex++;\n break;\n case \"LineString\":\n case \"MultiPoint\":\n for (j = 0; j < coords.length; j++) {\n if (\n callback(\n coords[j],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n if (geomType === \"MultiPoint\") multiFeatureIndex++;\n }\n if (geomType === \"LineString\") multiFeatureIndex++;\n break;\n case \"Polygon\":\n case \"MultiLineString\":\n for (j = 0; j < coords.length; j++) {\n for (k = 0; k < coords[j].length - wrapShrink; k++) {\n if (\n callback(\n coords[j][k],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n if (geomType === \"MultiLineString\") multiFeatureIndex++;\n if (geomType === \"Polygon\") geometryIndex++;\n }\n if (geomType === \"Polygon\") multiFeatureIndex++;\n break;\n case \"MultiPolygon\":\n for (j = 0; j < coords.length; j++) {\n geometryIndex = 0;\n for (k = 0; k < coords[j].length; k++) {\n for (l = 0; l < coords[j][k].length - wrapShrink; l++) {\n if (\n callback(\n coords[j][k][l],\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n coordIndex++;\n }\n geometryIndex++;\n }\n multiFeatureIndex++;\n }\n break;\n case \"GeometryCollection\":\n for (j = 0; j < geometry.geometries.length; j++)\n if (\n coordEach(geometry.geometries[j], callback, excludeWrapCoord) ===\n false\n )\n return false;\n break;\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n }\n}\n\n/**\n * Callback for coordReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback coordReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Array<number>} currentCoord The current coordinate being processed.\n * @param {number} coordIndex The current index of the coordinate being processed.\n * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n */\n\n/**\n * Reduce coordinates in any GeoJSON object, similar to Array.reduce()\n *\n * @name coordReduce\n * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentCoord\n * //=coordIndex\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentCoord;\n * });\n */\nfunction coordReduce(geojson, callback, initialValue, excludeWrapCoord) {\n var previousValue = initialValue;\n coordEach(\n geojson,\n function (\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) {\n if (coordIndex === 0 && initialValue === undefined)\n previousValue = currentCoord;\n else\n previousValue = callback(\n previousValue,\n currentCoord,\n coordIndex,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n },\n excludeWrapCoord\n );\n return previousValue;\n}\n\n/**\n * Callback for propEach\n *\n * @callback propEachCallback\n * @param {Object} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over properties in any GeoJSON object, similar to Array.forEach()\n *\n * @name propEach\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentProperties, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propEach(features, function (currentProperties, featureIndex) {\n * //=currentProperties\n * //=featureIndex\n * });\n */\nfunction propEach(geojson, callback) {\n var i;\n switch (geojson.type) {\n case \"FeatureCollection\":\n for (i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i].properties, i) === false) break;\n }\n break;\n case \"Feature\":\n callback(geojson.properties, 0);\n break;\n }\n}\n\n/**\n * Callback for propReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback propReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {*} currentProperties The current Properties being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce properties in any GeoJSON object into a single value,\n * similar to how Array.reduce works. However, in this case we lazily run\n * the reduction, so an array of all properties is unnecessary.\n *\n * @name propReduce\n * @param {FeatureCollection|Feature} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {\n * //=previousValue\n * //=currentProperties\n * //=featureIndex\n * return currentProperties\n * });\n */\nfunction propReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n propEach(geojson, function (currentProperties, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentProperties;\n else\n previousValue = callback(previousValue, currentProperties, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Callback for featureEach\n *\n * @callback featureEachCallback\n * @param {Feature<any>} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Iterate over features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name featureEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.featureEach(features, function (currentFeature, featureIndex) {\n * //=currentFeature\n * //=featureIndex\n * });\n */\nfunction featureEach(geojson, callback) {\n if (geojson.type === \"Feature\") {\n callback(geojson, 0);\n } else if (geojson.type === \"FeatureCollection\") {\n for (var i = 0; i < geojson.features.length; i++) {\n if (callback(geojson.features[i], i) === false) break;\n }\n }\n}\n\n/**\n * Callback for featureReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback featureReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name featureReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {\"foo\": \"bar\"}),\n * turf.point([36, 53], {\"hello\": \"world\"})\n * ]);\n *\n * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * return currentFeature\n * });\n */\nfunction featureReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n featureEach(geojson, function (currentFeature, featureIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentFeature;\n else previousValue = callback(previousValue, currentFeature, featureIndex);\n });\n return previousValue;\n}\n\n/**\n * Get all coordinates from any GeoJSON object.\n *\n * @name coordAll\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @returns {Array<Array<number>>} coordinate position array\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * var coords = turf.coordAll(features);\n * //= [[26, 37], [36, 53]]\n */\nfunction coordAll(geojson) {\n var coords = [];\n coordEach(geojson, function (coord) {\n coords.push(coord);\n });\n return coords;\n}\n\n/**\n * Callback for geomEach\n *\n * @callback geomEachCallback\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array<number>} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()\n *\n * @name geomEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @returns {void}\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * });\n */\nfunction geomEach(geojson, callback) {\n var i,\n j,\n g,\n geometry,\n stopG,\n geometryMaybeCollection,\n isGeometryCollection,\n featureProperties,\n featureBBox,\n featureId,\n featureIndex = 0,\n isFeatureCollection = geojson.type === \"FeatureCollection\",\n isFeature = geojson.type === \"Feature\",\n stop = isFeatureCollection ? geojson.features.length : 1;\n\n // This logic may look a little weird. The reason why it is that way\n // is because it's trying to be fast. GeoJSON supports multiple kinds\n // of objects at its root: FeatureCollection, Features, Geometries.\n // This function has the responsibility of handling all of them, and that\n // means that some of the `for` loops you see below actually just don't apply\n // to certain inputs. For instance, if you give this just a\n // Point geometry, then both loops are short-circuited and all we do\n // is gradually rename the input until it's called 'geometry'.\n //\n // This also aims to allocate as few resources as possible: just a\n // few numbers and booleans, rather than any temporary arrays as would\n // be required with the normalization approach.\n for (i = 0; i < stop; i++) {\n geometryMaybeCollection = isFeatureCollection\n ? geojson.features[i].geometry\n : isFeature\n ? geojson.geometry\n : geojson;\n featureProperties = isFeatureCollection\n ? geojson.features[i].properties\n : isFeature\n ? geojson.properties\n : {};\n featureBBox = isFeatureCollection\n ? geojson.features[i].bbox\n : isFeature\n ? geojson.bbox\n : undefined;\n featureId = isFeatureCollection\n ? geojson.features[i].id\n : isFeature\n ? geojson.id\n : undefined;\n isGeometryCollection = geometryMaybeCollection\n ? geometryMaybeCollection.type === \"GeometryCollection\"\n : false;\n stopG = isGeometryCollection\n ? geometryMaybeCollection.geometries.length\n : 1;\n\n for (g = 0; g < stopG; g++) {\n geometry = isGeometryCollection\n ? geometryMaybeCollection.geometries[g]\n : geometryMaybeCollection;\n\n // Handle null Geometry\n if (geometry === null) {\n if (\n callback(\n null,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n continue;\n }\n switch (geometry.type) {\n case \"Point\":\n case \"LineString\":\n case \"MultiPoint\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\": {\n if (\n callback(\n geometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n break;\n }\n case \"GeometryCollection\": {\n for (j = 0; j < geometry.geometries.length; j++) {\n if (\n callback(\n geometry.geometries[j],\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) === false\n )\n return false;\n }\n break;\n }\n default:\n throw new Error(\"Unknown Geometry Type\");\n }\n }\n // Only increase `featureIndex` per each feature\n featureIndex++;\n }\n}\n\n/**\n * Callback for geomReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback geomReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Geometry} currentGeometry The current Geometry being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {Object} featureProperties The current Feature Properties being processed.\n * @param {Array<number>} featureBBox The current Feature BBox being processed.\n * @param {number|string} featureId The current Feature Id being processed.\n */\n\n/**\n * Reduce geometry in any GeoJSON object, similar to Array.reduce().\n *\n * @name geomReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.point([36, 53], {hello: 'world'})\n * ]);\n *\n * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {\n * //=previousValue\n * //=currentGeometry\n * //=featureIndex\n * //=featureProperties\n * //=featureBBox\n * //=featureId\n * return currentGeometry\n * });\n */\nfunction geomReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n geomEach(\n geojson,\n function (\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n ) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentGeometry;\n else\n previousValue = callback(\n previousValue,\n currentGeometry,\n featureIndex,\n featureProperties,\n featureBBox,\n featureId\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for flattenEach\n *\n * @callback flattenEachCallback\n * @param {Feature} currentFeature The current flattened feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Iterate over flattened features in any GeoJSON object, similar to\n * Array.forEach.\n *\n * @name flattenEach\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * });\n */\nfunction flattenEach(geojson, callback) {\n geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {\n // Callback for single geometry\n var type = geometry === null ? null : geometry.type;\n switch (type) {\n case null:\n case \"Point\":\n case \"LineString\":\n case \"Polygon\":\n if (\n callback(\n feature(geometry, properties, { bbox: bbox, id: id }),\n featureIndex,\n 0\n ) === false\n )\n return false;\n return;\n }\n\n var geomType;\n\n // Callback for multi-geometry\n switch (type) {\n case \"MultiPoint\":\n geomType = \"Point\";\n break;\n case \"MultiLineString\":\n geomType = \"LineString\";\n break;\n case \"MultiPolygon\":\n geomType = \"Polygon\";\n break;\n }\n\n for (\n var multiFeatureIndex = 0;\n multiFeatureIndex < geometry.coordinates.length;\n multiFeatureIndex++\n ) {\n var coordinate = geometry.coordinates[multiFeatureIndex];\n var geom = {\n type: geomType,\n coordinates: coordinate,\n };\n if (\n callback(feature(geom, properties), featureIndex, multiFeatureIndex) ===\n false\n )\n return false;\n }\n });\n}\n\n/**\n * Callback for flattenReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback flattenReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature} currentFeature The current Feature being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n */\n\n/**\n * Reduce flattened features in any GeoJSON object, similar to Array.reduce().\n *\n * @name flattenReduce\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object\n * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var features = turf.featureCollection([\n * turf.point([26, 37], {foo: 'bar'}),\n * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})\n * ]);\n *\n * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {\n * //=previousValue\n * //=currentFeature\n * //=featureIndex\n * //=multiFeatureIndex\n * return currentFeature\n * });\n */\nfunction flattenReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n flattenEach(\n geojson,\n function (currentFeature, featureIndex, multiFeatureIndex) {\n if (\n featureIndex === 0 &&\n multiFeatureIndex === 0 &&\n initialValue === undefined\n )\n previousValue = currentFeature;\n else\n previousValue = callback(\n previousValue,\n currentFeature,\n featureIndex,\n multiFeatureIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for segmentEach\n *\n * @callback segmentEachCallback\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n * @returns {void}\n */\n\n/**\n * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //=currentSegment\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * //=segmentIndex\n * });\n *\n * // Calculate the total number of segments\n * var total = 0;\n * turf.segmentEach(polygon, function () {\n * total++;\n * });\n */\nfunction segmentEach(geojson, callback) {\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n var segmentIndex = 0;\n\n // Exclude null Geometries\n if (!feature.geometry) return;\n // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n var type = feature.geometry.type;\n if (type === \"Point\" || type === \"MultiPoint\") return;\n\n // Generate 2-vertex line segments\n var previousCoords;\n var previousFeatureIndex = 0;\n var previousMultiIndex = 0;\n var prevGeomIndex = 0;\n if (\n coordEach(\n feature,\n function (\n currentCoord,\n coordIndex,\n featureIndexCoord,\n multiPartIndexCoord,\n geometryIndex\n ) {\n // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`\n if (\n previousCoords === undefined ||\n featureIndex > previousFeatureIndex ||\n multiPartIndexCoord > previousMultiIndex ||\n geometryIndex > prevGeomIndex\n ) {\n previousCoords = currentCoord;\n previousFeatureIndex = featureIndex;\n previousMultiIndex = multiPartIndexCoord;\n prevGeomIndex = geometryIndex;\n segmentIndex = 0;\n return;\n }\n var currentSegment = lineString(\n [previousCoords, currentCoord],\n feature.properties\n );\n if (\n callback(\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) === false\n )\n return false;\n segmentIndex++;\n previousCoords = currentCoord;\n }\n ) === false\n )\n return false;\n });\n}\n\n/**\n * Callback for segmentReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback segmentReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentSegment The current Segment being processed.\n * @param {number} featureIndex The current index of the Feature being processed.\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.\n * @param {number} geometryIndex The current index of the Geometry being processed.\n * @param {number} segmentIndex The current index of the Segment being processed.\n */\n\n/**\n * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()\n * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON\n * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {void}\n * @example\n * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);\n *\n * // Iterate over GeoJSON by 2-vertex segments\n * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {\n * //= previousSegment\n * //= currentSegment\n * //= featureIndex\n * //= multiFeatureIndex\n * //= geometryIndex\n * //= segmentIndex\n * return currentSegment\n * });\n *\n * // Calculate the total number of segments\n * var initialValue = 0\n * var total = turf.segmentReduce(polygon, function (previousValue) {\n * previousValue++;\n * return previousValue;\n * }, initialValue);\n */\nfunction segmentReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n var started = false;\n segmentEach(\n geojson,\n function (\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n ) {\n if (started === false && initialValue === undefined)\n previousValue = currentSegment;\n else\n previousValue = callback(\n previousValue,\n currentSegment,\n featureIndex,\n multiFeatureIndex,\n geometryIndex,\n segmentIndex\n );\n started = true;\n }\n );\n return previousValue;\n}\n\n/**\n * Callback for lineEach\n *\n * @callback lineEachCallback\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,\n * similar to Array.forEach.\n *\n * @name lineEach\n * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object\n * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @example\n * var multiLine = turf.multiLineString([\n * [[26, 37], [35, 45]],\n * [[36, 53], [38, 50], [41, 55]]\n * ]);\n *\n * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * });\n */\nfunction lineEach(geojson, callback) {\n // validation\n if (!geojson) throw new Error(\"geojson is required\");\n\n flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {\n if (feature.geometry === null) return;\n var type = feature.geometry.type;\n var coords = feature.geometry.coordinates;\n switch (type) {\n case \"LineString\":\n if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false)\n return false;\n break;\n case \"Polygon\":\n for (\n var geometryIndex = 0;\n geometryIndex < coords.length;\n geometryIndex++\n ) {\n if (\n callback(\n lineString(coords[geometryIndex], feature.properties),\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n ) === false\n )\n return false;\n }\n break;\n }\n });\n}\n\n/**\n * Callback for lineReduce\n *\n * The first time the callback function is called, the values provided as arguments depend\n * on whether the reduce method has an initialValue argument.\n *\n * If an initialValue is provided to the reduce method:\n * - The previousValue argument is initialValue.\n * - The currentValue argument is the value of the first element present in the array.\n *\n * If an initialValue is not provided:\n * - The previousValue argument is the value of the first element present in the array.\n * - The currentValue argument is the value of the second element present in the array.\n *\n * @callback lineReduceCallback\n * @param {*} previousValue The accumulated value previously returned in the last invocation\n * of the callback, or initialValue, if supplied.\n * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.\n * @param {number} featureIndex The current index of the Feature being processed\n * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed\n * @param {number} geometryIndex The current index of the Geometry being processed\n */\n\n/**\n * Reduce features in any GeoJSON object, similar to Array.reduce().\n *\n * @name lineReduce\n * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object\n * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)\n * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.\n * @returns {*} The value that results from the reduction.\n * @example\n * var multiPoly = turf.multiPolygon([\n * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),\n * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])\n * ]);\n *\n * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n * //=previousValue\n * //=currentLine\n * //=featureIndex\n * //=multiFeatureIndex\n * //=geometryIndex\n * return currentLine\n * });\n */\nfunction lineReduce(geojson, callback, initialValue) {\n var previousValue = initialValue;\n lineEach(\n geojson,\n function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {\n if (featureIndex === 0 && initialValue === undefined)\n previousValue = currentLine;\n else\n previousValue = callback(\n previousValue,\n currentLine,\n featureIndex,\n multiFeatureIndex,\n geometryIndex\n );\n }\n );\n return previousValue;\n}\n\n/**\n * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n * Point & MultiPoint will always return null.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.segmentIndex=0] Segment Index\n * @param {Object} [options.properties={}] Translate Properties to output LineString\n * @param {BBox} [options.bbox={}] Translate BBox to output LineString\n * @param {number|string} [options.id={}] Translate Id to output LineString\n * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findSegment(multiLine);\n * // => Feature<LineString<[[10, 10], [50, 30]]>>\n *\n * // First Segment of 2nd Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: 1});\n * // => Feature<LineString<[[-10, -10], [-50, -30]]>>\n *\n * // Last Segment of Last Multi Feature\n * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});\n * // => Feature<LineString<[[-50, -30], [-30, -40]]>>\n */\nfunction findSegment(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var segmentIndex = options.segmentIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find SegmentIndex\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;\n return lineString(\n [coords[segmentIndex], coords[segmentIndex + 1]],\n properties,\n options\n );\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[geometryIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[geometryIndex][segmentIndex],\n coords[geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (segmentIndex < 0)\n segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][segmentIndex],\n coords[multiFeatureIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (segmentIndex < 0)\n segmentIndex =\n coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;\n return lineString(\n [\n coords[multiFeatureIndex][geometryIndex][segmentIndex],\n coords[multiFeatureIndex][geometryIndex][segmentIndex + 1],\n ],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\n/**\n * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.\n *\n * Negative indexes are permitted.\n *\n * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.featureIndex=0] Feature Index\n * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index\n * @param {number} [options.geometryIndex=0] Geometry Index\n * @param {number} [options.coordIndex=0] Coord Index\n * @param {Object} [options.properties={}] Translate Properties to output Point\n * @param {BBox} [options.bbox={}] Translate BBox to output Point\n * @param {number|string} [options.id={}] Translate Id to output Point\n * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point\n * @example\n * var multiLine = turf.multiLineString([\n * [[10, 10], [50, 30], [30, 40]],\n * [[-10, -10], [-50, -30], [-30, -40]]\n * ]);\n *\n * // First Segment (defaults are 0)\n * turf.findPoint(multiLine);\n * // => Feature<Point<[10, 10]>>\n *\n * // First Segment of the 2nd Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: 1});\n * // => Feature<Point<[-10, -10]>>\n *\n * // Last Segment of last Multi-Feature\n * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});\n * // => Feature<Point<[-30, -40]>>\n */\nfunction findPoint(geojson, options) {\n // Optional Parameters\n options = options || {};\n if (!isObject(options)) throw new Error(\"options is invalid\");\n var featureIndex = options.featureIndex || 0;\n var multiFeatureIndex = options.multiFeatureIndex || 0;\n var geometryIndex = options.geometryIndex || 0;\n var coordIndex = options.coordIndex || 0;\n\n // Find FeatureIndex\n var properties = options.properties;\n var geometry;\n\n switch (geojson.type) {\n case \"FeatureCollection\":\n if (featureIndex < 0)\n featureIndex = geojson.features.length + featureIndex;\n properties = properties || geojson.features[featureIndex].properties;\n geometry = geojson.features[featureIndex].geometry;\n break;\n case \"Feature\":\n properties = properties || geojson.properties;\n geometry = geojson.geometry;\n break;\n case \"Point\":\n case \"MultiPoint\":\n return null;\n case \"LineString\":\n case \"Polygon\":\n case \"MultiLineString\":\n case \"MultiPolygon\":\n geometry = geojson;\n break;\n default:\n throw new Error(\"geojson is invalid\");\n }\n\n // Find Coord Index\n if (geometry === null) return null;\n var coords = geometry.coordinates;\n switch (geometry.type) {\n case \"Point\":\n return point(coords, properties, options);\n case \"MultiPoint\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n return point(coords[multiFeatureIndex], properties, options);\n case \"LineString\":\n if (coordIndex < 0) coordIndex = coords.length + coordIndex;\n return point(coords[coordIndex], properties, options);\n case \"Polygon\":\n if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;\n if (coordIndex < 0)\n coordIndex = coords[geometryIndex].length + coordIndex;\n return point(coords[geometryIndex][coordIndex], properties, options);\n case \"MultiLineString\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (coordIndex < 0)\n coordIndex = coords[multiFeatureIndex].length + coordIndex;\n return point(coords[multiFeatureIndex][coordIndex], properties, options);\n case \"MultiPolygon\":\n if (multiFeatureIndex < 0)\n multiFeatureIndex = coords.length + multiFeatureIndex;\n if (geometryIndex < 0)\n geometryIndex = coords[multiFeatureIndex].length + geometryIndex;\n if (coordIndex < 0)\n coordIndex =\n coords[multiFeatureIndex][geometryIndex].length - coordIndex;\n return point(\n coords[multiFeatureIndex][geometryIndex][coordIndex],\n properties,\n options\n );\n }\n throw new Error(\"geojson is invalid\");\n}\n\nexport { coordAll, coordEach, coordReduce, featureEach, featureReduce, findPoint, findSegment, flattenEach, flattenReduce, geomEach, geomReduce, lineEach, lineReduce, propEach, propReduce, segmentEach, segmentReduce };\n", "/**\n * @module helpers\n */\n/**\n * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.\n *\n * @memberof helpers\n * @type {number}\n */\nexport var earthRadius = 6371008.8;\n/**\n * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.\n *\n * @memberof helpers\n * @type {Object}\n */\nexport var factors = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: earthRadius / 111325,\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936,\n};\n/**\n * Units of measurement factors based on 1 meter.\n *\n * @memberof helpers\n * @type {Object}\n */\nexport var unitsFactors = {\n centimeters: 100,\n centimetres: 100,\n degrees: 1 / 111325,\n feet: 3.28084,\n inches: 39.37,\n kilometers: 1 / 1000,\n kilometres: 1 / 1000,\n meters: 1,\n metres: 1,\n miles: 1 / 1609.344,\n millimeters: 1000,\n millimetres: 1000,\n nauticalmiles: 1 / 1852,\n radians: 1 / earthRadius,\n yards: 1.0936133,\n};\n/**\n * Area of measurement factors based on 1 square meter.\n *\n * @memberof helpers\n * @type {Object}\n */\nexport var areaFactors = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046,\n};\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @name feature\n * @param {Geometry} geometry input geometry\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nexport function feature(geom, properties, options) {\n if (options === void 0) { options = {}; }\n var feat = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @name geometry\n * @param {string} type Geometry Type\n * @param {Array<any>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\nexport function geometry(type, coordinates, _options) {\n if (_options === void 0) { _options = {}; }\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @name point\n * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nexport function point(coordinates, properties, options) {\n if (options === void 0) { options = {}; }\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n var geom = {\n type: \"Point\",\n coordinates: coordinates,\n };\n return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @name points\n * @param {Array<Array<number>>} coordinates an array of Points\n * @param {Object} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\nexport function points(coordinates, properties, options) {\n if (options === void 0) { options = {}; }\n return featureCollection(coordinates.map(function (coords) {\n return point(coords, properties);\n }), options);\n}\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @name polygon\n * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nexport function polygon(coordinates, properties, options) {\n if (options === void 0) { options = {}; }\n for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {\n var ring = coordinates_1[_i];\n if (ring.length < 4) {\n throw new Error(\"Each LinearRing of a Polygon must have 4 or more Positions.\");\n }\n for (var j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n var geom = {\n type: \"Polygon\",\n coordinates: coordinates,\n };\n return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @name polygons\n * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nexport function polygons(coordinates, properties, options) {\n if (options === void 0) { options = {}; }\n return featureCollection(coordinates.map(function (coords) {\n return polygon(coords, properties);\n }), options);\n}\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @name lineString\n * @param {Array<Array<number>>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nexport function lineString(coordinates, properties, options) {\n if (options === void 0) { options = {}; }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n var geom = {\n type: \"LineString\",\n coordinates: coordinates,\n };\n return feature(geom, properties, options);\n}\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @name lineStrings\n * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nexport function lineStrings(coordinates, properties, options) {\n if (options === void 0) { options = {}; }\n return featureCollection(coordinates.map(function (coords) {\n return lineString(coords, properties);\n }), options);\n}\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @name featureCollection\n * @param {Feature[]} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\nexport function featureCollection(features, options) {\n if (options === void 0) { options = {}; }\n var fc = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\n/**\n * Creates a {@link Feature<MultiLineString>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiLineString\n * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nexport function multiLineString(coordinates, properties, options) {\n if (options === void 0) { options = {}; }\n var geom = {\n type: \"MultiLineString\",\n coordinates: coordinates,\n };\n return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature<MultiPoint>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPoint\n * @param {Array<Array<number>>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nexport function multiPoint(coordinates, properties, options) {\n if (options === void 0) { options = {}; }\n var geom = {\n type: \"MultiPoint\",\n coordinates: coordinates,\n };\n return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature<MultiPolygon>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPolygon\n * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nexport function multiPolygon(coordinates, properties, options) {\n if (options === void 0) { options = {}; }\n var geom = {\n type: \"MultiPolygon\",\n coordinates: coordinates,\n };\n return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature<GeometryCollection>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name geometryCollection\n * @param {Array<Geometry>} geometries an array of GeoJSON Geometries\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\nexport function geometryCollection(geometries, properties, options) {\n if (options === void 0) { options = {}; }\n var geom = {\n type: \"GeometryCollection\",\n geometries: geometries,\n };\n return feature(geom, properties, options);\n}\n/**\n * Round number to precision\n *\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nexport function round(num, precision) {\n if (precision === void 0) { precision = 0; }\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name radiansToLength\n * @param {number} radians in radians across the sphere\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\nexport function radiansToLength(radians, units) {\n if (units === void 0) { units = \"kilometers\"; }\n var factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name lengthToRadians\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\nexport function lengthToRadians(distance, units) {\n if (units === void 0) { units = \"kilometers\"; }\n var factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @name lengthToDegrees\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nexport function lengthToDegrees(distance, units) {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @name bearingToAzimuth\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nexport function bearingToAzimuth(bearing) {\n var angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\n/**\n * Converts an angle in radians to degrees\n *\n * @name radiansToDegrees\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nexport function radiansToDegrees(radians) {\n var degrees = radians % (2 * Math.PI);\n return (degrees * 180) / Math.PI;\n}\n/**\n * Converts an angle in degrees to radians\n *\n * @name degreesToRadians\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nexport function degreesToRadians(degrees) {\n var radians = degrees % 360;\n return (radians * Math.PI) / 180;\n}\n/**\n * Converts a length to the requested unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @param {number} length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] of the length\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted length\n */\nexport function convertLength(length, originalUnit, finalUnit) {\n if (originalUnit === void 0) { originalUnit = \"kilometers\"; }\n if (finalUnit === void 0) { finalUnit = \"kilometers\"; }\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n/**\n * Converts a area to the requested unit.\n * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches, hectares\n * @param {number} area to be converted\n * @param {Units} [originalUnit=\"meters\"] of the distance\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted area\n */\nexport function convertArea(area, originalUnit, finalUnit) {\n if (originalUnit === void 0) { originalUnit = \"meters\"; }\n if (finalUnit === void 0) { finalUnit = \"kilometers\"; }\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n var startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n var finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n return (area / startFactor) * finalFactor;\n}\n/**\n * isNumber\n *\n * @param {*} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nexport function isNumber(num) {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n/**\n * isObject\n *\n * @param {*} input variable to validate\n * @returns {boolean} true/false\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nexport function isObject(input) {\n return !!input && input.constructor === Object;\n}\n/**\n * Validate BBox\n *\n * @private\n * @param {Array<number>} bbox BBox to validate\n * @returns {void}\n * @throws Error if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nexport function validateBBox(bbox) {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach(function (num) {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n/**\n * Validate Id\n *\n * @private\n * @param {string|number} id Id to validate\n * @returns {void}\n * @throws Error if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nexport function validateId(id) {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n", "import { isColor, Logger } from '@packages/internal/common';\nimport type { BevelState, LineStyle, Shading } from '../../types';\nimport { DEFAULT_BORDER_WIDTH } from '../../systems/border/system';\n\nexport const DEFAULT_COLOR = '#ffffff';\nconst DEFAULT_WALL_WIDTH = 0.1;\nexport const DEFAULT_HEIGHT = 0.1;\n\n/**\n * Determines how a material is rendered, back face, front face or both (default)\n */\nexport type MaterialSide = 'back' | 'front' | 'double';\n\ntype Style = {\n\tcolor: string;\n\twidth: number;\n\topacity: number;\n\tvisible: boolean;\n\theight: number;\n\taltitude: number;\n\tjoin: LineStyle['join'];\n\tcap: LineStyle['cap'];\n\ttopColor?: string;\n\ttexture?: string;\n\ttopTexture?: string;\n\tshowImage: boolean;\n\tflipImageToFaceCamera: boolean;\n\tenableImageCollisions: boolean;\n\turl?: string;\n\tside?: MaterialSide;\n\trenderOrder?: number;\n\tshading?: Shading;\n\tbevel?: BevelState;\n\tborderVisible: boolean;\n\tborderColor?: string;\n\tborderWidth?: number;\n};\n\nexport class StyleComponent implements Style {\n\tinitialColor = DEFAULT_COLOR;\n\t#color = DEFAULT_COLOR;\n\tset color(color: string) {\n\t\tif (isColor(color)) {\n\t\t\tthis.#color = color;\n\t\t} else {\n\t\t\tLogger.warn(`Failed to update color. Invalid color \"${color}\".`);\n\t\t}\n\t}\n\tget color(): string {\n\t\treturn this.#color;\n\t}\n\tinitialTopColor?: string;\n\t#topColor?: string;\n\tset topColor(color: string | undefined) {\n\t\t// topColor may be undefined to unset it\n\t\tif (color === undefined || isColor(color)) {\n\t\t\tthis.#topColor = color;\n\t\t} else {\n\t\t\tLogger.warn(`Failed to update top color. Invalid color \"${color}\".`);\n\t\t}\n\t}\n\tget topColor(): string | undefined {\n\t\treturn this.#topColor;\n\t}\n\ttopTexture?: string;\n\ttexture?: string;\n\t#hoverColor?: string;\n\tset hoverColor(color: string) {\n\t\tif (isColor(color)) {\n\t\t\tthis.#hoverColor = color;\n\t\t} else {\n\t\t\tLogger.warn(`Failed to update hover color. Invalid color \"${color}\".`);\n\t\t}\n\t}\n\tget hoverColor(): string | undefined {\n\t\treturn this.#hoverColor;\n\t}\n\tdirty = true;\n\tvisible = true;\n\topacity = 1;\n\twidth = DEFAULT_WALL_WIDTH;\n\theight = DEFAULT_HEIGHT;\n\tinitialHeight = DEFAULT_HEIGHT;\n\taltitude = 0;\n\tjoin: LineStyle['join'] = 'round';\n\tcap: LineStyle['cap'] = 'round';\n\tshowImage = true;\n\tflipImageToFaceCamera = true;\n\tenableImageCollisions = false;\n\turl?: string;\n\tside: MaterialSide = 'double';\n\trenderOrder = 0;\n\tshading?: Shading;\n\tbevel?: BevelState;\n\tborderVisible = false;\n\tborderColor: string;\n\tborderWidth: number;\n\tconstructor(style: Partial<Style> = {}) {\n\t\tthis.color = style?.color !== undefined ? style.color : this.color;\n\t\tthis.initialColor = this.color;\n\t\tthis.width = style?.width !== undefined ? style.width : this.width;\n\t\tthis.opacity = style?.opacity !== undefined ? style.opacity : this.opacity;\n\t\tthis.visible = style?.visible !== undefined ? style.visible : this.visible;\n\t\tthis.height = style?.height !== undefined ? style.height : this.height;\n\t\tthis.initialHeight = this.height;\n\t\tthis.altitude = style?.altitude !== undefined ? style.altitude : this.altitude;\n\t\tthis.join = style?.join !== undefined ? style.join : this.join;\n\t\tthis.cap = style?.cap !== undefined ? style.cap : this.cap;\n\t\tthis.topColor = style?.topColor;\n\t\tthis.initialTopColor = this.topColor;\n\t\tthis.texture = style?.texture;\n\t\tthis.topTexture = style?.topTexture;\n\t\tthis.showImage = style?.showImage !== undefined ? style.showImage : this.showImage;\n\t\tthis.flipImageToFaceCamera =\n\t\t\tstyle?.flipImageToFaceCamera !== undefined ? style.flipImageToFaceCamera : this.flipImageToFaceCamera;\n\t\tthis.url = style?.url;\n\t\tthis.side = style?.side !== undefined ? style.side : this.side;\n\t\tthis.renderOrder = style?.renderOrder !== undefined ? style.renderOrder : this.renderOrder;\n\t\tthis.shading = style?.shading;\n\t\tthis.bevel = style?.bevel;\n\t\tthis.borderVisible = style?.borderVisible !== undefined ? style.borderVisible : this.borderVisible;\n\t\tthis.borderColor = style?.borderColor !== undefined ? style.borderColor : this.color;\n\t\tthis.borderWidth = style?.borderWidth !== undefined ? style.borderWidth : DEFAULT_BORDER_WIDTH;\n\t\tthis.enableImageCollisions =\n\t\t\tstyle?.enableImageCollisions !== undefined ? style.enableImageCollisions : this.enableImageCollisions;\n\t}\n}\n", "import { type BufferGeometry, Mesh, MeshBasicMaterial, Object3D } from 'three';\nimport type { LineString, Feature, RendererCore, Polygon, MultiLineString } from '../..';\nimport type { BorderComponent } from '../../components/border';\nimport { MeshComponent } from '../../components/mesh';\nimport type { StyleComponent } from '../../components/styles';\nimport { Geometry3DComponents } from '../../entities';\nimport { renderLineStringGeometry } from '../../geometry/line-string';\nimport type { EntityTypes, RendererState } from '../../renderer';\nimport polygonToLine from '@turf/polygon-to-line';\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\nimport { destroyObject3D } from '../../utils/object3d-destroy';\nimport { Logger } from '@packages/internal/common';\nimport { filterPolygonVerticesByAngle, isValidPolygon } from './utils';\n\nexport const DEFAULT_BORDER_COLOR = 'gray';\nexport const DEFAULT_BORDER_WIDTH = 0.1;\n// number of degrees below which vertical lines are removed, to make borders look better\nconst CLEANUP_DEGREES = 15;\nexport const XRAY_OPACITY = 0.25;\n\nexport class BorderSystem {\n\trendererState: RendererState;\n\tdirty = false;\n\tconvertTo3DMapPosition: RendererCore['convertTo3DMapPosition'];\n\tconstructor(rendererState: RendererState, convertTo3DMapPosition: RendererCore['convertTo3DMapPosition']) {\n\t\tthis.rendererState = rendererState;\n\t\tthis.convertTo3DMapPosition = convertTo3DMapPosition;\n\t}\n\n\tupdate() {\n\t\tlet entity: EntityTypes | undefined;\n\t\tlet style: StyleComponent;\n\t\tlet border: BorderComponent | undefined;\n\t\tlet meshComponent: MeshComponent | undefined;\n\t\tfor (const entityId of this.rendererState.geometry3DIdsInScene) {\n\t\t\tentity = this.rendererState.geometry3DMap.get(entityId);\n\t\t\tif (entity != null) {\n\t\t\t\tmeshComponent = entity.components[Geometry3DComponents.Mesh] as MeshComponent;\n\t\t\t\tstyle = entity.components[Geometry3DComponents.Style] as StyleComponent;\n\t\t\t\tif (\n\t\t\t\t\tentity.type === 'geometry' &&\n\t\t\t\t\tmeshComponent instanceof MeshComponent &&\n\t\t\t\t\tisValidPolygon(meshComponent.feature as Feature<Polygon, any>)\n\t\t\t\t) {\n\t\t\t\t\tborder = entity.components[Geometry3DComponents.Border];\n\n\t\t\t\t\tif (border?.dirty) {\n\t\t\t\t\t\tif (border.mesh == null) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst mesh = this.buildBorder(meshComponent.feature as Feature<Polygon, any>, style, border);\n\t\t\t\t\t\t\t\tmeshComponent.mesh?.add(mesh);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tLogger.error(error);\n\t\t\t\t\t\t\t\tborder.dirty = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tborder.mesh?.children.forEach(child => {\n\t\t\t\t\t\t\tif (border) {\n\t\t\t\t\t\t\t\t((child as Mesh).material as MeshBasicMaterial).color.set(style.borderColor);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tborder.dirty = false;\n\t\t\t\t\t\tborder.visible = style.borderVisible;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (border?.needsRebuild) {\n\t\t\t\t\t\tdestroyObject3D(border.mesh!);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst mesh = this.buildBorder(meshComponent.feature as Feature<Polygon, any>, style, border);\n\t\t\t\t\t\t\tmeshComponent.mesh?.add(mesh);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tLogger.error(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tborder.needsRebuild = false;\n\t\t\t\t\t\tborder.visible = style.borderVisible;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate colorToMaterialCache: Record<string, [MeshBasicMaterial, MeshBasicMaterial]> = {};\n\n\tprivate buildBorder(feature: Feature<Polygon, any>, styleComponent: StyleComponent, border: BorderComponent) {\n\t\t// Use original polygon for top and bottom borders to maintain full detail\n\t\tconst originalLine = polygonToLine(feature) as Feature<LineString | MultiLineString, any>;\n\n\t\t// Use filtered polygon for vertical lines to reduce complexity\n\t\tconst filteredFeature = filterPolygonVerticesByAngle(feature, CLEANUP_DEGREES);\n\t\t// filter out vertices that don't form angles of higher than the specified threshold\n\t\tconst filteredLine = polygonToLine(filteredFeature) as Feature<LineString | MultiLineString, any>;\n\t\tconst borderWidth = styleComponent.borderWidth / 2;\n\t\tconst borderColor = styleComponent.borderColor;\n\n\t\t// render the complete polygon for the bottom border\n\t\tconst bottomBorder = renderLineStringGeometry(\n\t\t\toriginalLine as Feature<LineString, any>,\n\t\t\tthis.convertTo3DMapPosition,\n\t\t\t{\n\t\t\t\twidth: borderWidth,\n\t\t\t\theight: borderWidth,\n\t\t\t\tcolor: borderColor,\n\t\t\t\tcap: 'square',\n\t\t\t},\n\t\t);\n\n\t\t// clone the bottom border for the top border and translate it up by the height of the polygon\n\t\tconst topBorder = bottomBorder.clone();\n\t\ttopBorder.translate(0, 0, styleComponent.height);\n\n\t\t// Handle both LineString and MultiLineString geometries for vertical lines (using filtered coordinates)\n\t\tlet coordinates: number[][];\n\t\tif (filteredLine.geometry.type === 'LineString') {\n\t\t\tcoordinates = filteredLine.geometry.coordinates;\n\t\t} else {\n\t\t\t// For MultiLineString, flatten all coordinate arrays\n\t\t\tcoordinates = filteredLine.geometry.coordinates.flat();\n\t\t}\n\n\t\tconst verticalGeometries: BufferGeometry[] = [];\n\n\t\t// remove the last coordinate as it is the same as the first coordinate\n\t\tcoordinates.pop();\n\n\t\tfor (const c of coordinates || []) {\n\t\t\ttry {\n\t\t\t\tconst geometry = renderLineStringGeometry(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'Feature',\n\t\t\t\t\t\tgeometry: {\n\t\t\t\t\t\t\ttype: 'LineString',\n\t\t\t\t\t\t\tcoordinates: [\n\t\t\t\t\t\t\t\t[c[0], c[1], 0],\n\t\t\t\t\t\t\t\t[c[0], c[1], styleComponent.height],\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t},\n\t\t\t\t\tthis.convertTo3DMapPosition,\n\t\t\t\t\t{\n\t\t\t\t\t\twidth: borderWidth,\n\t\t\t\t\t\theight: borderWidth,\n\t\t\t\t\t\tcolor: borderColor,\n\t\t\t\t\t\tcap: 'butt',\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tverticalGeometries.push(geometry);\n\t\t\t} catch (error) {\n\t\t\t\tLogger.warn(error);\n\t\t\t}\n\t\t}\n\n\t\t// merge all the geometries into one\n\t\tconst merged = BufferGeometryUtils.mergeGeometries([bottomBorder, topBorder, ...verticalGeometries]);\n\n\t\t// create/cache a material for the border\n\t\tlet material = this.colorToMaterialCache[borderColor]?.[0];\n\t\tif (material == null) {\n\t\t\tmaterial = new MeshBasicMaterial({ color: borderColor });\n\t\t}\n\t\tlet xrayMaterial = this.colorToMaterialCache[borderColor]?.[1];\n\t\tif (xrayMaterial == null) {\n\t\t\txrayMaterial = new MeshBasicMaterial({ color: borderColor });\n\t\t}\n\n\t\tthis.colorToMaterialCache[borderColor] = [material, xrayMaterial];\n\n\t\tconst object = new Object3D();\n\n\t\tconst mesh = new Mesh(merged, material);\n\t\tconst xrayMesh = new Mesh(merged, xrayMaterial);\n\t\tobject.add(mesh);\n\t\tobject.add(xrayMesh);\n\t\txrayMesh.material.depthWrite = false;\n\t\txrayMesh.material.depthTest = false;\n\t\txrayMesh.material.opacity = XRAY_OPACITY;\n\t\txrayMesh.material.transparent = true;\n\n\t\tobject.position.z = styleComponent.altitude ?? 0;\n\n\t\tborder.mesh = object;\n\t\treturn object;\n\t}\n\n\tdestroy() {\n\t\tfor (const [_, [material, xrayMaterial]] of Object.entries(this.colorToMaterialCache)) {\n\t\t\tmaterial.dispose();\n\t\t\txrayMaterial.dispose();\n\t\t}\n\t\tthis.colorToMaterialCache = {};\n\t}\n}\n", "export { updateInteractivity } from './utils';\nexport { Geometry2D, Geometry2DComponents } from './geometry2d';\nexport { Geometry3D, Geometry3DComponents } from './geometry3d';\nexport type {\n\tPathMesh,\n\tPatMeshContainer,\n\tPathMaterial,\n\tGeometry3DTypes,\n\tImageGeometry3D,\n\tTextGeometry3D,\n\tModelGeometry3D,\n\tCustomGeometry3D,\n\tMeshGeometry3D,\n} from './geometry3d';\n", "import type { CollisionRankingTier, GeometryState, LabelState, LabelTextPlacement, ModelState, RendererCore } from '..';\nimport type { CustomGeometryComponent } from '../components/custom';\nimport { InteractionComponent } from '../components/interaction';\nimport LabelComponent from '../components/label';\nimport { validateLabelOptions, isOneOfPinDirtyOptions, isOneOfTextDirtyOptions } from '../components/label-utils';\nimport { addMarkerOptionsSchema, type MarkerComponent, type MarkerState } from '../components/marker';\nimport type { PathUpdateState } from '../components/path';\nimport type { EntityTypes, All3DTypes, Position, RendererState } from '../renderer';\nimport type { KeysOfUnion } from '../utils';\nimport { mergeObjects, pick, isEmpty } from '../utils';\nimport { convertCollisionRankingTierToNumber } from '../utils/collision-ranking-tier';\nimport { GeometryGroupObject3D } from './geometry-group';\nimport { GroupContainerComponents, GroupContainerObject3D } from './group-container';\nimport { Geometry3D, Geometry3DComponents, Geometry3DObject3D } from './geometry3d';\nimport type { ModelGeometry3D, Geometry3DTypes, TextGeometry3D, ImageGeometry3D } from './geometry3d';\nimport { Geometry2D, Geometry2DComponents, Geometry2DObject3D } from './geometry2d';\nimport type { StyleComponent } from '../components/styles/style';\nimport { MeshComponent } from '../components/mesh';\nimport type { GeometryGroupStyleComponent } from '../components/geometry-group-style';\n\nimport { Logger } from '@packages/internal/common';\nimport { updateText3DStateSchema, type Text3DState, type UpdatableText3DState } from '../components/text3d';\nimport { OutlineComponent } from '../components/outline';\nimport { darkenColorForOutline } from '../systems/mesh-creation-and-optimization/utils';\nimport { FocusableComponent } from '../components/focusable';\nimport { BorderComponent } from '../components/border';\nimport type { MarkerPlacement } from '../components/marker-utils';\n\nexport function updateInteractivity(\n\tentity: All3DTypes | Geometry2D,\n\tupdate: boolean | undefined,\n\tstate: RendererState,\n) {\n\tif (update !== undefined) {\n\t\tif (\n\t\t\tentity.type === 'model' ||\n\t\t\tentity.type === 'path' ||\n\t\t\tentity.type === 'marker' ||\n\t\t\tentity.type === 'label' ||\n\t\t\tentity.type === 'geometry' ||\n\t\t\tentity.type === 'group-container' ||\n\t\t\tentity.type === 'custom-geometry'\n\t\t) {\n\t\t\tif (update === true) {\n\t\t\t\tif (entity instanceof Geometry2D && entity.components[Geometry2DComponents.Interaction] === undefined) {\n\t\t\t\t\tentity.components[Geometry2DComponents.Interaction] = new InteractionComponent();\n\t\t\t\t\tentity.components[Geometry2DComponents.Interaction].dirty = true;\n\t\t\t\t} else if (entity instanceof Geometry3D && entity.components[Geometry3DComponents.Interaction] === undefined) {\n\t\t\t\t\tentity.components[Geometry3DComponents.Interaction] = new InteractionComponent();\n\t\t\t\t\tentity.components[Geometry3DComponents.Interaction].dirty = true;\n\t\t\t\t} else if (\n\t\t\t\t\tentity instanceof GroupContainerObject3D &&\n\t\t\t\t\tentity.components[GroupContainerComponents.Interaction] === undefined\n\t\t\t\t) {\n\t\t\t\t\tentity.components[GroupContainerComponents.Interaction] = new InteractionComponent();\n\t\t\t\t\tentity.components[GroupContainerComponents.Interaction].dirty = true;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tif (entity instanceof Geometry2D) {\n\t\t\t\t\tentity.components[Geometry2DComponents.Interaction] = undefined;\n\t\t\t\t} else if (entity instanceof Geometry3D) {\n\t\t\t\t\tentity.components[Geometry3DComponents.Interaction] = undefined;\n\t\t\t\t} else if (entity instanceof GroupContainerObject3D) {\n\t\t\t\t\tentity.components[GroupContainerComponents.Interaction] = undefined;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (entity.type === 'geometry-group') {\n\t\t\tlet child;\n\t\t\tfor (const entityId of entity.userData.entities3D.values()) {\n\t\t\t\tchild = state.geometry3DMap.get(entityId) as Geometry3D | undefined;\n\t\t\t\tupdateInteractivity(child, update, state);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateGroupColor(\n\tentity: GeometryGroupObject3D,\n\tstate: RendererState,\n\tupdate: Partial<Pick<GeometryState, 'color' | 'topColor'>>,\n) {\n\tif (!update?.color && !('topColor' in update)) return;\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry-group') {\n\t\t\tlet childEntity: All3DTypes | undefined;\n\t\t\tfor (const childEntityId of entity.userData.entities3D.values()) {\n\t\t\t\tchildEntity = state.geometry3DMap.get(childEntityId);\n\t\t\t\tif (childEntity) {\n\t\t\t\t\tupdateColor(childEntity, update);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateShading(entity: Geometry3D, update?: StyleComponent['shading']) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry') {\n\t\t\tentity.components[Geometry3DComponents.Style].shading = update;\n\t\t\tentity.components[Geometry3DComponents.Style].dirty = true;\n\t\t}\n\t}\n}\n\nexport function updateGroupShading(\n\tentity: GeometryGroupObject3D,\n\tstate: RendererState,\n\tupdate?: StyleComponent['shading'],\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry-group') {\n\t\t\tfor (const entityId of entity.userData.entities3D.values()) {\n\t\t\t\tconst child = state.geometry3DMap.get(entityId) as Geometry3D | undefined;\n\t\t\t\tif (child) {\n\t\t\t\t\tupdateShading(child, update);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateImageProps(\n\tentity: Geometry3D | Geometry2D | GeometryGroupObject3D | GroupContainerObject3D,\n\tupdate?: Partial<GeometryState>,\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry') {\n\t\t\tif (update.showImage !== undefined) {\n\t\t\t\tentity.components[Geometry3DComponents.Style].showImage = update.showImage;\n\t\t\t}\n\t\t\tif (update.flipImageToFaceCamera !== undefined) {\n\t\t\t\tentity.components[Geometry3DComponents.Style].flipImageToFaceCamera = update.flipImageToFaceCamera;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function updateHeight(entity: Geometry3D | GeometryGroupObject3D, state: RendererState, update?: number) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry') {\n\t\t\tconst style = entity.components[Geometry3DComponents.Style];\n\t\t\tif (style.height !== update) {\n\t\t\t\tstyle.height = update;\n\t\t\t\tstyle.dirty = true;\n\t\t\t\tif (entity.components[Geometry3DComponents.Outline]) {\n\t\t\t\t\tentity.components[Geometry3DComponents.Outline].dirty = true;\n\t\t\t\t}\n\t\t\t\tif (entity.components[Geometry3DComponents.Border]) {\n\t\t\t\t\tentity.components[Geometry3DComponents.Border].needsRebuild = true;\n\t\t\t\t\tentity.components[Geometry3DComponents.Border].dirty = true;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (entity.type === 'geometry-group') {\n\t\t\tfor (const entityId of entity.userData.entities3D.values()) {\n\t\t\t\tconst child = state.geometry3DMap.get(entityId) as Geometry3D | undefined;\n\t\t\t\tif (child?.type === 'geometry' || child?.type === 'model') {\n\t\t\t\t\tupdateHeight(child, state, update);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateColor(\n\tentity: Geometry3DTypes | Geometry2D | GeometryGroupObject3D | GroupContainerObject3D,\n\tupdate?: Partial<GeometryState>,\n) {\n\tif (update !== undefined) {\n\t\tlet needsDirty = false;\n\t\tif (entity.type === 'path' || entity.type === 'geometry') {\n\t\t\tif (\n\t\t\t\tupdate.initialColor !== undefined &&\n\t\t\t\tupdate.initialColor !== entity.components[Geometry3DComponents.Style].initialColor\n\t\t\t) {\n\t\t\t\tentity.components[Geometry3DComponents.Style].initialColor = update.initialColor;\n\t\t\t\tneedsDirty = true;\n\t\t\t}\n\t\t\tif (update.color !== undefined && update.color !== entity.components[Geometry3DComponents.Style].color) {\n\t\t\t\tentity.components[Geometry3DComponents.Style].color = update.color;\n\t\t\t\tneedsDirty = true;\n\t\t\t\tif (entity.components[Geometry3DComponents.Outline]) {\n\t\t\t\t\tentity.components[Geometry3DComponents.Outline].color = darkenColorForOutline(update.color);\n\t\t\t\t\tentity.components[Geometry3DComponents.Outline].dirty = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// topColor may be undefined to unset it\n\t\t\tif ('topColor' in update) {\n\t\t\t\tentity.components[Geometry3DComponents.Style].topColor = update.topColor;\n\t\t\t\tneedsDirty = true;\n\t\t\t}\n\n\t\t\tif (needsDirty) {\n\t\t\t\tentity.components[Geometry3DComponents.Style].dirty = true;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function updatePosition(\n\tentity: EntityTypes,\n\tupdate: Position | undefined,\n\tconvertTo3DMapPosition: RendererCore['convertTo3DMapPosition'],\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'label' || entity.type === 'marker') {\n\t\t\tentity.updatePosition(convertTo3DMapPosition(update[1], update[0], update[2] || 0));\n\t\t} else if (entity.type === 'custom-geometry') {\n\t\t\tconst component = entity.components[Geometry3DComponents.Mesh] as CustomGeometryComponent;\n\t\t\tcomponent.position.copy(convertTo3DMapPosition(update[1], update[0], update[2] || 0));\n\t\t}\n\t}\n}\n\nexport function updateParent(entity: EntityTypes, update: GroupContainerObject3D | undefined) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'marker' || entity.type === 'label' || entity.type === 'custom-geometry') {\n\t\t\tif (entity.parentObject3D !== update && entity.parentObject3D instanceof GroupContainerObject3D) {\n\t\t\t\tentity.parentObject3D?.removeEntity(entity);\n\t\t\t\tupdate.addEntity(entity);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateEnabled(\n\tentity: Geometry3D | Geometry2D | GeometryGroupObject3D | GroupContainerObject3D,\n\tupdate: boolean | undefined,\n) {\n\tif (update !== undefined) {\n\t\tif (\n\t\t\t(entity.type === 'marker' || entity.type === 'label') &&\n\t\t\tentity.components[Geometry2DComponents.UI].enabled !== update\n\t\t) {\n\t\t\tentity.components[Geometry2DComponents.UI].enabled = update;\n\t\t}\n\t}\n}\n\nexport function updateMarker(\n\tentity: Geometry3D | Geometry2D | GeometryGroupObject3D | GroupContainerObject3D,\n\tupdate: Partial<MarkerState> | undefined,\n\tstate: RendererState,\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'marker') {\n\t\t\tconst component = entity.components[Geometry2DComponents.UI] as MarkerComponent;\n\t\t\tif (update.contentHTML !== undefined) {\n\t\t\t\tcomponent.containerEl.innerHTML = update.contentHTML;\n\t\t\t\tcomponent.contentHtml = update.contentHTML;\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (updatePlacement(entity, update.placement)) {\n\t\t\t\tcomponent.collisionDirty = true;\n\t\t\t}\n\t\t\tif (update.dynamicResize !== undefined) {\n\t\t\t\tcomponent.options.dynamicResize = update.dynamicResize;\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (update.options != null) {\n\t\t\t\ttry {\n\t\t\t\t\taddMarkerOptionsSchema.parse(update.options || {});\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tLogger.error(error);\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (update.options.interactive != null) {\n\t\t\t\t\tif (update.options.interactive === 'pointer-events-auto') {\n\t\t\t\t\t\tcomponent.pointerEvents = 'auto';\n\t\t\t\t\t\tupdateInteractivity(entity, false, state);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcomponent.pointerEvents = 'none';\n\t\t\t\t\t\tupdateInteractivity(entity, update.options.interactive, state);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tupdateRank(entity, update.options.rank);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateRank(\n\tentity: Geometry3D | Geometry2D | GeometryGroupObject3D | GroupContainerObject3D,\n\tupdate: CollisionRankingTier | undefined,\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'marker' || entity.type === 'label') {\n\t\t\tentity.components[Geometry2DComponents.UI].rank = convertCollisionRankingTierToNumber(update);\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateLabelAppearance(component: LabelComponent, update: Partial<LabelState> | undefined) {\n\tif (update?.options?.appearance == null) return;\n\t/*\n\t * parsing the label appearance here resets any unchanged values to their defaults and fails the unit test\n\t *\n\t * TODO: fix this if we want to parse the label appearance here\n\t * const appearance = parseLabelAppearance(update.options.appearance);\n\t */\n\tconst appearance = update.options.appearance || {};\n\tmergeObjects(component.appearance, appearance);\n}\n\nexport function updateLabel(\n\tentity: Geometry3D | Geometry2D | GeometryGroupObject3D | GroupContainerObject3D,\n\tupdate: Partial<LabelState> | undefined,\n\tstate: RendererState,\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'label') {\n\t\t\tconst component = entity.components[Geometry2DComponents.UI] as LabelComponent;\n\t\t\tif (update.text !== undefined && update.text !== component.text) {\n\t\t\t\tcomponent.text = update.text;\n\t\t\t\tcomponent.textDirty = true;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tvalidateLabelOptions(update.options ?? {});\n\t\t\t} catch (error: unknown) {\n\t\t\t\tLogger.error(error);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tisOneOfTextDirtyOptions(component.appearance, update.options?.appearance || {}) ||\n\t\t\t\tupdate.options?.textPlacement != null\n\t\t\t) {\n\t\t\t\tcomponent.textDirty = true;\n\t\t\t}\n\t\t\tif (isOneOfPinDirtyOptions(component.appearance, update.options?.appearance || {})) {\n\t\t\t\tcomponent.pinDirty = true;\n\t\t\t}\n\t\t\tupdateLabelAppearance(component, update);\n\t\t\tif (updatePlacement(entity, update.options?.textPlacement)) {\n\t\t\t\t// need to unset the current strategy to force the label to pick a new one\n\t\t\t\tcomponent.currentStrategyIndex = -1;\n\t\t\t}\n\t\t\tupdateInteractivity(entity, update.options?.interactive, state);\n\t\t\tupdateRank(entity, update.options?.rank);\n\t\t}\n\t}\n}\n\nexport function updatePlacement(\n\tentity: Geometry2D,\n\tupdate: LabelTextPlacement | LabelTextPlacement[] | MarkerPlacement | MarkerPlacement[] | undefined,\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'label') {\n\t\t\tconst component = entity.components[Geometry2DComponents.UI] as LabelComponent;\n\t\t\tcomponent.options.textPlacement = update as LabelTextPlacement | LabelTextPlacement[];\n\n\t\t\treturn true;\n\t\t} else if (entity.type === 'marker') {\n\t\t\tconst component = entity.components[Geometry2DComponents.UI] as MarkerComponent;\n\t\t\tcomponent.options.placement = update as MarkerPlacement | MarkerPlacement[];\n\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function updateHoverColor(\n\tentity: Geometry3D | Geometry2D | GeometryGroupObject3D | GroupContainerObject3D,\n\tupdate?: string,\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry') {\n\t\t\tentity.components[Geometry3DComponents.Style].hoverColor = update;\n\t\t\tentity.components[Geometry3DComponents.Style].dirty = true;\n\t\t}\n\t}\n}\n\n/** Sets a geometry to be in hovered state, until manually unset or the user interacts with it. */\nexport function updateHovered(entity: Geometry3D, update?: boolean) {\n\tif (update !== undefined) {\n\t\tconst interactionComponent = entity.components[Geometry3DComponents.Interaction];\n\t\tif (entity.type === 'geometry' && interactionComponent != null) {\n\t\t\tinteractionComponent.hover = update;\n\t\t\tinteractionComponent.dirty = true;\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateFlipImageToFaceCamera(entity: EntityTypes, update?: boolean) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'image') {\n\t\t\tentity.components[Geometry3DComponents.Style].flipImageToFaceCamera = update;\n\t\t}\n\t}\n}\n\nexport function updateEnableImageCollisions(entity: EntityTypes, update?: boolean) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry') {\n\t\t\tentity.components[Geometry3DComponents.Style].enableImageCollisions = update;\n\t\t}\n\t}\n}\n\nexport function updateVisibility(entity: EntityTypes, state: RendererState, update?: boolean) {\n\tif (update !== undefined) {\n\t\tif (\n\t\t\tentity.type === 'model' ||\n\t\t\tentity.type === 'path' ||\n\t\t\tentity.type === 'geometry' ||\n\t\t\tentity.type === 'custom-geometry' ||\n\t\t\tentity.type === 'image' ||\n\t\t\tentity.type === 'text3d'\n\t\t) {\n\t\t\tif (update !== entity.components[Geometry3DComponents.Style].visible) {\n\t\t\t\tentity.components[Geometry3DComponents.Style].visible = update;\n\t\t\t\tentity.components[Geometry3DComponents.Style].dirty = true;\n\t\t\t}\n\t\t\tconst outlineComponent = entity.components[Geometry3DComponents.Outline];\n\t\t\tif (outlineComponent) {\n\t\t\t\toutlineComponent.dirty = true;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} else if (entity.type === 'geometry-group') {\n\t\t\tentity.setVisible(update);\n\n\t\t\treturn true;\n\t\t} else if (entity.type === 'group-container') {\n\t\t\tif (entity.visible !== update) {\n\t\t\t\tentity.setVisible(update);\n\n\t\t\t\t// If the group container is being hidden, we need to set all the 2d elements to canShow false\n\t\t\t\t// This prevents the 2d elements from being animated out when the group container is shown but there's no collision room\n\t\t\t\tif (update === false) {\n\t\t\t\t\tentity.traverse(child => {\n\t\t\t\t\t\tif (child instanceof Geometry2DObject3D) {\n\t\t\t\t\t\t\tconst entity = state.geometry2DMap.get(child.userData.entityId);\n\t\t\t\t\t\t\tif (entity) {\n\t\t\t\t\t\t\t\tconst component = entity.components[Geometry2DComponents.UI];\n\t\t\t\t\t\t\t\t// TODO: enable this for markers as well\n\t\t\t\t\t\t\t\t// Currently, this breaks marker placement in stacked maps\n\t\t\t\t\t\t\t\t// https://mappedin.atlassian.net/browse/SDKS-2698\n\t\t\t\t\t\t\t\tif (component instanceof LabelComponent) {\n\t\t\t\t\t\t\t\t\tcomponent.canShow = update;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (entity.type === 'label') {\n\t\t\tentity.components[Geometry2DComponents.UI].visible = update;\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateOpacity(\n\tentity: Geometry3D | Geometry2D | GeometryGroupObject3D | GroupContainerObject3D | ImageGeometry3D,\n\tstate: RendererState,\n\tupdate?: number,\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry-group') {\n\t\t\tfor (const entityId of entity.userData.entities3D.values()) {\n\t\t\t\tconst child = state.geometry3DMap.get(entityId) as Geometry3D | undefined;\n\t\t\t\tif (child?.type === 'geometry' || child?.type === 'model') {\n\t\t\t\t\tupdateOpacity(child, state, update);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} else if (entity.type === 'group-container') {\n\t\t\tif (entity.opacity !== update) {\n\t\t\t\tentity.setOpacity(update);\n\n\t\t\t\t// If this container has a parent get its opacity so we can compute relative to it\n\t\t\t\tlet parentOpacity = 1;\n\t\t\t\tif (entity.parent instanceof GroupContainerObject3D) {\n\t\t\t\t\tparentOpacity = entity.parent.opacity;\n\t\t\t\t}\n\t\t\t\t// Cascade the opacity down and compute the effective opacity of each container.\n\t\t\t\tcascadeOpacity(entity, state, parentOpacity);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (entity instanceof Geometry3D) {\n\t\t\tif (entity.components[Geometry3DComponents.Style].opacity !== update) {\n\t\t\t\tentity.components[Geometry3DComponents.Style].opacity = update;\n\t\t\t\tentity.components[Geometry3DComponents.Style].dirty = true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Compute the opacity of a group container or geometry group based on the computed opacity of its parent.\n */\nfunction cascadeOpacity(\n\tentity: GroupContainerObject3D | GeometryGroupObject3D,\n\tstate: RendererState,\n\tparentOpacity = 1,\n) {\n\tif (entity.type === 'group-container' && 'children' in entity && entity.children.length > 0) {\n\t\t// Compute the container's opacity considering the parent opacity\n\t\tconst computedOpacity = parentOpacity * entity.opacity;\n\t\tentity.userData.computedOpacity = computedOpacity;\n\n\t\tfor (const child of entity.children) {\n\t\t\tif (\n\t\t\t\t(child instanceof GeometryGroupObject3D && child.type === 'geometry-group') ||\n\t\t\t\t(child instanceof GroupContainerObject3D && child.type === 'group-container')\n\t\t\t) {\n\t\t\t\tcascadeOpacity(child, state, computedOpacity);\n\t\t\t}\n\t\t}\n\t} else if (entity.type === 'geometry-group') {\n\t\tfor (const entityId of entity.userData.entities3D.values()) {\n\t\t\tconst child = state.geometry3DMap.get(entityId) as Geometry3D | undefined;\n\t\t\tlet childStyle: StyleComponent;\n\t\t\tif (child?.type === 'geometry' || child?.type === 'model') {\n\t\t\t\tchildStyle = child.components[Geometry3DComponents.Style];\n\t\t\t\t// Set the child's style as dirty, so that its opacity will be updated by the change in the parent style\n\t\t\t\tchildStyle.dirty = true;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function updateGroupTexture(\n\tentity: Geometry3D | Geometry2D | GeometryGroupObject3D | GroupContainerObject3D,\n\tstate: RendererState,\n\tupdate?: Pick<GeometryGroupStyleComponent, 'texture' | 'topTexture'>,\n) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry-group') {\n\t\t\tfor (const entityId of entity.userData.entities3D.values()) {\n\t\t\t\tconst child = state.geometry3DMap.get(entityId) as Geometry3D | undefined;\n\t\t\t\tif (child) {\n\t\t\t\t\tupdateIndividualGeometryTexture(child, update);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function updateIndividualGeometryTexture(\n\tentity: Geometry3D,\n\tupdate?: Pick<StyleComponent, 'texture' | 'topTexture'>,\n) {\n\tif (entity.type === 'geometry') {\n\t\tlet needsUpdate = false;\n\t\tconst style = entity.components[Geometry3DComponents.Style];\n\n\t\tif (update?.texture != null && style.texture !== update?.texture) {\n\t\t\tstyle.texture = update.texture;\n\t\t\tneedsUpdate = true;\n\t\t}\n\t\tif (update?.topTexture != null && style.topTexture !== update?.topTexture) {\n\t\t\tstyle.topTexture = update.topTexture;\n\t\t\tneedsUpdate = true;\n\t\t}\n\n\t\tif (needsUpdate && entity.components[Geometry3DComponents.Mesh] instanceof MeshComponent) {\n\t\t\tconst meshComponent = entity.components[Geometry3DComponents.Mesh];\n\t\t\t// At this point, this geometry is detached from the parents, as there is no reliable way to set opacity on a per-geometry basis\n\t\t\t// in a batched mesh due to transparency sorting among other issues.\n\t\t\tif (meshComponent.detached === false) {\n\t\t\t\tmeshComponent.detached = true;\n\t\t\t\tmeshComponent.dirty = true;\n\t\t\t}\n\n\t\t\tentity.components[Geometry3DComponents.Style].dirty = true;\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateIndividualGeometryOpacity(entity: Geometry3D, update?: number) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry') {\n\t\t\tconst style = entity.components[Geometry3DComponents.Style];\n\t\t\tif (style.opacity !== update) {\n\t\t\t\tstyle.opacity = update;\n\t\t\t\tconst meshComponent = entity.components[Geometry3DComponents.Mesh] as MeshComponent;\n\t\t\t\tconst outlineComponent = entity.components[Geometry3DComponents.Outline];\n\t\t\t\tif (outlineComponent) {\n\t\t\t\t\toutlineComponent.dirty = true;\n\t\t\t\t}\n\t\t\t\t// At this point, this geometry is detached from the parents, as there is no reliable way to set opacity on a per-geometry basis\n\t\t\t\t// in a batched mesh due to transparency sorting among other issues.\n\t\t\t\tif (meshComponent.detached === false) {\n\t\t\t\t\tmeshComponent.detached = true;\n\t\t\t\t\tmeshComponent.dirty = true;\n\t\t\t\t}\n\t\t\t\tstyle.dirty = true;\n\t\t\t\tconst geometryGroup = entity.parentObject3D;\n\t\t\t\t// make sure that the detached geometry's outline is hidden from the parent\n\t\t\t\tif (geometryGroup?.type === 'geometry-group') {\n\t\t\t\t\tgeometryGroup.userData.shadingDirty = true;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateAltitude(entity: EntityTypes, update?: number) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry' || entity.type === 'path' || entity.type === 'custom-geometry') {\n\t\t\tconst style = entity.components[Geometry3DComponents.Style];\n\t\t\tif (style.altitude !== update) {\n\t\t\t\tstyle.altitude = update;\n\t\t\t\tstyle.dirty = true;\n\t\t\t\tif (entity.components[Geometry3DComponents.Outline]) {\n\t\t\t\t\tentity.components[Geometry3DComponents.Outline].dirty = true;\n\t\t\t\t}\n\t\t\t\tif (entity.components[Geometry3DComponents.Border]) {\n\t\t\t\t\tentity.components[Geometry3DComponents.Border].needsRebuild = true;\n\t\t\t\t\tentity.components[Geometry3DComponents.Border].dirty = true;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (entity.type === 'group-container' && entity.altitude !== update) {\n\t\t\tentity.setAltitude(update);\n\n\t\t\treturn true;\n\t\t} else if (entity.type === 'geometry-group') {\n\t\t\tif (entity.altitude !== update) {\n\t\t\t\tentity.setAltitude(update);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateOutline(entity: All3DTypes, state: RendererState, update?: boolean) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry-group') {\n\t\t\tfor (const entityId of entity.userData.entities3D.values()) {\n\t\t\t\tconst entity = state.geometry3DMap.get(entityId);\n\t\t\t\tif (entity instanceof Geometry3D) {\n\t\t\t\t\tupdateOutline(entity, state, update);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (entity.type === 'geometry') {\n\t\t\tconst outline = entity.components[Geometry3DComponents.Outline];\n\t\t\tconst style = entity.components[Geometry3DComponents.Style];\n\t\t\tif (!outline && update === true) {\n\t\t\t\tentity.components[Geometry3DComponents.Outline] = new OutlineComponent(darkenColorForOutline(style.color));\n\t\t\t} else if (outline) {\n\t\t\t\toutline.enabled = update;\n\t\t\t\toutline.dirty = true;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nexport function updateFocusable(entity: Geometry3D | GroupContainerObject3D, update?: boolean) {\n\tif (update !== undefined) {\n\t\tlet component: FocusableComponent | undefined;\n\t\tlet index: Geometry3DComponents.Focusable | GroupContainerComponents.Focusable = Geometry3DComponents.Focusable;\n\t\tif (entity.type === 'geometry') {\n\t\t\tcomponent = entity.components[Geometry3DComponents.Focusable];\n\t\t\tindex = Geometry3DComponents.Focusable;\n\t\t} else if (entity.type === 'group-container') {\n\t\t\tcomponent = entity.components[GroupContainerComponents.Focusable];\n\t\t\tindex = GroupContainerComponents.Focusable;\n\t\t}\n\n\t\tif (update === true && component == null) {\n\t\t\tentity.components[index] = new FocusableComponent();\n\n\t\t\treturn true;\n\t\t} else if (update === false && component != null) {\n\t\t\tentity.components[index] = undefined;\n\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateIndividualGeometryRenderOrder(entity: Geometry3D, update?: number) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry') {\n\t\t\tconst style = entity.components[Geometry3DComponents.Style];\n\t\t\tif (style.renderOrder !== update) {\n\t\t\t\tstyle.renderOrder = update;\n\t\t\t\tconst meshComponent = entity.components[Geometry3DComponents.Mesh] as MeshComponent;\n\t\t\t\tif (meshComponent.detached === false) {\n\t\t\t\t\tmeshComponent.detached = true;\n\t\t\t\t\tmeshComponent.dirty = true;\n\t\t\t\t}\n\t\t\t\tif (meshComponent.imageMesh) {\n\t\t\t\t\t// We need to move the image mesh render order above the geometry\n\t\t\t\t\tmeshComponent.imageMesh.renderOrder = update + 1;\n\t\t\t\t}\n\t\t\t\tstyle.dirty = true;\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\nexport function updateSide(\n\tgeometry: Geometry3DTypes | GeometryGroupObject3D,\n\tstate: RendererState,\n\tupdate?: StyleComponent['side'],\n) {\n\tif (update == null) return;\n\tif (geometry.type === 'geometry') {\n\t\tconst style = geometry.components[Geometry3DComponents.Style];\n\t\tif (style.side !== update) {\n\t\t\tstyle.side = update;\n\t\t\tstyle.dirty = true;\n\t\t}\n\t} else if (geometry.type === 'geometry-group') {\n\t\tfor (const entityId of geometry.userData.entities3D.values()) {\n\t\t\tconst entity = state.geometry3DMap.get(entityId);\n\t\t\tif (entity instanceof Geometry3D) {\n\t\t\t\tupdateSide(entity, state, update);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function updateBorder(entity: Geometry3D, update?: Partial<GeometryState>) {\n\tif (update !== undefined) {\n\t\tif (entity.type === 'geometry') {\n\t\t\tconst style = entity.components[Geometry3DComponents.Style];\n\t\t\tlet border: BorderComponent | undefined;\n\n\t\t\tborder = entity.components[Geometry3DComponents.Border];\n\t\t\tif (update.borderVisible !== style.borderVisible && update.borderVisible != null) {\n\t\t\t\tif (update.borderVisible === true) {\n\t\t\t\t\tif (border == null) {\n\t\t\t\t\t\t// create border component\n\t\t\t\t\t\tconst borderComponent = new BorderComponent();\n\t\t\t\t\t\tentity.components[Geometry3DComponents.Border] = borderComponent;\n\t\t\t\t\t\tborder = entity.components[Geometry3DComponents.Border];\n\t\t\t\t\t\t// if the border is created, we need to set the border color to the geometry color\n\t\t\t\t\t\tstyle.borderColor = style.color;\n\t\t\t\t\t}\n\t\t\t\t\tborder.visible = true;\n\t\t\t\t\tborder.dirty = true;\n\t\t\t\t} else if (update.borderVisible === false) {\n\t\t\t\t\tif (border != null) {\n\t\t\t\t\t\tborder.visible = false;\n\t\t\t\t\t\tborder.dirty = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.borderVisible = update.borderVisible;\n\t\t\t}\n\n\t\t\tif (style.borderColor !== update.borderColor && update.borderColor != null) {\n\t\t\t\tstyle.borderColor = update.borderColor;\n\t\t\t\tif (border) {\n\t\t\t\t\tborder.dirty = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (style.borderWidth !== update.borderWidth && update.borderWidth != null) {\n\t\t\t\tstyle.borderWidth = update.borderWidth;\n\t\t\t\tif (border) {\n\t\t\t\t\tborder.needsRebuild = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function handlePathUpdate(geometry: Geometry3DTypes, state: RendererState, update: PathUpdateState) {\n\tconst { visible, color } = update;\n\tif (geometry.type !== 'path') return;\n\tconst pathComponent = geometry.components[Geometry3DComponents.Mesh];\n\tif (visible != null) {\n\t\tupdateVisibility(geometry, state, visible);\n\t}\n\tif (color != null) {\n\t\tupdateColor(geometry, { color });\n\t}\n\n\tObject.assign(pathComponent, pickPathOptions(update));\n\n\tif (!isEmpty(update)) {\n\t\tpathComponent.materialDirty = true;\n\t\t// Must run the conversion from zoom level to altitude if these are changed\n\t\tif (update.width != null) {\n\t\t\tpathComponent.dirty = true;\n\t\t}\n\t}\n}\n\nexport function pickPathOptions(update: PathUpdateState) {\n\treturn pick(update, PATH_COMPONENT_UPDATE_PROPS);\n}\n\nconst PATH_COMPONENT_UPDATE_PROPS = [\n\t'animateArrowsOnPath',\n\t'displayArrowsOnPath',\n\t'width',\n\t'accentColor',\n\t'completeFraction',\n\t'dashed',\n\t'visibleThroughGeometry',\n] as KeysOfUnion<PathUpdateState>[];\n\nexport function getEntityId(\n\tentityOrEntityId:\n\t\t| Geometry2D\n\t\t| Geometry3DTypes\n\t\t| Geometry2DObject3D\n\t\t| Geometry3DObject3D\n\t\t| GeometryGroupObject3D\n\t\t| GroupContainerObject3D\n\t\t| string\n\t\t| number,\n) {\n\tif (typeof entityOrEntityId === 'string' || typeof entityOrEntityId === 'number') {\n\t\treturn entityOrEntityId;\n\t}\n\n\tif (entityOrEntityId instanceof Geometry2D) {\n\t\treturn entityOrEntityId.id;\n\t}\n\tif (entityOrEntityId instanceof Geometry3D) {\n\t\treturn entityOrEntityId.id;\n\t}\n\tif (entityOrEntityId instanceof Geometry2DObject3D) {\n\t\treturn entityOrEntityId.userData.entityId;\n\t}\n\tif (entityOrEntityId instanceof Geometry3DObject3D) {\n\t\treturn entityOrEntityId.userData.entityId;\n\t}\n\tif (entityOrEntityId instanceof GeometryGroupObject3D) {\n\t\treturn entityOrEntityId.userData.entityId;\n\t}\n\tif (entityOrEntityId instanceof GroupContainerObject3D) {\n\t\treturn entityOrEntityId.userData.entityId;\n\t}\n\n\treturn undefined;\n}\n\nexport function assetGeometryIsText3D(geometry: Geometry3DTypes): asserts geometry is TextGeometry3D {\n\tif (!(geometry instanceof Geometry3D && geometry.type === 'text3d')) {\n\t\tthrow new Error('expect target is TextGeometry3D');\n\t}\n}\n\n/**\n * @internal\n */\nexport const TEXT3D_STYLE_UPDATE_PROPS = [\n\t'visible',\n\t'color',\n\t'strokeWidth',\n\t'outlineOffsetX',\n\t'outlineOffsetY',\n\t'outlineWidth',\n\t'outlineBlur',\n\t'outlineOpacity',\n\t'outlineColor',\n\t'strokeWidth',\n\t'strokeColor',\n\t'strokeOpacity',\n\t'maxWidth',\n\t'maxHeight',\n\t'font',\n\t'hoverColor',\n\t'fillOpacity',\n\t'fontSize',\n\t'flipToFaceCamera',\n] as KeysOfUnion<UpdatableText3DState>[];\n\n/**\n * Handle state update of the text3d geometry.\n */\nexport function handleText3DUpdate(geometry: TextGeometry3D, state: RendererState, update: Partial<Text3DState>) {\n\tupdateVisibility(geometry, state, update.visible);\n\tconst styleComp = geometry.components[Geometry3DComponents.Style];\n\tconst updated = pick(update, TEXT3D_STYLE_UPDATE_PROPS);\n\tif ('margin' in update) {\n\t\tLogger.warn('update to margin is not supported atm');\n\t}\n\tif ('content' in update) {\n\t\tLogger.warn('content update is not supported atm');\n\t}\n\ttry {\n\t\tupdateText3DStateSchema.parse(updated);\n\t} catch (e) {\n\t\tLogger.error(e);\n\n\t\treturn;\n\t}\n\tif (Object.keys(updated).length > 0) {\n\t\tObject.assign(styleComp, updated);\n\t\tstyleComp.dirty = true;\n\t}\n}\n\n/**\n * @internal\n */\nexport const MODEL_UPATE_PROPS = [\n\t'color',\n\t'material',\n\t'opacity',\n\t'verticalOffset',\n\t'rotation',\n\t'position',\n\t'scale',\n] as KeysOfUnion<ModelState>[];\nexport function handleModelStyleUpdate(geometry: ModelGeometry3D, update: Partial<ModelState>) {\n\tconst updated = pick(update, MODEL_UPATE_PROPS);\n\tconst styleComp = geometry.components[Geometry3DComponents.Style];\n\tconst meshComp = geometry.components[Geometry3DComponents.Mesh];\n\tif (Object.keys(updated).length > 0) {\n\t\tif (updated.material) {\n\t\t\tstyleComp.material = updated.material;\n\t\t}\n\t\tif (updated.opacity != null) {\n\t\t\tstyleComp.opacity = updated.opacity;\n\t\t}\n\t\tif (updated.visible != null) {\n\t\t\tstyleComp.visible = updated.visible;\n\t\t}\n\t\tif (updated.verticalOffset != null) {\n\t\t\tstyleComp.verticalOffset = updated.verticalOffset;\n\t\t}\n\t\tif (updated.color != null) {\n\t\t\tstyleComp.color = updated.color;\n\t\t}\n\t\tif (updated.position != null) {\n\t\t\tmeshComp.feature.geometry.coordinates = updated.position;\n\t\t\tmeshComp.positionDirty = true;\n\t\t}\n\t\tif (updated.rotation != null) {\n\t\t\tstyleComp.rotation = updated.rotation;\n\t\t}\n\t\tif (updated.scale != null) {\n\t\t\tstyleComp.scale = updated.scale;\n\t\t}\n\t\tstyleComp.dirty = true;\n\t}\n}\n", "export class InteractionComponent {\n\thover: boolean | 'user-interaction' = false;\n\tdirty = false;\n}\n", "/* eslint-disable max-lines */\nimport { Vector2 } from 'three';\nimport type { TDrawFn } from '@packages/internal/shave-text';\nimport { randomId } from '../../../packages/common/random-id';\nimport type { EntityId, Position } from '../types';\nimport type { GroupContainerState } from '../entities/group-container';\nimport type { RendererState } from '../renderer';\nimport type { CollisionRankingTier } from '..';\nimport { convertCollisionRankingTierToNumber } from '../utils/collision-ranking-tier';\nimport type { PackedBBox, PackedJsonMessage } from '../systems/collisions/system';\nimport { PIN_STROKE_SIZE as PIN_STROKE_SIZE, PINVISIBILITY, TEXTALIGN } from '../systems/2d-draw/constants';\nimport {\n\ttype LabelTextPlacement,\n\ttype AddLabelOptionsInternal,\n\tLABEL_TEXT_PLACEMENT,\n\ttype LabelAppearance,\n\ttype LabelAppearanceWithDefaults,\n\tparseLabelAppearance,\n\tDEFAULT_LABEL_TEXT_PLACEMENTS,\n\tLABEL_LOW_PRIORITY,\n\ttype LabelTextPlacementInternal,\n} from './label-utils';\n\n// space around pin to give the text some room\nconst PIN_SPACER = 4;\n\nconst MIN_PIN_MARGIN = 6;\n\n// Size of pin when there's no icon\nconst PIN_SIZE_NO_ICON = 6.5;\nconst LOW_PRIORITY_BBOX_SIZE = PIN_SIZE_NO_ICON / 2;\nconst LOW_PRIORITY_BBOX = [\n\tLOW_PRIORITY_BBOX_SIZE,\n\tLOW_PRIORITY_BBOX_SIZE,\n\tLOW_PRIORITY_BBOX_SIZE,\n\tLOW_PRIORITY_BBOX_SIZE,\n];\n\ntype TStyle = {\n\ttop?: number;\n\tleft?: number;\n\ttextLabelVisible?: boolean;\n\tpinVisibility: PINVISIBILITY;\n\ttextAlign?: TEXTALIGN;\n\tcachedSymbol?: HTMLCanvasElement;\n};\n\nexport type LabelOptions = {\n\tid?: string;\n\tshortText?: string;\n\ttext?: string;\n\trank?: number;\n\tappearance?: LabelAppearance;\n\tcreateDespiteImage?: boolean;\n\tinteractive?: boolean;\n};\n/**\n * State reprsenting a Label\n */\nexport type LabelState = {\n\treadonly id: string | number;\n\treadonly type: 'label';\n\t/**\n\t * The position of the label in [lon, lat]\n\t */\n\treadonly position: Position;\n\t/**\n\t * The parent container of the label\n\t */\n\treadonly parent: EntityId<GroupContainerState>;\n\t/**\n\t * Whether the label is enabled\n\t */\n\tenabled: boolean;\n\t/**\n\t * Whether the label is visible IF is is enabled\n\t * this can be used to have more granular control of whether the label shows up,\n\t * for example, if someone implements a layer system that shows/hides,\n\t */\n\tvisible: boolean;\n\t/**\n\t * Text content of the label\n\t */\n\ttext: string;\n\t/**\n\t * The initial rank of the label, which can be used to reset the rank of the label to its initial value.\n\t */\n\tinitialRank: CollisionRankingTier;\n\t/**\n\t * Options for the label\n\t */\n\toptions: Omit<AddLabelOptionsInternal, 'id'>;\n\t/**\n\t * vertical offset of the model in meters off the floor\n\t */\n\tverticalOffset: number;\n};\n\ntype LabelStrategy = {\n\tname: LabelTextPlacementInternal;\n\tgetBoundingBox: () => number[];\n\tonStrategySelected: () => void;\n};\n\nexport class LabelComponent {\n\tlines = 0;\n\tid: string;\n\trank: number;\n\treadonly type = 'label';\n\tinitialRank: number;\n\tcontextConfigured = false;\n\tfillText = undefined as TDrawFn | undefined;\n\tnewStyle: TStyle = {} as TStyle;\n\tstatic testId = 0;\n\topacity = 0;\n\tvisibilityNeedsUpdate: 'show' | 'hide' | false = false;\n\tactivePlacement: LabelTextPlacementInternal = LABEL_TEXT_PLACEMENT.RIGHT;\n\n\ttext: string;\n\n\tstyle = {\n\t\ttop: 0,\n\t\tleft: 0,\n\t\ttextLabelVisible: true,\n\t\tpinVisibility: PINVISIBILITY.ACTIVE,\n\t\ttextAlign: TEXTALIGN.LEFT,\n\t} as TStyle;\n\n\tprojection: Vector2 = new Vector2();\n\tlabelCacheId?: string;\n\n\t_cache = {};\n\n\tappearance: LabelAppearanceWithDefaults;\n\toptions: AddLabelOptionsInternal;\n\t/**\n\t * Whether the anchored parent is visible.\n\t */\n\tvisible = true;\n\tenabled = true;\n\tisOccluded = false;\n\toffscreen = false;\n\t/**\n\t * Whether the label can be shown, which is decided by the collision engine\n\t */\n\tcanShow = false;\n\n\tactiveBoundingBox: {\n\t\tx: number;\n\t\ty: number;\n\t\tw: number;\n\t\th: number;\n\t} = { x: 0, y: 0, w: 0, h: 0 };\n\tdimensions = { width: 0, height: 0 };\n\tcurrentStrategyIndex = -1;\n\ttotalPinSize = 0;\n\ticonScale = 1;\n\n\tget scaledPinSize() {\n\t\treturn this.totalPinSize * this.iconScale;\n\t}\n\n\ticonPadding: number;\n\tget scaledIconPadding() {\n\t\treturn this.appearance.iconPadding * this.iconScale;\n\t}\n\n\tdirty = true;\n\ttextDirty = true;\n\tpinDirty = true;\n\n\t/** Flag used in 2d-projection system to determine if the parent has changed */\n\tattachedDirty = true;\n\tcollisionDirty = true;\n\tlastTextAlign;\n\timageHash?: number;\n\tpinSize = 0;\n\ticonVisible = false;\n\n\tdp: (v?: number) => number;\n\n\tconstructor(text: string, options: AddLabelOptionsInternal, state: RendererState) {\n\t\tthis.id = options.id ?? randomId();\n\t\tthis.options = options ?? {};\n\t\tthis.text = text;\n\t\tthis.dp = (v = 1) => v * state.pixelRatio;\n\n\t\tif (typeof options.rank === 'string') {\n\t\t\tthis.rank = convertCollisionRankingTierToNumber(options.rank as CollisionRankingTier);\n\t\t\tthis.initialRank = this.rank;\n\t\t} else if (options.rank != null && options.rank > 0) {\n\t\t\tthis.rank = options.rank;\n\t\t\tthis.initialRank = options.rank;\n\t\t} else {\n\t\t\tconst generatedRank =\n\t\t\t\tMath.trunc(process.env.NODE_ENV === 'test' ? LabelComponent.testId : LabelComponent.testId * 10) / 10;\n\n\t\t\tLabelComponent.testId += 0.001;\n\t\t\tthis.rank = generatedRank;\n\t\t\tthis.initialRank = generatedRank;\n\t\t}\n\t\tthis.options.textPlacement = options.textPlacement ?? DEFAULT_LABEL_TEXT_PLACEMENTS;\n\t\tconst appearance = parseLabelAppearance(options.appearance ?? {});\n\t\tthis.appearance = appearance;\n\t\tthis.iconPadding = appearance.iconPadding;\n\t}\n\n\tcalculatePinSize() {\n\t\tconst pixelRatio = this.dp();\n\t\t// if the current zoom level is greater than or equal to the zoom level at which the icon becomes visible,\n\t\t// use pin icon size\n\t\tif (this.iconVisible && typeof this.appearance.iconSize !== 'undefined' && this.imageHash) {\n\t\t\tthis.pinSize = this.dp(this.appearance.iconSize);\n\t\t} else {\n\t\t\tthis.pinSize = this.dp(PIN_SIZE_NO_ICON);\n\t\t}\n\n\t\tthis.totalPinSize = Math.ceil((this.pinSize + PIN_STROKE_SIZE) / pixelRatio);\n\t}\n\n\t/**\n\t * Get the bounding box when the label has no text.\n\t * @param margin - The margin to apply to the bounding box.\n\t */\n\tprivate getNoTextBbox(margin: number): number[] {\n\t\tconst v = this.scaledPinSize / 2 + margin;\n\t\treturn [v, v, v, v];\n\t}\n\n\t/**\n\t * Get the bounding box for the hidden text placement.\n\t * @param margin - The margin to apply to the bounding box.\n\t */\n\tprivate getHiddenTextPlacementBbox(margin: number): number[] {\n\t\tif (this.iconVisible) {\n\t\t\treturn this.getNoTextBbox(margin);\n\t\t}\n\t\treturn LOW_PRIORITY_BBOX;\n\t}\n\n\tprivate getBoundingBoxForPlacement(placement: LabelTextPlacementInternal): number[] {\n\t\tconst { width, height } = this.dimensions;\n\t\tconst { margin: suppliedMargin } = this.appearance;\n\n\t\t// do not allow margin below MIN_PIN_MARGIN\n\t\tconst margin = Math.max(MIN_PIN_MARGIN, suppliedMargin);\n\n\t\tif (this.text === '') {\n\t\t\treturn this.getNoTextBbox(margin);\n\t\t}\n\t\tconst bboxHeight = Math.max(this.scaledPinSize, height);\n\t\tswitch (placement) {\n\t\t\tcase LABEL_TEXT_PLACEMENT.RIGHT:\n\t\t\t\treturn [\n\t\t\t\t\tbboxHeight / 2 + margin,\n\t\t\t\t\tbboxHeight / 2 + margin,\n\t\t\t\t\tthis.scaledPinSize / 2 + margin,\n\t\t\t\t\tthis.scaledPinSize / 2 + width + margin,\n\t\t\t\t];\n\t\t\tcase LABEL_TEXT_PLACEMENT.LEFT:\n\t\t\t\treturn [\n\t\t\t\t\tbboxHeight / 2 + margin,\n\t\t\t\t\tbboxHeight / 2 + margin,\n\t\t\t\t\tthis.scaledPinSize / 2 + width + margin,\n\t\t\t\t\tthis.scaledPinSize / 2 + margin,\n\t\t\t\t];\n\t\t\tcase LABEL_TEXT_PLACEMENT.TOP: {\n\t\t\t\tconst pixelRatio = this.dp();\n\t\t\t\tconst topBboxHeight = height + this.scaledPinSize / 2 / pixelRatio;\n\t\t\t\treturn [topBboxHeight + margin, this.scaledPinSize / 2 + margin, width / 2 + margin, width / 2 + margin];\n\t\t\t}\n\t\t\tcase LABEL_TEXT_PLACEMENT.CENTER:\n\t\t\t\treturn [height / 2 + margin, height / 2 + margin, width / 2 + margin, width / 2 + margin];\n\t\t\tcase LABEL_TEXT_PLACEMENT.HIDDEN:\n\t\t\t\treturn this.getHiddenTextPlacementBbox(margin);\n\t\t\tcase LABEL_LOW_PRIORITY:\n\t\t\t\t// Special case when hidden text placement has an icon and may have a large bbox\n\t\t\t\treturn LOW_PRIORITY_BBOX;\n\t\t\tdefault:\n\t\t\t\treturn this.getNoTextBbox(margin);\n\t\t}\n\t}\n\n\tprivate getStrategyStyleForPlacement(placement: LabelTextPlacementInternal): void {\n\t\tconst { width, height } = this.dimensions;\n\t\tswitch (placement) {\n\t\t\tcase LABEL_TEXT_PLACEMENT.TOP:\n\t\t\t\tthis.newStyle.pinVisibility = PINVISIBILITY.ACTIVE;\n\t\t\t\tthis.newStyle.textAlign = TEXTALIGN.CENTER;\n\t\t\t\tthis.newStyle.textLabelVisible = true;\n\t\t\t\tthis.newStyle.top = -height - this.scaledPinSize / 2;\n\t\t\t\tthis.newStyle.left = -width / 2;\n\t\t\t\treturn;\n\t\t\tcase LABEL_TEXT_PLACEMENT.LEFT:\n\t\t\t\tthis.newStyle.textAlign = TEXTALIGN.RIGHT;\n\t\t\t\tthis.newStyle.pinVisibility = PINVISIBILITY.ACTIVE;\n\t\t\t\tthis.newStyle.top = -height / 2;\n\t\t\t\tthis.newStyle.left = -width - this.scaledPinSize / 2 - PIN_SPACER;\n\t\t\t\tthis.newStyle.textLabelVisible = true;\n\t\t\t\treturn;\n\t\t\tcase LABEL_TEXT_PLACEMENT.RIGHT:\n\t\t\t\tthis.newStyle.textAlign = TEXTALIGN.LEFT;\n\t\t\t\tthis.newStyle.pinVisibility = PINVISIBILITY.ACTIVE;\n\t\t\t\tthis.newStyle.top = -height / 2;\n\t\t\t\tthis.newStyle.left = this.scaledPinSize / 2 + PIN_SPACER;\n\t\t\t\tthis.newStyle.textLabelVisible = true;\n\t\t\t\treturn;\n\t\t\tcase LABEL_TEXT_PLACEMENT.CENTER:\n\t\t\t\tthis.newStyle.pinVisibility = PINVISIBILITY.HIDDEN;\n\t\t\t\tthis.newStyle.textAlign = TEXTALIGN.CENTER;\n\t\t\t\tthis.newStyle.textLabelVisible = true;\n\t\t\t\tthis.newStyle.top = -height / 2;\n\t\t\t\tthis.newStyle.left = -width / 2;\n\t\t\t\treturn;\n\t\t\tcase LABEL_TEXT_PLACEMENT.HIDDEN:\n\t\t\t\tthis.newStyle.pinVisibility = this.iconVisible ? PINVISIBILITY.ACTIVE : PINVISIBILITY.INACTIVE;\n\t\t\t\tthis.newStyle.textLabelVisible = false;\n\t\t\t\tthis.newStyle.top = 0;\n\t\t\t\tthis.newStyle.left = 0;\n\t\t\t\treturn;\n\t\t\tcase LABEL_LOW_PRIORITY:\n\t\t\tdefault:\n\t\t\t\tthis.newStyle.pinVisibility = PINVISIBILITY.INACTIVE;\n\t\t\t\tthis.newStyle.textLabelVisible = false;\n\t\t\t\tthis.newStyle.top = 0;\n\t\t\t\tthis.newStyle.left = 0;\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tget strategies(): LabelStrategy[] {\n\t\tconst placements: LabelTextPlacement[] = Array.isArray(this.options.textPlacement)\n\t\t\t? (this.options.textPlacement as LabelTextPlacement[])\n\t\t\t: [this.options.textPlacement as LabelTextPlacement];\n\n\t\tconst strategies: LabelStrategy[] = [];\n\t\tlet addLowPriorityFallback = false;\n\n\t\tfor (const placement of placements) {\n\t\t\tstrategies.push({\n\t\t\t\tname: placement,\n\t\t\t\tgetBoundingBox: () => this.getBoundingBoxForPlacement(placement),\n\t\t\t\tonStrategySelected: () => this.getStrategyStyleForPlacement(placement),\n\t\t\t});\n\t\t\tif (placement === LABEL_TEXT_PLACEMENT.HIDDEN) {\n\t\t\t\t/**\n\t\t\t\t * Hidden placement means that the label will appear without text. If there is an icon, it will remain visible.\n\t\t\t\t * To handle icon-only label collisions, we add an internal low-priority strategy as the final fallback\n\t\t\t\t * after parsing all placements.\n\t\t\t\t */\n\t\t\t\taddLowPriorityFallback = true;\n\t\t\t}\n\t\t}\n\n\t\tif (addLowPriorityFallback) {\n\t\t\tstrategies.push({\n\t\t\t\tname: LABEL_LOW_PRIORITY,\n\t\t\t\tgetBoundingBox: () => this.getBoundingBoxForPlacement(LABEL_LOW_PRIORITY),\n\t\t\t\tonStrategySelected: () => this.getStrategyStyleForPlacement(LABEL_LOW_PRIORITY),\n\t\t\t});\n\t\t}\n\n\t\treturn strategies;\n\t}\n\n\tanimate = true;\n\n\trecomputeCurrentStrategy(scale = this.iconScale) {\n\t\t// if scale changes, we need to recompute the strategy\n\t\tif (this.iconScale !== scale || this.dirty) {\n\t\t\tconst strategy = this.strategies[this.currentStrategyIndex];\n\t\t\tthis.iconScale = scale;\n\t\t\tthis.collisionDirty = true;\n\t\t\t// recompute the strategy\n\t\t\tif (strategy) {\n\t\t\t\tstrategy.onStrategySelected();\n\t\t\t\tconst temp = this.style;\n\t\t\t\tthis.style = this.newStyle;\n\t\t\t\tthis.newStyle = temp;\n\t\t\t}\n\t\t\tthis.dirty = false;\n\t\t}\n\t}\n\n\tonStrategySelected = strategyIndex => {\n\t\tif (this.currentStrategyIndex === strategyIndex) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.currentStrategyIndex = strategyIndex;\n\n\t\tconst currentStrategy = this.strategies[strategyIndex];\n\t\tthis.activePlacement = currentStrategy?.name ?? this.activePlacement;\n\n\t\tif (currentStrategy) {\n\t\t\tcurrentStrategy.onStrategySelected();\n\t\t\tconst temp = this.style;\n\t\t\tthis.style = this.newStyle;\n\t\t\tthis.newStyle = temp;\n\t\t}\n\t};\n\n\tprivate packedMessage: PackedJsonMessage = {\n\t\tx: 0,\n\t\ty: 0,\n\t\tenabled: false,\n\t\trank: 0,\n\t\tbboxes: [],\n\t\tshouldCollideWithScreenEdges: false,\n\t\tlockedToStrategyIndex: -1,\n\t};\n\n\t// locking to a strategy is used to prevent the label from changing strategies when the camera is panning\n\ttoPackedMessage(isPanning = false): PackedJsonMessage {\n\t\tif (\n\t\t\tthis.visible &&\n\t\t\tisPanning &&\n\t\t\tthis.collisionDirty === false &&\n\t\t\tthis.currentStrategyIndex != null &&\n\t\t\tthis.currentStrategyIndex !== -1\n\t\t) {\n\t\t\tthis.packedMessage.lockedToStrategyIndex = this.currentStrategyIndex;\n\t\t} else {\n\t\t\tthis.packedMessage.lockedToStrategyIndex = -1;\n\t\t}\n\n\t\tthis.packedMessage.x = this.projection.x;\n\t\tthis.packedMessage.y = this.projection.y;\n\t\tthis.packedMessage.enabled = this.enabled;\n\t\tthis.packedMessage.rank = this.rank;\n\n\t\t// make labels more stable by keeping the current strategy index at the front of the bboxes array\n\t\t// so it gets tested first, leaving the label in the same strategy if possible\n\t\t// EXCEPT for pin placement, which should switch to better placements when available\n\t\tconst currentStrategy = this.strategies[this.currentStrategyIndex];\n\t\tconst isStrategyWithoutText =\n\t\t\tthis.text === '' ||\n\t\t\tcurrentStrategy?.name === LABEL_TEXT_PLACEMENT.HIDDEN ||\n\t\t\tcurrentStrategy?.name === LABEL_LOW_PRIORITY;\n\t\tif (\n\t\t\t!isStrategyWithoutText &&\n\t\t\tthis.currentStrategyIndex !== -1 &&\n\t\t\tthis.currentStrategyIndex !== this.packedMessage.bboxes[0]?.[4]\n\t\t) {\n\t\t\tconst currentStrategyIndex = this.packedMessage.bboxes.findIndex(bbox => bbox[4] === this.currentStrategyIndex);\n\t\t\tif (currentStrategyIndex !== -1) {\n\t\t\t\tconst currentStrategyBox = this.packedMessage.bboxes.splice(currentStrategyIndex, 1)[0];\n\t\t\t\tthis.packedMessage.bboxes.unshift(currentStrategyBox);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.collisionDirty) {\n\t\t\treturn this.packedMessage;\n\t\t}\n\n\t\tthis.packedMessage.bboxes = [];\n\n\t\tfor (let i = 0; i < this.strategies.length; i++) {\n\t\t\tconst strategy = this.strategies[i];\n\t\t\tif (!isStrategyWithoutText && i === this.currentStrategyIndex && this.currentStrategyIndex !== -1) {\n\t\t\t\tthis.packedMessage.bboxes.unshift([...strategy.getBoundingBox(), i] as PackedBBox);\n\t\t\t} else {\n\t\t\t\tthis.packedMessage.bboxes.push([...strategy.getBoundingBox(), i] as PackedBBox);\n\t\t\t}\n\t\t}\n\n\t\tthis.packedMessage.shouldCollideWithScreenEdges = false;\n\t\tthis.collisionDirty = false;\n\n\t\treturn this.packedMessage;\n\t}\n\n\tdestroy() {}\n}\n\nexport default LabelComponent;\n", "import { z } from 'zod';\n\n/**\n * Defines the priority levels for collider collision handling, allowing customization of collider visibility in congested areas.\n *\n * | Value | Description |\n * |--------|-----------------------------------------------------------------------------------------------------------------------------------------|\n * | medium | Colliders with this ranking have a standard visibility priority and may be hidden in favor of higher-ranked colliders in crowded areas. |\n * | high | These colliders are given higher visibility priority than 'medium' priority. |\n * | always-visible | Colliders with this ranking will not be hidden, ensuring their constant visibility regardless of crowding. |\n *\n * Use this type to fine-tune the visibility of colliders, enhancing map readability and user experience by prioritizing important information.\n */\nexport const collisionRankingTierSchema = z.union([z.enum(['low', 'medium', 'high', 'always-visible']), z.number()]);\nexport type CollisionRankingTier = z.infer<typeof collisionRankingTierSchema>;\n\nconst rankToNumber = ['', '', 'low', 'medium', 'high', 'always-visible'];\nexport const LOW_RANK_INDEX = 2;\nexport const MEDIUM_RANK_INDEX = 3;\nexport const HIGH_RANK_INDEX = 4;\nexport const ALWAYS_VISIBLE_RANK_INDEX = 5;\n\nfunction clampTierNumber(rank: number): number {\n\treturn Math.min(ALWAYS_VISIBLE_RANK_INDEX, Math.max(LOW_RANK_INDEX, rank));\n}\n\n/**\n * @param tier CollisionRankingTier as a string or number\n * @returns The number representation of the tier, clamped to the valid range\n */\nexport function convertCollisionRankingTierToNumber(tier: CollisionRankingTier): number {\n\tif (typeof tier === 'number') {\n\t\tconst clamped = clampTierNumber(tier);\n\n\t\treturn clamped;\n\t}\n\n\tconst rankNumber = rankToNumber.indexOf(tier);\n\n\treturn rankNumber === -1 ? MEDIUM_RANK_INDEX : rankNumber;\n}\n\n/**\n * @param rank Rank as a number\n * @returns The CollisionRankingTier representation of the rank, clamped to the valid range\n */\nexport function convertNumberToCollisionRankingTier(rank: number): CollisionRankingTier {\n\tconst clamped = clampTierNumber(rank);\n\n\treturn rankToNumber[clamped] as CollisionRankingTier;\n}\n", "export const INACTIVE_PIN_SIZE_NO_ICON = 3.5;\nexport const PIN_STROKE_SIZE = 2.5;\nexport const PIN_SHADOW_OFFSET = 2;\nexport const PIN_SHADOW_BLUR = 5;\nexport const TEXT_STROKE_SIZE = 2.5;\n\n/**\n * The visibility of the label's pin.\n */\nexport enum PINVISIBILITY {\n\t/** The pin is visible. */\n\tACTIVE = 1,\n\t/** The pin is visible, but the icon is not visible. */\n\tINACTIVE = 0.5,\n\t/** The pin is not visible. */\n\tHIDDEN = 0,\n}\n\nexport enum TEXTALIGN {\n\tLEFT = 'left',\n\tCENTER = 'center',\n\tRIGHT = 'right',\n}\n", "import { z } from 'zod';\nimport { type Interpolation, zoomInterpolationSchema } from '../types/interpolation';\nimport { collisionRankingTierSchema } from '../utils/collision-ranking-tier';\nimport type { ColorString, EntityId, Position } from '../types';\nimport type { GeometryState } from '..';\nimport tinycolor from 'tinycolor2';\nimport type { OptionalRemap } from '../types/utils';\nimport type { ValueOf } from 'type-fest';\nimport type { ValuesAsTuple } from '@packages/internal/common/type-utils';\n\nexport const LABEL_TEXT_PLACEMENT = {\n\t/**\n\t * Text appears to the right of the pin.\n\t */\n\tRIGHT: 'right',\n\t/**\n\t * Text appears to the left of the pin.\n\t */\n\tLEFT: 'left',\n\t/**\n\t * Text appears above the pin.\n\t */\n\tTOP: 'top',\n\t/**\n\t * Text is hidden, only the pin is visible.\n\t */\n\tHIDDEN: 'hidden',\n\t/**\n\t * Text is centered at the pin location, pin is hidden.\n\t */\n\tCENTER: 'center',\n} as const;\n/**\n * Special internal label placement used as a fallback when a label's text is hidden\n * and only the pin should be considered for collision detection.\n *\n * This is typically used for labels with only a pin, ensuring that even when text is not shown,\n * the label can still participate in collision handling with a lower priority.\n * Not intended for use as a standard placement option.\n */\nexport const LABEL_LOW_PRIORITY = 'low-priority';\n\nexport type LabelTextPlacement = ValueOf<typeof LABEL_TEXT_PLACEMENT>;\nexport type LabelTextPlacementInternal = LabelTextPlacement | typeof LABEL_LOW_PRIORITY;\nexport const LABEL_TEXT_PLACEMENT_VALUES = Object.values(LABEL_TEXT_PLACEMENT) as ValuesAsTuple<\n\ttypeof LABEL_TEXT_PLACEMENT\n>;\n\n/** Default label placement in sorted order */\nexport const DEFAULT_LABEL_TEXT_PLACEMENTS: LabelTextPlacement[] = [\n\tLABEL_TEXT_PLACEMENT.RIGHT,\n\tLABEL_TEXT_PLACEMENT.LEFT,\n\tLABEL_TEXT_PLACEMENT.TOP,\n\tLABEL_TEXT_PLACEMENT.HIDDEN,\n\t// intentionally omits LABEL_TEXT_PLACEMENT.CENTER - this is a unique placement that we don't want to be the default\n];\n\n// IMPORTANT:Make sure to ALSO update the docs below when updating this schema\nexport const labelAppearanceSchemaBase = z.object({\n\t/**\n\t * Margin around the label text and pin in pixels. This will affect label density. Minimum is 6px.\n\t */\n\tmargin: z.number().min(6).default(6),\n\t/**\n\t * Number of lines to display when text spans multiple lines.\n\t */\n\tmaxLines: z.number().min(1).default(2),\n\t/**\n\t * Text size in pixels\n\t */\n\ttextSize: z.number().min(0).default(11.5),\n\t/**\n\t * Maximum width of text in pixels.\n\t */\n\tmaxWidth: z.number().min(0).default(150),\n\t/**\n\t * Line height sets the height of a line box. It's commonly used to set the distance between lines of text.\n\t */\n\tlineHeight: z.number().min(0).default(1.2),\n\t/**\n\t * A {@link ColorString} for the label text and pin.\n\t */\n\tcolor: z.string().default('#333'),\n\t/**\n\t * A {@link ColorString} for the outline around the label text and pin.\n\t */\n\toutlineColor: z.string().default('white'),\n\t/**\n\t * A {@link ColorString} representing just the text color. Defaults to the same as `color`.\n\t */\n\ttextColor: z.string().optional(),\n\t/**\n\t * A {@link ColorString} representing just the text outline. Defaults to the same as `outlineColor`.\n\t */\n\ttextOutlineColor: z.string().optional(),\n\t/**\n\t * A {@link ColorString} representing just the pin color. Defaults to the same as `color`.\n\t */\n\tpinColor: z.string().optional(),\n\t/**\n\t * A {@link ColorString} representing just the pin outline. Defaults to the same as `outlineColor`.\n\t */\n\tpinOutlineColor: z.string().optional(),\n\t/**\n\t * A {@link ColorString} representing just the pin color when the label is inactive. Defaults to the same as `pinColor`.\n\t */\n\tpinColorInactive: z.string().optional(),\n\t/**\n\t * A {@link ColorString} representing just the pin outline when the label is inactive. Defaults to the same as `pinOutlineColor`.\n\t */\n\tpinOutlineColorInactive: z.string().optional(),\n\t/**\n\t * An icon to be placed inside the label pin. Can be an SVG string or a path to a PNG or JPEG.\n\t */\n\ticon: z.string().optional(),\n\t/**\n\t * Size of the icon in pixels. Requires `icon` to be set.\n\t */\n\ticonSize: z.number().min(0).default(20),\n\t/**\n\t * Scale the icon uniformly. Specify a number or an {@link Interpolation} object.\n\t */\n\ticonScale: z.union([z.number(), zoomInterpolationSchema]).default(1),\n\t/**\n\t * Padding between the icon and the pin's border in pixels.\n\t */\n\ticonPadding: z.number().min(0).default(2),\n\t/**\n\t * How the icon should fit inside the pin. Options: `fill` (stretch to fill), `cover` (maintain aspect ratio and fill), `contain` (maintain aspect ratio and fit inside).\n\t */\n\ticonFit: z.enum(['fill', 'contain', 'cover']).default('cover'),\n\t/**\n\t * Whether the icon should overflow the circle of the pin. Options: `visible`, `hidden`.\n\t */\n\ticonOverflow: z.enum(['visible', 'hidden']).default('hidden'),\n\t/**\n\t * Controls icon visibility. If boolean, directly shows/hides the icon. If number, defines the zoom level at which the icon becomes visible.\n\t *\n\t * @default true\n\t */\n\ticonVisible: z.union([z.boolean(), z.number()]).default(true),\n});\nexport const labelAppearanceSchema = labelAppearanceSchemaBase.transform(appearance => ({\n\t...appearance,\n\ttextColor: appearance.textColor ?? appearance.color,\n\ttextOutlineColor: appearance.textOutlineColor ?? appearance.outlineColor,\n\tpinColor: appearance.pinColor ?? appearance.color,\n\tpinOutlineColor: appearance.pinOutlineColor ?? appearance.outlineColor,\n\tpinColorInactive: appearance.pinColorInactive ?? tinycolor(appearance.pinColor ?? appearance.color).toRgbString(),\n\tpinOutlineColorInactive:\n\t\tappearance.pinOutlineColorInactive ??\n\t\ttinycolor(appearance.pinOutlineColor ?? appearance.outlineColor).toRgbString(),\n}));\n\n// We don't want the actual schema to fail at runtime with unknown keys, but we do want the type safety of a strict schema\nconst labelAppearanceSchemaStrict = labelAppearanceSchemaBase.strict();\n\n/**\n * Options to control how a label is rendered.\n *\n * | Option | Type | Description | Default |\n * |--------|------|-------------|---------|\n * | `margin` | `number` | Margin around the label text and pin in pixels. This will affect label density. Minimum is 6px. | 6 |\n * | `maxLines` | `number` | Number of lines to display when text spans multiple lines. | 2 |\n * | `textSize` | `number` | Text size in pixels | 11.5 |\n * | `textPlacement` | `'top'` \\| `'left'` \\| `'right'` \\| `'hidden'` \\| `['top', 'left', 'right', 'hidden']` | The placement of the text relative to the pin. | - |\n * | `maxWidth` | `number` | Maximum width of text in pixels. | 150 |\n * | `lineHeight` | `number` | Line height sets the height of a line box. It's commonly used to set the distance between lines of text. | 1.2 |\n * | `color` | {@link ColorString} | A {@link ColorString} for the label text and pin. | `#333` |\n * | `outlineColor` | {@link ColorString} | A {@link ColorString} for the outline around the label text and pin. | `white` |\n * | `textColor` | {@link ColorString} | A {@link ColorString} representing just the text color. Defaults to the same as `color`. | - |\n * | `textOutlineColor` | {@link ColorString} | A {@link ColorString} representing just the text outline. Defaults to the same as `outlineColor`. | - |\n * | `pinColor` | {@link ColorString} | A {@link ColorString} representing just the pin color. Defaults to the same as `color`. | - |\n * | `pinOutlineColor` | {@link ColorString} | A {@link ColorString} representing just the pin outline. Defaults to the same as `outlineColor`. | - |\n * | `pinColorInactive` | {@link ColorString} | A {@link ColorString} representing just the pin color when the label is inactive. Defaults to the same as `pinColor`. | - |\n * | `pinOutlineColorInactive` | {@link ColorString} | A {@link ColorString} representing just the pin outline when the label is inactive. Defaults to the same as `pinOutlineColor`. | - |\n * | `icon` | `string` | An icon to be placed inside the label pin. Can be an SVG string or a path to a PNG or JPEG. | - |\n * | `iconSize` | `number` | Size of the icon in pixels. Requires `icon` to be set. | 20 |\n * | `iconScale` | `number` \\| {@link Interpolation} | Scale the icon uniformly. Specify a number or an {@link Interpolation} object. | 1 |\n * | `iconPadding` | `number` | Padding between the icon and the pin's border in pixels. | 2 |\n * | `iconFit` | `'fill'` \\| `'contain'` \\| `'cover'` | How the icon should fit inside the pin. Options: `fill` (stretch to fill), `cover` (maintain aspect ratio and fill), `contain` (maintain aspect ratio and fit inside). | `cover` |\n * | `iconOverflow` | `'visible'` \\| `'hidden'` | Whether the icon should overflow the circle of the pin. Options: `visible`, `hidden`. | `hidden` |\n * | `iconVisible` | `boolean` \\| `number` | Controls icon visibility. If boolean, directly shows/hides the icon. If number, defines the zoom level at which the icon becomes visible. | `true` |\n *\n * @example Render a label with an SVG icon\n * ```ts\n * mapView.FloatingLabels.add(space, \"Label\", {\n * \tappearance: {\n * \t\ticon: `<svg>...</svg>`,\n * \t},\n * });\n * ```\n *\n * @example Render a label with an image icon\n * ```ts\n * mapView.FloatingLabels.add(space, \"Label\", {\n * \tappearance: {\n * \t\ticon: 'https://example.com/icon.png',\n * \t},\n * });\n * ```\n *\n * @example Scale a label's icon with zoom level\n * ```ts\n * mapView.FloatingLabels.add(space, \"Label\", {\n * \tappearance: {\n * \t\t// Make the icon 3x larger from zoom level 19 to 22\n * \t\ticonScale: {\n * \t\t\ton: 'zoom-level',\n * \t\t\tinput: [19, 22],\n * \t\t\toutput: [1, 3],\n * \t\t},\n * \t},\n * });\n * ```\n *\n * @useDeclaredType\n */\nexport type LabelAppearance = OptionalRemap<\n\tOptionalRemap<\n\t\tz.input<typeof labelAppearanceSchemaStrict>,\n\t\t'iconScale',\n\t\tnumber | Interpolation<'zoom-level', number[]>\n\t>,\n\t'color' | 'outlineColor' | 'pinColor' | 'pinOutlineColor' | 'pinColorInactive' | 'pinOutlineColorInactive',\n\tColorString\n>;\n\nexport type LabelAppearanceWithDefaults = z.infer<typeof labelAppearanceSchema>;\n\nexport const parseLabelAppearance = (appearance: LabelAppearance) => {\n\treturn labelAppearanceSchema.parse(appearance);\n};\n\nexport const addLabelOptionsSchema = z.object({\n\t/**\n\t * Determines the collision ranking tier of the label, which influences its visibility in relation to other colliders.\n\t * For the possible values ('low', 'medium', 'high', 'always-visible') and their impact on label visibility.\n\t *\n\t * See {@link CollisionRankingTier}.\n\t */\n\trank: collisionRankingTierSchema.optional(),\n\t/**\n\t * Customize the appearance of the Label and its pin\n\t */\n\tappearance: labelAppearanceSchema.optional(),\n\t/**\n\t * Whether the Label should be clickable.\n\t * @default false\n\t */\n\tinteractive: z.boolean().default(false),\n\t/**\n\t * The placement of the text relative to the pin. Options include:\n\t * - 'right': Text appears to the right of the pin\n\t * - 'left': Text appears to the left of the pin\n\t * - 'top': Text appears above the pin\n\t * - 'center': Text is centered on the pin (hides pin)\n\t * - 'hidden': Hides text\n\t */\n\ttextPlacement: z\n\t\t.union([z.enum(LABEL_TEXT_PLACEMENT_VALUES), z.array(z.enum(LABEL_TEXT_PLACEMENT_VALUES))])\n\t\t.default(DEFAULT_LABEL_TEXT_PLACEMENTS),\n});\n\nexport type AddLabelOptionsInternal = z.input<typeof addLabelOptionsSchema> & {\n\tappearance?: LabelAppearance;\n\t// Add some extra internal properties\n\t/**\n\t * @internal\n\t */\n\tid?: string;\n\t/**\n\t * @internal\n\t */\n\toccluderId?: number;\n\t/**\n\t * The vertical position of the label relative to the floor.\n\t */\n\tverticalOffset?: number;\n\t/**\n\t * The entity to attach the label to.\n\t */\n\tattachTo?: EntityId<GeometryState> | string | null;\n\t/**\n\t * The placement of the text relative to the pin.\n\t */\n\ttextPlacement?: LabelTextPlacement | LabelTextPlacement[];\n};\n\nexport const validateLabelOptions = (options: AddLabelOptionsInternal) => {\n\taddLabelOptionsSchema.parse(options ?? {});\n};\n\nexport const validateLabel = (\n\tcoordinate: Position | EntityId<GeometryState>,\n\ttext: string,\n\toptions: AddLabelOptionsInternal,\n) => {\n\tz.array(z.number()).min(2).max(3).parse(coordinate);\n\tz.string().parse(text);\n\tvalidateLabelOptions(options);\n};\n\nconst SHARED_OPTIONS = ['color', 'outlineColor', 'margin'] satisfies (keyof LabelAppearance)[];\nconst TEXT_OPTIONS = [\n\t...SHARED_OPTIONS,\n\t'maxLines',\n\t'lineHeight',\n\t'textSize',\n\t'maxWidth',\n\t'textColor',\n\t'textOutlineColor',\n] satisfies (keyof LabelAppearance)[];\nconst PIN_OPTIONS = [\n\t...SHARED_OPTIONS,\n\t'icon',\n\t'pinColor',\n\t'pinOutlineColor',\n\t'pinColorInactive',\n\t'pinOutlineColorInactive',\n] satisfies (keyof LabelAppearance)[];\n\nexport const isOneOfTextDirtyOptions = (currentAppearance: LabelAppearance, newAppearance: LabelAppearance) => {\n\treturn TEXT_OPTIONS.some(key => newAppearance[key] != null && currentAppearance[key] !== newAppearance[key]);\n};\n\nexport const isOneOfPinDirtyOptions = (currentAppearance: LabelAppearance, newAppearance: LabelAppearance) => {\n\treturn PIN_OPTIONS.some(key => newAppearance[key] != null && currentAppearance[key] !== newAppearance[key]);\n};\n", "import { type EasingCurve, EASING_CURVES } from '@packages/internal/common/interpolate';\nimport z from 'zod';\n\nexport const easingCurveSchema = z.enum(EASING_CURVES);\n\n/**\n * Different properties that can be interpolated on, and what input values are expected.\n */\nexport type InterpolateOn = {\n\t'zoom-level': number[];\n};\n\n/**\n * Define interpolation behavior for a value.\n * @example\n * ```ts\n * // Interpolate a value from 1 to 2 between zoom levels 17 and 18 with easing\n * const value: Interpolation<'zoom-level', [number, number]> = {\n * on: 'zoom-level',\n * \tinput: [17, 18],\n * \toutput: [1, 2],\n * \teasing: 'ease-in',\n * };\n */\nexport type Interpolation<T extends keyof InterpolateOn, U extends unknown[]> = {\n\t/**\n\t * The property to observe when interpolating.\n\t *\n\t * @defaultValue 'zoom-level'\n\t */\n\ton: T;\n\t/**\n\t * Breakpoints in the observed property.\n\t */\n\tinput: [InterpolateOn[T][number], ...InterpolateOn[T]];\n\t/**\n\t * Output values corresponding to the input breakpoints.\n\t */\n\toutput: [U[number], ...U];\n\t/**\n\t * The easing function to use for the interpolation.\n\t *\n\t * @defaultValue 'linear'\n\t */\n\teasing?: EasingCurve;\n};\n\nconst isStrictlyIncreasing = (input: number[]) => {\n\tlet previous = input[0];\n\tfor (let i = 1; i < input.length; i++) {\n\t\tconst current = input[i];\n\t\tif (current <= previous) {\n\t\t\treturn false;\n\t\t}\n\t\tprevious = current;\n\t}\n\treturn true;\n};\n\nconst isStrictlyDecreasing = (input: number[]) => {\n\tlet previous = input[0];\n\tfor (let i = 1; i < input.length; i++) {\n\t\tconst current = input[i];\n\t\tif (current >= previous) {\n\t\t\treturn false;\n\t\t}\n\t\tprevious = current;\n\t}\n\treturn true;\n};\n\nconst isStrictlyIncreasingOrDecreasing = (input: number[]) => {\n\treturn isStrictlyIncreasing(input) || isStrictlyDecreasing(input);\n};\n\n/** Interpolation by zoom level. Input must be numeric. */\nexport const zoomInterpolationSchema = z\n\t.object({\n\t\ton: z.literal('zoom-level'),\n\t\tinput: z.array(z.number()).nonempty().refine(isStrictlyIncreasingOrDecreasing, {\n\t\t\tmessage: 'input array must be strictly increasing or decreasing',\n\t\t}),\n\t\toutput: z.array(z.number()).nonempty(),\n\t\teasing: easingCurveSchema.default('linear'),\n\t})\n\t.refine(interpolation => interpolation.input.length === interpolation.output.length, {\n\t\tmessage: 'input and output must have the same length',\n\t});\n", "// This file is autogenerated. It's used to publish ESM to npm.\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\n// https://github.com/bgrins/TinyColor\n// Brian Grinstead, MIT License\n\nvar trimLeft = /^\\s+/;\nvar trimRight = /\\s+$/;\nfunction tinycolor(color, opts) {\n color = color ? color : \"\";\n opts = opts || {};\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n var rgb = inputToRGB(color);\n this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) this._r = Math.round(this._r);\n if (this._g < 1) this._g = Math.round(this._g);\n if (this._b < 1) this._b = Math.round(this._b);\n this._ok = rgb.ok;\n}\ntinycolor.prototype = {\n isDark: function isDark() {\n return this.getBrightness() < 128;\n },\n isLight: function isLight() {\n return !this.isDark();\n },\n isValid: function isValid() {\n return this._ok;\n },\n getOriginalInput: function getOriginalInput() {\n return this._originalInput;\n },\n getFormat: function getFormat() {\n return this._format;\n },\n getAlpha: function getAlpha() {\n return this._a;\n },\n getBrightness: function getBrightness() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function getLuminance() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r / 255;\n GsRGB = rgb.g / 255;\n BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) R = RsRGB / 12.92;else R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n if (GsRGB <= 0.03928) G = GsRGB / 12.92;else G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n if (BsRGB <= 0.03928) B = BsRGB / 12.92;else B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n },\n setAlpha: function setAlpha(value) {\n this._a = boundAlpha(value);\n this._roundA = Math.round(100 * this._a) / 100;\n return this;\n },\n toHsv: function toHsv() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return {\n h: hsv.h * 360,\n s: hsv.s,\n v: hsv.v,\n a: this._a\n };\n },\n toHsvString: function toHsvString() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = Math.round(hsv.h * 360),\n s = Math.round(hsv.s * 100),\n v = Math.round(hsv.v * 100);\n return this._a == 1 ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n },\n toHsl: function toHsl() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return {\n h: hsl.h * 360,\n s: hsl.s,\n l: hsl.l,\n a: this._a\n };\n },\n toHslString: function toHslString() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = Math.round(hsl.h * 360),\n s = Math.round(hsl.s * 100),\n l = Math.round(hsl.l * 100);\n return this._a == 1 ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n },\n toHex: function toHex(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function toHexString(allow3Char) {\n return \"#\" + this.toHex(allow3Char);\n },\n toHex8: function toHex8(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function toHex8String(allow4Char) {\n return \"#\" + this.toHex8(allow4Char);\n },\n toRgb: function toRgb() {\n return {\n r: Math.round(this._r),\n g: Math.round(this._g),\n b: Math.round(this._b),\n a: this._a\n };\n },\n toRgbString: function toRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \")\" : \"rgba(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function toPercentageRgb() {\n return {\n r: Math.round(bound01(this._r, 255) * 100) + \"%\",\n g: Math.round(bound01(this._g, 255) * 100) + \"%\",\n b: Math.round(bound01(this._b, 255) * 100) + \"%\",\n a: this._a\n };\n },\n toPercentageRgbString: function toPercentageRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%)\" : \"rgba(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function toName() {\n if (this._a === 0) {\n return \"transparent\";\n }\n if (this._a < 1) {\n return false;\n }\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function toFilter(secondColor) {\n var hex8String = \"#\" + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = \"#\" + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n return \"progid:DXImageTransform.Microsoft.gradient(\" + gradientType + \"startColorstr=\" + hex8String + \",endColorstr=\" + secondHex8String + \")\";\n },\n toString: function toString(format) {\n var formatSet = !!format;\n format = format || this._format;\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n return formattedString || this.toHexString();\n },\n clone: function clone() {\n return tinycolor(this.toString());\n },\n _applyModification: function _applyModification(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function lighten() {\n return this._applyModification(_lighten, arguments);\n },\n brighten: function brighten() {\n return this._applyModification(_brighten, arguments);\n },\n darken: function darken() {\n return this._applyModification(_darken, arguments);\n },\n desaturate: function desaturate() {\n return this._applyModification(_desaturate, arguments);\n },\n saturate: function saturate() {\n return this._applyModification(_saturate, arguments);\n },\n greyscale: function greyscale() {\n return this._applyModification(_greyscale, arguments);\n },\n spin: function spin() {\n return this._applyModification(_spin, arguments);\n },\n _applyCombination: function _applyCombination(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function analogous() {\n return this._applyCombination(_analogous, arguments);\n },\n complement: function complement() {\n return this._applyCombination(_complement, arguments);\n },\n monochromatic: function monochromatic() {\n return this._applyCombination(_monochromatic, arguments);\n },\n splitcomplement: function splitcomplement() {\n return this._applyCombination(_splitcomplement, arguments);\n },\n // Disabled until https://github.com/bgrins/TinyColor/issues/254\n // polyad: function (number) {\n // return this._applyCombination(polyad, [number]);\n // },\n triad: function triad() {\n return this._applyCombination(polyad, [3]);\n },\n tetrad: function tetrad() {\n return this._applyCombination(polyad, [4]);\n }\n};\n\n// If input is an object, force 1 into \"1.0\" to handle ratios properly\n// String input requires \"1.0\" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function (color, opts) {\n if (_typeof(color) == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n } else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n// \"red\"\n// \"#f00\" or \"f00\"\n// \"#ff0000\" or \"ff0000\"\n// \"#ff000000\" or \"ff000000\"\n// \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n// \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n// \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n// \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n// \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n// \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n// \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n//\nfunction inputToRGB(color) {\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n if (_typeof(color) == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a\n };\n}\n\n// Conversion Functions\n// --------------------\n\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n\n// `rgbToRgb`\n// Handle bounds / percentage checking to conform to CSS color spec\n// <http://www.w3.org/TR/css3-color/>\n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n}\n\n// `rgbToHsl`\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n l = (max + min) / 2;\n if (max == min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n l: l\n };\n}\n\n// `hslToRgb`\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n var r, g, b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n v = max;\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n v: v\n };\n}\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHex`\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToHex`\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), pad2(convertDecimalToHex(a))];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToArgbHex`\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for \"toFilter()\"\nfunction rgbaToArgbHex(r, g, b, a) {\n var hex = [pad2(convertDecimalToHex(a)), pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n return hex.join(\"\");\n}\n\n// `equals`\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) return false;\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\ntinycolor.random = function () {\n return tinycolor.fromRatio({\n r: Math.random(),\n g: Math.random(),\n b: Math.random()\n });\n};\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>\n\nfunction _desaturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _saturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _greyscale(color) {\n return tinycolor(color).desaturate(100);\n}\nfunction _lighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\nfunction _brighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var rgb = tinycolor(color).toRgb();\n rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n return tinycolor(rgb);\n}\nfunction _darken(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction _spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>\n\nfunction _complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n}\nfunction polyad(color, number) {\n if (isNaN(number) || number <= 0) {\n throw new Error(\"Argument to polyad must be a positive number\");\n }\n var hsl = tinycolor(color).toHsl();\n var result = [tinycolor(color)];\n var step = 360 / number;\n for (var i = 1; i < number; i++) {\n result.push(tinycolor({\n h: (hsl.h + i * step) % 360,\n s: hsl.s,\n l: hsl.l\n }));\n }\n return result;\n}\nfunction _splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({\n h: (h + 72) % 360,\n s: hsl.s,\n l: hsl.l\n }), tinycolor({\n h: (h + 216) % 360,\n s: hsl.s,\n l: hsl.l\n })];\n}\nfunction _analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n}\nfunction _monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h,\n s = hsv.s,\n v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n while (results--) {\n ret.push(tinycolor({\n h: h,\n s: s,\n v: v\n }));\n v = (v + modification) % 1;\n }\n return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function (color1, color2, amount) {\n amount = amount === 0 ? 0 : amount || 50;\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n var p = amount / 100;\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a\n };\n return tinycolor(rgba);\n};\n\n// Readability Functions\n// ---------------------\n// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)\n\n// `contrast`\n// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)\ntinycolor.readability = function (color1, color2) {\n var c1 = tinycolor(color1);\n var c2 = tinycolor(color2);\n return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);\n};\n\n// `isReadable`\n// Ensure that foreground and background color combinations meet WCAG2 guidelines.\n// The third argument is an optional Object.\n// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';\n// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.\n// If the entire object is absent, isReadable defaults to {level:\"AA\",size:\"small\"}.\n\n// *Example*\n// tinycolor.isReadable(\"#000\", \"#111\") => false\n// tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\ntinycolor.isReadable = function (color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n out = false;\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n};\n\n// `mostReadable`\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\ntinycolor.mostReadable = function (baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors;\n level = args.level;\n size = args.size;\n for (var i = 0; i < colorList.length; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n if (tinycolor.isReadable(baseColor, bestColor, {\n level: level,\n size: size\n }) || !includeFallbackColors) {\n return bestColor;\n } else {\n args.includeFallbackColors = false;\n return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n }\n};\n\n// Big List of Colors\n// ------------------\n// <https://www.w3.org/TR/css-color-4/#named-colors>\nvar names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n};\n\n// Make it easy to access colors via `hexNames[hex]`\nvar hexNames = tinycolor.hexNames = flip(names);\n\n// Utilities\n// ---------\n\n// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\nfunction flip(o) {\n var flipped = {};\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n if (isOnePointZero(n)) n = \"100%\";\n var processPercent = isPercentage(n);\n n = Math.min(max, Math.max(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return n % max / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\nfunction isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf(\".\") != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n return typeof n === \"string\" && n.indexOf(\"%\") != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n return c.length == 1 ? \"0\" + c : \"\" + c;\n}\n\n// Replace a decimal with it's percentage value\nfunction convertToPercentage(n) {\n if (n <= 1) {\n n = n * 100 + \"%\";\n }\n return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\nvar matchers = function () {\n // <http://www.w3.org/TR/css3-values/#integers>\n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // <http://www.w3.org/TR/css3-values/#number-value>\n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n}();\n\n// `isValidCSSUnit`\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see `matchers` above for definition).\nfunction isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n}\n\n// `stringInputToObject`\n// Permissive string parsing. Take in a number of formats, and output an object\n// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\nfunction stringInputToObject(color) {\n color = color.replace(trimLeft, \"\").replace(trimRight, \"\").toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n } else if (color == \"transparent\") {\n return {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n format: \"name\"\n };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if (match = matchers.rgb.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3]\n };\n }\n if (match = matchers.rgba.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsl.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3]\n };\n }\n if (match = matchers.hsla.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsv.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3]\n };\n }\n if (match = matchers.hsva.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hex8.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex6.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if (match = matchers.hex4.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n a: convertHexToDecimal(match[4] + \"\" + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex3.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n return false;\n}\nfunction validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || {\n level: \"AA\",\n size: \"small\"\n };\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return {\n level: level,\n size: size\n };\n}\n\nexport { tinycolor as default };\n", "import '../styles/marker.scss';\nimport { Vector2 } from 'three';\nimport type { Entity2DHTMLDivElement, EntityId, Position } from '../types';\nimport { randomId } from '../../../packages/common/random-id';\nimport type { GroupContainerState } from '../entities/group-container';\nimport type { CollisionRankingTier } from '../utils/collision-ranking-tier';\nimport { convertCollisionRankingTierToNumber } from '../utils/collision-ranking-tier';\nimport { z } from 'zod';\nimport type { PackedJsonMessage, PackedBBox } from '../systems/collisions/system';\nimport merge from 'lodash.merge';\nimport type { GeometryState } from './mesh';\nimport type { MarkerPlacement } from './marker-utils';\nimport {\n\tDEFAULT_LOW_PRIORITY_PIN_CONFIG,\n\tDEFAULT_MARKER_MARGIN,\n\tDEFAULT_MARKER_PLACEMENT_VALUES,\n\tLOW_PRIORITY_PIN_OPACITY,\n\tMARKER_PLACEMENT,\n\tMARKER_PLACEMENT_VALUES,\n} from './marker-utils';\n\n/**\n * State representing a Marker\n */\nexport type MarkerState = {\n\treadonly id: string | number;\n\treadonly type: 'marker';\n\t/**\n\t * The parent container of the marker\n\t */\n\treadonly parent: EntityId<GroupContainerState> | string | number;\n\t/**\n\t * The position of the marker in [lon, lat]\n\t */\n\treadonly position: Position;\n\t/**\n\t * Whether the marker is enabled\n\t */\n\tenabled: boolean;\n\t/**\n\t * Whether the marker is visible IF is is enabled\n\t * this can be used to have more granular control of whether the label shows up,\n\t * for example, if someone implements a layer system that shows/hides\n\t */\n\tvisible: boolean;\n\t/**\n\t * HTML content of the marker as text\n\t */\n\tcontentHTML?: string;\n\t/**\n\t * Pointer to the HTML element of the marker in the DOM tree\n\t */\n\telement: HTMLElement;\n\t/**\n\t * The initial rank of the marker, which can be used to reset the rank of the marker to its initial value.\n\t */\n\tinitialRank: CollisionRankingTier | number;\n\toptions: Omit<AddMarkerOptions, 'id'> & {\n\t\tlowPriorityPin: LowPriorityPinConfig;\n\t};\n\t/**\n\t * Placement for the marker. This will determine the alignment of the marker relative to the placement. A list will place the marker in the first empty placement.\n\t */\n\tplacement: MarkerPlacement | MarkerPlacement[];\n\t/**\n\t * Dynamic resize of the marker. If set to true, the marker will resize based on the content.\n\t */\n\tdynamicResize: boolean;\n};\n\nexport type MarkerStateUpdate = Omit<MarkerState, 'type' | 'parent' | 'id' | 'options'> & {\n\toptions?: Partial<Omit<AddMarkerOptions, 'id' | 'lowPriorityPin'>>;\n};\n\n/**\n * Configuration for the low priority pin placement. Must be used in conjunction with the placement 'pin'.\n */\nexport type LowPriorityPinConfig = {\n\t/**\n\t * Size of the low priority pin in pixels.\n\t * @default 2\n\t */\n\tsize: number;\n\t/**\n\t * Color of the low priority pin.\n\t * @default '#666'\n\t */\n\tcolor: string;\n};\n\nexport const addMarkerOptionsSchema = z.object({\n\trank: z.union([z.enum(['low', 'medium', 'high', 'always-visible']), z.number()]).optional(),\n\tinteractive: z.union([z.boolean(), z.literal('pointer-events-auto')]).optional(),\n\tid: z.string().optional(),\n\tplacement: z.union([z.enum(MARKER_PLACEMENT_VALUES), z.array(z.enum(MARKER_PLACEMENT_VALUES))]).optional(),\n\tdynamicResize: z.boolean().optional(),\n\tzIndex: z.number().optional(),\n\tlowPriorityPin: z\n\t\t.object({\n\t\t\tsize: z.number().positive().optional(),\n\t\t\tcolor: z.string().optional(),\n\t\t})\n\t\t.optional(),\n});\n\nexport function validateMarker(coordinate: Position, contentHTML: string, options: AddMarkerOptions) {\n\tz.array(z.number()).min(2).max(3).parse(coordinate);\n\tz.string().parse(contentHTML);\n\taddMarkerOptionsSchema.parse(options);\n}\n\n/**\n * Options for creating a new Marker\n */\nexport type AddMarkerOptions = {\n\t/**\n\t * Optional. Determines the collision ranking tier of the marker, which influences its visibility in relation to other colliders.\n\t * For the possible values ('low', 'medium', 'high', 'always-visible') and their impact on label visibility.\n\t *\n\t * See {@link CollisionRankingTier}.\n\t */\n\trank?: CollisionRankingTier;\n\t/**\n\t * Whether the Label should be clickable.\n\t * If `true` the marker will be registered in the SDK interaction events.\n\t * If `'pointer-events-auto'` the marker will receive browser pointer events.\n\t * @default false\n\t */\n\tinteractive?: boolean | 'pointer-events-auto';\n\t/**\n\t * @internal\n\t */\n\tid?: string;\n\t/**\n\t * Placement for the marker. This will determine the alignment of the marker relative to the placement. A list will place the marker in the first empty placement.\n\t */\n\tplacement?: MarkerPlacement | MarkerPlacement[];\n\t/**\n\t * Dynamic resize of the marker. If set to true, the marker will resize based on the content.\n\t */\n\tdynamicResize?: boolean;\n\n\t/**\n\t * @internal\n\t */\n\toccluderId?: number;\n\t/**\n\t * The z-index of the marker. Can be used used in conjunction with rank: 'always-visible' to make certain markers appear over others\n\t */\n\tzIndex?: number;\n\t/**\n\t * The vertical position of the marker relative to the floor.\n\t */\n\tverticalOffset?: number;\n\t/**\n\t * The entity to attach the marker to.\n\t */\n\tattachTo?: EntityId<GeometryState> | string | number | null;\n\t/**\n\t * Configuration for the low priority pin fallback strategy.\n\t * When enabled, shows a smaller pin version of the marker when all anchor positions have collisions.\n\t * @default { size: 2, color: '#666' }\n\t */\n\tlowPriorityPin?: Partial<LowPriorityPinConfig>;\n};\n\ntype MarkerStrategy = {\n\tname: MarkerPlacement;\n\tgetBoundingBox: () => number[];\n};\n\nexport class MarkerComponent {\n\tid: string | number;\n\treadonly type = 'marker';\n\tstatic testId = 0;\n\trank = 0;\n\tinitialRank = 0;\n\tactivePlacement: MarkerPlacement = 'center';\n\tpointerEvents: 'auto' | 'none' = 'none';\n\toptions: Required<\n\t\tOmit<AddMarkerOptions, 'zIndex' | 'attachTo'> & {\n\t\t\tlowPriorityPin: Required<LowPriorityPinConfig>;\n\t\t}\n\t> & { zIndex?: number } = {\n\t\trank: 'low',\n\t\tinteractive: false,\n\t\tid: '',\n\t\tplacement: DEFAULT_MARKER_PLACEMENT_VALUES,\n\t\tdynamicResize: false,\n\t\toccluderId: 0,\n\t\tzIndex: undefined,\n\t\tverticalOffset: 0,\n\t\tlowPriorityPin: { ...DEFAULT_LOW_PRIORITY_PIN_CONFIG },\n\t};\n\tprojection: Vector2 = new Vector2();\n\tenabled = true;\n\t/**\n\t * Whether the marker can be shown, which is decided by the collision engine\n\t */\n\tcanShow = false;\n\tvisible = true;\n\tisOccluded = false;\n\toffscreen = false;\n\tstrategyIndex = -1;\n\tactiveBoundingBox: {\n\t\tx: number;\n\t\ty: number;\n\t\tw: number;\n\t\th: number;\n\t} = { x: 0, y: 0, w: 0, h: 0 };\n\tprivate dimensions: { width: number; height: number } = { width: 0, height: 0 };\n\t// container of the marker itself\n\tmarkerContainer: Entity2DHTMLDivElement;\n\t// container of the content of the marker. This is used to allow low level pin strategy to control the visibility of the content\n\tcontainerEl: HTMLElement;\n\t// content dom of the marker once user specified contenthtml gets rendered\n\tcontentEl: HTMLElement | null = null;\n\t// content html for the marker. TODO: handle update?\n\tcontentHtml = '';\n\tstyle = {\n\t\ttop: '0px',\n\t\tleft: '0px',\n\t};\n\tdirty = false;\n\t/** Flag used in 2d-projection system to determine if the parent has changed */\n\tattachedDirty = true;\n\tcollisionDirty = true;\n\tvisibilityNeedsUpdate: 'show' | 'hide' | false = 'show';\n\n\tconstructor(contentHtml: string, options: AddMarkerOptions = {}) {\n\t\tthis.id = options?.id || randomId();\n\t\tthis.options = merge(this.options, options);\n\t\tthis.options.placement = options.placement ?? this.options.placement;\n\t\tif (typeof options.rank === 'string') {\n\t\t\tthis.rank = convertCollisionRankingTierToNumber(options.rank);\n\t\t} else if (options.rank != null && options.rank > 0) {\n\t\t\tthis.rank = options.rank;\n\t\t} else {\n\t\t\tconst generatedRank =\n\t\t\t\tMath.trunc(process.env.NODE_ENV === 'test' ? MarkerComponent.testId : MarkerComponent.testId * 10) / 10;\n\n\t\t\tMarkerComponent.testId += 0.001;\n\t\t\tthis.rank = generatedRank;\n\t\t}\n\t\tif (typeof options.interactive === 'string') {\n\t\t\tthis.pointerEvents = options.interactive === 'pointer-events-auto' ? 'auto' : 'none';\n\t\t}\n\t\tthis.contentHtml = contentHtml;\n\t\tthis.initialRank = this.rank;\n\n\t\tthis.markerContainer = document.createElement('div') as Entity2DHTMLDivElement;\n\t\tthis.markerContainer.className = 'mappedin-marker';\n\t\tthis.markerContainer.style.opacity = '0';\n\t\tthis.markerContainer.innerHTML = `<div class=\"mappedin-marker-content\">${this.contentHtml}</div>`;\n\t\tthis.markerContainer.setAttribute('data-marker-id', this.id.toString());\n\t\tthis.containerEl = (this.markerContainer.firstElementChild as HTMLElement) ?? null;\n\t\tthis.contentEl = (this.markerContainer.firstElementChild?.firstElementChild as HTMLElement) ?? null;\n\t}\n\n\tupdateDimensions(width?: number, height?: number) {\n\t\tif (width != null && height != null) {\n\t\t\tthis.dimensions = { width, height };\n\t\t} else {\n\t\t\t// otherwise, assume collider is in the DOM\n\t\t\tconst { width, height } = this.markerContainer.getBoundingClientRect();\n\t\t\tthis.dimensions = { width, height };\n\t\t}\n\t\tObject.assign(this.markerContainer, {\n\t\t\twidth: this.dimensions.width + 'px',\n\t\t\theight: this.dimensions.height + 'px',\n\t\t});\n\t\t// reset the strategy so it can be recomputed\n\t\tthis.currentStrategyIndex = -1;\n\t}\n\n\tanimation: Animation | null = null;\n\n\tcurrentStrategyIndex = -1;\n\tonStrategySelected = (strategyIndex: number, force = false) => {\n\t\tif (this.currentStrategyIndex === strategyIndex && !force) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.currentStrategyIndex = strategyIndex;\n\n\t\t// Get the strategy info\n\t\tconst strategy = this.strategies[strategyIndex];\n\t\tthis.activePlacement = strategy?.name ?? 'center';\n\n\t\t// Handle Low Priority Pin strategy with special styling\n\t\tif (this.activePlacement === MARKER_PLACEMENT.HIDDEN) {\n\t\t\tthis.markerContainer.setAttribute('data-placement', MARKER_PLACEMENT.HIDDEN);\n\n\t\t\tconst pinConfig = this.options.lowPriorityPin!;\n\t\t\tconst pinSize = pinConfig.size;\n\t\t\tconst pinColor = pinConfig.color;\n\n\t\t\t// Set CSS custom properties for the pin styling\n\t\t\tthis.markerContainer.style.setProperty('--mappedin-pin-size', `${pinSize}px`);\n\t\t\tthis.markerContainer.style.setProperty('--pin-color', pinColor);\n\t\t\tthis.markerContainer.style.opacity = LOW_PRIORITY_PIN_OPACITY;\n\n\t\t\t// Center positioning for low priority pin\n\t\t\tthis.style.top = -pinSize / 2 + 'px';\n\t\t\tthis.style.left = -pinSize / 2 + 'px';\n\t\t} else {\n\t\t\t// Regular strategy: remove low priority pin data attribute and CSS properties\n\t\t\tthis.markerContainer.setAttribute('data-placement', this.activePlacement);\n\t\t\tthis.markerContainer.style.removeProperty('--mappedin-pin-size');\n\t\t\tthis.markerContainer.style.removeProperty('--pin-color');\n\t\t\tthis.markerContainer.style.opacity = '1';\n\n\t\t\tconst { width, height } = this.dimensions;\n\t\t\tlet top = -height / 2 + 'px';\n\t\t\tlet left = -width / 2 + 'px';\n\n\t\t\tthis.style.top = top;\n\t\t\tthis.style.left = left;\n\n\t\t\tswitch (this.activePlacement) {\n\t\t\t\tcase MARKER_PLACEMENT.TOP: {\n\t\t\t\t\tthis.style.top = -height + 'px';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MARKER_PLACEMENT.BOTTOM: {\n\t\t\t\t\tthis.style.top = '0px';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MARKER_PLACEMENT.LEFT: {\n\t\t\t\t\tthis.style.left = -width + 'px';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MARKER_PLACEMENT.RIGHT: {\n\t\t\t\t\tthis.style.left = '0px';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MARKER_PLACEMENT.TOP_LEFT: {\n\t\t\t\t\tthis.style.top = -height + 'px';\n\t\t\t\t\tthis.style.left = -width + 'px';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MARKER_PLACEMENT.TOP_RIGHT: {\n\t\t\t\t\tthis.style.top = -height + 'px';\n\t\t\t\t\tthis.style.left = '0px';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MARKER_PLACEMENT.BOTTOM_LEFT: {\n\t\t\t\t\tthis.style.top = '0px';\n\t\t\t\t\tthis.style.left = -width + 'px';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MARKER_PLACEMENT.BOTTOM_RIGHT: {\n\t\t\t\t\tthis.style.top = '0px';\n\t\t\t\t\tthis.style.left = '0px';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase MARKER_PLACEMENT.CENTER:\n\t\t\t\tdefault: {\n\t\t\t\t\tthis.style.top = top;\n\t\t\t\t\tthis.style.left = left;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.markerContainer.style.top = this.style.top;\n\t\tthis.markerContainer.style.left = this.style.left;\n\t};\n\n\tget strategies(): MarkerStrategy[] {\n\t\tconst { width, height } = this.dimensions;\n\n\t\t// This is to ensure if the marker has no content it's not considered by the collision engine\n\t\tif (width === 0 || height === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst placements: MarkerPlacement[] = Array.isArray(this.options.placement)\n\t\t\t? this.options.placement\n\t\t\t: [this.options.placement as MarkerPlacement];\n\n\t\tconst anchorStrategies = placements.map(anchor => {\n\t\t\treturn {\n\t\t\t\tname: anchor,\n\t\t\t\tgetBoundingBox: () => {\n\t\t\t\t\tlet top = height / 2;\n\t\t\t\t\tlet bottom = height / 2;\n\t\t\t\t\tlet left = width / 2;\n\t\t\t\t\tlet right = width / 2;\n\n\t\t\t\t\tswitch (anchor) {\n\t\t\t\t\t\tcase MARKER_PLACEMENT.TOP: {\n\t\t\t\t\t\t\ttop = height;\n\t\t\t\t\t\t\tbottom = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase MARKER_PLACEMENT.BOTTOM: {\n\t\t\t\t\t\t\ttop = 0;\n\t\t\t\t\t\t\tbottom = height;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase MARKER_PLACEMENT.LEFT: {\n\t\t\t\t\t\t\tleft = width;\n\t\t\t\t\t\t\tright = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase MARKER_PLACEMENT.RIGHT: {\n\t\t\t\t\t\t\tleft = 0;\n\t\t\t\t\t\t\tright = width;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase MARKER_PLACEMENT.TOP_LEFT: {\n\t\t\t\t\t\t\ttop = height;\n\t\t\t\t\t\t\tleft = width;\n\t\t\t\t\t\t\tbottom = 0;\n\t\t\t\t\t\t\tright = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase MARKER_PLACEMENT.TOP_RIGHT: {\n\t\t\t\t\t\t\ttop = height;\n\t\t\t\t\t\t\tright = width;\n\t\t\t\t\t\t\tbottom = 0;\n\t\t\t\t\t\t\tleft = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase MARKER_PLACEMENT.BOTTOM_LEFT: {\n\t\t\t\t\t\t\tbottom = height;\n\t\t\t\t\t\t\tleft = width;\n\t\t\t\t\t\t\ttop = 0;\n\t\t\t\t\t\t\tright = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase MARKER_PLACEMENT.BOTTOM_RIGHT: {\n\t\t\t\t\t\t\tbottom = height;\n\t\t\t\t\t\t\tright = width;\n\t\t\t\t\t\t\ttop = 0;\n\t\t\t\t\t\t\tleft = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase MARKER_PLACEMENT.HIDDEN:\n\t\t\t\t\t\t\t// Much smaller bounding box for low priority pin\n\t\t\t\t\t\t\tconst lowPriorityPinMargin = Math.max(2, DEFAULT_MARKER_MARGIN / 2);\n\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\tthis.options.lowPriorityPin.size / 2 + lowPriorityPinMargin,\n\t\t\t\t\t\t\t\tthis.options.lowPriorityPin.size / 2 + lowPriorityPinMargin,\n\t\t\t\t\t\t\t\tthis.options.lowPriorityPin.size / 2 + lowPriorityPinMargin,\n\t\t\t\t\t\t\t\tthis.options.lowPriorityPin.size / 2 + lowPriorityPinMargin,\n\t\t\t\t\t\t\t];\n\t\t\t\t\t}\n\n\t\t\t\t\treturn [\n\t\t\t\t\t\ttop + DEFAULT_MARKER_MARGIN,\n\t\t\t\t\t\tbottom + DEFAULT_MARKER_MARGIN,\n\t\t\t\t\t\tleft + DEFAULT_MARKER_MARGIN,\n\t\t\t\t\t\tright + DEFAULT_MARKER_MARGIN,\n\t\t\t\t\t];\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t\treturn anchorStrategies;\n\t}\n\n\tprivate packedMessage: PackedJsonMessage = {\n\t\tx: 0,\n\t\ty: 0,\n\t\tenabled: false,\n\t\trank: 0,\n\t\tbboxes: [],\n\t\tlockedToStrategyIndex: -1,\n\t\tshouldCollideWithScreenEdges: false,\n\t};\n\n\ttoPackedMessage(isPanning = false): PackedJsonMessage {\n\t\tthis.packedMessage.x = this.projection.x;\n\t\tthis.packedMessage.y = this.projection.y;\n\t\tthis.packedMessage.enabled = this.enabled;\n\t\tthis.packedMessage.rank = this.rank;\n\t\tthis.packedMessage.shouldCollideWithScreenEdges = true;\n\n\t\t// Check if marker is using a regular strategy (not unplaced and not low priority pin)\n\t\tconst isRegularStrategy =\n\t\t\tthis.currentStrategyIndex !== -1 && this.currentStrategyIndex !== this.lowPriorityPinStrategyIndex;\n\n\t\t// Lock to regular priority pin strategy during panning (similar to labels' low priority strategy)\n\t\tif (this.visible && isPanning && isRegularStrategy && this.collisionDirty === false) {\n\t\t\tthis.packedMessage.lockedToStrategyIndex = this.currentStrategyIndex;\n\t\t} else {\n\t\t\tthis.packedMessage.lockedToStrategyIndex = -1;\n\t\t}\n\n\t\t// make markers more stable by keeping the current strategy index at the front of the bboxes array\n\t\t// so it gets tested first, leaving the marker in the same strategy if possible\n\t\tif (isRegularStrategy && this.currentStrategyIndex !== this.packedMessage.bboxes[0]?.[4]) {\n\t\t\tconst currentStrategyIndex = this.packedMessage.bboxes.findIndex(bbox => bbox[4] === this.currentStrategyIndex);\n\t\t\tif (currentStrategyIndex !== -1) {\n\t\t\t\tconst currentStrategyBox = this.packedMessage.bboxes.splice(currentStrategyIndex, 1)[0];\n\t\t\t\tthis.packedMessage.bboxes.unshift(currentStrategyBox);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.collisionDirty) {\n\t\t\treturn this.packedMessage;\n\t\t}\n\n\t\tthis.packedMessage.bboxes = [];\n\n\t\tfor (let i = 0; i < this.strategies.length; i++) {\n\t\t\tconst strategy = this.strategies[i];\n\t\t\t// Prioritize current strategy unless it's the low priority pin strategy\n\t\t\tif (i === this.currentStrategyIndex && isRegularStrategy) {\n\t\t\t\tthis.packedMessage.bboxes.unshift([...strategy.getBoundingBox(), i] as PackedBBox);\n\t\t\t} else {\n\t\t\t\tthis.packedMessage.bboxes.push([...strategy.getBoundingBox(), i] as PackedBBox);\n\t\t\t}\n\t\t}\n\n\t\tthis.collisionDirty = false;\n\n\t\treturn this.packedMessage;\n\t}\n\n\t/**\n\t * Get the index of the low priority pin strategy\n\t */\n\tget lowPriorityPinStrategyIndex() {\n\t\tif (this.options.rank === 'always-visible') {\n\t\t\treturn -1;\n\t\t}\n\n\t\t// Find the HIDDEN strategy index in the strategies array\n\t\treturn this.strategies.findIndex(strategy => strategy.name === MARKER_PLACEMENT.HIDDEN);\n\t}\n\n\tdestroy() {\n\t\t// this.containerEl.userData = null;\n\t\t// this.containerEl.remove();\n\t\t// this.contentEl.remove();\n\t\t// this.containerEl = null;\n\t\t// this.contentEl = null;\n\t}\n}\n", "import type { ValuesAsTuple } from '@packages/internal/common/type-utils';\nimport type { ValueOf } from 'type-fest';\n\nexport const DEFAULT_MARKER_MARGIN = 4;\nexport const LOW_PRIORITY_PIN_SIZE = 8; // Small low priority pin size\nexport const LOW_PRIORITY_PIN_OPACITY = '0.6'; // Semi-transparent low priority pin\n\nexport const MARKER_PLACEMENT = {\n\t/** Marker is aligned to the top of the anchor */\n\tTOP: 'top',\n\t/** Marker is aligned to the bottom of the anchor */\n\tBOTTOM: 'bottom',\n\t/** Marker is aligned to the left of the anchor */\n\tLEFT: 'left',\n\t/** Marker is aligned to the right of the anchor */\n\tRIGHT: 'right',\n\t/** Marker is aligned to the center of the anchor */\n\tCENTER: 'center',\n\t/** Marker is aligned to the top-left of the anchor */\n\tTOP_LEFT: 'top-left',\n\t/** Marker is aligned to the top-right of the anchor */\n\tTOP_RIGHT: 'top-right',\n\t/** Marker is aligned to the bottom-left of the anchor */\n\tBOTTOM_LEFT: 'bottom-left',\n\t/** Marker is aligned to the bottom-right of the anchor */\n\tBOTTOM_RIGHT: 'bottom-right',\n\t/** Marker is hidden and replaced with a pin */\n\tHIDDEN: 'hidden',\n} as const;\n\nexport type MarkerPlacement = ValueOf<typeof MARKER_PLACEMENT>;\nexport const MARKER_PLACEMENT_VALUES = Object.values(MARKER_PLACEMENT) as ValuesAsTuple<typeof MARKER_PLACEMENT>;\nexport const DEFAULT_MARKER_PLACEMENT_VALUES: MarkerPlacement[] = [MARKER_PLACEMENT.CENTER, MARKER_PLACEMENT.HIDDEN];\n\nexport const DEFAULT_LOW_PRIORITY_PIN_CONFIG = Object.freeze({\n\tsize: LOW_PRIORITY_PIN_SIZE,\n\tcolor: '#666', // Why did we choose #666 as the default? \uD83D\uDE08\n});\n", "import { Object3D } from 'three';\nimport type { Mesh, Object3DEventMap, ShaderMaterial, Texture, TubeGeometry, Color, Vector2, Raycaster } from 'three';\nimport { randomId } from '../../../packages/common/random-id';\nimport type { InteractionComponent } from '../components/interaction';\nimport type { MeshComponent } from '../components/mesh';\nimport type { ModelComponent } from '../components/model';\nimport type { PathComponent } from '../components/path';\nimport type { StyleComponent } from '../components/styles/style';\nimport type { ImageComponent } from '../components/image';\nimport type { CustomGeometryComponent } from '../components/custom';\nimport type { GroupContainerObject3D } from './group-container';\nimport type { Geometry2D } from './geometry2d';\nimport { GeometryGroupObject3D } from './geometry-group';\nimport type { Text3DComponent } from '../components/text3d';\nimport type { ModelStyleComponnet, Text3DStyleComponent } from '../components/styles';\nimport type { OutlineComponent } from '../components/outline';\nimport type { FocusableComponent } from '../components/focusable';\nimport type { BorderComponent } from '../components/border';\n\nexport enum Geometry3DComponents {\n\tMesh,\n\tStyle,\n\tInteraction,\n\tOutline,\n\tFocusable,\n\tBorder,\n}\n\ntype Geometry3DObjectTypes = 'geometry' | 'path' | 'model' | 'custom-geometry' | 'image' | 'text3d';\nexport class Geometry3DObject3D extends Object3D {\n\ttype: Geometry3DObjectTypes = 'geometry';\n\tuserData: {\n\t\tentityId: string;\n\t\t/**\n\t\t * TODO: remove this when proper instancing is handled\n\t\t */\n\t\tisSingleModel?: boolean;\n\t\ttype: Geometry3DObjectTypes;\n\t} = {\n\t\tentityId: '',\n\t\ttype: 'geometry',\n\t};\n\t/**\n\t * Custom raycast implementation for model objects only.\n\t * This selectively enables recursive raycasting just for models, which have complex hierarchies,\n\t * while avoiding the performance cost of recursive raycasting for other object types.\n\t */\n\traycast(raycaster: Raycaster, intersects: any[]) {\n\t\tif (this.userData.type === 'model' && this.children[0]) {\n\t\t\traycaster.intersectObject(this.children[0], true).forEach(result => {\n\t\t\t\tintersects.push(result);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport type PathMaterial = ShaderMaterial & {\n\tuniforms: PathUniforms;\n};\nexport type PathMesh = Mesh<TubeGeometry, PathMaterial, Object3DEventMap>;\nexport declare class PatMeshContainer extends Geometry3DObject3D {\n\tchildren: [PathMesh, PathMesh];\n}\n\nexport type MeshComponentTypes =\n\t| MeshComponent\n\t| PathComponent\n\t| ModelComponent\n\t| CustomGeometryComponent\n\t| Text3DComponent\n\t| ImageComponent;\n\ntype MappedComponentType<M> = M extends MeshComponent\n\t? 'geometry'\n\t: M extends PathComponent\n\t? 'path'\n\t: M extends ModelComponent\n\t? 'model'\n\t: M extends CustomGeometryComponent\n\t? 'custom-geometry'\n\t: M extends ImageComponent\n\t? 'image'\n\t: M extends Text3DComponent\n\t? 'text3d'\n\t: never;\n\nexport class Geometry3D<\n\tM extends MeshComponentTypes = MeshComponent,\n\tS extends StyleComponent | Text3DStyleComponent | ModelStyleComponnet = StyleComponent,\n\tI extends InteractionComponent = InteractionComponent,\n\tT extends MappedComponentType<M> = MappedComponentType<M>,\n\tO extends OutlineComponent | undefined = OutlineComponent | undefined,\n\tF extends FocusableComponent | undefined = FocusableComponent | undefined,\n\tB extends BorderComponent | undefined = BorderComponent | undefined,\n> {\n\tid: string | number = randomId();\n\tcomponents: [M, S, I?, O?, F?, B?];\n\t/**\n\t * Parent geometry group ID\n\t */\n\tparentId?: string | number;\n\tget object3d() {\n\t\treturn this.components[Geometry3DComponents.Mesh].mesh as M['mesh'];\n\t}\n\t// scene-graph parent\n\tget parentObject3D(): GroupContainerObject3D | GeometryGroupObject3D | null {\n\t\treturn this.components[Geometry3DComponents.Mesh].mesh?.parent as\n\t\t\t| GroupContainerObject3D\n\t\t\t| GeometryGroupObject3D\n\t\t\t| null;\n\t}\n\tget type(): T {\n\t\treturn this.components[Geometry3DComponents.Mesh].type as T;\n\t}\n\n\tentities2D: Map<string | number, Geometry2D> = new Map();\n\n\tconstructor(meshComponent: M, styleComponent: S) {\n\t\tthis.components = [meshComponent, styleComponent];\n\t}\n\n\t/** Attaching a 2D entity to the 3D entity so it will follow the style changes */\n\tattach(entity: Geometry2D) {\n\t\tif (this.parentObject3D instanceof GeometryGroupObject3D) {\n\t\t\tentity.object3d.userData.attachedEntityId = this.id;\n\t\t} else {\n\t\t\tthis.entities2D.set(entity.id, entity);\n\t\t}\n\t}\n\n\tdetach(entity: Geometry2D) {\n\t\tif (this.parentObject3D instanceof GeometryGroupObject3D) {\n\t\t\tentity.object3d.userData.parentEntityId = undefined;\n\t\t}\n\t\tthis.entities2D.delete(entity.id);\n\t}\n\n\tremoveAllEntities() {\n\t\tfor (const entity of this.entities2D.values()) {\n\t\t\tthis.detach(entity);\n\t\t}\n\t}\n\n\t// toJSON() {\n\t// \treturn {\n\t// \t\tid: this.id,\n\t// \t\ttype: 'ThreeDEntity',\n\t// \t\tobject: this.components[Geometry3DComponents.Mesh].mesh?.id,\n\t// \t};\n\t// }\n}\n\nexport type TextGeometry3D = Geometry3D<Text3DComponent, Text3DStyleComponent, InteractionComponent, 'text3d'>;\nexport type CustomGeometry3D = Geometry3D<\n\tCustomGeometryComponent,\n\tStyleComponent,\n\tInteractionComponent,\n\t'custom-geometry'\n>;\nexport type ModelGeometry3D = Geometry3D<ModelComponent, ModelStyleComponnet, InteractionComponent, 'model'>;\nexport type PathGeometry3D = Geometry3D<PathComponent, StyleComponent, InteractionComponent, 'path'>;\nexport type ImageGeometry3D = Geometry3D<ImageComponent, StyleComponent, InteractionComponent, 'image'>;\nexport type MeshGeometry3D = Geometry3D<MeshComponent, StyleComponent, InteractionComponent, 'geometry'>;\nexport type Geometry3DTypes =\n\t| TextGeometry3D\n\t| CustomGeometry3D\n\t| PathGeometry3D\n\t| ImageGeometry3D\n\t| MeshGeometry3D\n\t| ModelGeometry3D;\n\nexport interface PathUniforms {\n\tvertexes: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tresolution: {\n\t\ttype: 'v2';\n\t\tvalue: Vector2;\n\t};\n\tcameraParameters: {\n\t\ttype: 'v2';\n\t\tvalue: Vector2;\n\t};\n\tcomplete: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tcolor: {\n\t\ttype: 'c';\n\t\tvalue: Color;\n\t};\n\tpathLength: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tnearRadius: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tfarRadius: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tnearZoom: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tfarZoom: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tpulseColor: {\n\t\ttype: 'c';\n\t\tvalue: Color;\n\t};\n\tpulse: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tpulseLength: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tpathIsVertical: {\n\t\ttype: 'b';\n\t\tvalue: boolean;\n\t};\n\tarrowAnimationTimer: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tarrowTexture: {\n\t\ttype: 't';\n\t\tvalue: Texture;\n\t};\n\tdisplayArrowsOnPath: {\n\t\ttype: 'b';\n\t\tvalue: boolean;\n\t};\n\tshowPulse: {\n\t\ttype: 'b';\n\t\tvalue: boolean;\n\t};\n\topacityMultiplier: {\n\t\ttype: 'f';\n\t\tvalue: number;\n\t};\n\tdashed: {\n\t\ttype: 'b';\n\t\tvalue: boolean;\n\t};\n}\n", "import { Object3D, Vector3 } from 'three';\nimport { randomId } from '../../../packages/common/random-id';\nimport type { MarkerComponent } from '../components/marker';\nimport type LabelComponent from '../components/label';\nimport type { GroupContainerObject3D } from './group-container';\nimport type { InteractionComponent } from '../components/interaction';\nimport { type GeometryGroupObject3D } from './geometry-group';\n\nexport enum Geometry2DComponents {\n\tUI,\n\tInteraction,\n}\n\nexport class Geometry2DObject3D extends Object3D {}\n\nexport class Geometry2D {\n\tid: string | number;\n\n\tget type(): 'label' | 'marker' {\n\t\treturn this.components[Geometry2DComponents.UI].type;\n\t}\n\t// scene-graph parent\n\tget parentObject3D(): GroupContainerObject3D | GeometryGroupObject3D | null {\n\t\treturn this.object3d.parent as GroupContainerObject3D | GeometryGroupObject3D | null;\n\t}\n\n\t/** The geometry3D that this 2D entity is attached to */\n\tget attachedTo(): string | number | undefined {\n\t\treturn this.object3d.userData.attachedEntityId;\n\t}\n\n\tverticalOffset: number;\n\toccluderId?: number;\n\t// And object 3D here ensures that the label's position is tied to it's parent, making our life so much easier\n\tobject3d = new Geometry2DObject3D();\n\tcomponents: [MarkerComponent | LabelComponent, InteractionComponent?];\n\tdisposed = false;\n\tconstructor(ui: MarkerComponent | LabelComponent, position: Vector3, verticalOffset = 0) {\n\t\tthis.id = ui.id || randomId();\n\t\tthis.components = [ui];\n\t\tthis.verticalOffset = verticalOffset;\n\t\tthis.object3d = new Geometry2DObject3D();\n\t\tthis.object3d.position.set(position.x, position.y, position.z + verticalOffset);\n\t\tthis.object3d.userData.entityId = this.id;\n\t\tthis.object3d.userData.type = this.type;\n\t\tthis.positionDirty = true;\n\t}\n\n\tprivate worldPosition = new Vector3();\n\n\tget position(): Vector3 {\n\t\t// cache world position as it's expensive to compute every frame for every entity\n\t\t// for now, group containers can only move up and down, so when they do, we need to recompute the world position\n\t\tif (this.positionDirty) {\n\t\t\tthis.object3d.matrixAutoUpdate = true;\n\t\t\tthis.object3d.getWorldPosition(this.worldPosition);\n\t\t\tthis.positionDirty = false;\n\t\t\tthis.object3d.matrixAutoUpdate = false;\n\t\t}\n\n\t\treturn this.worldPosition;\n\t}\n\n\t/**\n\t * When the position of the entity changes, this should be set to true, so that systems like pan bounds can update\n\t */\n\tget positionDirty() {\n\t\treturn this.object3d.userData.worldPositionDirty;\n\t}\n\n\tset positionDirty(value: boolean) {\n\t\tthis.object3d.userData.worldPositionDirty = value;\n\t}\n\n\tupdatePosition(position: Vector3) {\n\t\tthis.object3d.position.copy(position);\n\t\tthis.positionDirty = true;\n\t}\n\n\tsetAltitude(z: number) {\n\t\tthis.object3d.position.z = z;\n\t\tthis.positionDirty = true;\n\t}\n}\n", "import type { Position } from '../types';\nimport { z } from 'zod';\nimport type { Feature, Point } from 'geojson';\nimport { Geometry3DObject3D } from '../entities/geometry3d';\nimport type { BatchedText, Text } from '../services/text3d/text3d';\nimport type { Text3DStyle } from './styles';\nimport type { MeshComponentProperties } from './mesh';\nimport { doesBatchedTextContainsText } from '../systems/text3d/system';\nimport type { GroupContainerObject3D } from '../entities/group-container';\nimport { type FloorTextCommonProperties } from '@mappedin/mvf-v2';\n/**\n * State representing an Text3D\n */\nexport type Text3DState = {\n\treadonly id: string | number;\n\treadonly type: 'text3d';\n\t/**\n\t * The position of the Text3D in [lon, lat, altitude]\n\t */\n\treadonly position: Position;\n\t/**\n\t * Whether the Text3D is visible\n\t */\n\tvisible: boolean;\n\t/**\n\t * Attempt to keep the Text3D facing the camera as much as possible\n\t */\n\tflipToFaceCamera: boolean;\n\t/**\n\t * Content of the text3d\n\t */\n\tcontent: string;\n} & Text3DStyle;\n\nexport const text3DStateSchema = z.object({\n\tvisible: z.boolean(),\n\tcolor: z.string(),\n\tflipToFaceCamera: z.boolean(),\n\tfont: z.string().optional(),\n\tfontSize: z.number(),\n\tmargin: z.union([z.number(), z.tuple([z.number(), z.number(), z.number(), z.number()])]),\n\toutlineColor: z.string(),\n\toutlineOpacity: z.number(),\n\toutlineBlur: z.union([z.number(), z.string()]),\n\toutlineWidth: z.number(),\n\toutlineOffsetX: z.number(),\n\toutlineOffsetY: z.number(),\n\tstrokeWidth: z.number(),\n\tmaxWidth: z.number().optional(),\n\tmaxHeight: z.number().optional(),\n\tstrokeOpacity: z.number(),\n\tstrokeColor: z.string(),\n\tfillOpacity: z.number(),\n\thoverColor: z.string().optional(),\n\tid: z.union([z.string(), z.number()]),\n\ttype: z.literal('text3d'),\n\tposition: z.tuple([z.number(), z.number(), z.number()]),\n\tcontent: z.string(),\n});\n\n/**\n * @interface\n */\nexport type InitializeText3DState = Partial<Omit<Text3DState, 'id' | 'type'>>;\nexport const initializeText3DStateSchema = text3DStateSchema\n\t.partial()\n\t.omit({\n\t\tid: true,\n\t\ttype: true,\n\t})\n\t.strict();\n/**\n * At this moment updating text margin is not supported\n * Margin and content update are not handled at the moment.\n * @interface\n */\nexport type UpdatableText3DState = Omit<InitializeText3DState, 'margin' | 'position' | 'content'>;\nexport const updateText3DStateSchema = initializeText3DStateSchema\n\t.omit({\n\t\tmargin: true,\n\t\tposition: true,\n\t\tmaxWidth: true,\n\t\tmaxHeight: true,\n\t\tcontent: true,\n\t})\n\t.strict();\n\nexport type Text3DProperties = {\n\tid: string;\n\tcontent: string;\n\ttextArea?: MeshComponentProperties['textArea'];\n};\n\nexport type AddText3DOptions = { appearance?: Partial<InitializeText3DState> };\nexport const addText3DOptionsSchema = z\n\t.object({\n\t\tappearance: initializeText3DStateSchema.optional(),\n\t\tparentId: z.string().optional(),\n\t})\n\t.strict();\n\nexport class Text3DComponent {\n\t// TODO: can we avoiding having this but somehow maintain the scene graph structure?\n\tmesh = new Geometry3DObject3D();\n\t// textMesh will be processed by text3d system\n\ttextMesh?: Text;\n\n\treadonly type = 'text3d';\n\n\tfeature: Feature<Point, Text3DProperties | (FloorTextCommonProperties & { verticalOffset: number })>;\n\n\tconstructor(feature: Feature<Point, Text3DProperties | (FloorTextCommonProperties & { verticalOffset: number })>) {\n\t\tthis.feature = feature;\n\t}\n\n\tget visible() {\n\t\tif (this.batchedText && this.textMesh) {\n\t\t\treturn doesBatchedTextContainsText(this.batchedText, this.textMesh);\n\t\t} else if (this.textMesh) {\n\t\t\treturn this.textMesh.visible;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tset visible(visible: boolean) {\n\t\tif (this.batchedText && this.textMesh) {\n\t\t\tif (visible) {\n\t\t\t\tthis.batchedText.addText(this.textMesh);\n\t\t\t} else {\n\t\t\t\tthis.batchedText.removeText(this.textMesh);\n\t\t\t}\n\t\t} else if (this.textMesh) {\n\t\t\tthis.textMesh.visible = visible;\n\t\t}\n\n\t\tthis.mesh.visible = visible;\n\t}\n\tparent?: GroupContainerObject3D;\n\t// holds the poniter of the batched text components if this Text3DComponent is batched\n\tbatchedText?: BatchedText;\n\n\t/**\n\t * if this Text3DComponent is a polygon label, populate this id with the polygon entity id\n\t * This id is used to prevent drawing text for the same polygon.\n\t */\n\tpolygonEntityId?: string;\n}\n", "import type { All3DTypes, RendererState } from '../../renderer';\nimport { Geometry3DComponents } from '../../entities';\nimport { Matrix4, Mesh, MeshBasicMaterial, PlaneGeometry, Vector3 } from 'three';\nimport type { RendererCore } from '../..';\nimport { Logger, PubSub } from '@packages/internal/common';\nimport { normalizeAngle } from '../../utils';\nimport { Text3DComponent } from '../../components/text3d';\nimport { GroupContainerObject3D } from '../../entities/group-container';\nimport type { Text, BatchedText } from 'troika-three-text';\nimport type { Text3DStyleComponent } from '../../components/styles';\nimport type { ModuleType } from '../../services/text3d/text3d';\n\nexport class Text3DSystem extends PubSub<{ render: undefined }> {\n\tprivate rendererState: RendererState;\n\tprivate convertTo3DMapPosition: RendererCore['convertTo3DMapPosition'];\n\t// simple mechanism to block creating text for the same mesh entity id. There should be a better way to do this\n\ttextSet = new Set<string>();\n\tbatchedTextMap = new Map<GroupContainerObject3D, Promise<BatchedText>>();\n\tuseWorker = true;\n\tremove(id: string) {\n\t\tthis.textSet.delete(id);\n\t}\n\tconstructor(\n\t\trendererState: RendererState,\n\t\tconvertTo3DMapPosition: RendererCore['convertTo3DMapPosition'],\n\t\tuseWorker = true,\n\t) {\n\t\tsuper();\n\t\tif (useWorker === false) {\n\t\t\tthis.useWorker = false;\n\t\t\tconfigureWorker(false);\n\t\t}\n\t\tthis.rendererState = rendererState;\n\t\tthis.convertTo3DMapPosition = convertTo3DMapPosition;\n\t}\n\n\tupdate(cameraRotationRadians: number) {\n\t\tlet entity: All3DTypes | undefined;\n\t\tlet text3DComponent: Text3DComponent | undefined;\n\t\tlet styleComponent: Text3DStyleComponent | undefined;\n\t\tconst promises: Promise<void>[] = [];\n\n\t\tfor (let entityId of this.rendererState.geometry3DIdsInScene) {\n\t\t\tentity = this.rendererState.geometry3DMap.get(entityId);\n\n\t\t\tif (entity?.type === 'text3d') {\n\t\t\t\ttext3DComponent = entity.components[Geometry3DComponents.Mesh];\n\t\t\t\tstyleComponent = entity.components[Geometry3DComponents.Style];\n\n\t\t\t\tconst group = text3DComponent.mesh?.parent;\n\t\t\t\tif (!group || !(group instanceof GroupContainerObject3D) || !(text3DComponent instanceof Text3DComponent)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Handle polygon label due to polygonEnityId\n\t\t\t\tif (\n\t\t\t\t\t'textArea' in text3DComponent.feature.properties &&\n\t\t\t\t\ttext3DComponent.mesh != null &&\n\t\t\t\t\ttext3DComponent.polygonEntityId != null &&\n\t\t\t\t\ttext3DComponent.textMesh == null &&\n\t\t\t\t\ttext3DComponent.mesh.parent != null &&\n\t\t\t\t\ttext3DComponent.feature.properties?.textArea?.position != null\n\t\t\t\t) {\n\t\t\t\t\tif (this.textSet.has(text3DComponent.polygonEntityId)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthis.textSet.add(text3DComponent.polygonEntityId);\n\t\t\t\t\t// each group holds a batchedText\n\t\t\t\t\tif (!this.batchedTextMap.has(group)) {\n\t\t\t\t\t\tthis.batchedTextMap.set(\n\t\t\t\t\t\t\tgroup,\n\t\t\t\t\t\t\tgetText3DService().then(({ BatchedText }) => {\n\t\t\t\t\t\t\t\tconst batchedText = new BatchedText();\n\t\t\t\t\t\t\t\tbatchedText.type = 'batchedtext';\n\t\t\t\t\t\t\t\tgroup.add(batchedText);\n\n\t\t\t\t\t\t\t\treturn batchedText;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst batchedMeshPromise = this.batchedTextMap.get(group);\n\n\t\t\t\t\tif (!batchedMeshPromise) {\n\t\t\t\t\t\tthrow new Error('batched text required');\n\t\t\t\t\t}\n\n\t\t\t\t\tpromises.push(\n\t\t\t\t\t\tcreateText({\n\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\ttextComponent: text3DComponent,\n\t\t\t\t\t\t\tstyleComponent,\n\t\t\t\t\t\t\tconvertTo3DMapPosition: this.convertTo3DMapPosition,\n\t\t\t\t\t\t\tbatchedMeshPromise: batchedMeshPromise,\n\t\t\t\t\t\t\trendererState: this.rendererState,\n\t\t\t\t\t\t\ttype: 'text-area',\n\t\t\t\t\t\t}).then(() => {\n\t\t\t\t\t\t\tthis.publish('render');\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t} else if (\n\t\t\t\t\ttext3DComponent.mesh != null &&\n\t\t\t\t\ttext3DComponent.textMesh == null &&\n\t\t\t\t\ttext3DComponent.mesh.parent != null\n\t\t\t\t) {\n\t\t\t\t\tif (this.textSet.has(entityId.toString())) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthis.textSet.add(entityId.toString());\n\t\t\t\t\tif (!this.batchedTextMap.has(group)) {\n\t\t\t\t\t\tthis.batchedTextMap.set(\n\t\t\t\t\t\t\tgroup,\n\t\t\t\t\t\t\tgetText3DService().then(({ BatchedText }) => {\n\t\t\t\t\t\t\t\tconst batchedText = new BatchedText();\n\t\t\t\t\t\t\t\tbatchedText.type = 'batchedtext';\n\t\t\t\t\t\t\t\tgroup.add(batchedText);\n\n\t\t\t\t\t\t\t\treturn batchedText;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst batchedMeshPromise = this.batchedTextMap.get(group);\n\n\t\t\t\t\tif (!batchedMeshPromise) {\n\t\t\t\t\t\tthrow new Error('batched text required');\n\t\t\t\t\t}\n\n\t\t\t\t\tpromises.push(\n\t\t\t\t\t\tcreateText({\n\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\ttextComponent: text3DComponent,\n\t\t\t\t\t\t\tstyleComponent,\n\t\t\t\t\t\t\tconvertTo3DMapPosition: this.convertTo3DMapPosition,\n\t\t\t\t\t\t\tbatchedMeshPromise: batchedMeshPromise,\n\t\t\t\t\t\t\trendererState: this.rendererState,\n\t\t\t\t\t\t\ttype: 'point',\n\t\t\t\t\t\t}).then(() => {\n\t\t\t\t\t\t\tthis.publish('render');\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst batchedTextPromise = this.batchedTextMap.get(group);\n\n\t\t\t\tif (text3DComponent.textMesh && batchedTextPromise && text3DComponent.polygonEntityId != null) {\n\t\t\t\t\tPromise.all([batchedTextPromise, Promise.resolve({ meshComponent: text3DComponent, styleComponent })]).then(\n\t\t\t\t\t\t([batchedText, { meshComponent, styleComponent }]) => {\n\t\t\t\t\t\t\tconst { textMesh } = meshComponent;\n\t\t\t\t\t\t\tif (batchedText && textMesh) {\n\t\t\t\t\t\t\t\t// O(1) check the members map source of truth. There should be better way to do this\n\t\t\t\t\t\t\t\tconst visible = doesBatchedTextContainsText(batchedText, textMesh);\n\t\t\t\t\t\t\t\tif (meshComponent.visible && !visible) {\n\t\t\t\t\t\t\t\t\tbatchedText.add(textMesh);\n\t\t\t\t\t\t\t\t} else if (!meshComponent.visible && visible) {\n\t\t\t\t\t\t\t\t\tbatchedText.remove(textMesh);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (styleComponent.flipToFaceCamera) {\n\t\t\t\t\t\t\t\tthis.flipIfNeeded(meshComponent, cameraRotationRadians);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn Promise.all(promises);\n\t}\n\n\t/**\n\t * flip text based on camera rotation\n\t * - flipping when text and camera angle is larger than 90 degrees or less than 270 degrees, see: https://mappedin.atlassian.net/wiki/spaces/SDK/pages/522715164/V6+Implementation#Handling-Flipping\n\t * - could do this in GPU, updating camera position uniform can save running through the loops. Although, since we are running the loops anyway, it's not much more work to do it here for now.\n\t */\n\tprivate flipIfNeeded(meshComponent: Text3DComponent, cameraRotationRadians: number) {\n\t\tconst text = meshComponent.textMesh;\n\t\tif (!text) return false;\n\t\tconst textRotation = text.rotation.z;\n\t\tconst relativeAngle = normalizeAngle(textRotation + cameraRotationRadians);\n\t\tif (relativeAngle > Math.PI / 2 && relativeAngle < (3 * Math.PI) / 2) {\n\t\t\ttext.rotation.z = normalizeAngle(textRotation + Math.PI);\n\t\t}\n\t}\n\n\t// Handle debug\n\tprivate debugTextAreaMesh = new Map<string | number, Mesh>();\n\tshowTextAreaMesh() {\n\t\tlet entity: All3DTypes | undefined;\n\t\tlet component: Text3DComponent;\n\t\tfor (let entityId of this.rendererState.geometry3DIdsInScene) {\n\t\t\tentity = this.rendererState.geometry3DMap.get(entityId);\n\t\t\tif (entity?.type === 'text3d') {\n\t\t\t\tcomponent = entity.components[Geometry3DComponents.Mesh];\n\t\t\t\tif ('textArea' in component.feature.properties) {\n\t\t\t\t\tconst textArea = component.feature.properties.textArea;\n\t\t\t\t\tif (!textArea) continue;\n\t\t\t\t\tconst plane = new PlaneGeometry(textArea.maxWidth, textArea.maxHeight);\n\t\t\t\t\tconst textAreaMesh = new Mesh(\n\t\t\t\t\t\tplane,\n\t\t\t\t\t\tnew MeshBasicMaterial({\n\t\t\t\t\t\t\tcolor: 'pink',\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tconst { textMesh } = component;\n\t\t\t\t\tif (!textMesh) continue;\n\t\t\t\t\tconst pos = this.convertTo3DMapPosition(textArea.position, tempVec);\n\t\t\t\t\ttextAreaMesh.position.copy(pos);\n\t\t\t\t\ttextAreaMesh.position.z = textMesh.position.z - 0.1;\n\t\t\t\t\ttextAreaMesh.rotation.z = textMesh.rotation.z;\n\n\t\t\t\t\ttempMatrix.identity();\n\t\t\t\t\ttempMatrix.makeRotationAxis(new Vector3(0, 0, 1), textMesh.userData.rotationZ);\n\t\t\t\t\ttempVec.set(textArea.maxWidth / 2, 0, 0);\n\t\t\t\t\ttempVec.applyMatrix4(tempMatrix);\n\t\t\t\t\ttextAreaMesh.position.x -= tempVec.x;\n\t\t\t\t\ttextAreaMesh.position.y -= tempVec.y;\n\n\t\t\t\t\tthis.rendererState.entityScene.add(textAreaMesh);\n\t\t\t\t\tthis.debugTextAreaMesh.set(entityId, textAreaMesh);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.publish('render');\n\t}\n\n\thideTextAreaMesh() {\n\t\tthis.debugTextAreaMesh.forEach(mesh => {\n\t\t\tthis.rendererState.entityScene.remove(mesh);\n\t\t});\n\t\tthis.debugTextAreaMesh.clear();\n\t\tthis.publish('render');\n\t}\n}\n\nexport function configureWorker(useWorker: boolean) {\n\tgetText3DService().then(({ configureTroikaTextBuilder }) => {\n\t\tconfigureTroikaTextBuilder({ useWorker });\n\t});\n}\n\nconst tempMatrix = new Matrix4();\nconst tempVec = new Vector3();\n\nlet text3DServiceTextmoduleLoadPromise: Promise<ModuleType> | undefined;\n/**\n * Preload fonts and optionally pre-generate the SDF textures for particular glyphs up front.\n * This is to avoid ondemand font generation can take long.\n *\n * If working in CSP-restricted environment, call `disableText3DWorker` before to avoid errors\n *\n * @param fontUrl - url of the font file served.\n * @returns A promise that resolves when the font is loaded\n *\n */\nexport async function preloadFont(fontUrl?: string) {\n\tconst { preloadFont: preloadFontInText3D } = await getText3DService();\n\n\treturn preloadFontInText3D(fontUrl);\n}\n\nfunction getText3DService() {\n\tif (!text3DServiceTextmoduleLoadPromise)\n\t\ttext3DServiceTextmoduleLoadPromise = import(`../../services/text3d/text3d`).then(v => {\n\t\t\treturn v;\n\t\t});\n\n\treturn text3DServiceTextmoduleLoadPromise!;\n}\n\n// TODO: can refactor into a more ECS approach\nasync function createText({\n\tentityId,\n\ttextComponent,\n\tstyleComponent,\n\tconvertTo3DMapPosition,\n\tbatchedMeshPromise,\n\trendererState,\n\ttype = 'text-area',\n}: {\n\tentityId: string | number;\n\ttextComponent: Text3DComponent;\n\tstyleComponent: Text3DStyleComponent;\n\tconvertTo3DMapPosition: RendererCore['convertTo3DMapPosition'];\n\tbatchedMeshPromise: Promise<BatchedText>;\n\trendererState: RendererState;\n\ttype: 'text-area' | 'point';\n}) {\n\treturn Promise.all([getText3DService(), Promise.resolve({ entityId, meshComponent: textComponent, styleComponent })])\n\t\t.then(([{ createTroikaTextPoint, createTroikaTextArea }, args]) => {\n\t\t\treturn type === 'text-area'\n\t\t\t\t? createTroikaTextArea(args.entityId, args.meshComponent, args.styleComponent, convertTo3DMapPosition)\n\t\t\t\t: createTroikaTextPoint(args.entityId, args.meshComponent, args.styleComponent, convertTo3DMapPosition);\n\t\t})\n\t\t.catch(error => {\n\t\t\tLogger.warn('Trouble creating text: ', error);\n\t\t})\n\t\t.then(args => {\n\t\t\tif (!args?.text) return;\n\n\t\t\tlet promises = [Promise.resolve(args.text), batchedMeshPromise, Promise.resolve()] as [\n\t\t\t\tPromise<Text>,\n\t\t\t\tPromise<BatchedText>,\n\t\t\t\tPromise<void>,\n\t\t\t];\n\n\t\t\tif (textComponent.polygonEntityId) {\n\t\t\t\tconst geometry = rendererState.geometry3DMap.get(textComponent.polygonEntityId);\n\t\t\t\tif (geometry?.type === 'geometry') {\n\t\t\t\t\tconst meshComponent = geometry.components[Geometry3DComponents.Mesh];\n\t\t\t\t\tconst styleComponent = geometry.components[Geometry3DComponents.Style];\n\t\t\t\t\tmeshComponent.textMesh = args.text;\n\t\t\t\t\targs.text.position.z = styleComponent.altitude + styleComponent.height + DEFAULT_VERTICAL_OFFSET; // component.mesh.position.z + DEFAULT_VERTICAL_OFFSET;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// since we don't run sync for point text, like we do for fit text area, we need to do it here\n\t\t\t\tpromises[2] = getText3DService().then(({ syncText }) => {\n\t\t\t\t\treturn syncText(args.text);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn Promise.all(promises);\n\t\t})\n\t\t.then(args => {\n\t\t\tif (!args) return;\n\t\t\tconst [text, batchedText] = args;\n\t\t\tbatchedText.add(text);\n\t\t\tif (!textComponent.batchedText) {\n\t\t\t\ttextComponent.batchedText = batchedText;\n\t\t\t}\n\t\t});\n}\n\nexport function doesBatchedTextContainsText(batchedText: BatchedText, text: Text) {\n\treturn batchedText._members.has(text);\n}\n\n// this is to help with z fighting. Lowering this runs will to issues where half the text is below the polygon mesh somehow.\n// TODO: look into why this is the case\nexport const DEFAULT_VERTICAL_OFFSET = 0.5;\n", "import type { BufferAttribute, BufferGeometry } from 'three';\n\ntype Outline = {\n\tcolor: string;\n\tdirty: boolean;\n\tenabled: boolean;\n\tedgeColors?: BufferAttribute;\n\tranges?: { start: number; count: number };\n\tgeometry?: BufferGeometry;\n\tcurrentOpacity: number;\n\tcurrentColor: [number, number, number];\n\ttopFaceVerticesIndices?: number[];\n\tvisible: boolean;\n};\n\nexport class OutlineComponent implements Outline {\n\tcolor: string;\n\tdirty = true;\n\t/** Controls whether the outline should be updated in the renderer */\n\tenabled = true;\n\t#visible = false;\n\tedgeColors?: BufferAttribute;\n\tedgeVisibility?: BufferAttribute;\n\tgeometry?: BufferGeometry;\n\tranges?: { start: number; count: number };\n\ttopFaceVerticesIndices?: number[];\n\tget currentOpacity() {\n\t\treturn this.edgeColors && this.ranges ? this.edgeColors.array[this.ranges.start * 4 + 3] : 0;\n\t}\n\n\t/**\n\t * Sets the visibility of the outline.\n\t */\n\tset visible(visible: boolean) {\n\t\tif (!this.edgeVisibility || !this.ranges) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#visible === visible) {\n\t\t\t// no change\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#visible = visible;\n\t\tconst visibilityArray = this.edgeVisibility.array as Float32Array;\n\t\tconst visibilityValue = visible ? 1.0 : 0.0;\n\n\t\tfor (let i = 0; i < this.ranges.count; i++) {\n\t\t\tconst vertexIndex = this.ranges.start + i;\n\t\t\tvisibilityArray[vertexIndex] = visibilityValue;\n\t\t}\n\n\t\tthis.edgeVisibility.needsUpdate = true;\n\t}\n\n\t/**\n\t * Gets the visibility of the outline.\n\t */\n\tget visible() {\n\t\treturn this.#visible;\n\t}\n\n\tget currentColor(): [number, number, number] {\n\t\treturn this.edgeColors && this.ranges\n\t\t\t? [\n\t\t\t\t\tthis.edgeColors.array[this.ranges.start * 4],\n\t\t\t\t\tthis.edgeColors.array[this.ranges.start * 4 + 1],\n\t\t\t\t\tthis.edgeColors.array[this.ranges.start * 4 + 2],\n\t\t\t ]\n\t\t\t: [0, 0, 0];\n\t}\n\n\tconstructor(color: string) {\n\t\tthis.color = color;\n\t}\n}\n", "import type { BatchedMeshGeometryRange, BufferGeometry, MeshLambertMaterial } from 'three';\nimport {\n\tBackSide,\n\tColor,\n\tDoubleSide,\n\tEdgesGeometry,\n\tEuler,\n\tFrontSide,\n\tLineBasicMaterial,\n\tLineSegments,\n\tMatrix4,\n\tObject3D,\n\tQuaternion,\n\tVector3,\n} from 'three';\nimport { BatchedStandardMaterial } from './batched-material';\nimport type { Geometry3D, MeshComponentTypes } from '../../entities/geometry3d';\nimport { Geometry3DComponents } from '../../entities/geometry3d';\nimport { EntityBatchedMesh, MeshComponent } from '../../components/mesh';\nimport type { Shading } from '../../types';\nimport { RAYCAST_LAYERS } from '../../utils/constants';\nimport { OUTLINE_PERCENT_TO_DARKEN } from '../outline-interpolation/constants';\nimport tinycolor from 'tinycolor2';\nimport { type MaterialSide } from '../../components/styles';\nimport type { RendererCore } from '../..';\nimport type { EnterpriseTexture } from '@mappedin/mvf-v2';\nimport { SCENE_RENDER_ORDER } from '../../utils';\n\nconst GEOMETRY_OUTLINE_THRESHOLD = 80;\n\nexport function batchGeometries(\n\tentities: Geometry3D[],\n\tstyle: {\n\t\tcolor: string;\n\t\ttopColor?: string;\n\t\topacity?: number;\n\t\tshading?: Shading;\n\t\tside?: MaterialSide;\n\t},\n) {\n\tlet vertices = 0;\n\n\t// let's figure out how many vertices we have\n\tfor (const entity of entities) {\n\t\tvertices +=\n\t\t\t(entity.components[Geometry3DComponents.Mesh] as MeshComponent)?.geometry?.attributes.position.count || 0;\n\t}\n\n\tconst color = new Color(style.color);\n\tlet material: BatchedStandardMaterial;\n\n\tmaterial = new BatchedStandardMaterial(\n\t\t{\n\t\t\tcolor,\n\t\t\tside: style.side === 'back' ? BackSide : style.side === 'front' ? FrontSide : DoubleSide,\n\t\t\topacity: style.opacity ?? 1,\n\t\t\ttransparent: style.opacity !== undefined ? style.opacity < 1 : false,\n\t\t\tpolygonOffset: true,\n\t\t\tpolygonOffsetFactor: 1,\n\t\t\tpolygonOffsetUnits: 1,\n\t\t},\n\n\t\tentities.length,\n\t);\n\n\tconst mesh = new EntityBatchedMesh(entities.length, vertices, 0, material);\n\tmesh.renderOrder = SCENE_RENDER_ORDER.Geometry;\n\tlet component: MeshComponentTypes;\n\tlet geometryId: number;\n\tlet range: BatchedMeshGeometryRange | null;\n\tfor (const entity of entities) {\n\t\tcomponent = entity.components[Geometry3DComponents.Mesh];\n\t\tif (!(component instanceof MeshComponent) || !component.geometry) continue;\n\t\tcomponent.mesh = mesh;\n\t\tcomponent.material = material;\n\t\tcomponent.instanceIndex = mesh.addGeometry(component.geometry);\n\n\t\tmesh.addInstance(component.instanceIndex);\n\t\tmesh.userData.entities[component.instanceIndex] = entity.id;\n\t\tif (material instanceof BatchedStandardMaterial) {\n\t\t\tmaterial.setColor(component.instanceIndex, color, style.topColor ? new Color(style.topColor) : color);\n\t\t}\n\t\tgeometryId = mesh.getGeometryIdAt(component.instanceIndex);\n\t\tif (component.batchedProps) {\n\t\t\trange = mesh.getGeometryRangeAt(geometryId);\n\t\t\tif (range) {\n\t\t\t\tcomponent.batchedProps.range = range;\n\t\t\t}\n\t\t\tcomponent.batchedProps.geometryId = geometryId;\n\t\t}\n\t}\n\n\tmesh.perObjectFrustumCulled = true;\n\tmesh.matrixAutoUpdate = false;\n\n\treturn mesh;\n}\n\nexport function createOutlines(geometry: BufferGeometry, material: MeshLambertMaterial) {\n\tconst geo = new EdgesGeometry(geometry, GEOMETRY_OUTLINE_THRESHOLD);\n\tconst color = darkenColorForOutline(material.color.getHexString());\n\n\tconst mat = new LineBasicMaterial({\n\t\tlinewidth: 1,\n\t\tcolor: color,\n\t\ttransparent: true,\n\t});\n\n\tconst lines = new LineSegments(geo, mat);\n\tlines.layers.set(RAYCAST_LAYERS.OUTLINES);\n\n\treturn lines;\n}\n\nexport function darkenColorForOutline(color: string) {\n\treturn tinycolor(color).darken(OUTLINE_PERCENT_TO_DARKEN).toRgbString();\n}\n\n/**\n * Update the UVs of the geometry based on the texture properties and legacy north bearing to match V5 behaviour.\n */\nexport function updateUVsLegacy(\n\tgeometry: BufferGeometry,\n\ttextures: EnterpriseTexture[],\n\tlegacyNorth: number,\n\tconvertTo3DMapPosition: RendererCore['convertTo3DMapPosition'],\n) {\n\tif (textures.length < 1) {\n\t\treturn;\n\t}\n\n\tif (!geometry.boundingBox) {\n\t\tgeometry.computeBoundingBox();\n\t}\n\tconst computedBoundingBox = geometry.boundingBox!;\n\n\tconst vertexPositions = geometry.getAttribute('position');\n\tconst vertexNormals = geometry.getAttribute('normal');\n\tconst vertexUvs = geometry.getAttribute('uv');\n\n\t// If the geometry has an index, we need to get face elements from that index\n\t// instead of just assuming each sequence of 3 vertices is a face.\n\tlet faceCount;\n\tlet meshIndex;\n\tif (geometry.index) {\n\t\tfaceCount = geometry.index.count / 3;\n\t\tmeshIndex = function (faceIndex, withinFaceIndex) {\n\t\t\treturn geometry.index!.getX(faceIndex * 3 + withinFaceIndex);\n\t\t};\n\t} else {\n\t\tfaceCount = vertexPositions.count / 3;\n\t\tmeshIndex = function (faceIndex, withinFaceIndex) {\n\t\t\treturn faceIndex * 3 + withinFaceIndex;\n\t\t};\n\t}\n\n\t// First create a rotation matrix for the desired angle\n\tconst rotationMatrix = new Matrix4();\n\trotationMatrix.makeRotationFromQuaternion(\n\t\tnew Quaternion().setFromEuler(new Euler(0, 0, (legacyNorth / 180) * Math.PI)),\n\t);\n\n\t// Get the bounds of the top and side textures in the rotated space\n\tconst topTexture = textures.find(t => t.face === 'top');\n\tlet topTextureBounds: { min: Vector3; max: Vector3 } | undefined;\n\tif (topTexture) {\n\t\ttopTextureBounds = {\n\t\t\tmin: convertTo3DMapPosition(topTexture.bounds[1], topTexture.bounds[0], 0),\n\t\t\tmax: convertTo3DMapPosition(topTexture.bounds[3], topTexture.bounds[2], computedBoundingBox.max.z),\n\t\t};\n\t}\n\tconst sideTexture = textures.find(t => t.face === 'side');\n\tlet sideTextureBounds: { min: Vector3; max: Vector3 } | undefined;\n\tif (sideTexture) {\n\t\tsideTextureBounds = {\n\t\t\tmin: convertTo3DMapPosition(sideTexture.bounds[1], sideTexture.bounds[0], 0),\n\t\t\tmax: convertTo3DMapPosition(sideTexture.bounds[3], sideTexture.bounds[2], computedBoundingBox.max.z),\n\t\t};\n\t}\n\n\tif (!sideTextureBounds && !topTextureBounds) {\n\t\treturn;\n\t}\n\n\tfor (let i = 0; i < faceCount; ++i) {\n\t\t// Compute an average face-normal from the vertex normals\n\t\t// (we don't need to normalize since we only compare the relative magnitude\n\t\t// of components.)\n\t\tconst normalX =\n\t\t\tvertexNormals.getX(meshIndex(i, 0)) + vertexNormals.getX(meshIndex(i, 1)) + vertexNormals.getX(meshIndex(i, 2));\n\t\tconst normalY =\n\t\t\tvertexNormals.getY(meshIndex(i, 0)) + vertexNormals.getY(meshIndex(i, 1)) + vertexNormals.getY(meshIndex(i, 2));\n\t\tconst normalZ =\n\t\t\tvertexNormals.getZ(meshIndex(i, 0)) + vertexNormals.getZ(meshIndex(i, 1)) + vertexNormals.getZ(meshIndex(i, 2));\n\n\t\tconst absNormalX = Math.abs(normalX);\n\t\tconst absNormalY = Math.abs(normalY);\n\t\tconst absNormalZ = Math.abs(normalZ);\n\n\t\t// Determine the relative size of the components of the face normal;\n\t\t// The largest component determines whether the face is\n\t\t// a top-face or a side-face, and the two smaller components are used\n\t\t// to determine texture coordinates.\n\t\tvar uDim;\n\t\tvar vDim;\n\t\tif (absNormalX <= absNormalY && absNormalX <= absNormalZ) {\n\t\t\tuDim = 'x';\n\t\t\tif (absNormalY <= absNormalZ) {\n\t\t\t\tvDim = 'y';\n\t\t\t} else {\n\t\t\t\tvDim = 'z';\n\t\t\t}\n\t\t} else if (absNormalY <= absNormalX && absNormalY <= absNormalZ) {\n\t\t\tuDim = 'y';\n\t\t\tif (absNormalX <= absNormalZ) {\n\t\t\t\tvDim = 'x';\n\t\t\t} else {\n\t\t\t\tvDim = 'z';\n\t\t\t}\n\t\t} else {\n\t\t\tuDim = 'z';\n\t\t\tif (absNormalX <= absNormalY) {\n\t\t\t\tvDim = 'x';\n\t\t\t} else {\n\t\t\t\tvDim = 'y';\n\t\t\t}\n\t\t}\n\n\t\t// For side textures, ensure textures face right-side-up\n\t\tif (uDim === 'z') {\n\t\t\tuDim = vDim;\n\t\t\tvDim = 'z';\n\t\t}\n\n\t\tlet repeatU: number;\n\t\tlet repeatV: number;\n\t\tlet offsetU: number;\n\t\tlet offsetV: number;\n\t\tlet rotation: number;\n\t\tlet bounds: { min: Vector3; max: Vector3 };\n\t\tif (vDim === 'z' || uDim === 'z') {\n\t\t\tif (!sideTexture || !sideTextureBounds) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trepeatU = sideTexture.repeat.u;\n\t\t\trepeatV = sideTexture.repeat.v;\n\t\t\toffsetU = sideTexture.offset.u;\n\t\t\toffsetV = sideTexture.offset.v;\n\t\t\trotation = sideTexture.rotation;\n\t\t\tbounds = sideTextureBounds;\n\t\t} else {\n\t\t\tif (!topTexture || !topTextureBounds) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trepeatU = topTexture.repeat.u;\n\t\t\trepeatV = topTexture.repeat.v;\n\t\t\toffsetU = topTexture.offset.u;\n\t\t\toffsetV = topTexture.offset.v;\n\t\t\t// The topTexture rotation is bearing from north, but we've already rotated the bounds to face north\n\t\t\t// so we need just the difference\n\t\t\trotation = (360 - legacyNorth + topTexture.rotation) % 360;\n\t\t\tbounds = topTextureBounds;\n\t\t}\n\n\t\tconst { min, max } = bounds;\n\n\t\tconst legacyObject = new Object3D();\n\t\tlegacyObject.position.set(min.x, min.y, 0);\n\n\t\tlegacyObject.updateMatrix();\n\t\tlegacyObject.updateMatrixWorld();\n\n\t\t// Transform min and max points to rotated space\n\t\tconst rotatedMin = min.clone().applyMatrix4(rotationMatrix);\n\t\tconst rotatedMax = max.clone().applyMatrix4(rotationMatrix);\n\n\t\tconst rotatedWidth = Math.abs(rotatedMax.x - rotatedMin.x);\n\t\tconst rotatedHeight = Math.abs(rotatedMax.y - rotatedMin.y);\n\n\t\tconst rotatedBoundsMax = new Vector3(rotatedWidth, rotatedHeight, max.z).applyMatrix4(legacyObject.matrixWorld);\n\n\t\tconst rangeU = Math.abs(rotatedBoundsMax[uDim] - min[uDim]);\n\t\tconst rangeV = Math.abs(rotatedBoundsMax[vDim] - min[vDim]);\n\n\t\tconst angle = (rotation * Math.PI) / 180 || 0;\n\t\tconst c = Math.cos(angle);\n\t\tconst s = Math.sin(angle);\n\n\t\tconst iverted = legacyObject.matrixWorld.clone().invert();\n\t\tconst rotationQuaternion = new Quaternion().setFromEuler(new Euler(0, 0, (legacyNorth / 180) * Math.PI));\n\t\t// Assign UV coordinates to vertices based on the texture properties\n\t\t// for top or side textures, and the world-space position of the\n\t\t// vertices along the two smaller dimensions of the surface normal.\n\t\tfor (let j = 0; j < 3; j++) {\n\t\t\tconst tempVec = new Vector3(\n\t\t\t\tvertexPositions.getX(meshIndex(i, j)),\n\t\t\t\tvertexPositions.getY(meshIndex(i, j)),\n\t\t\t\tvertexPositions.getZ(meshIndex(i, j)),\n\t\t\t);\n\t\t\tconst local = tempVec.applyMatrix4(iverted);\n\t\t\tlocal.applyQuaternion(rotationQuaternion);\n\t\t\tconst world = local.applyMatrix4(legacyObject.matrixWorld);\n\n\t\t\tconst positionX = world.x;\n\t\t\tconst positionY = world.y;\n\t\t\tconst positionZ = world.z;\n\n\t\t\tvar uvU;\n\t\t\tvar uvV;\n\t\t\tif (uDim === 'x') {\n\t\t\t\tuvU = (repeatU * (positionX - min[uDim])) / rangeU + offsetU;\n\t\t\t} else if (uDim === 'y') {\n\t\t\t\tuvU = (repeatU * (positionY - min[uDim])) / rangeU + offsetU;\n\t\t\t} else {\n\t\t\t\tuvU = (repeatU * (positionZ - min[uDim])) / rangeU + offsetU;\n\t\t\t}\n\n\t\t\tif (vDim === 'x') {\n\t\t\t\tuvV = (repeatV * (positionX - min[vDim])) / rangeV + offsetV;\n\t\t\t} else if (vDim === 'y') {\n\t\t\t\tuvV = (repeatV * (positionY - min[vDim])) / rangeV + offsetV;\n\t\t\t} else {\n\t\t\t\tuvV = (repeatV * (positionZ - min[vDim])) / rangeV + offsetV;\n\t\t\t}\n\n\t\t\tuvU -= 0.5;\n\t\t\tuvV -= 0.5;\n\t\t\tconst rotatedU = uvU * c - uvV * s + 0.5;\n\t\t\tconst rotatedV = uvU * s + uvV * c + 0.5;\n\t\t\tvertexUvs.setX(meshIndex(i, j), rotatedU);\n\t\t\tvertexUvs.setY(meshIndex(i, j), rotatedV);\n\t\t}\n\t}\n}\n", "import {\n\tMeshLambertMaterial,\n\tRepeatWrapping,\n\tSRGBColorSpace,\n\tLinearSRGBColorSpace,\n\ttype WebGLProgramParametersWithUniforms,\n\ttype Color,\n\ttype Texture,\n\ttype MeshLambertMaterialParameters,\n\ttype ColorSpace,\n} from 'three';\nimport { BatchedPropertiesTexture } from './batched-texture';\nimport vertexShaderSource from './batched-lambert-vertex.glsl';\nimport fragmentShaderSource from './batched-lambert-fragment.glsl';\n\nconst MIN_SIDE_ALPHA = -0.05;\nconst MAX_SIDE_ALPHA = 1.0;\n\nexport class BatchedStandardMaterial extends MeshLambertMaterial {\n\tprivate propertiesTexture: BatchedPropertiesTexture;\n\tprivate uniforms: WebGLProgramParametersWithUniforms['uniforms'] = {\n\t\tuGradientIntensity: { value: 0 },\n\t\tuGradientEnd: { value: 0 },\n\t\tuGradientStart: { value: 0 },\n\t\tuTopTexture: { value: null },\n\t\tuTexture: { value: null },\n\t\tuRepeatYFactor: {\n\t\t\tvalue: 1,\n\t\t},\n\t\tuBlendTexture: { value: false },\n\t};\n\tprivate colorSpace: ColorSpace = SRGBColorSpace;\n\n\tconstructor(params: MeshLambertMaterialParameters, geometryCount: number, scaleFactor = 1) {\n\t\tsuper(params);\n\t\tthis.alphaTest = 0.01; // need this to fix some opacity fighting with invisible geometry infront of semi-transparent geometry\n\t\tthis.propertiesTexture = new BatchedPropertiesTexture(geometryCount);\n\t\tthis.uniforms.uRepeatYFactor.value = scaleFactor;\n\t\tthis.onBeforeCompile = shader => {\n\t\t\tconst uGradientIntensity = this.uniforms.uGradientIntensity;\n\t\t\tconst uGradientEnd = this.uniforms.uGradientEnd;\n\t\t\tconst uGradientStart = this.uniforms.uGradientStart;\n\t\t\tconst uTopTexture = this.uniforms.uTopTexture;\n\t\t\tconst uTexture = this.uniforms.uTexture;\n\t\t\tconst uRepeatYFactor = this.uniforms.uRepeatYFactor;\n\t\t\tconst uBlendTexture = this.uniforms.uBlendTexture;\n\t\t\tthis.uniforms = shader.uniforms;\n\t\t\tshader.vertexShader = vertexShaderSource;\n\t\t\tshader.fragmentShader = fragmentShaderSource;\n\t\t\tObject.assign(this.uniforms, {\n\t\t\t\tuGradientIntensity,\n\t\t\t\tuGradientEnd,\n\t\t\t\tuGradientStart,\n\t\t\t\tuMinSideAlpha: { value: MIN_SIDE_ALPHA },\n\t\t\t\tuMaxSideAlpha: { value: MAX_SIDE_ALPHA },\n\t\t\t\tuPropertiesTexture: { value: this.propertiesTexture },\n\t\t\t\tuTopTexture,\n\t\t\t\tuTexture,\n\t\t\t\tuRepeatYFactor,\n\t\t\t\tuBlendTexture,\n\t\t\t});\n\t\t};\n\t}\n\n\t/**\n\t * These control the repeat factor of the texture in the Y direction.\n\t * So when we scale a geometry, it needs to scale the texture as well.\n\t * For now this only applies to detached geometries.\n\t */\n\tget repeatYFactor() {\n\t\treturn this.uniforms.uRepeatYFactor.value;\n\t}\n\n\tset repeatYFactor(value: number) {\n\t\tif (value !== this.uniforms.uRepeatYFactor.value) {\n\t\t\tthis.uniforms.uRepeatYFactor.value = value;\n\t\t\tthis.needsUpdate = true;\n\t\t}\n\t}\n\n\tget texture() {\n\t\treturn this.uniforms.uTexture.value;\n\t}\n\n\tset texture(texture: Texture) {\n\t\ttexture.wrapS = RepeatWrapping;\n\t\ttexture.wrapT = RepeatWrapping;\n\t\ttexture.colorSpace = this.colorSpace;\n\t\tthis.uniforms.uTexture.value = texture;\n\t}\n\n\tget topTexture() {\n\t\treturn this.uniforms.uTopTexture.value;\n\t}\n\n\tset topTexture(texture: Texture) {\n\t\ttexture.wrapS = RepeatWrapping;\n\t\ttexture.wrapT = RepeatWrapping;\n\t\ttexture.colorSpace = this.colorSpace;\n\t\tthis.uniforms.uTopTexture.value = texture;\n\t}\n\n\tget blendTexture() {\n\t\treturn this.uniforms.uBlendTexture.value;\n\t}\n\n\tset blendTexture(value: boolean) {\n\t\tif (value !== this.uniforms.uBlendTexture.value) {\n\t\t\tthis.uniforms.uBlendTexture.value = value;\n\t\t\t// SRGBColorSpace's gamma correction causes incorrect darkening when multiplying colors\n\t\t\t// LinearSRGBColorSpace provides linear values that multiply correctly\n\t\t\tthis.colorSpace = value ? LinearSRGBColorSpace : SRGBColorSpace;\n\t\t\tif (this.texture) this.texture.colorSpace = this.colorSpace;\n\t\t\tif (this.topTexture) this.topTexture.colorSpace = this.colorSpace;\n\t\t\tthis.needsUpdate = true;\n\t\t}\n\t}\n\n\tpublic setGradientShading(start: number, end: number, intensity: number): void {\n\t\tthis.uniforms.uGradientStart.value = start;\n\t\tthis.uniforms.uGradientEnd.value = end;\n\t\tthis.uniforms.uGradientIntensity.value = intensity;\n\t}\n\n\tpublic getGradientShading() {\n\t\treturn {\n\t\t\tstart: this.uniforms.uGradientStart.value,\n\t\t\tend: this.uniforms.uGradientEnd.value,\n\t\t\tintensity: this.uniforms.uGradientIntensity.value,\n\t\t};\n\t}\n\n\tpublic setColor(batchId: number, color: Color, topColor: Color): void {\n\t\tthis.propertiesTexture.setColor(batchId, color, topColor);\n\t}\n\n\tpublic getColor(batchId: number) {\n\t\treturn this.propertiesTexture.getColor(batchId);\n\t}\n\n\tpublic showTextures = (batchId: number): void => {\n\t\tconst texture = Boolean(this.uniforms.uTexture.value);\n\t\tconst topTexture = Boolean(this.uniforms.uTopTexture.value);\n\n\t\tif (texture || topTexture) {\n\t\t\tthis.propertiesTexture.setTexture(batchId, texture, topTexture);\n\t\t\tthis.needsUpdate = true;\n\t\t}\n\t};\n\n\tpublic hideTextures(batchId: number): void {\n\t\tconst texture = Boolean(this.uniforms.uTexture.value);\n\t\tconst topTexture = Boolean(this.uniforms.uTopTexture.value);\n\n\t\tif (texture || topTexture) {\n\t\t\tthis.propertiesTexture.setTexture(batchId, false, false);\n\t\t\tthis.needsUpdate = true;\n\t\t}\n\t}\n\n\t// removes and disposes the texture from the material\n\tpublic removeSideTexture(batchId: number): void {\n\t\tif (this.texture) {\n\t\t\tthis.texture.dispose();\n\t\t\tthis.uniforms.uTexture.value = null;\n\t\t\tconst topTexture = Boolean(this.uniforms.uTopTexture.value);\n\t\t\tthis.propertiesTexture.setTexture(batchId, false, topTexture);\n\t\t\tthis.needsUpdate = true;\n\t\t}\n\t}\n\n\t// removes and disposes the top texture from the material\n\tpublic removeTopTexture(batchId: number): void {\n\t\tif (this.topTexture) {\n\t\t\tthis.topTexture.dispose();\n\t\t\tthis.uniforms.uTopTexture.value = null;\n\t\t\tconst texture = Boolean(this.uniforms.uTexture.value);\n\t\t\tthis.propertiesTexture.setTexture(batchId, texture, false);\n\t\t\tthis.needsUpdate = true;\n\t\t}\n\t}\n\n\tpublic dispose(): void {\n\t\tsuper.dispose();\n\t\tthis.propertiesTexture.dispose();\n\t}\n}\n", "import { Color, DataTexture, RGBAFormat, UnsignedByteType } from 'three';\n\nexport class BatchedPropertiesTexture extends DataTexture {\n\t_width: number;\n\t_height: number;\n\t_propertiesLength: number;\n\n\tconstructor(count: number) {\n\t\tconst height = count;\n\t\tconst propertiesLength = 3;\n\t\tconst width = propertiesLength * 4;\n\n\t\tsuper(new Uint8Array(count * width), propertiesLength, count, RGBAFormat, UnsignedByteType);\n\t\tthis._width = width;\n\t\tthis._height = height;\n\t\tthis._propertiesLength = propertiesLength;\n\t}\n\n\tsetColor(id: number, color: Color, topColor: Color) {\n\t\tconst data = this.image.data;\n\t\tconst yOffset = id * this._width;\n\t\tdata[yOffset] = Math.round(color.r * 255);\n\t\tdata[yOffset + 1] = Math.round(color.g * 255);\n\t\tdata[yOffset + 2] = Math.round(color.b * 255);\n\t\tdata[yOffset + 3] = 0;\n\n\t\tdata[yOffset + 4] = Math.round(topColor.r * 255);\n\t\tdata[yOffset + 5] = Math.round(topColor.g * 255);\n\t\tdata[yOffset + 6] = Math.round(topColor.b * 255);\n\t\tdata[yOffset + 7] = 0;\n\n\t\tthis.needsUpdate = true;\n\t}\n\n\tgetColor(id: number): { color: Color; topColor: Color } {\n\t\tconst data = this.image.data;\n\t\tconst yOffset = id * this._width;\n\n\t\tconst color = new Color(data[yOffset] / 255, data[yOffset + 1] / 255, data[yOffset + 2] / 255);\n\t\tconst topColor = new Color(data[yOffset + 4] / 255, data[yOffset + 5] / 255, data[yOffset + 6] / 255);\n\n\t\treturn { color, topColor };\n\t}\n\n\tsetTexture(id: number, texture: boolean, topTexture: boolean) {\n\t\tconst data = this.image.data;\n\t\tconst yOffset = id * this._width;\n\n\t\tdata[yOffset + 8] = texture ? 255 : 0;\n\t\tdata[yOffset + 9] = topTexture ? 255 : 0;\n\t\tdata[yOffset + 10] = 0;\n\t\tdata[yOffset + 11] = 0;\n\n\t\tthis.needsUpdate = true;\n\t}\n\n\tgetTexture(id: number): { texture: boolean; topTexture: boolean } {\n\t\tconst data = this.image.data;\n\t\tconst yOffset = id * this._width;\n\n\t\tconst texture = data[yOffset + 8] === 255;\n\t\tconst topTexture = data[yOffset + 9] === 255;\n\n\t\treturn { texture, topTexture };\n\t}\n}\n", "export default `#define LAMBERT\nvarying vec3 vViewPosition;\nvarying vec4 vPosition;\nvarying vec2 vUv;\nvarying vec4 finalPosition;\nvarying float vVerticalOffset;\nvarying vec3 worldNormal;\nvarying float vBatchId;\n\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n\t\n // To mitigate visual defects on machines such as windows and iOS\n\tvBatchId = getIndirectIndex(gl_DrawID) + 0.5;\n\tvViewPosition = - mvPosition.xyz;\n\tworldNormal = normal;\n\tvUv = uv;\n vVerticalOffset = position.z;\n}\n`", "export default `#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nuniform float uGradientEnd;\nuniform float uGradientIntensity;\nuniform float uMinSideAlpha;\nuniform float uMaxSideAlpha;\nuniform float uGradientStart;\nuniform highp sampler2D uPropertiesTexture;\nuniform highp sampler2D uTopTexture;\nuniform highp sampler2D uTexture;\nuniform float uRepeatYFactor;\nuniform bool uBlendTexture;\nvarying float vBatchId;\n\nvarying vec2 vUv;\nvarying float vVerticalOffset;\nvarying vec3 worldNormal;\n\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_lambert_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvec3 blendTextureColor(vec3 diffuseColor, vec4 texColor) {\n\tvec3 texturedColor = diffuseColor * texColor.rgb;\n\treturn mix(diffuseColor, texturedColor, texColor.a);\n}\n\nvoid main() {\n\t#include <clipping_planes_fragment>\n\n\t// get the normalized world normal of vertex fragment\n\tvec3 surfaceNormal = normalize(worldNormal);\n\n\t// get angle relative to Z up\n\tfloat angle = degrees(acos(abs(dot(surfaceNormal, vec3(0.0, 0.0, 1.0)))));\n\n\tint idx = int(vBatchId) * 1;\n\tvec3 diffuse = vec3(texelFetch(uPropertiesTexture, ivec2(0, idx), 0).rgb);\n\tbool shouldShowTexture = texelFetch(uPropertiesTexture, ivec2(2, idx), 0).r > 0.99;\n\n\tif(shouldShowTexture) {\n\t\tvec4 tex2d = texture2D(uTexture, vec2(vUv.x, vUv.y * uRepeatYFactor));\n\t\tdiffuse = uBlendTexture ? blendTextureColor(diffuse, tex2d) : tex2d.rgb;\n\t}\n\n\t// if this is a fragment facing upwards, use topColor. Avoid any sort of '==' comparison, due to floating point precision issue\n\tif(angle < 0.02) {\n\t\tbool shouldShowTopTexture = texelFetch(uPropertiesTexture, ivec2(2, idx), 0).g > 0.99;\n\n\t\tif(shouldShowTopTexture) {\n\t\t\tvec4 topTex2d = texture2D(uTopTexture, vUv);\n\t\t\tdiffuse = uBlendTexture ? blendTextureColor(diffuse, topTex2d) : topTex2d.rgb;\n\t\t} else {\n\t\t\tdiffuse = vec3(texelFetch(uPropertiesTexture, ivec2(1, idx), 0).rgb);\n\t\t}\n\t}\n\n\tvec4 diffuseColor = vec4(diffuse, opacity);\n\n\t// only for vertical surfaces\n\tif(angle > 89.0 && angle < 91.0) {\n\n\t\t// get the percentage of the z position from the ground, up\n\t\tfloat percentFromZeroZ = max((abs(vVerticalOffset) - uGradientStart) / uGradientEnd, 0.0);\n\n\t\t// gradient based on percentage\n\t\tfloat alpha = smoothstep(uMinSideAlpha, uMaxSideAlpha, percentFromZeroZ);\n\n\t\t// mix the shadow color with the diffuse color based on the alpha and opacity\n\t\tdiffuseColor = vec4(mix(diffuseColor.rgb, diffuseColor.rgb * (1.0 - uGradientIntensity), 1.0 - alpha), opacity);\n\t}\n\n\tReflectedLight reflectedLight = ReflectedLight(vec3(0.0), vec3(0.0), vec3(0.0), vec3(0.0));\n\tvec3 totalEmissiveRadiance = emissive;\n\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\n\t// accumulation\n\t#include <lights_lambert_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\n\t// modulation\n\t#include <aomap_fragment>\n\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n\n}\n`", "import type { InsetPadding, BevelState } from '../types';\n\nexport const DEFAULT_INSET_PADDING: InsetPadding = {\n\ttop: 0,\n\tbottom: 0,\n\tleft: 0,\n\tright: 0,\n\ttype: 'pixel',\n};\n\n/**\n * Default bevel values for ExtrudeGeometry\n */\nexport const DEFAULT_BEVEL_VALUES = {\n\tenabled: false,\n\tthickness: 0,\n\tsize: 0,\n\toffset: 0,\n\tsegments: 3,\n} as const;\n\n/**\n * Creates ExtrudeGeometry settings with proper bevel defaults\n * @param bevel - Bevel options from style\n * @param height - Geometry depth/height\n */\nexport function createExtrudeSettings(bevel: BevelState | undefined, height: number) {\n\treturn {\n\t\tbevelEnabled: bevel?.enabled ?? DEFAULT_BEVEL_VALUES.enabled,\n\t\tbevelThickness: bevel?.thickness ?? DEFAULT_BEVEL_VALUES.thickness,\n\t\tbevelSize: bevel?.size ?? (bevel?.thickness || DEFAULT_BEVEL_VALUES.size),\n\t\tbevelOffset: bevel?.offset ?? DEFAULT_BEVEL_VALUES.offset,\n\t\tbevelSegments: bevel?.segments ?? DEFAULT_BEVEL_VALUES.segments,\n\t\tdepth: height,\n\t};\n}\n\nexport const MAPPEDIN_LAYER_ID = 'mappedin';\n// layers for raycasting\nexport enum RAYCAST_LAYERS {\n\tDEFAULT,\n\tOUTLINES, // outlines have their own layer to filter them from raycasting\n}\n\n// layers for rendering\nexport const RENDER_LAYERS = {\n\tALWAYS_ON_TOP: 10,\n};\n\n/**\n * Duration of zoom in/out animation when double tapping with one finger or single tapping with two fingers.\n */\nexport const TAP_ZOOM_DURATION = 250;\n\nexport const COLLISION_WORKER_PATH = 'collision-worker.csp.js';\nexport const MAPLIBRE_WORKER_PATH = 'maplibre-worker.csp.js';\n", "/** Percentage to darken the outline from the polygon's initial color */\nexport const OUTLINE_PERCENT_TO_DARKEN = 30;\n/** The level at which the outline will become fully \"opaque\" */\nexport const OUTLINE_MAX_ZOOM_LEVEL = 19;\n/** The level at which the outline will become fully \"transparent\" */\nexport const OUTLINE_MIN_ZOOM_LEVEL = 16;\n", "import type { Mesh } from 'three';\n\nexport class FocusableComponent {\n\tfocusMesh?: Mesh;\n\tdirty = true;\n}\n", "import type { Object3D } from 'three';\n\ntype Border = {\n\tdirty: boolean;\n\tvisible: boolean;\n\tmesh?: Object3D;\n\t// we need a better way to detect height/altitude from the geometry this belongs to\n\t// but this will suffice for now\n\tneedsRebuild: boolean;\n};\n\nexport class BorderComponent implements Border {\n\tdirty = true;\n\tneedsRebuild = false;\n\tset visible(visible: boolean) {\n\t\tif (this.mesh) {\n\t\t\tthis.mesh.visible = visible;\n\t\t}\n\t}\n\tget visible() {\n\t\treturn this.mesh ? this.mesh.visible : false;\n\t}\n\tmesh?: Object3D;\n}\n", "import type { Feature, LineString } from 'geojson';\nimport type { LineStyle } from '../types';\nimport type { Vector3 } from 'three';\nimport { ExtrudeGeometry, Path, Shape } from 'three';\nimport ClipperLib from '@packages/internal/clipper-lib/ClipperLib';\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\n\nconst DEFAULT_COLOR = 'gray';\n\nlet offsetter = new ClipperLib.ClipperOffset();\nconst QUALITY = 100;\n\nexport function renderLineStringGeometry(feature: Feature<LineString, any>, convertTo3DMapPosition, style?: LineStyle) {\n\tlet {\n\t\tcolor = DEFAULT_COLOR,\n\t\topacity = 1,\n\t\twidth = 1,\n\t\tjoin = 'round',\n\t\tcap = 'round',\n\t\theight = 0.01,\n\t\taltitude = 0,\n\t} = style || {};\n\tif (Array.isArray(opacity)) {\n\t\topacity = 0;\n\t}\n\n\tconst pathSegments: Vector3[][] = [];\n\n\tconst verticalPath = feature.geometry.coordinates.every(e => e[2] != null);\n\n\tfor (let i = 0; i < feature.geometry.coordinates.length - 1; i++) {\n\t\tconst start: Vector3 = convertTo3DMapPosition(\n\t\t\tfeature.geometry.coordinates[i][1],\n\t\t\tfeature.geometry.coordinates[i][0],\n\t\t\tfeature.geometry.coordinates[i][2],\n\t\t);\n\t\tconst end: Vector3 = convertTo3DMapPosition(\n\t\t\tfeature.geometry.coordinates[i + 1][1],\n\t\t\tfeature.geometry.coordinates[i + 1][0],\n\t\t\tfeature.geometry.coordinates[i + 1][2],\n\t\t);\n\n\t\tpathSegments.push([start, end]);\n\t}\n\n\tconst yOffset = pathSegments[0][0].y;\n\n\toffsetter.AddPaths(\n\t\tpathSegments.map(c => c.map(c => ({ X: c.x * QUALITY, Y: (verticalPath ? c.z : c.y) * QUALITY }))),\n\t\tjoin === 'round'\n\t\t\t? ClipperLib.JoinType.jsRound\n\t\t\t: join === 'miter'\n\t\t\t? ClipperLib.JoinType.jsMiter\n\t\t\t: ClipperLib.JoinType.jsSquare,\n\t\tcap === 'round'\n\t\t\t? ClipperLib.EndType.etOpenRound\n\t\t\t: cap === 'butt'\n\t\t\t? ClipperLib.EndType.etOpenButt\n\t\t\t: ClipperLib.EndType.etOpenSquare,\n\t);\n\n\tlet polygons = new ClipperLib.PolyTree();\n\n\t// TODO: fix, for some reason, each line is separate, whereas accordin to the docs they should all make up one\n\t// geometry... I am just tired of fighting\n\toffsetter.Execute(polygons, (width / 2) * QUALITY);\n\n\tconst geometries: ExtrudeGeometry[] = [];\n\n\tconst extrudeSettings = {\n\t\tbevelEnabled: false,\n\t\tdepth: height,\n\t};\n\n\tfor (const polygon of polygons.m_AllPolys) {\n\t\tconst shape = new Shape();\n\t\tif (polygon.IsHole()) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst coords = polygon.m_polygon;\n\t\tshape.moveTo(coords[0].X / QUALITY, coords[0].Y / QUALITY);\n\t\tcoords.slice(1).forEach(coord => shape.lineTo(coord.X / QUALITY, coord.Y / QUALITY));\n\t\tshape.lineTo(coords[0].X / QUALITY, coords[0].Y / QUALITY);\n\n\t\tshape.holes = polygon.m_Childs.map(h => {\n\t\t\tconst path = new Path();\n\t\t\tconst coords = h.m_polygon;\n\t\t\tpath.moveTo(coords[0].X / QUALITY, coords[0].Y / QUALITY);\n\t\t\tcoords.slice(1).forEach(coord => path.lineTo(coord.X / QUALITY, coord.Y / QUALITY));\n\t\t\tpath.lineTo(coords[0].X / QUALITY, coords[0].Y / QUALITY);\n\n\t\t\treturn path;\n\t\t});\n\n\t\tgeometries.push(new ExtrudeGeometry(shape, extrudeSettings));\n\t}\n\n\tconst geometry = BufferGeometryUtils.mergeGeometries(geometries);\n\tif (verticalPath) {\n\t\tgeometry.rotateX(Math.PI / 2);\n\t\tgeometry.translate(0, yOffset + height / 2, altitude || 0);\n\t}\n\n\tgeometry.userData = {\n\t\tstyle: {\n\t\t\tcolor,\n\t\t\topacity,\n\t\t},\n\t};\n\n\toffsetter.Clear();\n\n\treturn geometry;\n}\n", "import ClipperLib from 'js-clipper';\n\nexport function JSClipperError(message) {\n\tthis.name = 'JSClipperError';\n\tthis.message = message;\n\tthis.stack = new Error().stack;\n}\nJSClipperError.prototype = Error.prototype;\n\nClipperLib.Error = function (message) {\n\tthrow new JSClipperError(message);\n};\n\nexport default ClipperLib;\n", "import {\n BBox,\n Feature,\n FeatureCollection,\n Geometry,\n GeometryCollection,\n GeometryObject,\n LineString,\n MultiLineString,\n MultiPoint,\n MultiPolygon,\n Point,\n Polygon,\n Position,\n GeoJsonProperties,\n} from \"geojson\";\n\nimport { Id } from \"./lib/geojson.js\";\nexport * from \"./lib/geojson.js\";\n\n/**\n * @module helpers\n */\n\n// TurfJS Combined Types\nexport type Coord = Feature<Point> | Point | Position;\n\n/**\n * Linear measurement units.\n *\n * ⚠️ Warning. Be aware of the implications of using radian or degree units to\n * measure distance. The distance represented by a degree of longitude *varies*\n * depending on latitude.\n *\n * See https://www.thoughtco.com/degree-of-latitude-and-longitude-distance-4070616\n * for an illustration of this behaviour.\n *\n * @typedef\n */\nexport type Units =\n | \"meters\"\n | \"metres\"\n | \"millimeters\"\n | \"millimetres\"\n | \"centimeters\"\n | \"centimetres\"\n | \"kilometers\"\n | \"kilometres\"\n | \"miles\"\n | \"nauticalmiles\"\n | \"inches\"\n | \"yards\"\n | \"feet\"\n | \"radians\"\n | \"degrees\";\n\n/**\n * Area measurement units.\n *\n * @typedef\n */\nexport type AreaUnits =\n | Exclude<Units, \"radians\" | \"degrees\">\n | \"acres\"\n | \"hectares\";\n\n/**\n * Grid types.\n *\n * @typedef\n */\nexport type Grid = \"point\" | \"square\" | \"hex\" | \"triangle\";\n\n/**\n * Shorthand corner identifiers.\n *\n * @typedef\n */\nexport type Corners = \"sw\" | \"se\" | \"nw\" | \"ne\" | \"center\" | \"centroid\";\n\n/**\n * Geometries made up of lines i.e. lines and polygons.\n *\n * @typedef\n */\nexport type Lines = LineString | MultiLineString | Polygon | MultiPolygon;\n\n/**\n * Convenience type for all possible GeoJSON.\n *\n * @typedef\n */\nexport type AllGeoJSON =\n | Feature\n | FeatureCollection\n | Geometry\n | GeometryCollection;\n\n/**\n * The Earth radius in kilometers. Used by Turf modules that model the Earth as a sphere. The {@link https://en.wikipedia.org/wiki/Earth_radius#Arithmetic_mean_radius mean radius} was selected because it is {@link https://rosettacode.org/wiki/Haversine_formula#:~:text=This%20value%20is%20recommended recommended } by the Haversine formula (used by turf/distance) to reduce error.\n *\n * @constant\n */\nexport const earthRadius = 6371008.8;\n\n/**\n * Unit of measurement factors based on earthRadius.\n *\n * Keys are the name of the unit, values are the number of that unit in a single radian\n *\n * @constant\n */\nexport const factors: Record<Units, number> = {\n centimeters: earthRadius * 100,\n centimetres: earthRadius * 100,\n degrees: 360 / (2 * Math.PI),\n feet: earthRadius * 3.28084,\n inches: earthRadius * 39.37,\n kilometers: earthRadius / 1000,\n kilometres: earthRadius / 1000,\n meters: earthRadius,\n metres: earthRadius,\n miles: earthRadius / 1609.344,\n millimeters: earthRadius * 1000,\n millimetres: earthRadius * 1000,\n nauticalmiles: earthRadius / 1852,\n radians: 1,\n yards: earthRadius * 1.0936,\n};\n\n/**\n\n * Area of measurement factors based on 1 square meter.\n *\n * @constant\n */\nexport const areaFactors: Record<AreaUnits, number> = {\n acres: 0.000247105,\n centimeters: 10000,\n centimetres: 10000,\n feet: 10.763910417,\n hectares: 0.0001,\n inches: 1550.003100006,\n kilometers: 0.000001,\n kilometres: 0.000001,\n meters: 1,\n metres: 1,\n miles: 3.86e-7,\n nauticalmiles: 2.9155334959812285e-7,\n millimeters: 1000000,\n millimetres: 1000000,\n yards: 1.195990046,\n};\n\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @function\n * @param {GeometryObject} geometry input geometry\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryObject, GeoJsonProperties>} a GeoJSON Feature\n * @example\n * var geometry = {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nexport function feature<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geom: G | null,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<G, P> {\n const feat: any = { type: \"Feature\" };\n if (options.id === 0 || options.id) {\n feat.id = options.id;\n }\n if (options.bbox) {\n feat.bbox = options.bbox;\n }\n feat.properties = properties || {};\n feat.geometry = geom;\n return feat;\n}\n\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @function\n * @param {(\"Point\" | \"LineString\" | \"Polygon\" | \"MultiPoint\" | \"MultiLineString\" | \"MultiPolygon\")} type Geometry Type\n * @param {Array<any>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\nexport function geometry(\n type:\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"MultiPoint\"\n | \"MultiLineString\"\n | \"MultiPolygon\",\n coordinates: any[],\n _options: Record<string, never> = {}\n) {\n switch (type) {\n case \"Point\":\n return point(coordinates).geometry;\n case \"LineString\":\n return lineString(coordinates).geometry;\n case \"Polygon\":\n return polygon(coordinates).geometry;\n case \"MultiPoint\":\n return multiPoint(coordinates).geometry;\n case \"MultiLineString\":\n return multiLineString(coordinates).geometry;\n case \"MultiPolygon\":\n return multiPolygon(coordinates).geometry;\n default:\n throw new Error(type + \" is invalid\");\n }\n}\n\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @function\n * @param {Position} coordinates longitude, latitude position (each in decimal degrees)\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point, GeoJsonProperties>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nexport function point<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Point, P> {\n if (!coordinates) {\n throw new Error(\"coordinates is required\");\n }\n if (!Array.isArray(coordinates)) {\n throw new Error(\"coordinates must be an Array\");\n }\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be at least 2 numbers long\");\n }\n if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n throw new Error(\"coordinates must contain numbers\");\n }\n\n const geom: Point = {\n type: \"Point\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @function\n * @param {Position[]} coordinates an array of Points\n * @param {GeoJsonProperties} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n * [-75, 39],\n * [-80, 45],\n * [-78, 50]\n * ]);\n *\n * //=points\n */\nexport function points<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Point, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return point(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon, GeoJsonProperties>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nexport function polygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<Polygon, P> {\n for (const ring of coordinates) {\n if (ring.length < 4) {\n throw new Error(\n \"Each LinearRing of a Polygon must have 4 or more Positions.\"\n );\n }\n\n if (ring[ring.length - 1].length !== ring[0].length) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n\n for (let j = 0; j < ring[ring.length - 1].length; j++) {\n // Check if first point of Polygon contains two numbers\n if (ring[ring.length - 1][j] !== ring[0][j]) {\n throw new Error(\"First and last Position are not equivalent.\");\n }\n }\n }\n const geom: Polygon = {\n type: \"Polygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygon coordinates\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon, GeoJsonProperties>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nexport function polygons<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<Polygon, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return polygon(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString, GeoJsonProperties>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nexport function lineString<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<LineString, P> {\n if (coordinates.length < 2) {\n throw new Error(\"coordinates must be an array of two or more positions\");\n }\n const geom: LineString = {\n type: \"LineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @function\n * @param {Position[][]} coordinates an array of LinearRings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {Id} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString, GeoJsonProperties>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nexport function lineStrings<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<LineString, P> {\n return featureCollection(\n coordinates.map((coords) => {\n return lineString(coords, properties);\n }),\n options\n );\n}\n\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @function\n * @param {Array<Feature<GeometryObject, GeoJsonProperties>>} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection<GeometryObject, GeoJsonProperties>} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n * locationA,\n * locationB,\n * locationC\n * ]);\n *\n * //=collection\n */\nexport function featureCollection<\n G extends GeometryObject = Geometry,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n features: Array<Feature<G, P>>,\n options: { bbox?: BBox; id?: Id } = {}\n): FeatureCollection<G, P> {\n const fc: any = { type: \"FeatureCollection\" };\n if (options.id) {\n fc.id = options.id;\n }\n if (options.bbox) {\n fc.bbox = options.bbox;\n }\n fc.features = features;\n return fc;\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiLineString}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][]} coordinates an array of LineStrings\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString, GeoJsonProperties>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nexport function multiLineString<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n coordinates: Position[][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiLineString, P> {\n const geom: MultiLineString = {\n type: \"MultiLineString\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPoint}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[]} coordinates an array of Positions\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint, GeoJsonProperties>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nexport function multiPoint<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPoint, P> {\n const geom: MultiPoint = {\n type: \"MultiPoint\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a {@link Feature}<{@link MultiPolygon}> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Position[][][]} coordinates an array of Polygons\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon, GeoJsonProperties>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nexport function multiPolygon<P extends GeoJsonProperties = GeoJsonProperties>(\n coordinates: Position[][][],\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<MultiPolygon, P> {\n const geom: MultiPolygon = {\n type: \"MultiPolygon\",\n coordinates,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Creates a Feature<GeometryCollection> based on a\n * coordinate array. Properties can be added optionally.\n *\n * @function\n * @param {Array<Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon>} geometries an array of GeoJSON Geometries\n * @param {GeoJsonProperties} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {BBox} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {Id} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection, GeoJsonProperties>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\nexport function geometryCollection<\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n geometries: Array<\n Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon\n >,\n properties?: P,\n options: { bbox?: BBox; id?: Id } = {}\n): Feature<GeometryCollection, P> {\n const geom: GeometryCollection = {\n type: \"GeometryCollection\",\n geometries,\n };\n return feature(geom, properties, options);\n}\n\n/**\n * Round number to precision\n *\n * @function\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nexport function round(num: number, precision = 0): number {\n if (precision && !(precision >= 0)) {\n throw new Error(\"precision must be a positive number\");\n }\n const multiplier = Math.pow(10, precision || 0);\n return Math.round(num * multiplier) / multiplier;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} radians in radians across the sphere\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\nexport function radiansToLength(\n radians: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return radians * factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\nexport function lengthToRadians(\n distance: number,\n units: Units = \"kilometers\"\n): number {\n const factor = factors[units];\n if (!factor) {\n throw new Error(units + \" units is invalid\");\n }\n return distance / factor;\n}\n\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @function\n * @param {number} distance in real units\n * @param {Units} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nexport function lengthToDegrees(distance: number, units?: Units): number {\n return radiansToDegrees(lengthToRadians(distance, units));\n}\n\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nexport function bearingToAzimuth(bearing: number): number {\n let angle = bearing % 360;\n if (angle < 0) {\n angle += 360;\n }\n return angle;\n}\n\n/**\n * Converts any azimuth angle from the north line direction (positive clockwise)\n * and returns an angle between -180 and +180 degrees (positive clockwise), 0 being the north line\n *\n * @function\n * @param {number} angle between 0 and 360 degrees\n * @returns {number} bearing between -180 and +180 degrees\n */\nexport function azimuthToBearing(angle: number): number {\n // Ignore full revolutions (multiples of 360)\n angle = angle % 360;\n\n if (angle > 180) {\n return angle - 360;\n } else if (angle < -180) {\n return angle + 360;\n }\n\n return angle;\n}\n\n/**\n * Converts an angle in radians to degrees\n *\n * @function\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nexport function radiansToDegrees(radians: number): number {\n // % (2 * Math.PI) radians in case someone passes value > 2π\n const normalisedRadians = radians % (2 * Math.PI);\n return (normalisedRadians * 180) / Math.PI;\n}\n\n/**\n * Converts an angle in degrees to radians\n *\n * @function\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nexport function degreesToRadians(degrees: number): number {\n // % 360 degrees in case someone passes value > 360\n const normalisedDegrees = degrees % 360;\n return (normalisedDegrees * Math.PI) / 180;\n}\n\n/**\n * Converts a length from one unit to another.\n *\n * @function\n * @param {number} length Length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] Input length unit\n * @param {Units} [finalUnit=\"kilometers\"] Returned length unit\n * @returns {number} The converted length\n */\nexport function convertLength(\n length: number,\n originalUnit: Units = \"kilometers\",\n finalUnit: Units = \"kilometers\"\n): number {\n if (!(length >= 0)) {\n throw new Error(\"length must be a positive number\");\n }\n return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n\n/**\n * Converts an area from one unit to another.\n *\n * @function\n * @param {number} area Area to be converted\n * @param {AreaUnits} [originalUnit=\"meters\"] Input area unit\n * @param {AreaUnits} [finalUnit=\"kilometers\"] Returned area unit\n * @returns {number} The converted length\n */\nexport function convertArea(\n area: number,\n originalUnit: AreaUnits = \"meters\",\n finalUnit: AreaUnits = \"kilometers\"\n): number {\n if (!(area >= 0)) {\n throw new Error(\"area must be a positive number\");\n }\n\n const startFactor = areaFactors[originalUnit];\n if (!startFactor) {\n throw new Error(\"invalid original units\");\n }\n\n const finalFactor = areaFactors[finalUnit];\n if (!finalFactor) {\n throw new Error(\"invalid final units\");\n }\n\n return (area / startFactor) * finalFactor;\n}\n\n/**\n * isNumber\n *\n * @function\n * @param {any} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nexport function isNumber(num: any): boolean {\n return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n\n/**\n * isObject\n *\n * @function\n * @param {any} input variable to validate\n * @returns {boolean} true/false, including false for Arrays and Functions\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nexport function isObject(input: any): boolean {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n}\n\n/**\n * Validate BBox\n *\n * @private\n * @param {any} bbox BBox to validate\n * @returns {void}\n * @throws {Error} if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nexport function validateBBox(bbox: any): void {\n if (!bbox) {\n throw new Error(\"bbox is required\");\n }\n if (!Array.isArray(bbox)) {\n throw new Error(\"bbox must be an Array\");\n }\n if (bbox.length !== 4 && bbox.length !== 6) {\n throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n }\n bbox.forEach((num) => {\n if (!isNumber(num)) {\n throw new Error(\"bbox must only contain numbers\");\n }\n });\n}\n\n/**\n * Validate Id\n *\n * @private\n * @param {any} id Id to validate\n * @returns {void}\n * @throws {Error} if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nexport function validateId(id: any): void {\n if (!id) {\n throw new Error(\"id is required\");\n }\n if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n throw new Error(\"id must be a number or a string\");\n }\n}\n", "import {\n Feature,\n FeatureCollection,\n Geometry,\n LineString,\n MultiPoint,\n MultiLineString,\n MultiPolygon,\n Point,\n Polygon,\n} from \"geojson\";\nimport { isNumber } from \"@turf/helpers\";\n\n/**\n * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.\n *\n * @function\n * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers\n * @returns {Array<number>} coordinates\n * @example\n * var pt = turf.point([10, 10]);\n *\n * var coord = turf.getCoord(pt);\n * //= [10, 10]\n */\nfunction getCoord(coord: Feature<Point> | Point | number[]): number[] {\n if (!coord) {\n throw new Error(\"coord is required\");\n }\n\n if (!Array.isArray(coord)) {\n if (\n coord.type === \"Feature\" &&\n coord.geometry !== null &&\n coord.geometry.type === \"Point\"\n ) {\n return [...coord.geometry.coordinates];\n }\n if (coord.type === \"Point\") {\n return [...coord.coordinates];\n }\n }\n if (\n Array.isArray(coord) &&\n coord.length >= 2 &&\n !Array.isArray(coord[0]) &&\n !Array.isArray(coord[1])\n ) {\n return [...coord];\n }\n\n throw new Error(\"coord must be GeoJSON Point or an Array of numbers\");\n}\n\n/**\n * Unwrap coordinates from a Feature, Geometry Object or an Array\n *\n * @function\n * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array\n * @returns {Array<any>} coordinates\n * @example\n * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);\n *\n * var coords = turf.getCoords(poly);\n * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]\n */\nfunction getCoords<\n G extends\n | Point\n | LineString\n | Polygon\n | MultiPoint\n | MultiLineString\n | MultiPolygon,\n>(coords: any[] | Feature<G> | G): any[] {\n if (Array.isArray(coords)) {\n return coords;\n }\n\n // Feature\n if (coords.type === \"Feature\") {\n if (coords.geometry !== null) {\n return coords.geometry.coordinates;\n }\n } else {\n // Geometry\n if (coords.coordinates) {\n return coords.coordinates;\n }\n }\n\n throw new Error(\n \"coords must be GeoJSON Feature, Geometry Object or an Array\"\n );\n}\n\n/**\n * Checks if coordinates contains a number\n *\n * @function\n * @param {Array<any>} coordinates GeoJSON Coordinates\n * @returns {boolean} true if Array contains a number\n */\nfunction containsNumber(coordinates: any[]): boolean {\n if (\n coordinates.length > 1 &&\n isNumber(coordinates[0]) &&\n isNumber(coordinates[1])\n ) {\n return true;\n }\n\n if (Array.isArray(coordinates[0]) && coordinates[0].length) {\n return containsNumber(coordinates[0]);\n }\n throw new Error(\"coordinates must only contain numbers\");\n}\n\n/**\n * Enforce expectations about types of GeoJSON objects for Turf.\n *\n * @function\n * @param {GeoJSON} value any GeoJSON object\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction geojsonType(value: any, type: string, name: string): void {\n if (!type || !name) {\n throw new Error(\"type and name required\");\n }\n\n if (!value || value.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n value.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link Feature} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {Feature} feature a feature with an expected geometry type\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} error if value is not the expected type.\n */\nfunction featureOf(feature: Feature<any>, type: string, name: string): void {\n if (!feature) {\n throw new Error(\"No feature passed\");\n }\n if (!name) {\n throw new Error(\".featureOf() requires a name\");\n }\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n}\n\n/**\n * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @function\n * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nfunction collectionOf(\n featureCollection: FeatureCollection<any>,\n type: string,\n name: string\n) {\n if (!featureCollection) {\n throw new Error(\"No featureCollection passed\");\n }\n if (!name) {\n throw new Error(\".collectionOf() requires a name\");\n }\n if (!featureCollection || featureCollection.type !== \"FeatureCollection\") {\n throw new Error(\n \"Invalid input to \" + name + \", FeatureCollection required\"\n );\n }\n for (const feature of featureCollection.features) {\n if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n throw new Error(\n \"Invalid input to \" + name + \", Feature with geometry required\"\n );\n }\n if (!feature.geometry || feature.geometry.type !== type) {\n throw new Error(\n \"Invalid input to \" +\n name +\n \": must be a \" +\n type +\n \", given \" +\n feature.geometry.type\n );\n }\n }\n}\n\n/**\n * Get Geometry from Feature or Geometry Object\n *\n * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object\n * @returns {Geometry|null} GeoJSON Geometry Object\n * @throws {Error} if geojson is not a Feature or Geometry Object\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getGeom(point)\n * //={\"type\": \"Point\", \"coordinates\": [110, 40]}\n */\nfunction getGeom<G extends Geometry>(geojson: Feature<G> | G): G {\n if (geojson.type === \"Feature\") {\n return geojson.geometry;\n }\n return geojson;\n}\n\n/**\n * Get GeoJSON object's type, Geometry type is prioritize.\n *\n * @param {GeoJSON} geojson GeoJSON object\n * @param {string} [name=\"geojson\"] name of the variable to display in error message (unused)\n * @returns {string} GeoJSON type\n * @example\n * var point = {\n * \"type\": \"Feature\",\n * \"properties\": {},\n * \"geometry\": {\n * \"type\": \"Point\",\n * \"coordinates\": [110, 40]\n * }\n * }\n * var geom = turf.getType(point)\n * //=\"Point\"\n */\nfunction getType(\n geojson: Feature<any> | FeatureCollection<any> | Geometry,\n _name?: string\n): string {\n if (geojson.type === \"FeatureCollection\") {\n return \"FeatureCollection\";\n }\n if (geojson.type === \"GeometryCollection\") {\n return \"GeometryCollection\";\n }\n if (geojson.type === \"Feature\" && geojson.geometry !== null) {\n return geojson.geometry.type;\n }\n return geojson.type;\n}\n\nexport {\n getCoord,\n getCoords,\n containsNumber,\n geojsonType,\n featureOf,\n collectionOf,\n getGeom,\n getType,\n};\n// No default export!\n", "import { featureCollection, lineString, multiLineString } from \"@turf/helpers\";\nimport {\n Feature,\n FeatureCollection,\n LineString,\n MultiLineString,\n MultiPolygon,\n Polygon,\n GeoJsonProperties,\n} from \"geojson\";\nimport { getGeom } from \"@turf/invariant\";\n\n/**\n * Converts a {@link Polygon} to {@link LineString|(Multi)LineString} or {@link MultiPolygon} to a\n * {@link FeatureCollection} of {@link LineString|(Multi)LineString}.\n *\n * @function\n * @param {Feature<Polygon|MultiPolygon>} poly Feature to convert\n * @param {Object} [options={}] Optional parameters\n * @param {Object} [options.properties={}] translates GeoJSON properties to Feature\n * @returns {FeatureCollection|Feature<LineString|MultiLinestring>} converted (Multi)Polygon to (Multi)LineString\n * @example\n * var poly = turf.polygon([[[125, -30], [145, -30], [145, -20], [125, -20], [125, -30]]]);\n *\n * var line = turf.polygonToLine(poly);\n *\n * //addToMap\n * var addToMap = [line];\n */\nfunction polygonToLine<\n G extends Polygon | MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n poly: Feature<G, P> | G,\n options: { properties?: any } = {}\n):\n | Feature<LineString | MultiLineString, P>\n | FeatureCollection<LineString | MultiLineString, P> {\n const geom: any = getGeom(poly);\n if (!options.properties && poly.type === \"Feature\") {\n options.properties = poly.properties;\n }\n switch (geom.type) {\n case \"Polygon\":\n return singlePolygonToLine(geom, options);\n case \"MultiPolygon\":\n return multiPolygonToLine(geom, options);\n default:\n throw new Error(\"invalid poly\");\n }\n}\n\n/**\n * @private\n */\nfunction singlePolygonToLine<\n G extends Polygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n poly: Feature<G, P> | G,\n options: { properties?: any } = {}\n): Feature<LineString | MultiLineString, P> {\n const geom = getGeom(poly);\n const coords: any[] = geom.coordinates;\n const properties: any = options.properties\n ? options.properties\n : poly.type === \"Feature\"\n ? poly.properties\n : {};\n\n return coordsToLine(coords, properties);\n}\n\n/**\n * @private\n */\nfunction multiPolygonToLine<\n G extends MultiPolygon,\n P extends GeoJsonProperties = GeoJsonProperties,\n>(\n multiPoly: Feature<G, P> | G,\n options: { properties?: P } = {}\n): FeatureCollection<LineString | MultiLineString, P> {\n const geom = getGeom(multiPoly);\n const coords: any[] = geom.coordinates;\n const properties: any = options.properties\n ? options.properties\n : multiPoly.type === \"Feature\"\n ? multiPoly.properties\n : {};\n\n const lines: Array<Feature<LineString | MultiLineString, P>> = [];\n coords.forEach((coord) => {\n lines.push(coordsToLine(coord, properties));\n });\n return featureCollection(lines);\n}\n\n/**\n * @private\n */\nfunction coordsToLine<P extends GeoJsonProperties = GeoJsonProperties>(\n coords: number[][][],\n properties: P\n): Feature<LineString | MultiLineString, P> {\n if (coords.length > 1) {\n return multiLineString(coords, properties);\n }\n return lineString(coords[0], properties);\n}\n\nexport { polygonToLine, coordsToLine, multiPolygonToLine, singlePolygonToLine };\nexport default polygonToLine;\n", "import type { Mesh } from 'three';\nimport { Object3D } from 'three';\n\nfunction scrubMaterial(material: any) {\n\tif (material) {\n\t\tif (material.map) {\n\t\t\tmaterial.map.dispose();\n\t\t\tmaterial.map = undefined;\n\t\t}\n\t\tmaterial.dispose();\n\t}\n}\n\nexport function destroyObject3D(object: Object3D | Mesh) {\n\tfor (let i = object.children.length - 1; i >= 0; i--) {\n\t\tdestroyObject3D(object.children[i]);\n\t}\n\n\tif ('geometry' in object && object.geometry) {\n\t\tobject.geometry.dispose();\n\t}\n\n\tif (object.parent) {\n\t\tobject.parent.remove(object);\n\t}\n\n\tif ('material' in object && Array.isArray(object.material)) {\n\t\tobject.material.forEach(function (material) {\n\t\t\tscrubMaterial(material);\n\t\t});\n\t} else if ('material' in object && typeof object.material !== 'undefined') {\n\t\tscrubMaterial(object.material);\n\t}\n}\n\nexport default Object3D;\n", "import { type Feature, type Polygon } from 'geojson';\n\nexport function isValidPolygon(polygon: Feature<Polygon, any>) {\n\treturn polygon != null && polygon.geometry.type === 'Polygon' && polygon.geometry.coordinates[0].length > 2;\n}\n\n/**\n * Calculates the angle between two 2D vectors in degrees\n * @param v1 - First vector [x, y]\n * @param v2 - Second vector [x, y]\n * @returns Angle in degrees between 0 and 180\n */\nexport function calculateAngle(v1: [number, number], v2: [number, number]): number {\n\tconst dot = v1[0] * v2[0] + v1[1] * v2[1];\n\tconst mag1 = Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1]);\n\tconst mag2 = Math.sqrt(v2[0] * v2[0] + v2[1] * v2[1]);\n\n\tif (mag1 === 0 || mag2 === 0) {\n\t\treturn 0;\n\t}\n\n\tconst cosAngle = dot / (mag1 * mag2);\n\t// Clamp to avoid floating point precision issues\n\tconst clampedCos = Math.max(-1, Math.min(1, cosAngle));\n\treturn Math.acos(clampedCos) * (180 / Math.PI);\n}\n\n/**\n * Removes vertices that don't form angles of higher than the specified threshold\n * @param coordinates - Array of coordinate pairs [x, y]\n * @param minAngleDegrees - Minimum angle in degrees (default: 5)\n * @returns Filtered array of coordinates\n */\nexport function filterVerticesByAngle(coordinates: number[][], minAngleDegrees = 5): number[][] {\n\tif (coordinates.length < 3) {\n\t\treturn coordinates;\n\t}\n\n\t// Check if the polygon is closed (first and last vertices are the same)\n\tconst isClosed =\n\t\tcoordinates.length > 3 &&\n\t\tcoordinates[0][0] === coordinates[coordinates.length - 1][0] &&\n\t\tcoordinates[0][1] === coordinates[coordinates.length - 1][1];\n\n\tconst filtered: number[][] = [];\n\n\t// Process all vertices, including the first one for closed polygons\n\tconst endIndex = isClosed ? coordinates.length - 1 : coordinates.length;\n\n\tfor (let i = 0; i < endIndex; i++) {\n\t\tconst prev = isClosed && i === 0 ? coordinates[coordinates.length - 2] : coordinates[i - 1];\n\t\tconst curr = coordinates[i];\n\t\tconst next = isClosed && i === coordinates.length - 1 ? coordinates[1] : coordinates[i + 1];\n\n\t\t// Skip if we don't have valid adjacent vertices\n\t\tif (prev == null || next == null) {\n\t\t\tfiltered.push(curr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Calculate vectors representing the line segments\n\t\tconst v1: [number, number] = [curr[0] - prev[0], curr[1] - prev[1]];\n\t\tconst v2: [number, number] = [next[0] - curr[0], next[1] - curr[1]];\n\n\t\t// Calculate the angle between the vectors\n\t\tconst angle = calculateAngle(v1, v2);\n\n\t\t// Keep the vertex if the angle is greater than the threshold\n\t\tif (angle > minAngleDegrees) {\n\t\t\tfiltered.push(curr);\n\t\t}\n\t}\n\n\t// For closed polygons, ensure the result is still closed\n\tif (isClosed && filtered.length > 0) {\n\t\t// Check if the last vertex is different from the first\n\t\tconst first = filtered[0];\n\t\tconst last = filtered[filtered.length - 1];\n\t\tif (first[0] !== last[0] || first[1] !== last[1]) {\n\t\t\tfiltered.push([first[0], first[1]]);\n\t\t}\n\t}\n\n\treturn filtered;\n}\n\n/**\n * Applies angle-based vertex filtering to a polygon feature\n * @param feature - The polygon feature to filter\n * @param minAngleDegrees - Minimum angle in degrees (default: 5)\n * @returns New feature with filtered coordinates\n */\nexport function filterPolygonVerticesByAngle(\n\tfeature: Feature<Polygon, any>,\n\tminAngleDegrees = 5,\n): Feature<Polygon, any> {\n\treturn {\n\t\t...feature,\n\t\tgeometry: {\n\t\t\t...feature.geometry,\n\t\t\tcoordinates: feature.geometry.coordinates.map(ring => filterVerticesByAngle(ring, minAngleDegrees)),\n\t\t},\n\t};\n}\n", "import { type Box3, Vector3 } from 'three';\n\nexport function getCornersOfBoundingBox(boundingBox: Box3) {\n\tconst low = boundingBox.min;\n\tconst high = boundingBox.max;\n\n\tconst corner1 = new Vector3(low.x, low.y, low.z);\n\tconst corner2 = new Vector3(high.x, low.y, low.z);\n\tconst corner3 = new Vector3(low.x, high.y, low.z);\n\tconst corner5 = new Vector3(high.x, high.y, low.z);\n\n\treturn [corner1, corner2, corner3, corner5];\n}\n", "import type { Geometry2D, Geometry3D, Geometry3DTypes } from '../entities';\nimport type { GroupContainerObject3D } from '../entities/group-container';\nimport type { GeometryGroupObject3D } from '../entities/geometry-group';\nimport type { EntityId, EntityState, RendererState } from '../renderer';\nimport { Box3, Vector3 } from 'three';\nimport type RendererCore from '../renderer';\n\nexport function getGeometryByGeometryId(\n\tstate: RendererState,\n\tgeometryOrGeometryId?: string | number | Record<string, any>,\n) {\n\tlet geometry: Geometry2D | Geometry3DTypes | GroupContainerObject3D | GeometryGroupObject3D | undefined;\n\tif (typeof geometryOrGeometryId === 'string' || typeof geometryOrGeometryId === 'number') {\n\t\tgeometry = state.geometry2DMap.get(geometryOrGeometryId);\n\t\tif (geometry == null) {\n\t\t\tgeometry = state.geometry3DMap.get(geometryOrGeometryId);\n\t\t}\n\t} else if (typeof geometryOrGeometryId?.id === 'string' || typeof geometryOrGeometryId?.id === 'number') {\n\t\tgeometry = state.geometry2DMap.get(geometryOrGeometryId.id);\n\t\tif (geometry == null) {\n\t\t\tgeometry = state.geometry3DMap.get(geometryOrGeometryId.id);\n\t\t}\n\t} else {\n\t\tgeometry = geometryOrGeometryId as Geometry2D | Geometry3D | GroupContainerObject3D | GeometryGroupObject3D;\n\t}\n\n\treturn geometry;\n}\n\nexport function getVerticesOfEntity(\n\tcore: RendererCore,\n\tgeometryOrGeometryId?: string | number | EntityId<EntityState>,\n\tvertices: Vector3[] = [],\n\tbounds: Box3 = new Box3(),\n\tzOffset?: number,\n): Vector3[] {\n\tif (core.getSystems().renderSystem.threeDdirty || core.getSystems().renderSystem.twoDdirty) {\n\t\tcore.renderSync();\n\t}\n\tconst geometryEntity = getGeometryByGeometryId(core.getInternalState(), geometryOrGeometryId);\n\n\ttraverse(geometryEntity, vertices, bounds, zOffset);\n\n\treturn vertices;\n}\n\nconst vertex = new Vector3();\nfunction traverse(obj: any, vertices: Vector3[] = [], bounds: Box3 = new Box3(), zOffset?: number): void {\n\tif (!obj.visible) return;\n\n\tif (obj.isMesh || obj.isLine || obj.isPoints) {\n\t\tconst geometry = obj.geometry;\n\n\t\tif (geometry.isBufferGeometry) {\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tfor (let i = 0; i < position.count; i++) {\n\t\t\t\tvertex.fromBufferAttribute(position, i);\n\t\t\t\tif (zOffset !== undefined) {\n\t\t\t\t\t// since the vertices are relative to their parent, we need to add the zOffset to the vertex\n\t\t\t\t\tvertex.z = zOffset;\n\t\t\t\t}\n\t\t\t\tvertices.push(vertex.clone());\n\t\t\t\tbounds.expandByPoint(vertex);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const child of obj.children) {\n\t\ttraverse(child, vertices, bounds, zOffset);\n\t}\n}\n", "export function getPixelRatio(): number {\n\treturn typeof window === 'undefined' ? 1 : Math.min(window.devicePixelRatio, 2);\n}\n", "// lodash throttle function\nexport function throttle<T>(func: () => void, wait: number, options?: any): () => void {\n\tlet context: T | null;\n\tlet args;\n\tlet result: any;\n\tlet timeout: NodeJS.Timeout | null = null;\n\tlet previous = 0;\n\n\tif (!options) options = {};\n\n\tlet later = function () {\n\t\tprevious = options.leading === false ? 0 : Date.now();\n\t\ttimeout = null;\n\t\tresult = func.apply(context, args);\n\t\tif (!timeout) context = args = null;\n\t};\n\n\treturn function (this: T, ...args: any) {\n\t\tlet now = Date.now();\n\n\t\tif (!previous && options.leading === false) previous = now;\n\n\t\tlet remaining = wait - (now - previous);\n\n\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\tif (timeout) {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\ttimeout = null;\n\t\t\t}\n\n\t\t\tprevious = now;\n\t\t\tresult = func.apply(this, args);\n\n\t\t\tif (!timeout) context = args = null;\n\t\t} else if (!timeout && options.trailing !== false) {\n\t\t\ttimeout = setTimeout(later, remaining);\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\nexport function debounce<T extends (...args: any[]) => void>(func: T, wait: number, immediate = false) {\n\tlet timeout: NodeJS.Timeout | null = null;\n\tlet called = 0; // called times between execution\n\n\treturn function (...args: Parameters<T>) {\n\t\tcalled++;\n\n\t\tif (called === 1 && immediate === true) {\n\t\t\tfunc(...args);\n\t\t}\n\n\t\tlet later = () => {\n\t\t\t// only execute if it's called more than once before timeout reset\n\t\t\tif (!immediate || called > 1) {\n\t\t\t\tfunc(...args);\n\t\t\t}\n\t\t\ttimeout = null;\n\t\t\tcalled = 0;\n\t\t};\n\n\t\tclearTimeout(timeout as NodeJS.Timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n", "type DeviceType = {\n\tisIpad: boolean;\n\tisMobile: boolean;\n\tisSafari12: boolean;\n\tisFirefox: boolean;\n\tisWindows: boolean;\n};\n\n/**\n * Get device OS info\n * export for testing purpose\n * @returns DeviceType\n */\nexport const _deviceTypeControl = (() => {\n\tlet result: DeviceType | undefined;\n\n\treturn {\n\t\tgetDeviceType() {\n\t\t\tif (result) return result;\n\t\t\tconst { userAgent, platform, maxTouchPoints } = window.navigator;\n\n\t\t\tconst isIOS = /(iphone|ipod|ipad)/i.test(userAgent);\n\n\t\t\t// Workaround for ipadOS, force detection as tablet\n\t\t\t// SEE: https://github.com/lancedikson/bowser/issues/329\n\t\t\t// SEE: https://stackoverflow.com/questions/58019463/how-to-detect-device-name-in-safari-on-ios-13-while-it-doesnt-show-the-correct\n\t\t\tconst isIpad =\n\t\t\t\tplatform === 'iPad' ||\n\t\t\t\t// @ts-expect-error window.MSStream is non standard\n\t\t\t\t(platform.indexOf('Mac') === 0 && maxTouchPoints > 0 && !window.MSStream);\n\n\t\t\tconst isAndroid = /android/i.test(userAgent);\n\n\t\t\tresult = {\n\t\t\t\tisIpad,\n\t\t\t\tisMobile: isAndroid || isIOS || isIpad,\n\t\t\t\tisSafari12: /Version\\/12.+Safari/.test(userAgent),\n\t\t\t\tisFirefox: /Firefox/.test(userAgent),\n\t\t\t\tisWindows: /windows/i.test(userAgent),\n\t\t\t};\n\n\t\t\treturn result;\n\t\t},\n\t\t_reset() {\n\t\t\tresult = undefined;\n\t\t},\n\t};\n})();\n\nexport const getDeviceType = _deviceTypeControl.getDeviceType;\n\n/**\n * Creates a closure encapsulating the logic of getting device GPU info.\n * inspired by https://github.com/pmndrs/detect-gpu\n * export for testing\n */\nexport const _gpuInfoControl = (() => {\n\tlet canvas: HTMLCanvasElement | undefined;\n\tlet result: string | undefined;\n\tlet shouldDisableOfflineCanvasResult: boolean | undefined;\n\n\tfunction getInfo() {\n\t\tif (result !== undefined) return result;\n\t\tif (!canvas) canvas = document.createElement('canvas');\n\t\tconst gl = (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')) as WebGLRenderingContext | null;\n\n\t\tif (!gl) {\n\t\t\treturn result;\n\t\t}\n\n\t\ttry {\n\t\t\tconst debugRendererInfo = getDeviceType().isFirefox ? null : gl.getExtension('WEBGL_debug_renderer_info');\n\t\t\tresult = debugRendererInfo\n\t\t\t\t? gl.getParameter(debugRendererInfo.UNMASKED_RENDERER_WEBGL)\n\t\t\t\t: gl.getParameter(gl.RENDERER);\n\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tconst error = new Error('Failed getting device info');\n\t\t\terror.name = 'FailedGettingDeviceInfo';\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tfunction shouldDisableOffscreenCanvas() {\n\t\tif (!getDeviceType().isWindows) return false; // never need to disable for non-windows OS since the issue only resides to windows chrome Angle backend\n\t\tif (shouldDisableOfflineCanvasResult !== undefined) return shouldDisableOfflineCanvasResult;\n\t\tconst gpuInfo = getGPUInfo()?.toLowerCase() ?? '';\n\t\tshouldDisableOfflineCanvasResult =\n\t\t\tgpuInfo.includes('intel') && (gpuInfo.includes('uhd') || gpuInfo.includes('iris'));\n\n\t\treturn shouldDisableOfflineCanvasResult;\n\t}\n\n\treturn {\n\t\tgetInfo,\n\t\tshouldDisableOffscreenCanvas,\n\t\t// reset for for testing\n\t\t_setCanvas(c: HTMLCanvasElement) {\n\t\t\tcanvas = c;\n\t\t\tresult = undefined;\n\t\t\tshouldDisableOfflineCanvasResult = undefined;\n\t\t},\n\t};\n})();\n\nexport const getGPUInfo = _gpuInfoControl.getInfo;\n\n/**\n * Check if device is certain intel integrated GPU.\n * This is for implementing workaround - https://issues.chromium.org/issues/40251953\n * The reason we want to disable OffscreenCanvas at all is due to `willReadFrequently` flag only works in FF.\n * In order to ensure the integrated intel GPU render text correctly\n */\nexport const shouldDisableOffscreenCanvas = _gpuInfoControl.shouldDisableOffscreenCanvas;\n", "export function noop() {}\n\nexport type KeysOfUnion<T> = T extends T ? keyof T : never;\n/**\n * Given an object and a number of properties as strings, return version\n * of that object with only those properties.\n *\n * @param src - the object\n * @param properties - an array of property names chosen\n * to appear on the resulting object.\n * @returns object with limited properties.\n * @example\n * ```ts\n * let foo = { name: 'Charlie', age: 10 };\n * let justName = pick(foo, ['name']); // justName = { name: 'Charlie' }\n * ```\n */\nexport function pick<T extends object>(src: T, properties: KeysOfUnion<T>[]): Partial<T> {\n\tconst result: Partial<T> = {};\n\tfor (let i = 0; i < properties.length; i++) {\n\t\tconst k = properties[i];\n\t\tif (k in src) {\n\t\t\tresult[k] = src[k];\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function isEmpty(obj: Record<string, any>) {\n\t// native Object.keys is the fastest approach actually\n\treturn Object.keys(obj).length === 0;\n}\n", "export const transformRequest = (headers: { 'x-mappedin-tiles-key': string }) => (url: string) => {\n\t// filter out mappedin headers from the outdoor view in order to avoid CORS issues\n\tif (!url.includes('mappedin')) {\n\t\tconst newHeaders = {};\n\t\tfor (const key in headers) {\n\t\t\tconst value = headers[key];\n\n\t\t\tif (!url.includes('mappedin')) {\n\t\t\t\theaders[key] = value;\n\t\t\t}\n\t\t}\n\n\t\treturn { url, headers: newHeaders };\n\t}\n\n\treturn { url, headers };\n};\n", "/**\n * avoid storying default values on the text style to save space\n */\nexport class Text3DStyleComponent implements Partial<Text3DStyle> {\n\tvisible?: boolean;\n\taltitude?: number;\n\t// TODO: handle width height\n\t// width?: number;\n\t// height?: number;\n\tcolor?: string;\n\tdirty = true;\n\tmaxWidth?: number;\n\tmaxHeight?: number;\n\thoverByPolygon?: boolean;\n\tflipToFaceCamera? = DEFAULT_TEXT_STYLE.flipToFaceCamera;\n\tfont?: string;\n\tfillOpacity?: number;\n\tfontSize?: number;\n\tmargin?: number;\n\toutlineWidth?: number;\n\toutlineBlur?: number | string;\n\toutlineOffsetX?: number;\n\tstrokeColor?: string;\n\tstrokeOpacity?: number;\n\tstrokeWidth?: number;\n\thoverColor?: string | undefined;\n\toutlineOffsetY?: number;\n\toutlineColor?: string;\n\toutlineOpacity?: number;\n\tconstructor(initialState?: Partial<Text3DStyle>) {\n\t\tif (initialState) {\n\t\t\tObject.assign(this, initialState);\n\t\t}\n\t}\n\t/**\n\t * Put together a json ignore all the undefined fields.\n\t * This is helpful when we Object.assign(instance, json) to update the instance.\n\t */\n\tgetState(includeDirty = false): Partial<Text3DStyle> {\n\t\tconst json: { [key: string]: any } = {};\n\t\tfor (let key in this) {\n\t\t\tif (!includeDirty && key === 'dirty') {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this[key] !== undefined) {\n\t\t\t\tjson[key] = this[key];\n\t\t\t}\n\t\t}\n\n\t\treturn json;\n\t}\n}\n\n/**\n * Not directly storing default values on the text style to save space\n * TODO: lookign at text style spec from maplibre. we can also support:\n * letterSpacing?: number;\n * lineHeight: number;\n * anchor: number; => .anchorX & .anchorY\n * justify: nubmer; => .textAlign\n * tarnsform: string;\n * offset: number;\n */\nexport const DEFAULT_TEXT_STYLE: Readonly<Text3DStyle> = Object.freeze({\n\tvisible: true,\n\tcolor: 'black',\n\tflipToFaceCamera: true,\n\tfillOpacity: 1,\n\tfont: undefined,\n\tfontSize: 2,\n\tmargin: [0.2, 1, 0.2, 1.5] as [number, number, number, number],\n\toutlineColor: 'black',\n\toutlineOpacity: 1,\n\toutlineWidth: 0,\n\toutlineOffsetX: 0,\n\toutlineOffsetY: 0,\n\toutlineBlur: 0,\n\tstrokeOpacity: 1,\n\tstrokeWidth: 0,\n\tmaxWidth: undefined,\n\tmaxHeight: undefined,\n\tstrokeColor: 'black',\n\thoverColor: undefined,\n});\n\nexport type Text3DStyle = {\n\t/**\n\t * Controls the visibility of the text element.\n\t * @default true\n\t */\n\tvisible: boolean;\n\n\t/**\n\t * The color of the text. Will change to hoverColor when the associated polygon is hovered.\n\t * Accepts any CSS color string.\n\t * @default 'black'\n\t */\n\tcolor: string;\n\n\t/**\n\t * When true, the text will flip to face the camera while maintaining its position.\n\t * @default true\n\t */\n\tflipToFaceCamera: boolean;\n\n\t/**\n\t * URL to a custom font file (.ttf, .otf, .woff).\n\t * Falls back to Roboto if undefined.\n\t */\n\tfont: string | undefined;\n\n\t/**\n\t * The size of the text in meters. Will be automatically adjusted if it exceeds\n\t * the text area bounds.\n\t */\n\tfontSize: number;\n\n\t/**\n\t * Padding between the text and its bounding box, in meters.\n\t * Can be specified as either:\n\t * - A single number for uniform padding on all sides\n\t * - An array of 4 numbers [top, right, bottom, left] for individual side padding\n\t * @default [0.2, 1, 0.2, 1.5]\n\t */\n\tmargin: number | [number, number, number, number];\n\n\t/**\n\t * Color of the text outline.\n\t * Accepts any CSS color string.\n\t * @default 'black'\n\t */\n\toutlineColor: string;\n\n\t/**\n\t * Opacity of the text outline.\n\t * Accepts values between 0 and 1.\n\t * @default 1\n\t */\n\toutlineOpacity: number;\n\n\t/**\n\t * Blur radius for the text outline.\n\t * Can be a number in pixels or a string with units.\n\t */\n\toutlineBlur: number | string;\n\n\t/**\n\t * Width of the text outline effect in pixels.\n\t */\n\toutlineWidth: number;\n\n\t/**\n\t * Horizontal offset of the outline effect from the text, in pixels.\n\t */\n\toutlineOffsetX: number;\n\n\t/**\n\t * Vertical offset of the outline effect from the text, in pixels.\n\t */\n\toutlineOffsetY: number;\n\n\t/**\n\t * Width of the inner stroke of each text glyph.\n\t * @default 0\n\t */\n\tstrokeWidth: number;\n\n\t/**\n\t * Maximum width constraint for the text area in meters.\n\t * Overrides default text field constraints when set.\n\t */\n\tmaxWidth: number | undefined;\n\n\t/**\n\t * Maximum height constraint for the text area in meters.\n\t * Overrides default text field constraints when set.\n\t */\n\tmaxHeight: number | undefined;\n\n\t/**\n\t * Opacity of the text stroke when strokeWidth > 0.\n\t * @default 1\n\t */\n\tstrokeOpacity: number;\n\n\t/**\n\t * Color of the text stroke when strokeWidth > 0.\n\t * Accepts any CSS color string.\n\t * @default 'black'\n\t */\n\tstrokeColor: string;\n\n\t/**\n\t * Opacity of the text fill, independent of stroke and outline opacity.\n\t * Set to 0 to show only stroke/outline.\n\t * Accepts values between 0 and 1.\n\t */\n\tfillOpacity: number;\n\n\t/**\n\t * Color to display when text is hovered.\n\t * Falls back to global hover color if undefined.\n\t */\n\thoverColor: string | undefined;\n};\n", "export { StyleComponent, DEFAULT_COLOR, type MaterialSide } from './style';\nexport { Text3DStyleComponent, type Text3DStyle, DEFAULT_TEXT_STYLE } from './text-style';\nexport { ModelStyleComponnet, type ModelStyle } from './model-style';\nexport { DEFAULT_ROTATION, DEFAULT_SCALE } from './constants';\n", "type MaterialStyle = {\n\tcolor: string;\n};\n\nexport type ModelStyle = {\n\t/**\n\t * Model's URL. Can be based64 inlined url.\n\t */\n\turl: string;\n\t/**\n\t * Visiiblity of the model group\n\t */\n\tvisible: boolean;\n\t/**\n\t * Opacity of the model group.\n\t */\n\topacity: number;\n\t/**\n\t * Change material state by name\n\t * @example\n\t * ```ts\n\t * mapView.Models.add(\n\t * { target: new Coordinate(45, -75) },\n\t * {\n\t * url: 'bed.glb',\n\t * materials: {\n\t * Default: {\n\t * color: MAPPEDIN_COLOR.orange,\n\t * },\n\t * },\n\t * },\n\t * );\n\t * ```\n\t */\n\tmaterial: {\n\t\t[name: string]: MaterialStyle;\n\t};\n\t/**\n\t * vertical offset of the model in meters off the floor\n\t */\n\tverticalOffset: number;\n\n\t/**\n\t * Color property designed for use with @mappedin/3d-assets.\n\t * Updates the accent color of 3d assets by applying the color to materials named\n\t * ['Default', 'Fabric', 'Mpdn_Logo', 'Fabric_Logo'].\n\t * For custom colors on non-Mappedin models, use the `material` property.\n\t * If both the `material` and `color` properties are provided, `material` property updates will take higher precedence than `color` property updates.\n\t */\n\tcolor: string;\n\n\t/**\n\t * The rotation of the model in degrees [x, y, z].\n\t * - x: Rotation around x-axis (pitch)\n\t * - y: Rotation around y-axis (yaw)\n\t * - z: Rotation around z-axis (roll), where z points up\n\t *\n\t * Rotations are applied in order: x, then y, then z.\n\t * 0 degrees means the model faces north (or the parent group's forward direction).\n\t * Positive rotations follow the right-hand rule.\n\t */\n\trotation: [number, number, number];\n\t/**\n\t * The scale of the model in [x, y, z]\n\t */\n\tscale: [number, number, number];\n};\n\nexport class ModelStyleComponnet implements Partial<ModelStyle> {\n\tdirty = true;\n\tvisible = true;\n\topacity = 1;\n\tverticalOffset = 0;\n\tinteractive = false;\n\tcolor?: string;\n\tmaterial?: ModelStyle['material'];\n\trotation?: [number, number, number];\n\tscale?: [number, number, number];\n\tconstructor(init?: Partial<ModelStyle>) {\n\t\tif (init) {\n\t\t\tObject.assign(this, init);\n\t\t}\n\t}\n}\n", "export const DEFAULT_SCALE = [1, 1, 1];\nexport const DEFAULT_ROTATION = [0, 0, 0];\n"],
5
+ "mappings": "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",
6
+ "names": ["require_lodash", "__commonJSMin", "exports", "module", "init_define_process", "LARGE_ARRAY_SIZE", "HASH_UNDEFINED", "HOT_COUNT", "HOT_SPAN", "MAX_SAFE_INTEGER", "argsTag", "arrayTag", "asyncTag", "boolTag", "dateTag", "errorTag", "funcTag", "genTag", "mapTag", "numberTag", "nullTag", "objectTag", "proxyTag", "regexpTag", "setTag", "stringTag", "undefinedTag", "weakMapTag", "arrayBufferTag", "dataViewTag", "float32Tag", "float64Tag", "int8Tag", "int16Tag", "int32Tag", "uint8Tag", "uint8ClampedTag", "uint16Tag", "uint32Tag", "reRegExpChar", "reIsHostCtor", "reIsUint", "typedArrayTags", "freeGlobal", "freeSelf", "root", "freeExports", "freeModule", "moduleExports", "freeProcess", "nodeUtil", "types", "nodeIsTypedArray", "apply", "func", "thisArg", "args", "baseTimes", "n", "iteratee", "index", "result", "baseUnary", "value", "getValue", "object", "key", "overArg", "transform", "arg", "arrayProto", "funcProto", "objectProto", "coreJsData", "funcToString", "hasOwnProperty", "maskSrcKey", "uid", "nativeObjectToString", "objectCtorString", "reIsNative", "Buffer", "Symbol", "Uint8Array", "allocUnsafe", "getPrototype", "objectCreate", "propertyIsEnumerable", "splice", "symToStringTag", "defineProperty", "getNative", "nativeIsBuffer", "nativeMax", "nativeNow", "Map", "nativeCreate", "baseCreate", "proto", "isObject", "Hash", "entries", "length", "entry", "hashClear", "hashDelete", "hashGet", "data", "hashHas", "hashSet", "ListCache", "listCacheClear", "listCacheDelete", "assocIndexOf", "lastIndex", "listCacheGet", "listCacheHas", "listCacheSet", "MapCache", "mapCacheClear", "mapCacheDelete", "getMapData", "mapCacheGet", "mapCacheHas", "mapCacheSet", "size", "Stack", "stackClear", "stackDelete", "stackGet", "stackHas", "stackSet", "pairs", "arrayLikeKeys", "inherited", "isArr", "isArray", "isArg", "isArguments", "isBuff", "isBuffer", "isType", "isTypedArray", "skipIndexes", "isIndex", "assignMergeValue", "eq", "baseAssignValue", "assignValue", "objValue", "array", "baseFor", "createBaseFor", "baseGetTag", "getRawTag", "objectToString", "baseIsArguments", "isObjectLike", "baseIsNative", "isMasked", "pattern", "isFunction", "toSource", "baseIsTypedArray", "isLength", "baseKeysIn", "nativeKeysIn", "isProto", "isPrototype", "baseMerge", "source", "srcIndex", "customizer", "stack", "srcValue", "baseMergeDeep", "newValue", "safeGet", "keysIn", "mergeFunc", "stacked", "isCommon", "isTyped", "isArrayLikeObject", "copyArray", "cloneBuffer", "cloneTypedArray", "isPlainObject", "toPlainObject", "initCloneObject", "baseRest", "start", "setToString", "overRest", "identity", "baseSetToString", "string", "constant", "buffer", "isDeep", "cloneArrayBuffer", "arrayBuffer", "typedArray", "copyObject", "props", "isNew", "createAssigner", "assigner", "sources", "guard", "isIterateeCall", "fromRight", "keysFunc", "iterable", "map", "isKeyable", "isOwn", "tag", "unmasked", "type", "isArrayLike", "Ctor", "otherArgs", "shortOut", "count", "lastCalled", "stamp", "remaining", "other", "stubFalse", "merge", "require_clipper", "__commonJSMin", "exports", "module", "init_define_process", "use_int32", "use_xyz", "use_lines", "use_deprecated", "ClipperLib", "isNode", "navigator_appName", "nav", "browser", "dbits", "canary", "j_lm", "BigInteger", "a", "b", "c", "nbi", "am1", "i", "x", "w", "j", "n", "v", "am2", "xl", "xh", "l", "h", "m", "am3", "BI_FP", "BI_RM", "BI_RC", "rr", "vv", "int2char", "intAt", "s", "bnpCopyTo", "r", "bnpFromInt", "nbv", "bnpFromString", "k", "mi", "sh", "bnpClamp", "bnToString", "km", "d", "p", "bnNegate", "bnAbs", "bnCompareTo", "nbits", "t", "bnBitLength", "bnpDLShiftTo", "bnpDRShiftTo", "bnpLShiftTo", "bs", "cbs", "bm", "ds", "bnpRShiftTo", "bnpSubTo", "bnpMultiplyTo", "y", "bnpSquareTo", "bnpDivRemTo", "q", "pm", "pt", "ts", "ms", "nsh", "ys", "y0", "yt", "d1", "d2", "e", "qd", "bnMod", "Classic", "cConvert", "cRevert", "cReduce", "cMulTo", "cSqrTo", "bnpInvDigit", "Montgomery", "montConvert", "montRevert", "montReduce", "u0", "montSqrTo", "montMulTo", "bnpIsEven", "bnpExp", "z", "r2", "g", "bnModPowInt", "bnClone", "bnIntValue", "bnByteValue", "bnShortValue", "bnpChunkSize", "bnSigNum", "bnpToRadix", "cs", "bnpFromRadix", "bnpFromNumber", "op_or", "bnToByteArray", "bnEquals", "bnMin", "bnMax", "bnpBitwiseTo", "op", "f", "op_and", "bnAnd", "bnOr", "op_xor", "bnXor", "op_andnot", "bnAndNot", "bnNot", "bnShiftLeft", "bnShiftRight", "lbit", "bnGetLowestSetBit", "cbit", "bnBitCount", "bnTestBit", "bnpChangeBit", "bnSetBit", "bnClearBit", "bnFlipBit", "bnpAddTo", "bnAdd", "bnSubtract", "bnMultiply", "bnSquare", "bnDivide", "bnRemainder", "bnDivideAndRemainder", "bnpDMultiply", "bnpDAddOffset", "NullExp", "nNop", "nMulTo", "nSqrTo", "bnPow", "bnpMultiplyLowerTo", "bnpMultiplyUpperTo", "Barrett", "barrettConvert", "barrettRevert", "barrettReduce", "barrettSqrTo", "barrettMulTo", "bnModPow", "k1", "g2", "is1", "bnGCD", "bnpModInt", "bnModInverse", "ac", "u", "lowprimes", "lplim", "bnIsProbablePrime", "bnpMillerRabin", "n1", "Int128", "val1", "val2", "lhs", "rhs", "Inherit", "ce", "ce2", "props", "dp", "result", "node", "Child", "cnt", "ilen", "alen", "ir", "node1", "node2", "val", "pp", "pp2", "linePt1", "linePt2", "UseFullRange", "e1", "e2", "pt1", "pt2", "pt3", "pt4", "jlen", "tmpLm", "Pt", "useFullRange", "eNext", "ePrev", "polyType", "E", "E2", "IsClockwise", "EStart", "Result", "Horz", "StartX", "locMin", "pg", "Closed", "highI", "edges", "IsFlat", "$1", "eStart", "eLoopStop", "eHighest", "clockwise", "EMin", "ppg", "closed", "newLm", "tmp", "lm", "InitOptions", "sb2", "Y", "newSb", "ispolytree", "clipType", "solution", "subjFillType", "clipFillType", "succeeded", "polytree", "outRec", "orfl", "botY", "topY", "index", "tmpPp", "Op1", "Op2", "OffPt", "Op", "lb", "rb", "edge", "startEdge", "pft", "pft2", "Inside", "edge1", "edge2", "next", "prev", "prevE", "outPt", "ToFront", "newOp", "Pt1a", "Pt1b", "Pt2a", "Pt2b", "p1", "p2", "isHole", "btmPt1", "btmPt2", "dx1p", "dx1n", "dx2p", "dx2n", "dups", "outRec1", "outRec2", "bPt1", "bPt2", "idx", "outrec", "holeStateRec", "p1_lft", "p1_rt", "p2_lft", "p2_rt", "side", "OKIdx", "ObsoleteIdx", "pp1", "outIdx", "protect", "e1stops", "e2stops", "e1Contributing", "e2Contributing", "oldE1WindCnt", "e1FillType", "e2FillType", "e1FillType2", "e2FillType2", "e1Wc", "e2Wc", "e1Wc2", "e2Wc2", "AelPrev", "AelNext", "SelPrev", "SelNext", "isTopOfScanbeam", "horzEdge", "HorzEdge", "$var", "dir", "horzLeft", "horzRight", "eLastHorz", "eMaxPair", "IsLastHorz", "op1", "op2", "Direction", "isModified", "newNode", "inode", "iNode", "R1", "R2", "R3", "R4", "currentY", "ip", "b1", "b2", "IsMaximaEdge", "polys", "len", "poly", "pts", "polyg", "pn", "lastOK", "InsertAfter", "a1", "a2", "$val", "op1b", "op2b", "DiscardLeft", "Dir1", "Dir2", "isHorizontal", "reverse1", "reverse2", "Left", "Right", "DiscardLeftSide", "Reverse1", "Reverse2", "paths", "ops", "opStart", "path", "ipNext", "startOp", "poly0x", "poly0y", "poly1x", "poly1y", "outPt1", "outPt2", "res", "OldOutRec", "NewOutRec", "$i2", "$t2", "$l2", "FirstLeft", "join", "oRec", "op3", "op4", "outrec2", "delta", "jointype", "endtype", "MiterLimit", "co", "fillType", "dx", "dy", "ln1", "ln2", "A", "B", "C", "distSqrd", "distance", "outPts", "pattern", "IsSum", "IsClosed", "polyCnt", "pathCnt", "quads", "quad", "pathIsClosed", "pathFillType", "polynode", "nt", "match", "$i3", "$t3", "$l3", "miterLimit", "arcTolerance", "joinType", "endType", "steps", "X", "X2", "clpr", "outer", "outerNode", "message", "err", "scale", "area", "bounds", "polygon", "isPolygons", "k_length", "results", "plen", "tolerance", "poly2", "P", "rem", "addlast", "bxax", "byay", "ax", "ay", "toleranceSq", "sqrt", "perimeter", "p1x", "p1y", "p2x", "p2y", "round", "expolygons", "ep", "childs", "childs2", "init_define_process", "MI_ERROR_LABEL", "E_SDK_LOG_LEVEL", "createLogger", "name", "prefix", "label", "rnDebug", "type", "args", "processed", "arg", "define_process_default", "level", "Logger", "setLoggerLevel", "Mappedin_Logger_default", "init_define_process", "init_define_process", "InvalidTokenError", "b64DecodeUnicode", "str", "m", "p", "code", "base64UrlDecode", "output", "jwtDecode", "token", "options", "pos", "part", "decoded", "e", "init_define_process", "EARTH_RADIUS_M", "init_define_process", "clampWithWarning", "x", "lower", "upper", "warning", "Mappedin_Logger_default", "init_define_process", "arraysEqual", "arr1", "arr2", "i", "decodeAccessToken", "accessToken", "decoded", "jwtDecode", "toRadians", "degrees", "toDegrees", "radians", "round", "value", "decimals", "factor", "euclideanModulo", "modulus", "haversineDistance", "lon1", "lat1", "lon2", "lat2", "dLat", "dLon", "startLat", "destLat", "a", "c", "EARTH_RADIUS_M", "getForwardBearing", "startLon", "y", "x", "shortestTweenRotation", "startRotation", "targetRotation", "startRotationMod2Pi", "targetRotationMod2Pi", "delta", "endRotation", "isFiniteBox", "box", "Box2", "isBrowser", "init_define_process", "debounce", "func", "wait", "immediate", "timeout", "called", "args", "later", "init_define_process", "init_define_process", "formatMessage", "message", "label", "MappedinError", "MI_ERROR_LABEL", "MappedinRenderError", "init_define_process", "AssertionError", "_AssertionError", "message", "__publicField", "assertExists", "value", "options", "errorMessage", "ErrorClass", "error", "assertType", "obj", "expectedType", "errorMessage", "assertExists", "defaultMessage", "init_define_process", "SLICE_POSITIONS", "randomId", "array", "seed", "i", "hexArray", "v", "cyrb53", "str", "h1", "h2", "ch", "init_define_process", "PubSub", "__publicField", "eventName", "data", "fn", "itemIdx", "init_define_process", "SESSION_DATA_KEY", "LOCAL_DATA_KEY", "SESSION_ID_KEY", "DEVICE_ID_KEY", "_instance", "_sessionData", "_localData", "_SafeStorage", "__privateAdd", "sessionData", "__privateSet", "randomId", "localData", "__privateGet", "key", "data", "itemData", "SafeStorage", "init_define_process", "X11_COLOR_NAMES_SET", "Color", "colorInstance", "getColorInstance", "isX11Color", "color", "isHexColor", "hex", "i", "isRgbColor", "openParen", "closeParen", "components", "component", "value", "isHslColor", "isColor", "stringToRgbArray", "instance", "rgbArrayToString", "rgb", "init_define_process", "EASING_CURVES", "linearEase", "t", "quadEaseIn", "easeIn", "x", "quadEaseOut", "InterpolationEasingFns", "interpolate", "value", "inputMin", "inputMax", "outputMin", "outputMax", "easeFunc", "easedT", "getInterpolationBreakpoint", "range", "breakpoint", "comparator", "a", "b", "interpolateMulti", "inputRange", "outputRange", "MappedinError", "segment", "external_exports", "__export", "BRAND", "DIRTY", "EMPTY_PATH", "INVALID", "NEVER", "OK", "ParseStatus", "ZodType", "ZodAny", "ZodArray", "ZodBigInt", "ZodBoolean", "ZodBranded", "ZodCatch", "ZodDate", "ZodDefault", "ZodDiscriminatedUnion", "ZodEffects", "ZodEnum", "ZodError", "ZodFirstPartyTypeKind", "ZodFunction", "ZodIntersection", "ZodIssueCode", "ZodLazy", "ZodLiteral", "ZodMap", "ZodNaN", "ZodNativeEnum", "ZodNever", "ZodNull", "ZodNullable", "ZodNumber", "ZodObject", "ZodOptional", "ZodParsedType", "ZodPipeline", "ZodPromise", "ZodReadonly", "ZodRecord", "ZodSet", "ZodString", "ZodSymbol", "ZodTuple", "ZodUndefined", "ZodUnion", "ZodUnknown", "ZodVoid", "addIssueToContext", "anyType", "arrayType", "bigIntType", "booleanType", "coerce", "custom", "dateType", "datetimeRegex", "en_default", "discriminatedUnionType", "effectsType", "enumType", "functionType", "getErrorMap", "getParsedType", "instanceOfType", "intersectionType", "isAborted", "isAsync", "isDirty", "isValid", "late", "lazyType", "literalType", "makeIssue", "mapType", "nanType", "nativeEnumType", "neverType", "nullType", "nullableType", "numberType", "objectType", "objectUtil", "oboolean", "onumber", "optionalType", "ostring", "pipelineType", "preprocessType", "promiseType", "quotelessJson", "recordType", "setType", "setErrorMap", "strictObjectType", "stringType", "symbolType", "tupleType", "undefinedType", "unionType", "unknownType", "util", "voidType", "init_define_process", "init_define_process", "init_define_process", "init_define_process", "init_define_process", "util", "_", "assertIs", "_arg", "assertNever", "_x", "items", "obj", "item", "validKeys", "k", "filtered", "e", "object", "keys", "key", "arr", "checker", "val", "joinValues", "array", "separator", "value", "objectUtil", "first", "second", "ZodParsedType", "getParsedType", "data", "ZodIssueCode", "util", "quotelessJson", "obj", "ZodError", "_ZodError", "issues", "sub", "subs", "actualProto", "_mapper", "mapper", "issue", "fieldErrors", "processError", "error", "curr", "i", "el", "value", "formErrors", "errorMap", "issue", "_ctx", "message", "ZodIssueCode", "ZodParsedType", "util", "en_default", "overrideErrorMap", "en_default", "setErrorMap", "map", "overrideErrorMap", "getErrorMap", "init_define_process", "makeIssue", "params", "data", "path", "errorMaps", "issueData", "fullPath", "fullIssue", "errorMessage", "maps", "m", "map", "EMPTY_PATH", "addIssueToContext", "ctx", "overrideMap", "getErrorMap", "issue", "en_default", "x", "ParseStatus", "_ParseStatus", "status", "results", "arrayValue", "s", "INVALID", "pairs", "syncPairs", "pair", "key", "value", "finalObject", "DIRTY", "OK", "isAborted", "isDirty", "isValid", "isAsync", "init_define_process", "init_define_process", "init_define_process", "errorUtil", "message", "ParseInputLazyPath", "parent", "value", "path", "key", "handleResult", "ctx", "result", "isValid", "error", "ZodError", "processCreateParams", "params", "errorMap", "invalid_type_error", "required_error", "description", "iss", "message", "ZodType", "input", "getParsedType", "ParseStatus", "isAsync", "data", "err", "maybeAsyncResult", "check", "getIssueProperties", "val", "setError", "ZodIssueCode", "refinementData", "refinement", "ZodEffects", "ZodFirstPartyTypeKind", "def", "ZodOptional", "ZodNullable", "ZodArray", "ZodPromise", "option", "ZodUnion", "incoming", "ZodIntersection", "transform", "defaultValueFunc", "ZodDefault", "ZodBranded", "catchValueFunc", "ZodCatch", "This", "target", "ZodPipeline", "ZodReadonly", "cuidRegex", "cuid2Regex", "ulidRegex", "uuidRegex", "nanoidRegex", "jwtRegex", "durationRegex", "emailRegex", "_emojiRegex", "emojiRegex", "ipv4Regex", "ipv4CidrRegex", "ipv6Regex", "ipv6CidrRegex", "base64Regex", "base64urlRegex", "dateRegexSource", "dateRegex", "timeRegexSource", "args", "secondsRegexSource", "secondsQuantifier", "timeRegex", "datetimeRegex", "regex", "opts", "isValidIP", "ip", "version", "isValidJWT", "jwt", "alg", "header", "base64", "decoded", "isValidCidr", "ZodString", "_ZodString", "ZodParsedType", "addIssueToContext", "INVALID", "status", "tooBig", "tooSmall", "util", "validation", "errorUtil", "options", "minLength", "maxLength", "len", "ch", "min", "max", "floatSafeRemainder", "step", "valDecCount", "stepDecCount", "decCount", "valInt", "stepInt", "ZodNumber", "_ZodNumber", "kind", "inclusive", "ZodBigInt", "_ZodBigInt", "ZodBoolean", "OK", "ZodDate", "_ZodDate", "minDate", "maxDate", "ZodSymbol", "ZodUndefined", "ZodNull", "ZodAny", "ZodUnknown", "ZodNever", "ZodVoid", "_ZodArray", "item", "i", "schema", "deepPartialify", "ZodObject", "newShape", "fieldSchema", "ZodTuple", "_ZodObject", "shape", "keys", "shapeKeys", "extraKeys", "pairs", "keyValidator", "unknownKeys", "catchall", "syncPairs", "pair", "issue", "defaultError", "augmentation", "merging", "index", "mask", "newField", "createZodEnum", "handleResults", "results", "unionErrors", "childCtx", "dirty", "issues", "types", "getDiscriminator", "type", "ZodLazy", "ZodLiteral", "ZodEnum", "ZodNativeEnum", "ZodDiscriminatedUnion", "_ZodDiscriminatedUnion", "discriminator", "discriminatorValue", "optionsMap", "discriminatorValues", "mergeValues", "a", "b", "aType", "bType", "bKeys", "sharedKeys", "newObj", "sharedValue", "newArray", "itemA", "itemB", "handleParsed", "parsedLeft", "parsedRight", "isAborted", "merged", "isDirty", "left", "right", "_ZodTuple", "items", "itemIndex", "x", "rest", "schemas", "ZodRecord", "_ZodRecord", "keyType", "valueType", "first", "second", "third", "ZodMap", "finalMap", "ZodSet", "_ZodSet", "finalizeSet", "elements", "parsedSet", "element", "minSize", "maxSize", "size", "ZodFunction", "_ZodFunction", "makeArgsIssue", "makeIssue", "getErrorMap", "en_default", "makeReturnsIssue", "returns", "fn", "me", "parsedArgs", "e", "parsedReturns", "returnType", "func", "getter", "values", "_ZodEnum", "expectedValues", "enumValues", "newDef", "opt", "nativeEnumValues", "promisified", "effect", "checkCtx", "arg", "processed", "DIRTY", "executeRefinement", "acc", "inner", "base", "preprocess", "ZodOptional", "ZodType", "input", "ZodParsedType", "OK", "type", "params", "ZodFirstPartyTypeKind", "processCreateParams", "ZodNullable", "ZodDefault", "ctx", "data", "ZodCatch", "newCtx", "result", "isAsync", "ZodError", "ZodNaN", "addIssueToContext", "ZodIssueCode", "INVALID", "BRAND", "ZodBranded", "ZodPipeline", "_ZodPipeline", "status", "inResult", "DIRTY", "a", "b", "ZodReadonly", "freeze", "isValid", "cleanParams", "p", "custom", "check", "_params", "fatal", "ZodAny", "r", "_fatal", "late", "ZodObject", "ZodFirstPartyTypeKind", "instanceOfType", "cls", "params", "custom", "data", "stringType", "ZodString", "numberType", "ZodNumber", "nanType", "ZodNaN", "bigIntType", "ZodBigInt", "booleanType", "ZodBoolean", "dateType", "ZodDate", "symbolType", "ZodSymbol", "undefinedType", "ZodUndefined", "nullType", "ZodNull", "anyType", "ZodAny", "unknownType", "ZodUnknown", "neverType", "ZodNever", "voidType", "ZodVoid", "arrayType", "ZodArray", "objectType", "ZodObject", "strictObjectType", "unionType", "ZodUnion", "discriminatedUnionType", "ZodDiscriminatedUnion", "intersectionType", "ZodIntersection", "tupleType", "ZodTuple", "recordType", "ZodRecord", "mapType", "ZodMap", "setType", "ZodSet", "functionType", "ZodFunction", "lazyType", "ZodLazy", "literalType", "ZodLiteral", "enumType", "ZodEnum", "nativeEnumType", "ZodNativeEnum", "promiseType", "ZodPromise", "effectsType", "ZodEffects", "optionalType", "ZodOptional", "nullableType", "ZodNullable", "preprocessType", "pipelineType", "ZodPipeline", "ostring", "onumber", "oboolean", "coerce", "arg", "NEVER", "INVALID", "init_define_process", "v3_default", "external_exports", "init_define_process", "esm_default", "v3_default", "init_define_process", "normalizeAngle", "angle", "init_define_process", "init_define_process", "init_define_process", "init_define_process", "init_define_process", "init_define_process", "init_define_process", "init_define_process", "earthRadius", "factors", "unitsFactors", "feature", "geom", "properties", "options", "feat", "point", "coordinates", "properties", "options", "isNumber", "geom", "feature", "polygon", "coordinates", "properties", "options", "_i", "coordinates_1", "ring", "j", "geom", "feature", "lineString", "coordinates", "properties", "options", "geom", "feature", "featureCollection", "features", "options", "fc", "multiLineString", "coordinates", "properties", "geom", "feature", "multiPolygon", "coordinates", "properties", "options", "geom", "feature", "radiansToLength", "radians", "units", "factor", "factors", "lengthToRadians", "distance", "radiansToDegrees", "radians", "degrees", "degreesToRadians", "isNumber", "num", "coordEach", "geojson", "callback", "excludeWrapCoord", "j", "k", "l", "geometry", "stopG", "coords", "geometryMaybeCollection", "wrapShrink", "coordIndex", "isGeometryCollection", "type", "isFeatureCollection", "isFeature", "stop", "featureIndex", "geomIndex", "multiFeatureIndex", "geometryIndex", "geomType", "featureEach", "geojson", "callback", "i", "geomEach", "geojson", "callback", "i", "j", "g", "geometry", "stopG", "geometryMaybeCollection", "isGeometryCollection", "featureProperties", "featureBBox", "featureId", "featureIndex", "isFeatureCollection", "isFeature", "stop", "flattenEach", "geojson", "callback", "geomEach", "geometry", "featureIndex", "properties", "bbox", "id", "type", "feature", "geomType", "multiFeatureIndex", "coordinate", "geom", "segmentEach", "geojson", "callback", "flattenEach", "feature", "featureIndex", "multiFeatureIndex", "segmentIndex", "type", "previousCoords", "previousFeatureIndex", "previousMultiIndex", "prevGeomIndex", "coordEach", "currentCoord", "coordIndex", "featureIndexCoord", "multiPartIndexCoord", "geometryIndex", "currentSegment", "lineString", "segmentReduce", "initialValue", "previousValue", "started", "bbox", "geojson", "result", "coordEach", "coord", "es_default", "getBoundingBoxFromFeature", "feature", "es_default", "init_define_process", "init_define_process", "init_define_process", "init_define_process", "init_define_process", "InteractionComponent", "__publicField", "init_define_process", "init_define_process", "collisionRankingTierSchema", "external_exports", "rankToNumber", "LOW_RANK_INDEX", "MEDIUM_RANK_INDEX", "ALWAYS_VISIBLE_RANK_INDEX", "clampTierNumber", "rank", "LOW_RANK_INDEX", "convertCollisionRankingTierToNumber", "tier", "rankNumber", "rankToNumber", "MEDIUM_RANK_INDEX", "convertNumberToCollisionRankingTier", "clamped", "init_define_process", "init_define_process", "init_define_process", "easingCurveSchema", "esm_default", "EASING_CURVES", "isStrictlyIncreasing", "input", "previous", "i", "current", "isStrictlyDecreasing", "isStrictlyIncreasingOrDecreasing", "zoomInterpolationSchema", "interpolation", "init_define_process", "_typeof", "obj", "trimLeft", "trimRight", "tinycolor", "color", "opts", "rgb", "inputToRGB", "RsRGB", "GsRGB", "BsRGB", "R", "G", "B", "value", "boundAlpha", "hsv", "rgbToHsv", "h", "s", "v", "hsl", "rgbToHsl", "l", "allow3Char", "rgbToHex", "allow4Char", "rgbaToHex", "bound01", "hexNames", "secondColor", "hex8String", "rgbaToArgbHex", "secondHex8String", "gradientType", "format", "formatSet", "formattedString", "hasAlpha", "needsAlphaFormat", "fn", "args", "_lighten", "_brighten", "_darken", "_desaturate", "_saturate", "_greyscale", "_spin", "_analogous", "_complement", "_monochromatic", "_splitcomplement", "polyad", "newColor", "i", "convertToPercentage", "a", "ok", "stringInputToObject", "isValidCSSUnit", "rgbToRgb", "hsvToRgb", "hslToRgb", "r", "g", "b", "max", "min", "d", "hue2rgb", "p", "q", "t", "f", "mod", "hex", "pad2", "convertDecimalToHex", "color1", "color2", "amount", "clamp01", "hue", "number", "result", "step", "results", "slices", "part", "ret", "modification", "rgb1", "rgb2", "rgba", "c1", "c2", "wcag2", "readability", "wcag2Parms", "out", "validateWCAG2Parms", "baseColor", "colorList", "bestColor", "bestScore", "includeFallbackColors", "level", "size", "names", "flip", "o", "flipped", "n", "isOnePointZero", "processPercent", "isPercentage", "val", "parseIntFromHex", "c", "convertHexToDecimal", "matchers", "CSS_INTEGER", "CSS_NUMBER", "CSS_UNIT", "PERMISSIVE_MATCH3", "PERMISSIVE_MATCH4", "named", "match", "parms", "LABEL_TEXT_PLACEMENT", "LABEL_LOW_PRIORITY", "LABEL_TEXT_PLACEMENT_VALUES", "DEFAULT_LABEL_TEXT_PLACEMENTS", "labelAppearanceSchemaBase", "external_exports", "zoomInterpolationSchema", "labelAppearanceSchema", "appearance", "tinycolor", "labelAppearanceSchemaStrict", "parseLabelAppearance", "addLabelOptionsSchema", "collisionRankingTierSchema", "validateLabelOptions", "options", "validateLabel", "coordinate", "text", "SHARED_OPTIONS", "TEXT_OPTIONS", "PIN_OPTIONS", "isOneOfTextDirtyOptions", "currentAppearance", "newAppearance", "key", "isOneOfPinDirtyOptions", "PIN_SPACER", "MIN_PIN_MARGIN", "PIN_SIZE_NO_ICON", "LOW_PRIORITY_BBOX_SIZE", "LOW_PRIORITY_BBOX", "_LabelComponent", "text", "options", "state", "__publicField", "LABEL_TEXT_PLACEMENT", "Vector2", "strategyIndex", "currentStrategy", "temp", "randomId", "v", "convertCollisionRankingTierToNumber", "generatedRank", "define_process_default", "DEFAULT_LABEL_TEXT_PLACEMENTS", "appearance", "parseLabelAppearance", "pixelRatio", "margin", "placement", "width", "height", "suppliedMargin", "bboxHeight", "LABEL_LOW_PRIORITY", "placements", "strategies", "addLowPriorityFallback", "scale", "strategy", "isPanning", "isStrategyWithoutText", "currentStrategyIndex", "bbox", "currentStrategyBox", "LabelComponent", "label_default", "init_define_process", "import_lodash", "init_define_process", "LOW_PRIORITY_PIN_OPACITY", "MARKER_PLACEMENT", "MARKER_PLACEMENT_VALUES", "DEFAULT_MARKER_PLACEMENT_VALUES", "DEFAULT_LOW_PRIORITY_PIN_CONFIG", "addMarkerOptionsSchema", "external_exports", "MARKER_PLACEMENT_VALUES", "validateMarker", "coordinate", "contentHTML", "options", "_MarkerComponent", "contentHtml", "__publicField", "DEFAULT_MARKER_PLACEMENT_VALUES", "DEFAULT_LOW_PRIORITY_PIN_CONFIG", "Vector2", "strategyIndex", "force", "strategy", "MARKER_PLACEMENT", "pinConfig", "pinSize", "pinColor", "LOW_PRIORITY_PIN_OPACITY", "width", "height", "top", "left", "randomId", "merge", "convertCollisionRankingTierToNumber", "generatedRank", "define_process_default", "anchor", "bottom", "right", "lowPriorityPinMargin", "isPanning", "isRegularStrategy", "currentStrategyIndex", "bbox", "currentStrategyBox", "i", "MarkerComponent", "init_define_process", "Geometry3DObject3D", "Object3D", "__publicField", "raycaster", "intersects", "result", "Geometry3D", "meshComponent", "styleComponent", "randomId", "entity", "GeometryGroupObject3D", "init_define_process", "Geometry2DObject3D", "Object3D", "Geometry2D", "ui", "position", "verticalOffset", "__publicField", "Vector3", "randomId", "value", "z", "init_define_process", "init_define_process", "Text3DSystem", "PubSub", "rendererState", "convertTo3DMapPosition", "useWorker", "__publicField", "configureWorker", "id", "cameraRotationRadians", "entity", "text3DComponent", "styleComponent", "promises", "entityId", "group", "GroupContainerObject3D", "Text3DComponent", "getText3DService", "BatchedText", "batchedText", "batchedMeshPromise", "createText", "batchedTextPromise", "meshComponent", "textMesh", "visible", "doesBatchedTextContainsText", "text", "textRotation", "relativeAngle", "normalizeAngle", "component", "textArea", "plane", "PlaneGeometry", "textAreaMesh", "Mesh", "MeshBasicMaterial", "pos", "tempVec", "tempMatrix", "Vector3", "mesh", "configureTroikaTextBuilder", "Matrix4", "text3DServiceTextmoduleLoadPromise", "preloadFont", "fontUrl", "preloadFontInText3D", "v", "textComponent", "type", "createTroikaTextPoint", "createTroikaTextArea", "args", "error", "Mappedin_Logger_default", "geometry", "DEFAULT_VERTICAL_OFFSET", "syncText", "text3DStateSchema", "external_exports", "initializeText3DStateSchema", "updateText3DStateSchema", "addText3DOptionsSchema", "Text3DComponent", "feature", "__publicField", "Geometry3DObject3D", "doesBatchedTextContainsText", "visible", "init_define_process", "_visible", "OutlineComponent", "color", "__publicField", "__privateAdd", "visible", "__privateGet", "__privateSet", "visibilityArray", "visibilityValue", "vertexIndex", "init_define_process", "init_define_process", "init_define_process", "BatchedPropertiesTexture", "DataTexture", "count", "height", "propertiesLength", "width", "RGBAFormat", "UnsignedByteType", "__publicField", "id", "color", "topColor", "data", "yOffset", "Color", "texture", "topTexture", "init_define_process", "batched_lambert_vertex_default", "init_define_process", "batched_lambert_fragment_default", "MIN_SIDE_ALPHA", "MAX_SIDE_ALPHA", "BatchedStandardMaterial", "MeshLambertMaterial", "params", "geometryCount", "scaleFactor", "__publicField", "SRGBColorSpace", "batchId", "texture", "topTexture", "BatchedPropertiesTexture", "shader", "uGradientIntensity", "uGradientEnd", "uGradientStart", "uTopTexture", "uTexture", "uRepeatYFactor", "uBlendTexture", "batched_lambert_vertex_default", "batched_lambert_fragment_default", "value", "RepeatWrapping", "LinearSRGBColorSpace", "start", "end", "intensity", "color", "topColor", "init_define_process", "DEFAULT_INSET_PADDING", "DEFAULT_BEVEL_VALUES", "createExtrudeSettings", "bevel", "height", "MAPPEDIN_LAYER_ID", "RENDER_LAYERS", "TAP_ZOOM_DURATION", "COLLISION_WORKER_PATH", "MAPLIBRE_WORKER_PATH", "init_define_process", "batchGeometries", "entities", "style", "vertices", "entity", "color", "Color", "material", "BatchedStandardMaterial", "BackSide", "FrontSide", "DoubleSide", "mesh", "EntityBatchedMesh", "component", "geometryId", "range", "MeshComponent", "darkenColorForOutline", "color", "tinycolor", "updateUVsLegacy", "geometry", "textures", "legacyNorth", "convertTo3DMapPosition", "computedBoundingBox", "vertexPositions", "vertexNormals", "vertexUvs", "faceCount", "meshIndex", "faceIndex", "withinFaceIndex", "rotationMatrix", "Matrix4", "Quaternion", "Euler", "topTexture", "t", "topTextureBounds", "sideTexture", "sideTextureBounds", "i", "normalX", "normalY", "normalZ", "absNormalX", "absNormalY", "absNormalZ", "uDim", "vDim", "repeatU", "repeatV", "offsetU", "offsetV", "rotation", "bounds", "min", "max", "legacyObject", "Object3D", "rotatedMin", "rotatedMax", "rotatedWidth", "rotatedHeight", "rotatedBoundsMax", "Vector3", "rangeU", "rangeV", "angle", "c", "s", "iverted", "rotationQuaternion", "j", "local", "world", "positionX", "positionY", "positionZ", "uvU", "uvV", "rotatedU", "rotatedV", "init_define_process", "FocusableComponent", "__publicField", "init_define_process", "BorderComponent", "__publicField", "visible", "updateInteractivity", "entity", "update", "state", "Geometry2D", "InteractionComponent", "Geometry3D", "GroupContainerObject3D", "child", "entityId", "updateGroupColor", "childEntity", "childEntityId", "updateColor", "updateShading", "updateGroupShading", "updateImageProps", "updateHeight", "style", "needsDirty", "darkenColorForOutline", "updatePosition", "convertTo3DMapPosition", "updateParent", "updateEnabled", "updateMarker", "component", "updatePlacement", "addMarkerOptionsSchema", "error", "Mappedin_Logger_default", "updateRank", "convertCollisionRankingTierToNumber", "updateLabelAppearance", "appearance", "mergeObjects", "updateLabel", "validateLabelOptions", "isOneOfTextDirtyOptions", "isOneOfPinDirtyOptions", "updateHoverColor", "updateHovered", "interactionComponent", "updateFlipImageToFaceCamera", "updateEnableImageCollisions", "updateVisibility", "outlineComponent", "Geometry2DObject3D", "label_default", "updateOpacity", "parentOpacity", "cascadeOpacity", "computedOpacity", "GeometryGroupObject3D", "childStyle", "updateGroupTexture", "updateIndividualGeometryTexture", "needsUpdate", "MeshComponent", "meshComponent", "updateIndividualGeometryOpacity", "geometryGroup", "updateAltitude", "updateOutline", "outline", "OutlineComponent", "updateFocusable", "index", "FocusableComponent", "updateIndividualGeometryRenderOrder", "updateSide", "geometry", "updateBorder", "border", "borderComponent", "BorderComponent", "handlePathUpdate", "visible", "color", "pathComponent", "pickPathOptions", "isEmpty", "pick", "PATH_COMPONENT_UPDATE_PROPS", "assetGeometryIsText3D", "geometry", "Geometry3D", "TEXT3D_STYLE_UPDATE_PROPS", "handleText3DUpdate", "state", "update", "updateVisibility", "styleComp", "updated", "pick", "Mappedin_Logger_default", "updateText3DStateSchema", "e", "MODEL_UPATE_PROPS", "handleModelStyleUpdate", "meshComp", "init_define_process", "init_define_process", "import_js_clipper", "JSClipperError", "message", "ClipperLib", "ClipperLib_default", "DEFAULT_COLOR", "offsetter", "ClipperLib_default", "QUALITY", "renderLineStringGeometry", "feature", "convertTo3DMapPosition", "style", "color", "opacity", "width", "join", "cap", "height", "altitude", "pathSegments", "verticalPath", "e", "i", "start", "end", "yOffset", "c", "polygons", "geometries", "extrudeSettings", "polygon", "shape", "Shape", "coords", "coord", "h", "path", "Path", "ExtrudeGeometry", "geometry", "mergeGeometries", "earthRadius", "factors", "feature", "geom", "properties", "options", "feat", "lineString", "coordinates", "properties", "options", "feature", "featureCollection", "features", "options", "fc", "multiLineString", "coordinates", "properties", "feature", "getGeom", "geojson", "polygonToLine", "poly", "options", "geom", "getGeom", "singlePolygonToLine", "multiPolygonToLine", "coords", "properties", "coordsToLine", "multiPoly", "lines", "coord", "featureCollection", "multiLineString", "lineString", "turf_polygon_to_line_default", "init_define_process", "scrubMaterial", "material", "destroyObject3D", "object", "i", "init_define_process", "isValidPolygon", "polygon", "calculateAngle", "v1", "v2", "dot", "mag1", "mag2", "cosAngle", "clampedCos", "filterVerticesByAngle", "coordinates", "minAngleDegrees", "isClosed", "filtered", "endIndex", "i", "prev", "curr", "next", "first", "last", "filterPolygonVerticesByAngle", "feature", "ring", "DEFAULT_BORDER_WIDTH", "CLEANUP_DEGREES", "XRAY_OPACITY", "BorderSystem", "rendererState", "convertTo3DMapPosition", "__publicField", "entity", "style", "border", "meshComponent", "entityId", "MeshComponent", "isValidPolygon", "mesh", "error", "Mappedin_Logger_default", "child", "destroyObject3D", "feature", "styleComponent", "originalLine", "turf_polygon_to_line_default", "filteredFeature", "filterPolygonVerticesByAngle", "filteredLine", "borderWidth", "borderColor", "bottomBorder", "renderLineStringGeometry", "topBorder", "coordinates", "verticalGeometries", "c", "geometry", "merged", "mergeGeometries", "material", "MeshBasicMaterial", "xrayMaterial", "object", "Object3D", "Mesh", "xrayMesh", "_", "DEFAULT_COLOR", "DEFAULT_WALL_WIDTH", "DEFAULT_HEIGHT", "_color", "_topColor", "_hoverColor", "StyleComponent", "style", "__publicField", "__privateAdd", "DEFAULT_BORDER_WIDTH", "color", "isColor", "__privateSet", "Mappedin_Logger_default", "__privateGet", "EntityBatchedMesh", "BatchedMesh", "__publicField", "_opacity", "_bbox", "MeshComponent", "feature", "DEFAULT_HEIGHT", "Color", "Vector3", "__privateAdd", "visible", "value", "color", "topColor", "__privateGet", "imageMaterials", "material", "__privateSet", "texture", "getBoundingBoxFromFeature", "GeometryGroupObject3D", "Object3D", "id", "__publicField", "visible", "firstChild", "child", "EntityBatchedMesh", "altitude", "GroupContainerObject3D", "_GroupContainerObject3D", "Object3D", "id", "__publicField", "feature", "occluderId", "entityGroupOrContainer", "Geometry2D", "GeometryGroupObject3D", "Geometry3D", "visible", "altitude", "child", "Geometry2DObject3D", "opacity", "init_define_process", "getCornersOfBoundingBox", "boundingBox", "low", "high", "corner1", "Vector3", "corner2", "corner3", "corner5", "init_define_process", "getGeometryByGeometryId", "state", "geometryOrGeometryId", "geometry", "getVerticesOfEntity", "core", "vertices", "bounds", "Box3", "zOffset", "geometryEntity", "traverse", "vertex", "Vector3", "obj", "position", "i", "child", "init_define_process", "getPixelRatio", "init_define_process", "debounce", "func", "wait", "immediate", "timeout", "called", "args", "later", "init_define_process", "_deviceTypeControl", "result", "userAgent", "platform", "maxTouchPoints", "isIOS", "isIpad", "isAndroid", "getDeviceType", "_gpuInfoControl", "canvas", "shouldDisableOfflineCanvasResult", "getInfo", "gl", "debugRendererInfo", "error", "shouldDisableOffscreenCanvas", "gpuInfo", "getGPUInfo", "c", "init_define_process", "pick", "src", "properties", "result", "i", "k", "isEmpty", "obj", "init_define_process", "transformRequest", "headers", "url", "newHeaders", "key", "value", "cartesianToGeographic", "centerLat", "centerLon", "x", "y", "latRadian", "latDelta", "EARTH_RADIUS_M", "newLat", "lonDelta", "newLon", "geographicToCartesian", "targetLat", "targetLon", "lonRadian", "centerLatRadian", "centerLonRadian", "populateGeometry3DIdsInScene", "tree", "entities", "loadGeometryGroupIds", "parentPreloaded", "isPreloadedContainer", "GroupContainerObject3D", "preloadedHidden", "child", "GeometryGroupObject3D", "entityId", "Geometry3DObject3D", "populateGeometry2DIdsInScene", "Geometry2DObject3D", "mergeObjects", "obj1", "obj2", "key", "createCustomLayer", "modelAsMercatorCoordinate", "viewCamera", "onRender", "modelTransform", "matrix1", "Matrix4", "scale", "Vector3", "matrix2", "MAPPEDIN_LAYER_ID", "_gl", "args", "fetchToken", "authURL", "getRequestHeaders", "token", "access_token", "cyrb53", "str", "seed", "h1", "h2", "ch", "getProjectionScaleFactor", "FOV", "canvasHeight", "zoom", "halfFOV", "PQ", "getBoundingBoxCenter", "bbox", "LngLatBounds", "LngLat", "shouldExpandZoomLevel", "minZoomFromCurrentPanBounds", "cameraZoomLevel", "getGroupContainerOpacity", "entity", "containerOpacity", "GroupContainerObject3D", "GeometryGroupObject3D", "coordinatesEqual", "coord1", "coord2", "tolerance", "lonEqual", "latEqual", "altEqual", "MAPLIBRE_FRUSTRUM_CULL_HACK_NAME", "maplibreFrustrumCullHack", "geometry", "BoxGeometry", "material", "MeshBasicMaterial", "mesh", "Mesh", "tempVec", "tempVec2", "Vector2", "projectToBox2D", "object", "camera", "result", "Box2", "child", "position", "i", "ndcToScreen", "ndc", "container", "width", "height", "drawProjectedBox", "box", "color", "div", "min", "max", "rectFromScreenOffsets", "el", "screenOffsets", "x", "y", "w", "h", "_left", "_top", "_right", "_bottom", "type", "left", "top", "right", "bottom", "v", "init_define_process", "Text3DStyleComponent", "initialState", "__publicField", "DEFAULT_TEXT_STYLE", "includeDirty", "json", "key", "init_define_process", "init_define_process", "ModelStyleComponnet", "init", "__publicField", "init_define_process", "DEFAULT_SCALE", "DEFAULT_ROTATION"]
7
+ }