@nextgis/ngw-connector 3.0.0-alpha.0 → 3.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts CHANGED
@@ -778,16 +778,52 @@ interface PutRequestItemsResponseMap extends RequestItemKeys {
778
778
  interface DeleteRequestItemsResponseMap extends RequestItemKeys {
779
779
  'feature_layer.feature.item': any;
780
780
  }
781
+ /**
782
+ * User credentials for authorization.
783
+ */
781
784
  interface Credentials {
785
+ /**
786
+ * The login username for the user.
787
+ */
782
788
  login: string;
789
+ /**
790
+ * The password for the user.
791
+ */
783
792
  password: string;
784
793
  }
785
794
  type RequestTransformFunction = (url: string, options: RequestOptions) => [url: string, options: RequestOptions];
786
795
  interface NgwConnectorOptions {
796
+ /**
797
+ * The base URL of the NextGIS Web (NGW) server.
798
+ * Example: "https://demo.nextgis.com"
799
+ */
787
800
  baseUrl?: string;
801
+ /**
802
+ * The API route path to use for requests.
803
+ * If not specified, the default route "/api/component/pyramid/route" will be used.
804
+ */
788
805
  route?: string;
806
+ /**
807
+ * User credentials for authorization in NGW.
808
+ * These credentials will be used for authentication in NGW requests.
809
+ */
789
810
  auth?: Credentials;
811
+ /**
812
+ * Indicates whether to include credentials such as cookies, authentication headers,
813
+ * or TLS client certificates in cross-site Access-Control requests.
814
+ * Setting this property ensures that cookies from another domain are used in the requests.
815
+ * Note that setting this property has no effect on same-origin requests.
816
+ */
817
+ withCredentials?: boolean;
818
+ /**
819
+ * A function to transform the request before sending it.
820
+ * This function can be used to modify the URL, headers, or other options.
821
+ */
790
822
  requestTransform?: RequestTransformFunction;
823
+ /**
824
+ * Identifier for caching requests.
825
+ * This can be used to segregate cached data for different connectors.
826
+ */
791
827
  cacheId?: string;
792
828
  }
793
829
  interface RequestHeaders {
@@ -803,19 +839,64 @@ interface BaseRequestOptions {
803
839
  cache?: boolean;
804
840
  signal?: AbortSignal;
805
841
  }
842
+ /**
843
+ * Options for configuring requests to NGW.
844
+ */
806
845
  interface RequestOptions<M extends RequestMethods = RequestMethods, K extends keyof RequestItemsParamsMap = keyof RequestItemsParamsMap> extends BaseRequestOptions {
846
+ /**
847
+ * Data to be sent as the request body.
848
+ * Typically used with POST, PUT, or PATCH requests.
849
+ */
807
850
  data?: any;
851
+ /**
852
+ * File to be sent in the request.
853
+ */
808
854
  file?: File;
855
+ /**
856
+ * HTTP method to be used for the request.
857
+ * Example: 'GET', 'POST', 'PUT', 'PATCH', 'DELETE'
858
+ */
809
859
  method?: M;
860
+ /**
861
+ * HTTP headers to be included in the request.
862
+ */
810
863
  headers?: RequestHeaders;
864
+ /**
865
+ * Indicates whether to include credentials such as cookies, authentication headers,
866
+ * or TLS client certificates in cross-site Access-Control requests.
867
+ */
811
868
  withCredentials?: boolean;
869
+ /**
870
+ * The type of data that the server will respond with.
871
+ * Can be either 'json' or 'blob'.
872
+ */
812
873
  responseType?: 'json' | 'blob';
874
+ /**
875
+ * Whether to cache the request.
876
+ * When set to true, the response will be stored in the cache.
877
+ */
813
878
  cache?: boolean;
879
+ /**
880
+ * Signal object that allows you to communicate with a DOM request (such as fetch) and abort it if desired via an AbortController.
881
+ */
814
882
  signal?: AbortSignal;
883
+ /**
884
+ * Parameters to be included in the request URL.
885
+ */
815
886
  params?: RequestItemsParams<K>;
887
+ /**
888
+ * A function to be called to monitor the progress of the request.
889
+ * @param percentComplete - The percentage of the request that has been completed.
890
+ * @param event - The progress event.
891
+ */
816
892
  onProgress?: (percentComplete: number, event: ProgressEvent) => void;
893
+ /**
894
+ * Name to use for caching the request.
895
+ */
817
896
  cacheName?: string;
818
- /** Use to override default cache props */
897
+ /**
898
+ * Properties to override default cache behavior.
899
+ */
819
900
  cacheProps?: Record<string, unknown>;
820
901
  }
821
902
  type RequestItemAdditionalParams = {
@@ -932,6 +1013,8 @@ declare class NgwConnector {
932
1013
  user?: UserInfo;
933
1014
  resources: ResourcesControl;
934
1015
  cache: Cache;
1016
+ withCredentials?: boolean;
1017
+ private client;
935
1018
  private routeStr;
936
1019
  private activeRequests;
937
1020
  private requestTransform?;
@@ -1,10 +1,66 @@
1
- /** Bundle of @nextgis/ngw-connector; version: 3.0.0-alpha.0; author: NextGIS */
1
+ /** Bundle of @nextgis/ngw-connector; version: 3.0.0-alpha.2; author: NextGIS */
2
2
  'use strict';
3
3
 
4
4
  var events = require('events');
5
5
  var Cache = require('@nextgis/cache');
6
6
  var utils = require('@nextgis/utils');
7
7
 
8
+ var pkg = {
9
+ name: "@nextgis/ngw-connector",
10
+ version: "3.0.0-alpha.2",
11
+ _priority: 12,
12
+ description: "A lightweight HTTP client optimized for use with NextGIS Web API",
13
+ main: "index.js",
14
+ module: "lib/ngw-connector.esm-bundler.js",
15
+ unpkg: "lib/ngw-connector.global.prod.js",
16
+ jsdelivr: "lib/ngw-connector.global.prod.js",
17
+ types: "lib/index.d.ts",
18
+ dependencies: {
19
+ "@nextgis/cache": "^3.0.0-alpha.1",
20
+ "@nextgis/cancelable-promise": "^3.0.0-alpha.1",
21
+ "@nextgis/utils": "^3.0.0-alpha.1",
22
+ "@types/events": "^3.0.0",
23
+ events: "*",
24
+ "form-data": "^4.0.0"
25
+ },
26
+ devDependencies: {
27
+ "@nextgis/build-tools": "^3.0.0-alpha.1"
28
+ },
29
+ scripts: {
30
+ clean: "rimraf ./lib",
31
+ dev: "node ../build-tools/lib/build.js",
32
+ prod: "npm run dev -- --release",
33
+ lint: "eslint ./src/**/*.ts --fix --c ../../.eslintrc",
34
+ watch: "npm run dev -- --watch",
35
+ "gen:types": "node ./scripts/generator"
36
+ },
37
+ buildOptions: {
38
+ name: "NgwConnector",
39
+ formats: [
40
+ "esm-bundler",
41
+ "esm-browser",
42
+ "cjs",
43
+ "global"
44
+ ]
45
+ },
46
+ keywords: [
47
+ "NextGIS",
48
+ "MAP"
49
+ ],
50
+ author: "NextGIS",
51
+ files: [
52
+ "index.js",
53
+ "lib"
54
+ ],
55
+ license: "MIT",
56
+ homepage: "https://github.com/nextgis/nextgis_frontend/tree/master/packages/ngw-connector#readme",
57
+ repository: {
58
+ type: "git",
59
+ url: "git://github.com/nextgis/nextgis_frontend.git"
60
+ },
61
+ gitHead: "edc68033f914f6c95c4125b9738bba6d36e990b4"
62
+ };
63
+
8
64
  var __defProp$4 = Object.defineProperty;
9
65
  var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
66
  var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -542,6 +598,8 @@ class NgwConnector {
542
598
  __publicField(this, "user");
543
599
  __publicField(this, "resources");
544
600
  __publicField(this, "cache");
601
+ __publicField(this, "withCredentials");
602
+ __publicField(this, "client", `NextGIS-NGW-Connector/${pkg.version}`);
545
603
  __publicField(this, "routeStr", "/api/component/pyramid/route");
546
604
  __publicField(this, "activeRequests", {});
547
605
  __publicField(this, "requestTransform");
@@ -550,11 +608,15 @@ class NgwConnector {
550
608
  if (exist) {
551
609
  return exist;
552
610
  } else {
553
- if (this.options.route) {
554
- this.routeStr = this.options.route;
611
+ const { route, requestTransform, withCredentials } = this.options;
612
+ if (route) {
613
+ this.routeStr = route;
614
+ }
615
+ if (requestTransform) {
616
+ this.requestTransform = requestTransform;
555
617
  }
556
- if (this.options.requestTransform) {
557
- this.requestTransform = this.options.requestTransform;
618
+ if (withCredentials !== void 0) {
619
+ this.withCredentials = withCredentials;
558
620
  }
559
621
  this.resources = new ResourcesControl({
560
622
  connector: this,
@@ -607,8 +669,9 @@ class NgwConnector {
607
669
  await this._login({ login, password });
608
670
  }
609
671
  }
672
+ const routeUrl = `${this.routeStr}?client=${this.client}`;
610
673
  return await this.makeQuery(
611
- this.routeStr,
674
+ routeUrl,
612
675
  {},
613
676
  {
614
677
  cacheName: "route",
@@ -824,6 +887,7 @@ class NgwConnector {
824
887
  url = template(url, restParams);
825
888
  }
826
889
  url = encodeURI(utils.fixUrlStr(url));
890
+ options = { withCredentials: this.withCredentials, ...options };
827
891
  const {
828
892
  cache,
829
893
  signal: externalSignal,
@@ -1 +1 @@
1
- {"version":3,"file":"ngw-connector.cjs.js","sources":["../src/errors/NgwError.ts","../src/errors/ResourceNotFoundError.ts","../src/utils/isObject.ts","../src/utils/resourceCompare.ts","../src/utils/resourceToQuery.ts","../src/ResourcesControl.ts","../src/activeConnectors.ts","../src/errors/AbortError.ts","../src/errors/InsufficientPermissionsError.ts","../src/utils/template.ts","../src/utils/apiRequest.ts","../src/errors/isError.ts","../src/utils/loadData.ts","../src/NgwConnector.ts"],"sourcesContent":["import type { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when...\n */\nexport class NgwError extends Error {\n name = 'NgwError';\n\n title!: string;\n message!: string;\n detail!: string;\n exception!: NgwExceptions;\n status_code!: number | 404 | 500;\n data?: Record<string, any>;\n guru_meditation!: string;\n\n constructor(er?: Partial<NgwError>) {\n super();\n Object.assign(this, er);\n Object.setPrototypeOf(this, NgwError.prototype);\n }\n}\n","import { NgwError } from './NgwError';\n\nimport type { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when ...\n */\nexport class ResourceNotFoundError extends NgwError {\n name = 'ResourceNotFoundError';\n exception: NgwExceptions = 'nextgisweb.resource.exception.ResourceNotFound';\n\n constructor(obj?: ResourceNotFoundError) {\n super(obj);\n Object.setPrototypeOf(this, ResourceNotFoundError.prototype);\n }\n}\n","export function isObject(val: unknown): val is Record<string | number, any> {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n","import { objectDeepEqual } from '@nextgis/utils';\n\nimport type { Resource } from '../types/ResourceItem';\nimport type { DeepPartial } from '@nextgis/utils';\n\nexport function resourceCompare(\n res1: DeepPartial<Resource>,\n res2: DeepPartial<Resource>,\n): boolean {\n return objectDeepEqual(res1, res2);\n}\n","import { defined } from '@nextgis/utils';\n\nimport { isObject } from './isObject';\n\nimport type { Resource } from '../types/ResourceItem';\nimport type { DeepPartial } from '@nextgis/utils';\n\nconst exclude = ['description'];\n\n/**\n * @remarks\n * https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#search-resources\n *\n * ```\n * { keyname, owner_user: { id }} > { keyname, owner_user__id }\n * ```\n *\n * @param resource - Any property from NGW resource item\n */\nexport function resourceToQuery(\n resource: DeepPartial<Resource>,\n prefix = '',\n): Record<string, unknown> {\n prefix = prefix ? prefix + '__' : '';\n const query: Record<string, any> = {};\n for (const [key, value] of Object.entries(resource)) {\n if (exclude.indexOf(key) === -1) {\n if (isObject(value)) {\n if (key === 'owner_user') {\n const children = resourceToQuery(value as DeepPartial<Resource>, key);\n Object.assign(query, children);\n } else if (key === 'parent' && 'id' in value) {\n query.parent_id = value.id;\n }\n } else if (defined(value)) {\n query[prefix + key] = value;\n }\n }\n }\n return query;\n}\n","import Cache from '@nextgis/cache';\nimport { defined } from '@nextgis/utils';\n\nimport { ResourceNotFoundError } from './errors/ResourceNotFoundError';\nimport { isObject } from './utils/isObject';\nimport { resourceCompare } from './utils/resourceCompare';\nimport { resourceToQuery } from './utils/resourceToQuery';\n\nimport type { NgwConnector } from './NgwConnector';\nimport type {\n GetChildrenOfOptions,\n RequestOptions,\n ResourceDefinition,\n} from './interfaces';\nimport type { Resource, ResourceItem } from './types/ResourceItem';\nimport type { DeepPartial } from '@nextgis/utils';\n\nexport class ResourcesControl {\n cache: Cache<Promise<ResourceItem | undefined>, { id?: number | string }>;\n connector: NgwConnector;\n\n constructor({\n connector,\n cacheId,\n }: {\n connector: NgwConnector;\n cacheId?: string;\n }) {\n this.connector = connector;\n this.cache = new Cache({ namespace: cacheId });\n }\n\n // -------------------------------------------------------------------------\n // Resource Methods\n // -------------------------------------------------------------------------\n\n /**\n * Receive resource from NGW by id, keyname or search-object parameter.\n * @param resource - Resource id, keyname or search-object\n *\n * @remarks\n * Fetching resource would be cached to speed up next call\n */\n getOne(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n const forCache: { keyname?: string; display_name?: string; id?: number } =\n {};\n const opt = { ...requestOptions };\n if (typeof resource === 'string') {\n forCache.keyname = resource;\n } else if (typeof resource === 'number') {\n forCache.id = resource;\n } else if (isObject(resource)) {\n if (resource.id !== undefined) {\n forCache.id = resource.id;\n } else {\n if (resource.keyname) {\n forCache.keyname = resource.keyname;\n }\n if (resource.display_name) {\n forCache.display_name = resource.display_name;\n }\n }\n }\n\n if (typeof resource === 'string') {\n return this._fetchResourceBy({ keyname: resource }, opt);\n } else if (typeof resource === 'number') {\n return this._fetchResourceById(resource, opt);\n } else if (isObject(resource)) {\n return this._fetchResourceBy(resource, opt);\n }\n return Promise.resolve(undefined);\n }\n\n getOneOrFail(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem> {\n return this.getOne(resource, requestOptions).then((res) => {\n if (res) {\n return res;\n }\n throw new ResourceNotFoundError();\n });\n }\n\n /**\n * A fast way to retrieve resource ID for any resource definition.\n * @param resource - Any available resource definition\n *\n * @remarks\n * There are situations when exactly the resource id is needed\n * (for example, to compose the correct request to the api)\n * then this method will come in handy to facilitate the extraction of the identifier\n * if the resource is specified through a keyname or other parameters.\n */\n getId(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<number | undefined> {\n if (typeof resource === 'number') {\n return Promise.resolve(resource);\n } else if (typeof resource === 'string' || isObject(resource)) {\n return this.getOne(resource, requestOptions).then((res) => {\n if (res) {\n return res.resource.id;\n }\n });\n }\n return Promise.resolve(undefined);\n }\n\n /**\n * A fast way to retrieve resource ID for any resource definition.\n * @param resource - Any available resource definition\n *\n * @remarks\n * Similar with {@link NgwConnector.getResourceId | getResourceId} but rise error if resource is not exist.\n * To not make one more checks if the resource is definitely exists\n */\n getIdOrFail(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<number> {\n return this.getId(resource, requestOptions).then((resp) => {\n if (resp === undefined) {\n throw new Error();\n }\n return resp;\n });\n }\n\n getMany(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem[]> {\n return this._resourceCacheFilter(resource).then((items) => {\n if (!items.length) {\n const query: Record<string, unknown> = {};\n if (resource.keyname) {\n query.keyname = resource.keyname;\n } else {\n Object.assign(query, resourceToQuery(resource));\n }\n return this.connector\n .get('resource.search', requestOptions, {\n serialization: 'full',\n ...query,\n })\n .then((resources) => {\n if (requestOptions?.cache && resources) {\n for (const x of resources) {\n this.cache.add('resource.item', Promise.resolve(x), {\n id: x.resource.id,\n });\n }\n }\n return resources;\n });\n }\n return items;\n });\n }\n\n getParent(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.getOne(resource, requestOptions).then((child) => {\n if (child) {\n return this.getOne(child.resource.parent.id, requestOptions);\n }\n return Promise.resolve(undefined);\n });\n }\n\n getChildrenOf(\n resource: ResourceDefinition,\n requestOptions?: GetChildrenOfOptions,\n ): Promise<ResourceItem[]> {\n return this.getIdOrFail(resource).then((parent) =>\n this._getChildrenOf(parent, requestOptions),\n );\n }\n\n update(\n resource: ResourceDefinition,\n data: DeepPartial<ResourceItem>,\n ): Promise<ResourceItem | undefined> {\n return this.getId(resource).then((id) => {\n if (id !== undefined) {\n return this.connector.put('resource.item', { data }, { id });\n }\n });\n }\n\n /**\n * Fast way to delete resource from NGW and clean cache.\n * @param resource - Resource definition\n */\n delete(resource: ResourceDefinition): Promise<void> {\n return this.getId(resource).then((id) => {\n if (id !== undefined) {\n return this.connector.delete('resource.item', null, { id }).then(() => {\n this._cleanResourceItemCache(id);\n return undefined;\n });\n }\n });\n }\n\n private _getChildrenOf(\n parent: ResourceDefinition,\n requestOptions?: GetChildrenOfOptions,\n _items: ResourceItem[] = [],\n ): Promise<ResourceItem[]> {\n return this.connector\n .get('resource.collection', requestOptions, {\n parent,\n })\n .then((items) => {\n const recursivePromises = [];\n for (const item of items) {\n if (requestOptions?.cache) {\n this.cache.add('resource.item', Promise.resolve(item), {\n id: item.resource.id,\n });\n }\n _items.push(item);\n if (requestOptions?.recursive && item.resource.children) {\n recursivePromises.push(\n this._getChildrenOf(item.resource.id, requestOptions, _items),\n );\n }\n }\n if (recursivePromises.length) {\n return Promise.all(recursivePromises).then(() => {\n return _items;\n });\n }\n return _items;\n });\n }\n\n private async _cleanResourceItemCache(id: number) {\n const all = this.cache.all();\n const toDelete: typeof all = [];\n for (const c of all) {\n const cid = c.props?.id;\n if (['resource.item', 'resource'].includes(c.key) && cid !== undefined) {\n if (typeof cid === 'number') {\n if (cid === id) {\n toDelete.push(c);\n }\n } else {\n const rid = await this.getId(cid);\n if (rid === id) {\n toDelete.push(c);\n }\n }\n }\n }\n for (const d of toDelete) {\n this.cache.delete(d);\n }\n }\n\n private _fetchResourceById(\n id: number,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.connector.get('resource.item', requestOptions, { id });\n }\n\n private _fetchResourceBy(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.getMany(resource, requestOptions).then((resources) => {\n return resources[0];\n });\n }\n\n private _resourceCacheFilter(\n resource: DeepPartial<Resource>,\n ): Promise<ResourceItem[]> {\n return Promise.all(this.cache.matchAll('resource.item')).then(\n (resources) => {\n const items: ResourceItem[] = [];\n resources.filter((x) => {\n if (x) {\n // identical by uniq props\n if (resource.keyname && x.resource.keyname) {\n return resource.keyname === x.resource.keyname;\n }\n if (defined(resource.id) && defined(x.resource.id)) {\n return resource.id === x.resource.id;\n }\n return resourceCompare(resource, x.resource);\n }\n });\n return items;\n },\n );\n }\n}\n","import { objectDeepEqual } from '@nextgis/utils';\n\nimport type { NgwConnector } from './NgwConnector';\nimport type { NgwConnectorOptions } from './interfaces';\n\nexport const CONNECTORS: NgwConnector[] = [];\n\nexport function addConnector(connector: NgwConnector): void {\n CONNECTORS.push(connector);\n}\n\nexport function findConnector(\n options: NgwConnectorOptions,\n): NgwConnector | undefined {\n return CONNECTORS.find((x) => {\n if (x.options.baseUrl === options.baseUrl) {\n if (options.auth) {\n if (x.options.auth) {\n return objectDeepEqual(x.options.auth, options.auth);\n }\n } else {\n // if auth not in find options; use first connector with same url\n return true;\n }\n }\n });\n}\n\nexport function removeConnector(connector: NgwConnector): void {\n const index = CONNECTORS.indexOf(connector);\n if (index !== -1) {\n CONNECTORS.splice(index, 1);\n }\n}\n\nexport function findAndRemoveConnector(options: NgwConnectorOptions): void {\n const exist = findConnector(options);\n if (exist) {\n removeConnector(exist);\n }\n}\n","export class AbortError extends Error {\n constructor(message = 'AbortError') {\n super(message);\n this.name = 'AbortError';\n }\n}\n","import { NgwError } from './NgwError';\n\nimport type { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when ...\n */\nexport class InsufficientPermissionsError extends NgwError {\n name = 'InsufficientPermissionsError';\n exception: NgwExceptions =\n 'nextgisweb.core.exception.InsufficientPermissions';\n\n constructor(obj: InsufficientPermissionsError) {\n super(obj);\n Object.setPrototypeOf(this, InsufficientPermissionsError.prototype);\n }\n}\n","// https://github.com/Leaflet/Leaflet/blob/b507e21c510b53cd704fb8d3f89bb46ea925c8eb/src/core/Util.js#L165\nconst templateRe = /\\{ *([\\w_-]+) *\\}/g;\n\nexport function template(str: string, data: { [param: string]: any }): string {\n return str.replace(templateRe, (s, key) => {\n let value = data[key];\n\n if (value === undefined) {\n throw new Error('No value provided for letiable ' + s);\n } else if (typeof value === 'function') {\n value = value(data);\n }\n return value;\n });\n}\n","import { template } from './template';\n\nimport type { NgwConnector } from '../NgwConnector';\nimport type {\n RequestItemKeys,\n RequestItemsParams,\n RequestOptions,\n} from '../interfaces';\nimport type { RequestItemsParamsMap } from '../types/RequestItemsParamsMap';\n\ninterface ApiRequestOptions<K extends keyof RequestItemsParamsMap> {\n name: string;\n connector: NgwConnector;\n params: RequestItemsParams<K>;\n requestOptions: RequestOptions;\n}\n\nexport async function apiRequest<\n K extends keyof RequestItemsParamsMap,\n P extends RequestItemKeys = RequestItemKeys,\n>(opt: ApiRequestOptions<K>): Promise<P[K]> {\n const { params, name, connector, requestOptions } = opt;\n\n const apiItems = await connector.connect();\n let apiItem = apiItems && apiItems[name];\n\n if (apiItem) {\n apiItem = [...apiItem];\n let url = apiItem.shift(); // Extract the base URL\n\n if (apiItem.length) {\n const replaceParams: { [num: number]: string } = {};\n\n // Prepare URL template parameters described in apiItem\n for (let fry = 0; fry < apiItem.length; fry++) {\n const arg = apiItem[fry];\n replaceParams[fry] = `{${arg}}`;\n\n // Check if each required by apiItem parameter is provided in params\n if (params[arg] === undefined) {\n throw new Error(`\\`${arg}\\` URL API argument is not specified`);\n }\n }\n\n // Replace URL template parameters with actual values\n if (url) {\n url = template(url, replaceParams);\n }\n }\n\n if (params) {\n const paramArray: string[] = [];\n const paramList = params.paramList;\n\n // Handle paramList if present: transform it into query string format\n if (Array.isArray(paramList)) {\n paramList.forEach(([key, value]) => {\n paramArray.push(`${key}=${value}`);\n });\n }\n\n // Append other parameters to the URL, excluding those already used in the template\n for (const p in params) {\n if (apiItem.indexOf(p) === -1) {\n paramArray.push(`${p}=${params[p]}`);\n }\n }\n\n // If there are any query parameters, append them to the URL\n if (paramArray.length) {\n url = `${url}?${paramArray.join('&')}`;\n }\n }\n\n if (url) {\n return connector.makeQuery(url, params, {\n cacheName: name,\n ...requestOptions,\n });\n } else {\n throw new Error('Request URL is not set');\n }\n } else {\n // Return undefined if API item is not found\n return undefined as P[K];\n }\n}\n","import { isObject } from '@nextgis/utils';\n\nexport function isError(error: unknown): error is Error {\n if (isObject(error)) {\n return error.status_code && error.exception && error.title;\n }\n return false;\n}\n","import { NetworkError } from '../errors/NetworkError';\nimport { NgwError } from '../errors/NgwError';\nimport { isError } from '../errors/isError';\n\nimport { isObject } from './isObject';\n\nimport type {\n RequestOptions as NgwRequestOptions,\n RequestMethods,\n} from '../interfaces';\n\n// readyState\n// Holds the status of the XMLHttpRequest.\n// 0: request not initialized\n// 1: server connection established\n// 2: request received\n// 3: processing request\n// 4: request finished and response is ready\n\n// status\n// 200: \"OK\"\n// 201 \"Created\"\tThe request has been fulfilled, and a new resource is created\n// 403: \"Forbidden\"\n// 404: \"Page not found\"\n// 500: \"Internal Server Error\"\n// For a complete list go to the Http Messages Reference\n\ntype LoadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions<RequestMethods> | undefined,\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n) => void;\n\nlet loadData: LoadData;\n// @ts-ignore\nif (__BROWSER__) {\n loadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions = {},\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n ): void => {\n options.method = options.method || 'GET';\n\n const xhr = new XMLHttpRequest();\n xhr.open(options.method || 'GET', url, true); // true for asynchronous\n\n if (options.responseType === 'blob') {\n xhr.responseType = options.responseType;\n }\n const getResponseText = () => {\n try {\n return JSON.parse(xhr.responseText);\n } catch (er) {\n return xhr.responseText;\n }\n };\n const processingResponse = (forError = false) => {\n const cb = forError ? error : callback;\n if (options.responseType === 'blob') {\n cb(xhr.response);\n } else {\n if (xhr.responseText) {\n cb(getResponseText());\n } else {\n error({ message: '' });\n }\n }\n };\n xhr.onload = () => {\n if ([401, 403, 404, 422, 500].indexOf(xhr.status) !== -1) {\n error(new NgwError(getResponseText()));\n }\n processingResponse();\n };\n\n // xhr.onreadystatechange = () => {\n // if (\n // (xhr.readyState === 4 && xhr.status === 200) ||\n // (xhr.readyState === 3 && xhr.status === 201)\n // ) {\n // processingResponse();\n // } else if (xhr.readyState === 3 && xhr.status === 400) {\n // processingResponse();\n // } else if (xhr.readyState === 4 && xhr.status === 500) {\n // processingResponse();\n // } else if (xhr.readyState === 4 && xhr.status === 401) {\n // error(xhr.statusText);\n // } else if (xhr.readyState === 4) {\n // error('request error');\n // }\n // };\n\n xhr.onerror = (er) => {\n if (xhr.status === 0) {\n error(new NetworkError(url));\n } else {\n error(er);\n }\n };\n\n xhr.upload.onprogress = function (e) {\n if (e.lengthComputable) {\n const percentComplete = (e.loaded / e.total) * 100;\n if (options.onProgress) {\n options.onProgress(percentComplete, e);\n }\n // console.log(percentComplete + '% uploaded');\n }\n };\n\n const headers = options.headers;\n if (headers) {\n for (const h in headers) {\n const header = headers[h];\n if (typeof header === 'string') {\n xhr.setRequestHeader(h, header);\n }\n }\n }\n if (options.withCredentials !== undefined) {\n xhr.withCredentials = options.withCredentials;\n }\n\n let data: FormData | any;\n if (options.file) {\n data = new FormData();\n data.append('file', options.file);\n if (options.data) {\n for (const d in options.data) {\n data.append(d, data[d]);\n }\n }\n } else {\n data = options.data\n ? typeof options.data === 'string'\n ? options.data\n : JSON.stringify(options.data)\n : null;\n }\n if (onCancel) {\n onCancel(() => {\n xhr.abort();\n });\n }\n xhr.send(data);\n };\n} else {\n const url = require('url');\n const http = require('http');\n const https = require('https');\n const FormData = require('form-data');\n\n const adapterFor = (inputUrl: string) => {\n const adapters: Record<string, any> = {\n 'http:': http,\n 'https:': https,\n };\n const protocol = url.parse(inputUrl).protocol || 'https:';\n return adapters[protocol];\n };\n\n loadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions<RequestMethods> = {},\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n ): Promise<unknown> => {\n const { file, headers, method, data, responseType } = options;\n\n const request = new Promise((resolve, reject) => {\n const adapter = adapterFor(url);\n if (adapter) {\n const requestOpt = {\n headers: headers || {},\n method,\n };\n const body = typeof data === 'string' ? data : JSON.stringify(data);\n // https://stackoverflow.com/questions/35589109/node-http-delete-request-no-longer-works-after-upgrading-from-0-10-40\n let form;\n let uploadedFile = file;\n if (file) {\n const fileMeta = {};\n if (\n isObject(file) &&\n 'file' in file &&\n ('filename' in file || 'name' in file)\n ) {\n const {\n file: file_,\n name,\n ...fileMeta_\n } = file as Record<string, any>;\n if (name && !fileMeta_.filename) {\n fileMeta_.filename = name;\n }\n Object.assign(fileMeta, fileMeta_);\n uploadedFile = file_ as File;\n }\n form = new FormData();\n form.append('file', uploadedFile, fileMeta);\n if (data) {\n for (const d in data) {\n form.append(d, data[d]);\n }\n }\n Object.assign(requestOpt.headers, {\n // 'content-length': form.getLengthSync(),\n ...form.getHeaders(),\n });\n }\n\n if (body !== undefined) {\n Object.assign(requestOpt.headers, {\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(body),\n });\n }\n const req = adapter.request(url, requestOpt, (resp: any) => {\n let data = '';\n resp.on('data', (chunk: any) => {\n data += chunk;\n });\n resp.on('end', () => {\n if (data) {\n if (responseType === 'blob') {\n resolve(data);\n } else {\n let json: Record<string, any> | undefined;\n try {\n json = JSON.parse(data);\n if (json && json.status_code && json.status_code) {\n reject(json.message);\n }\n } catch (er) {\n reject(er);\n }\n if (json !== undefined) {\n if (isError(json)) {\n reject('extractError(json)');\n } else {\n resolve(json);\n }\n }\n }\n }\n reject('no data');\n });\n });\n if (form) {\n form.pipe(req);\n }\n req.on('error', (err: any) => {\n reject(err);\n });\n if (body) {\n req.write(body);\n }\n onCancel(() => {\n req.abort();\n });\n req.end();\n } else {\n throw new Error(`Given URL '${url}' is not correct`);\n }\n });\n return request\n .then((data) => {\n if (callback) {\n callback(data);\n }\n return data;\n })\n .catch((er) => {\n if (error) {\n error(er);\n } else {\n throw new Error(er);\n }\n });\n };\n}\n\nexport { loadData };\n","import { EventEmitter } from 'events';\n\nimport Cache from '@nextgis/cache';\nimport { objectRemoveEmpty } from '@nextgis/utils';\nimport { fixUrlStr } from '@nextgis/utils';\n\nimport { ResourcesControl } from './ResourcesControl';\nimport {\n addConnector,\n findConnector,\n removeConnector,\n} from './activeConnectors';\nimport { AbortError } from './errors/AbortError';\nimport { InsufficientPermissionsError } from './errors/InsufficientPermissionsError';\nimport { NgwError } from './errors/NgwError';\nimport { ResourceNotFoundError } from './errors/ResourceNotFoundError';\nimport { apiRequest } from './utils/apiRequest';\nimport { loadData } from './utils/loadData';\nimport { template } from './utils/template';\n\nimport type {\n Credentials,\n DeleteRequestItemsResponseMap,\n GetChildrenOfOptions,\n GetRequestItemsResponseMap,\n NgwConnectorOptions,\n Params,\n PatchRequestItemsResponseMap,\n PostRequestItemsResponseMap,\n PutRequestItemsResponseMap,\n PyramidRoute,\n RequestHeaders,\n RequestItemKeys,\n RequestItemsParams,\n RequestOptions,\n RequestTransformFunction,\n ResourceDefinition,\n ResourceIdKeynameDef,\n UserInfo,\n} from './interfaces';\nimport type { RequestItemsParamsMap } from './types/RequestItemsParamsMap';\nimport type { Resource, ResourceItem } from './types/ResourceItem';\nimport type { DeepPartial } from '@nextgis/utils';\n\nlet ID = 0;\nlet REQUEST_ID = 0;\n\nexport class NgwConnector {\n static errors = {\n NgwError,\n ResourceNotFoundError,\n };\n id = ID++;\n emitter = new EventEmitter();\n user?: UserInfo;\n resources!: ResourcesControl;\n cache: Cache;\n private routeStr = '/api/component/pyramid/route';\n private activeRequests: {\n [requestId: number]: AbortController;\n } = {};\n private requestTransform?: RequestTransformFunction | null;\n\n constructor(public options: NgwConnectorOptions) {\n const exist = findConnector(options);\n this.cache = new Cache({ namespace: options.cacheId });\n if (exist) {\n return exist;\n } else {\n if (this.options.route) {\n this.routeStr = this.options.route;\n }\n if (this.options.requestTransform) {\n this.requestTransform = this.options.requestTransform;\n }\n this.resources = new ResourcesControl({\n connector: this,\n cacheId: options.cacheId,\n });\n addConnector(this);\n }\n }\n\n static create(options: NgwConnectorOptions): NgwConnector {\n return new this(options);\n }\n\n /**\n * Clear the cache.\n */\n clearCache(): void {\n this.cache.clean();\n this.resources.cache.clean();\n }\n\n setRequestTransform(\n requestTransform: RequestTransformFunction | undefined | null,\n ) {\n this.requestTransform = requestTransform;\n }\n\n /**\n * Fast way to specify the connection address to NextGIS Web.\n * The current connection will be severed.\n * @param baseUrl - NGW url\n */\n setNgw(baseUrl: string): void {\n this.logout();\n this.options.baseUrl = baseUrl;\n addConnector(this);\n }\n\n /**\n * Establishing a connection with NextGIS Web to fulfill all other requests.\n * @remarks\n * This method need not be called manually as it is used when forming a request in {@link apiRequest | apiRequest}.\n * Can be used to check connection.\n * @example\n * ```javascript\n * const connector = new NgwConnector({baseUrl: 'https://demo.nextgis.com'});\n * connector.connect()\n * .then(() => console.log('Ok'))\n * .catch((er) => console.log('Connection problem', er));\n * ```\n */\n async connect(): Promise<PyramidRoute> {\n const auth = this.options.auth;\n\n if (auth) {\n const { login, password } = auth;\n if (login && password) {\n await this._login({ login, password });\n }\n }\n return await this.makeQuery<PyramidRoute>(\n this.routeStr,\n {},\n {\n cacheName: 'route',\n cache: true,\n cacheProps: {\n id: this.id,\n auth,\n baseUrl: this.options.baseUrl,\n },\n },\n );\n }\n\n /**\n * Quick way to change NextGIS Web user.\n * @param credentials - New user credentials\n */\n login(credentials: Credentials, options?: RequestOptions): Promise<UserInfo> {\n this.logout();\n addConnector(this);\n return this._login(credentials, options);\n }\n\n /**\n * Disconnecting a user. Aborting all current requests\n */\n logout(): void {\n this.abort();\n removeConnector(this);\n this.options.auth = undefined;\n this.user = undefined;\n this.clearCache();\n this.emitter.emit('logout');\n }\n\n async getUserInfo(\n credentials?: Credentials,\n options?: RequestOptions,\n ): Promise<UserInfo> {\n if (this.user && this.user.id) {\n return this.user;\n }\n if (credentials) {\n this.options.auth = credentials;\n }\n const options_: RequestOptions = {\n headers: this.getAuthorizationHeaders(credentials),\n ...options,\n };\n\n // Do not use apiRequest('auth.current_user') to avoid circular-references\n return this.makeQuery<UserInfo>(\n '/api/component/auth/current_user',\n {},\n options_,\n );\n }\n\n /**\n * Obtaining the required Headers for authentication of requests in the NGW.\n */\n getAuthorizationHeaders(\n credentials?: Credentials,\n ): RequestHeaders | undefined {\n const client = this.makeClientId(credentials);\n if (client) {\n return {\n Authorization: `Basic ${client}`,\n };\n }\n }\n\n makeClientId(credentials?: Credentials): string | undefined {\n credentials = credentials || this.options.auth;\n if (credentials) {\n const { login, password } = credentials;\n const str = `${login}:${password}`;\n const encodedStr = encodeURIComponent(str);\n\n if (__BROWSER__) {\n return window.btoa(encodedStr);\n } else {\n return Buffer.from(encodedStr).toString('base64');\n }\n }\n }\n\n /** Stop all api requests */\n abort() {\n for (const abortController of Object.values(this.activeRequests)) {\n abortController.abort();\n }\n this.activeRequests = {};\n }\n\n getActiveApiRequests() {\n return { ...this.activeRequests };\n }\n\n /**\n * Send request to NGW api router.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param params - Request item params or query params\n * @param requestOptions - Request options\n *\n * @example\n * ```javascript\n *\n * // there is such an NGW route item\n * // \"feature_layer.feature.item\": [\n * // \"/api/resource/{0}/feature/{1}\",\n * // \"id\",\n * // \"fid\"\n * // ],\n *\n * const connector = new NgwConnector({ baseUrl: 'https://example.nextgis.com' });\n * connector.apiRequest('feature_layer.feature.item', {\n * // request params for {0} and {1}\n * 'id': 2011,\n * 'fid': 101,\n * // query params\n * 'srs': 4326,\n * 'geom_format': 'geojson',\n * }, { method: 'GET' });\n * // send get-request to 'https://example.nextgis.com/api/resource/2011/feature/101?srs=4326&geom_format=geojson'\n *\n * ```\n */\n apiRequest<\n K extends keyof RequestItemsParamsMap,\n P extends RequestItemKeys = RequestItemKeys,\n >(\n name: K,\n params_: RequestItemsParams<K> = {},\n requestOptions: RequestOptions = {},\n ): Promise<P[K]> {\n params_ = requestOptions.params ?? params_;\n const params = objectRemoveEmpty(params_);\n return apiRequest({ name, params, requestOptions, connector: this });\n }\n\n /**\n * Shortcut method for send POST request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n *\n * @example\n * ```javascript\n * connector.post('resource.collection', { data: POST_PAYLOAD })\n * .then((newResource) => console.log(newResource))\n * .catch((error) => console.warn(error));\n * ```\n */\n post<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'POST', K>,\n params?: RequestItemsParams<K>,\n ): Promise<PostRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'POST';\n return this.apiRequest<K, PostRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send GET request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n get<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'GET', K> | undefined | null,\n params?: RequestItemsParams<K>,\n ): Promise<GetRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'GET';\n return this.apiRequest<K, GetRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send PATCH request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n patch<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'PATCH', K>,\n params?: RequestItemsParams<K>,\n ): Promise<PatchRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'PATCH';\n return this.apiRequest<K, PatchRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send PUT request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n put<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'PUT', K>,\n params?: RequestItemsParams<K>,\n ): Promise<PutRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'PUT';\n return this.apiRequest<K, PutRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send DELETE request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n delete<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'DELETE', K> | undefined | null,\n params?: RequestItemsParams<K>,\n ): Promise<DeleteRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'DELETE';\n return this.apiRequest<K, DeleteRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Send request to NGW.\n * @param url - URL address to NGW\n * @param params - Query params\n * @param options - Request options\n */\n async makeQuery<R = unknown>(\n url: string,\n params?: Params | null,\n options: RequestOptions = {},\n ): Promise<R> {\n url = (this.options.baseUrl ? this.options.baseUrl : '') + url;\n if (!url) {\n throw new Error('Empty `url` not allowed');\n }\n\n if (params) {\n const { paramList, ...restParams } = params;\n url = template(url, restParams);\n }\n url = encodeURI(fixUrlStr(url));\n\n const {\n cache,\n signal: externalSignal,\n method = 'GET',\n headers,\n cacheName,\n cacheProps,\n responseType,\n withCredentials,\n } = options;\n\n const internalAbortController = new AbortController();\n const internalSignal = internalAbortController.signal;\n\n // If the external signal aborts, also abort the internal signal\n if (externalSignal) {\n if (externalSignal.aborted) {\n throw new AbortError();\n }\n externalSignal.addEventListener('abort', () => {\n internalAbortController.abort();\n });\n }\n\n options.signal = internalSignal;\n\n const createPromise = async () => {\n const id = REQUEST_ID++;\n this.activeRequests[id] = internalAbortController;\n try {\n return this._loadData<R>(url, options);\n } finally {\n this._cleanActiveRequest(id);\n }\n };\n\n if (cache && method === 'GET') {\n const cacheOptions = cacheProps\n ? cacheProps\n : {\n ...objectRemoveEmpty({\n headers,\n withCredentials,\n responseType,\n baseUrl: this.options.baseUrl,\n userId: this.user?.id,\n }),\n params,\n };\n return this.cache.add(\n cacheName || url,\n createPromise,\n cacheOptions,\n false,\n );\n }\n\n return createPromise();\n }\n\n // -------------------------------------------------------------------------\n // Resource Methods\n // -------------------------------------------------------------------------\n\n /**\n * {@link ResourcesControl.getOne}\n */\n getResource(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.resources.getOne(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getOneOrFail}\n */\n getResourceOrFail(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem> {\n return this.resources.getOneOrFail(resource, requestOptions);\n }\n\n /**\n * @deprecated - use {@link getResource}\n */\n getResourceBy(\n resource: DeepPartial<Resource>,\n ): Promise<ResourceItem | undefined> {\n return this.resources.getOne(resource);\n }\n\n /**\n * @deprecated - use {@link getResource}\n */\n getResourceByKeyname(keyname: string): Promise<ResourceItem | undefined> {\n return this.resources.getOne(keyname);\n }\n\n /**\n * @deprecated - use {@link getResource}\n */\n getResourceById(id: number): Promise<ResourceItem | undefined> {\n return this.resources.getOne(id);\n }\n\n /**\n * {@link ResourcesControl.getId}\n */\n getResourceId(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<number | undefined> {\n return this.resources.getId(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getIdOrFail}\n */\n getResourceIdOrFail(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<number> {\n return this.resources.getIdOrFail(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getMany}\n */\n getResourcesBy(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem[]> {\n return this.resources.getMany(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getParent}\n */\n getResourceParent(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.resources.getParent(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getChildrenOf}\n */\n getResourceChildren(\n resource: ResourceDefinition,\n requestOptions?: GetChildrenOfOptions,\n ): Promise<ResourceItem[]> {\n return this.resources.getChildrenOf(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.update}\n */\n updateResource(\n resource: ResourceIdKeynameDef,\n data: DeepPartial<ResourceItem>,\n ): Promise<ResourceItem | undefined> {\n return this.resources.update(resource, data);\n }\n\n /**\n * {@link ResourcesControl.delete}\n */\n deleteResource(resource: ResourceIdKeynameDef): Promise<void> {\n return this.resources.delete(resource);\n }\n\n /**\n * @internal\n */\n protected _loadData<R = unknown>(\n url: string,\n options: RequestOptions,\n ): Promise<R> {\n options.responseType = options.responseType || 'json';\n\n return new Promise<R>((resolve, reject) => {\n if (this.user) {\n options = options || {};\n options.headers = {\n ...this.getAuthorizationHeaders(),\n ...options.headers,\n };\n }\n\n if (this.requestTransform) {\n const [transUrl, transOptions] = this.requestTransform(url, options);\n url = transUrl;\n options = transOptions;\n }\n\n let runOnAbort: (() => void) | undefined = undefined;\n\n loadData(url, resolve, options, reject, (handler: () => void) => {\n runOnAbort = handler;\n });\n\n options.signal?.addEventListener('abort', () => {\n if (runOnAbort !== undefined) {\n runOnAbort();\n }\n reject(new AbortError());\n });\n }).catch((httpError) => {\n if (httpError.name !== 'AbortError') {\n if (__DEV__) {\n console.warn('DEV WARN', httpError);\n }\n const er = this._handleHttpError(httpError);\n if (er) {\n throw er;\n }\n }\n throw httpError;\n });\n }\n\n private async _login(\n credentials: Credentials,\n options?: RequestOptions,\n ): Promise<UserInfo> {\n try {\n const data = await this.getUserInfo(credentials, options);\n this.user = data;\n this.emitter.emit('login', data);\n return data;\n } catch (er) {\n this.emitter.emit('login:error', er);\n throw er;\n }\n }\n\n private _cleanActiveRequest(requestId: number) {\n delete this.activeRequests[requestId];\n }\n\n private _handleHttpError(er: Error) {\n if (er) {\n if (er instanceof NgwError) {\n if (er.exception === 'nextgisweb.resource.exception.ResourceNotFound') {\n throw new ResourceNotFoundError(er);\n } else if (\n er.exception === 'nextgisweb.core.exception.InsufficientPermissions'\n ) {\n throw new InsufficientPermissionsError(er);\n }\n }\n }\n return er;\n }\n}\n"],"names":["__publicField","objectDeepEqual","defined","isObject","FormData","url","data","EventEmitter","objectRemoveEmpty","fixUrlStr"],"mappings":"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"}
1
+ {"version":3,"file":"ngw-connector.cjs.js","sources":["../src/errors/NgwError.ts","../src/errors/ResourceNotFoundError.ts","../src/utils/isObject.ts","../src/utils/resourceCompare.ts","../src/utils/resourceToQuery.ts","../src/ResourcesControl.ts","../src/activeConnectors.ts","../src/errors/AbortError.ts","../src/errors/InsufficientPermissionsError.ts","../src/utils/template.ts","../src/utils/apiRequest.ts","../src/errors/isError.ts","../src/utils/loadData.ts","../src/NgwConnector.ts"],"sourcesContent":["import type { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when...\n */\nexport class NgwError extends Error {\n name = 'NgwError';\n\n title!: string;\n message!: string;\n detail!: string;\n exception!: NgwExceptions;\n status_code!: number | 404 | 500;\n data?: Record<string, any>;\n guru_meditation!: string;\n\n constructor(er?: Partial<NgwError>) {\n super();\n Object.assign(this, er);\n Object.setPrototypeOf(this, NgwError.prototype);\n }\n}\n","import { NgwError } from './NgwError';\n\nimport type { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when ...\n */\nexport class ResourceNotFoundError extends NgwError {\n name = 'ResourceNotFoundError';\n exception: NgwExceptions = 'nextgisweb.resource.exception.ResourceNotFound';\n\n constructor(obj?: ResourceNotFoundError) {\n super(obj);\n Object.setPrototypeOf(this, ResourceNotFoundError.prototype);\n }\n}\n","export function isObject(val: unknown): val is Record<string | number, any> {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n","import { objectDeepEqual } from '@nextgis/utils';\n\nimport type { Resource } from '../types/ResourceItem';\nimport type { DeepPartial } from '@nextgis/utils';\n\nexport function resourceCompare(\n res1: DeepPartial<Resource>,\n res2: DeepPartial<Resource>,\n): boolean {\n return objectDeepEqual(res1, res2);\n}\n","import { defined } from '@nextgis/utils';\n\nimport { isObject } from './isObject';\n\nimport type { Resource } from '../types/ResourceItem';\nimport type { DeepPartial } from '@nextgis/utils';\n\nconst exclude = ['description'];\n\n/**\n * @remarks\n * https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#search-resources\n *\n * ```\n * { keyname, owner_user: { id }} > { keyname, owner_user__id }\n * ```\n *\n * @param resource - Any property from NGW resource item\n */\nexport function resourceToQuery(\n resource: DeepPartial<Resource>,\n prefix = '',\n): Record<string, unknown> {\n prefix = prefix ? prefix + '__' : '';\n const query: Record<string, any> = {};\n for (const [key, value] of Object.entries(resource)) {\n if (exclude.indexOf(key) === -1) {\n if (isObject(value)) {\n if (key === 'owner_user') {\n const children = resourceToQuery(value as DeepPartial<Resource>, key);\n Object.assign(query, children);\n } else if (key === 'parent' && 'id' in value) {\n query.parent_id = value.id;\n }\n } else if (defined(value)) {\n query[prefix + key] = value;\n }\n }\n }\n return query;\n}\n","import Cache from '@nextgis/cache';\nimport { defined } from '@nextgis/utils';\n\nimport { ResourceNotFoundError } from './errors/ResourceNotFoundError';\nimport { isObject } from './utils/isObject';\nimport { resourceCompare } from './utils/resourceCompare';\nimport { resourceToQuery } from './utils/resourceToQuery';\n\nimport type { NgwConnector } from './NgwConnector';\nimport type {\n GetChildrenOfOptions,\n RequestOptions,\n ResourceDefinition,\n} from './interfaces';\nimport type { Resource, ResourceItem } from './types/ResourceItem';\nimport type { DeepPartial } from '@nextgis/utils';\n\nexport class ResourcesControl {\n cache: Cache<Promise<ResourceItem | undefined>, { id?: number | string }>;\n connector: NgwConnector;\n\n constructor({\n connector,\n cacheId,\n }: {\n connector: NgwConnector;\n cacheId?: string;\n }) {\n this.connector = connector;\n this.cache = new Cache({ namespace: cacheId });\n }\n\n // -------------------------------------------------------------------------\n // Resource Methods\n // -------------------------------------------------------------------------\n\n /**\n * Receive resource from NGW by id, keyname or search-object parameter.\n * @param resource - Resource id, keyname or search-object\n *\n * @remarks\n * Fetching resource would be cached to speed up next call\n */\n getOne(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n const forCache: { keyname?: string; display_name?: string; id?: number } =\n {};\n const opt = { ...requestOptions };\n if (typeof resource === 'string') {\n forCache.keyname = resource;\n } else if (typeof resource === 'number') {\n forCache.id = resource;\n } else if (isObject(resource)) {\n if (resource.id !== undefined) {\n forCache.id = resource.id;\n } else {\n if (resource.keyname) {\n forCache.keyname = resource.keyname;\n }\n if (resource.display_name) {\n forCache.display_name = resource.display_name;\n }\n }\n }\n\n if (typeof resource === 'string') {\n return this._fetchResourceBy({ keyname: resource }, opt);\n } else if (typeof resource === 'number') {\n return this._fetchResourceById(resource, opt);\n } else if (isObject(resource)) {\n return this._fetchResourceBy(resource, opt);\n }\n return Promise.resolve(undefined);\n }\n\n getOneOrFail(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem> {\n return this.getOne(resource, requestOptions).then((res) => {\n if (res) {\n return res;\n }\n throw new ResourceNotFoundError();\n });\n }\n\n /**\n * A fast way to retrieve resource ID for any resource definition.\n * @param resource - Any available resource definition\n *\n * @remarks\n * There are situations when exactly the resource id is needed\n * (for example, to compose the correct request to the api)\n * then this method will come in handy to facilitate the extraction of the identifier\n * if the resource is specified through a keyname or other parameters.\n */\n getId(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<number | undefined> {\n if (typeof resource === 'number') {\n return Promise.resolve(resource);\n } else if (typeof resource === 'string' || isObject(resource)) {\n return this.getOne(resource, requestOptions).then((res) => {\n if (res) {\n return res.resource.id;\n }\n });\n }\n return Promise.resolve(undefined);\n }\n\n /**\n * A fast way to retrieve resource ID for any resource definition.\n * @param resource - Any available resource definition\n *\n * @remarks\n * Similar with {@link NgwConnector.getResourceId | getResourceId} but rise error if resource is not exist.\n * To not make one more checks if the resource is definitely exists\n */\n getIdOrFail(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<number> {\n return this.getId(resource, requestOptions).then((resp) => {\n if (resp === undefined) {\n throw new Error();\n }\n return resp;\n });\n }\n\n getMany(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem[]> {\n return this._resourceCacheFilter(resource).then((items) => {\n if (!items.length) {\n const query: Record<string, unknown> = {};\n if (resource.keyname) {\n query.keyname = resource.keyname;\n } else {\n Object.assign(query, resourceToQuery(resource));\n }\n return this.connector\n .get('resource.search', requestOptions, {\n serialization: 'full',\n ...query,\n })\n .then((resources) => {\n if (requestOptions?.cache && resources) {\n for (const x of resources) {\n this.cache.add('resource.item', Promise.resolve(x), {\n id: x.resource.id,\n });\n }\n }\n return resources;\n });\n }\n return items;\n });\n }\n\n getParent(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.getOne(resource, requestOptions).then((child) => {\n if (child) {\n return this.getOne(child.resource.parent.id, requestOptions);\n }\n return Promise.resolve(undefined);\n });\n }\n\n getChildrenOf(\n resource: ResourceDefinition,\n requestOptions?: GetChildrenOfOptions,\n ): Promise<ResourceItem[]> {\n return this.getIdOrFail(resource).then((parent) =>\n this._getChildrenOf(parent, requestOptions),\n );\n }\n\n update(\n resource: ResourceDefinition,\n data: DeepPartial<ResourceItem>,\n ): Promise<ResourceItem | undefined> {\n return this.getId(resource).then((id) => {\n if (id !== undefined) {\n return this.connector.put('resource.item', { data }, { id });\n }\n });\n }\n\n /**\n * Fast way to delete resource from NGW and clean cache.\n * @param resource - Resource definition\n */\n delete(resource: ResourceDefinition): Promise<void> {\n return this.getId(resource).then((id) => {\n if (id !== undefined) {\n return this.connector.delete('resource.item', null, { id }).then(() => {\n this._cleanResourceItemCache(id);\n return undefined;\n });\n }\n });\n }\n\n private _getChildrenOf(\n parent: ResourceDefinition,\n requestOptions?: GetChildrenOfOptions,\n _items: ResourceItem[] = [],\n ): Promise<ResourceItem[]> {\n return this.connector\n .get('resource.collection', requestOptions, {\n parent,\n })\n .then((items) => {\n const recursivePromises = [];\n for (const item of items) {\n if (requestOptions?.cache) {\n this.cache.add('resource.item', Promise.resolve(item), {\n id: item.resource.id,\n });\n }\n _items.push(item);\n if (requestOptions?.recursive && item.resource.children) {\n recursivePromises.push(\n this._getChildrenOf(item.resource.id, requestOptions, _items),\n );\n }\n }\n if (recursivePromises.length) {\n return Promise.all(recursivePromises).then(() => {\n return _items;\n });\n }\n return _items;\n });\n }\n\n private async _cleanResourceItemCache(id: number) {\n const all = this.cache.all();\n const toDelete: typeof all = [];\n for (const c of all) {\n const cid = c.props?.id;\n if (['resource.item', 'resource'].includes(c.key) && cid !== undefined) {\n if (typeof cid === 'number') {\n if (cid === id) {\n toDelete.push(c);\n }\n } else {\n const rid = await this.getId(cid);\n if (rid === id) {\n toDelete.push(c);\n }\n }\n }\n }\n for (const d of toDelete) {\n this.cache.delete(d);\n }\n }\n\n private _fetchResourceById(\n id: number,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.connector.get('resource.item', requestOptions, { id });\n }\n\n private _fetchResourceBy(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.getMany(resource, requestOptions).then((resources) => {\n return resources[0];\n });\n }\n\n private _resourceCacheFilter(\n resource: DeepPartial<Resource>,\n ): Promise<ResourceItem[]> {\n return Promise.all(this.cache.matchAll('resource.item')).then(\n (resources) => {\n const items: ResourceItem[] = [];\n resources.filter((x) => {\n if (x) {\n // identical by uniq props\n if (resource.keyname && x.resource.keyname) {\n return resource.keyname === x.resource.keyname;\n }\n if (defined(resource.id) && defined(x.resource.id)) {\n return resource.id === x.resource.id;\n }\n return resourceCompare(resource, x.resource);\n }\n });\n return items;\n },\n );\n }\n}\n","import { objectDeepEqual } from '@nextgis/utils';\n\nimport type { NgwConnector } from './NgwConnector';\nimport type { NgwConnectorOptions } from './interfaces';\n\nexport const CONNECTORS: NgwConnector[] = [];\n\nexport function addConnector(connector: NgwConnector): void {\n CONNECTORS.push(connector);\n}\n\nexport function findConnector(\n options: NgwConnectorOptions,\n): NgwConnector | undefined {\n return CONNECTORS.find((x) => {\n if (x.options.baseUrl === options.baseUrl) {\n if (options.auth) {\n if (x.options.auth) {\n return objectDeepEqual(x.options.auth, options.auth);\n }\n } else {\n // if auth not in find options; use first connector with same url\n return true;\n }\n }\n });\n}\n\nexport function removeConnector(connector: NgwConnector): void {\n const index = CONNECTORS.indexOf(connector);\n if (index !== -1) {\n CONNECTORS.splice(index, 1);\n }\n}\n\nexport function findAndRemoveConnector(options: NgwConnectorOptions): void {\n const exist = findConnector(options);\n if (exist) {\n removeConnector(exist);\n }\n}\n","export class AbortError extends Error {\n constructor(message = 'AbortError') {\n super(message);\n this.name = 'AbortError';\n }\n}\n","import { NgwError } from './NgwError';\n\nimport type { NgwExceptions } from '../interfaces';\n\n/**\n * Thrown when ...\n */\nexport class InsufficientPermissionsError extends NgwError {\n name = 'InsufficientPermissionsError';\n exception: NgwExceptions =\n 'nextgisweb.core.exception.InsufficientPermissions';\n\n constructor(obj: InsufficientPermissionsError) {\n super(obj);\n Object.setPrototypeOf(this, InsufficientPermissionsError.prototype);\n }\n}\n","// https://github.com/Leaflet/Leaflet/blob/b507e21c510b53cd704fb8d3f89bb46ea925c8eb/src/core/Util.js#L165\nconst templateRe = /\\{ *([\\w_-]+) *\\}/g;\n\nexport function template(str: string, data: { [param: string]: any }): string {\n return str.replace(templateRe, (s, key) => {\n let value = data[key];\n\n if (value === undefined) {\n throw new Error('No value provided for letiable ' + s);\n } else if (typeof value === 'function') {\n value = value(data);\n }\n return value;\n });\n}\n","import { template } from './template';\n\nimport type { NgwConnector } from '../NgwConnector';\nimport type {\n RequestItemKeys,\n RequestItemsParams,\n RequestOptions,\n} from '../interfaces';\nimport type { RequestItemsParamsMap } from '../types/RequestItemsParamsMap';\n\ninterface ApiRequestOptions<K extends keyof RequestItemsParamsMap> {\n name: string;\n connector: NgwConnector;\n params: RequestItemsParams<K>;\n requestOptions: RequestOptions;\n}\n\nexport async function apiRequest<\n K extends keyof RequestItemsParamsMap,\n P extends RequestItemKeys = RequestItemKeys,\n>(opt: ApiRequestOptions<K>): Promise<P[K]> {\n const { params, name, connector, requestOptions } = opt;\n\n const apiItems = await connector.connect();\n let apiItem = apiItems && apiItems[name];\n\n if (apiItem) {\n apiItem = [...apiItem];\n let url = apiItem.shift(); // Extract the base URL\n\n if (apiItem.length) {\n const replaceParams: { [num: number]: string } = {};\n\n // Prepare URL template parameters described in apiItem\n for (let fry = 0; fry < apiItem.length; fry++) {\n const arg = apiItem[fry];\n replaceParams[fry] = `{${arg}}`;\n\n // Check if each required by apiItem parameter is provided in params\n if (params[arg] === undefined) {\n throw new Error(`\\`${arg}\\` URL API argument is not specified`);\n }\n }\n\n // Replace URL template parameters with actual values\n if (url) {\n url = template(url, replaceParams);\n }\n }\n\n if (params) {\n const paramArray: string[] = [];\n const paramList = params.paramList;\n\n // Handle paramList if present: transform it into query string format\n if (Array.isArray(paramList)) {\n paramList.forEach(([key, value]) => {\n paramArray.push(`${key}=${value}`);\n });\n }\n\n // Append other parameters to the URL, excluding those already used in the template\n for (const p in params) {\n if (apiItem.indexOf(p) === -1) {\n paramArray.push(`${p}=${params[p]}`);\n }\n }\n\n // If there are any query parameters, append them to the URL\n if (paramArray.length) {\n url = `${url}?${paramArray.join('&')}`;\n }\n }\n\n if (url) {\n return connector.makeQuery(url, params, {\n cacheName: name,\n ...requestOptions,\n });\n } else {\n throw new Error('Request URL is not set');\n }\n } else {\n // Return undefined if API item is not found\n return undefined as P[K];\n }\n}\n","import { isObject } from '@nextgis/utils';\n\nexport function isError(error: unknown): error is Error {\n if (isObject(error)) {\n return error.status_code && error.exception && error.title;\n }\n return false;\n}\n","import { NetworkError } from '../errors/NetworkError';\nimport { NgwError } from '../errors/NgwError';\nimport { isError } from '../errors/isError';\n\nimport { isObject } from './isObject';\n\nimport type {\n RequestOptions as NgwRequestOptions,\n RequestMethods,\n} from '../interfaces';\n\n// readyState\n// Holds the status of the XMLHttpRequest.\n// 0: request not initialized\n// 1: server connection established\n// 2: request received\n// 3: processing request\n// 4: request finished and response is ready\n\n// status\n// 200: \"OK\"\n// 201 \"Created\"\tThe request has been fulfilled, and a new resource is created\n// 403: \"Forbidden\"\n// 404: \"Page not found\"\n// 500: \"Internal Server Error\"\n// For a complete list go to the Http Messages Reference\n\ntype LoadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions<RequestMethods> | undefined,\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n) => void;\n\nlet loadData: LoadData;\n// @ts-ignore\nif (__BROWSER__) {\n loadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions = {},\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n ): void => {\n options.method = options.method || 'GET';\n\n const xhr = new XMLHttpRequest();\n xhr.open(options.method || 'GET', url, true); // true for asynchronous\n\n if (options.responseType === 'blob') {\n xhr.responseType = options.responseType;\n }\n const getResponseText = () => {\n try {\n return JSON.parse(xhr.responseText);\n } catch (er) {\n return xhr.responseText;\n }\n };\n const processingResponse = (forError = false) => {\n const cb = forError ? error : callback;\n if (options.responseType === 'blob') {\n cb(xhr.response);\n } else {\n if (xhr.responseText) {\n cb(getResponseText());\n } else {\n error({ message: '' });\n }\n }\n };\n xhr.onload = () => {\n if ([401, 403, 404, 422, 500].indexOf(xhr.status) !== -1) {\n error(new NgwError(getResponseText()));\n }\n processingResponse();\n };\n\n // xhr.onreadystatechange = () => {\n // if (\n // (xhr.readyState === 4 && xhr.status === 200) ||\n // (xhr.readyState === 3 && xhr.status === 201)\n // ) {\n // processingResponse();\n // } else if (xhr.readyState === 3 && xhr.status === 400) {\n // processingResponse();\n // } else if (xhr.readyState === 4 && xhr.status === 500) {\n // processingResponse();\n // } else if (xhr.readyState === 4 && xhr.status === 401) {\n // error(xhr.statusText);\n // } else if (xhr.readyState === 4) {\n // error('request error');\n // }\n // };\n\n xhr.onerror = (er) => {\n if (xhr.status === 0) {\n error(new NetworkError(url));\n } else {\n error(er);\n }\n };\n\n xhr.upload.onprogress = function (e) {\n if (e.lengthComputable) {\n const percentComplete = (e.loaded / e.total) * 100;\n if (options.onProgress) {\n options.onProgress(percentComplete, e);\n }\n // console.log(percentComplete + '% uploaded');\n }\n };\n\n const headers = options.headers;\n if (headers) {\n for (const h in headers) {\n const header = headers[h];\n if (typeof header === 'string') {\n xhr.setRequestHeader(h, header);\n }\n }\n }\n if (options.withCredentials !== undefined) {\n xhr.withCredentials = options.withCredentials;\n }\n\n let data: FormData | any;\n if (options.file) {\n data = new FormData();\n data.append('file', options.file);\n if (options.data) {\n for (const d in options.data) {\n data.append(d, data[d]);\n }\n }\n } else {\n data = options.data\n ? typeof options.data === 'string'\n ? options.data\n : JSON.stringify(options.data)\n : null;\n }\n if (onCancel) {\n onCancel(() => {\n xhr.abort();\n });\n }\n xhr.send(data);\n };\n} else {\n const url = require('url');\n const http = require('http');\n const https = require('https');\n const FormData = require('form-data');\n\n const adapterFor = (inputUrl: string) => {\n const adapters: Record<string, any> = {\n 'http:': http,\n 'https:': https,\n };\n const protocol = url.parse(inputUrl).protocol || 'https:';\n return adapters[protocol];\n };\n\n loadData = (\n url: string,\n callback: (...args: any[]) => any,\n options: NgwRequestOptions<RequestMethods> = {},\n error: (reason?: any) => void,\n onCancel: (cancelHandler: () => void) => void,\n ): Promise<unknown> => {\n const { file, headers, method, data, responseType } = options;\n\n const request = new Promise((resolve, reject) => {\n const adapter = adapterFor(url);\n if (adapter) {\n const requestOpt = {\n headers: headers || {},\n method,\n };\n const body = typeof data === 'string' ? data : JSON.stringify(data);\n // https://stackoverflow.com/questions/35589109/node-http-delete-request-no-longer-works-after-upgrading-from-0-10-40\n let form;\n let uploadedFile = file;\n if (file) {\n const fileMeta = {};\n if (\n isObject(file) &&\n 'file' in file &&\n ('filename' in file || 'name' in file)\n ) {\n const {\n file: file_,\n name,\n ...fileMeta_\n } = file as Record<string, any>;\n if (name && !fileMeta_.filename) {\n fileMeta_.filename = name;\n }\n Object.assign(fileMeta, fileMeta_);\n uploadedFile = file_ as File;\n }\n form = new FormData();\n form.append('file', uploadedFile, fileMeta);\n if (data) {\n for (const d in data) {\n form.append(d, data[d]);\n }\n }\n Object.assign(requestOpt.headers, {\n // 'content-length': form.getLengthSync(),\n ...form.getHeaders(),\n });\n }\n\n if (body !== undefined) {\n Object.assign(requestOpt.headers, {\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(body),\n });\n }\n const req = adapter.request(url, requestOpt, (resp: any) => {\n let data = '';\n resp.on('data', (chunk: any) => {\n data += chunk;\n });\n resp.on('end', () => {\n if (data) {\n if (responseType === 'blob') {\n resolve(data);\n } else {\n let json: Record<string, any> | undefined;\n try {\n json = JSON.parse(data);\n if (json && json.status_code && json.status_code) {\n reject(json.message);\n }\n } catch (er) {\n reject(er);\n }\n if (json !== undefined) {\n if (isError(json)) {\n reject('extractError(json)');\n } else {\n resolve(json);\n }\n }\n }\n }\n reject('no data');\n });\n });\n if (form) {\n form.pipe(req);\n }\n req.on('error', (err: any) => {\n reject(err);\n });\n if (body) {\n req.write(body);\n }\n onCancel(() => {\n req.abort();\n });\n req.end();\n } else {\n throw new Error(`Given URL '${url}' is not correct`);\n }\n });\n return request\n .then((data) => {\n if (callback) {\n callback(data);\n }\n return data;\n })\n .catch((er) => {\n if (error) {\n error(er);\n } else {\n throw new Error(er);\n }\n });\n };\n}\n\nexport { loadData };\n","import { EventEmitter } from 'events';\n\nimport Cache from '@nextgis/cache';\nimport { objectRemoveEmpty } from '@nextgis/utils';\nimport { fixUrlStr } from '@nextgis/utils';\n\nimport pkg from '../package.json';\n\nimport { ResourcesControl } from './ResourcesControl';\nimport {\n addConnector,\n findConnector,\n removeConnector,\n} from './activeConnectors';\nimport { AbortError } from './errors/AbortError';\nimport { InsufficientPermissionsError } from './errors/InsufficientPermissionsError';\nimport { NgwError } from './errors/NgwError';\nimport { ResourceNotFoundError } from './errors/ResourceNotFoundError';\nimport { apiRequest } from './utils/apiRequest';\nimport { loadData } from './utils/loadData';\nimport { template } from './utils/template';\n\nimport type {\n Credentials,\n DeleteRequestItemsResponseMap,\n GetChildrenOfOptions,\n GetRequestItemsResponseMap,\n NgwConnectorOptions,\n Params,\n PatchRequestItemsResponseMap,\n PostRequestItemsResponseMap,\n PutRequestItemsResponseMap,\n PyramidRoute,\n RequestHeaders,\n RequestItemKeys,\n RequestItemsParams,\n RequestOptions,\n RequestTransformFunction,\n ResourceDefinition,\n ResourceIdKeynameDef,\n UserInfo,\n} from './interfaces';\nimport type { RequestItemsParamsMap } from './types/RequestItemsParamsMap';\nimport type { Resource, ResourceItem } from './types/ResourceItem';\nimport type { DeepPartial } from '@nextgis/utils';\n\nlet ID = 0;\nlet REQUEST_ID = 0;\n\nexport class NgwConnector {\n static errors = {\n NgwError,\n ResourceNotFoundError,\n };\n id = ID++;\n emitter = new EventEmitter();\n user?: UserInfo;\n resources!: ResourcesControl;\n cache: Cache;\n withCredentials?: boolean = undefined;\n\n private client = `NextGIS-NGW-Connector/${pkg.version}`;\n private routeStr = '/api/component/pyramid/route';\n private activeRequests: {\n [requestId: number]: AbortController;\n } = {};\n private requestTransform?: RequestTransformFunction | null;\n\n constructor(public options: NgwConnectorOptions) {\n const exist = findConnector(options);\n this.cache = new Cache({ namespace: options.cacheId });\n if (exist) {\n return exist;\n } else {\n const { route, requestTransform, withCredentials } = this.options;\n if (route) {\n this.routeStr = route;\n }\n if (requestTransform) {\n this.requestTransform = requestTransform;\n }\n if (withCredentials !== undefined) {\n this.withCredentials = withCredentials;\n }\n this.resources = new ResourcesControl({\n connector: this,\n cacheId: options.cacheId,\n });\n addConnector(this);\n }\n }\n\n static create(options: NgwConnectorOptions): NgwConnector {\n return new this(options);\n }\n\n /**\n * Clear the cache.\n */\n clearCache(): void {\n this.cache.clean();\n this.resources.cache.clean();\n }\n\n setRequestTransform(\n requestTransform: RequestTransformFunction | undefined | null,\n ) {\n this.requestTransform = requestTransform;\n }\n\n /**\n * Fast way to specify the connection address to NextGIS Web.\n * The current connection will be severed.\n * @param baseUrl - NGW url\n */\n setNgw(baseUrl: string): void {\n this.logout();\n this.options.baseUrl = baseUrl;\n addConnector(this);\n }\n\n /**\n * Establishing a connection with NextGIS Web to fulfill all other requests.\n * @remarks\n * This method need not be called manually as it is used when forming a request in {@link apiRequest | apiRequest}.\n * Can be used to check connection.\n * @example\n * ```javascript\n * const connector = new NgwConnector({baseUrl: 'https://demo.nextgis.com'});\n * connector.connect()\n * .then(() => console.log('Ok'))\n * .catch((er) => console.log('Connection problem', er));\n * ```\n */\n async connect(): Promise<PyramidRoute> {\n const auth = this.options.auth;\n\n if (auth) {\n const { login, password } = auth;\n if (login && password) {\n await this._login({ login, password });\n }\n }\n const routeUrl = `${this.routeStr}?client=${this.client}`;\n return await this.makeQuery<PyramidRoute>(\n routeUrl,\n {},\n {\n cacheName: 'route',\n cache: true,\n cacheProps: {\n id: this.id,\n auth,\n baseUrl: this.options.baseUrl,\n },\n },\n );\n }\n\n /**\n * Quick way to change NextGIS Web user.\n * @param credentials - New user credentials\n */\n login(credentials: Credentials, options?: RequestOptions): Promise<UserInfo> {\n this.logout();\n addConnector(this);\n return this._login(credentials, options);\n }\n\n /**\n * Disconnecting a user. Aborting all current requests\n */\n logout(): void {\n this.abort();\n removeConnector(this);\n this.options.auth = undefined;\n this.user = undefined;\n this.clearCache();\n this.emitter.emit('logout');\n }\n\n async getUserInfo(\n credentials?: Credentials,\n options?: RequestOptions,\n ): Promise<UserInfo> {\n if (this.user && this.user.id) {\n return this.user;\n }\n if (credentials) {\n this.options.auth = credentials;\n }\n const options_: RequestOptions = {\n headers: this.getAuthorizationHeaders(credentials),\n ...options,\n };\n\n // Do not use apiRequest('auth.current_user') to avoid circular-references\n return this.makeQuery<UserInfo>(\n '/api/component/auth/current_user',\n {},\n options_,\n );\n }\n\n /**\n * Obtaining the required Headers for authentication of requests in the NGW.\n */\n getAuthorizationHeaders(\n credentials?: Credentials,\n ): RequestHeaders | undefined {\n const client = this.makeClientId(credentials);\n if (client) {\n return {\n Authorization: `Basic ${client}`,\n };\n }\n }\n\n makeClientId(credentials?: Credentials): string | undefined {\n credentials = credentials || this.options.auth;\n if (credentials) {\n const { login, password } = credentials;\n const str = `${login}:${password}`;\n const encodedStr = encodeURIComponent(str);\n\n if (__BROWSER__) {\n return window.btoa(encodedStr);\n } else {\n return Buffer.from(encodedStr).toString('base64');\n }\n }\n }\n\n /** Stop all api requests */\n abort() {\n for (const abortController of Object.values(this.activeRequests)) {\n abortController.abort();\n }\n this.activeRequests = {};\n }\n\n getActiveApiRequests() {\n return { ...this.activeRequests };\n }\n\n /**\n * Send request to NGW api router.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param params - Request item params or query params\n * @param requestOptions - Request options\n *\n * @example\n * ```javascript\n *\n * // there is such an NGW route item\n * // \"feature_layer.feature.item\": [\n * // \"/api/resource/{0}/feature/{1}\",\n * // \"id\",\n * // \"fid\"\n * // ],\n *\n * const connector = new NgwConnector({ baseUrl: 'https://example.nextgis.com' });\n * connector.apiRequest('feature_layer.feature.item', {\n * // request params for {0} and {1}\n * 'id': 2011,\n * 'fid': 101,\n * // query params\n * 'srs': 4326,\n * 'geom_format': 'geojson',\n * }, { method: 'GET' });\n * // send get-request to 'https://example.nextgis.com/api/resource/2011/feature/101?srs=4326&geom_format=geojson'\n *\n * ```\n */\n apiRequest<\n K extends keyof RequestItemsParamsMap,\n P extends RequestItemKeys = RequestItemKeys,\n >(\n name: K,\n params_: RequestItemsParams<K> = {},\n requestOptions: RequestOptions = {},\n ): Promise<P[K]> {\n params_ = requestOptions.params ?? params_;\n const params = objectRemoveEmpty(params_);\n return apiRequest({ name, params, requestOptions, connector: this });\n }\n\n /**\n * Shortcut method for send POST request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n *\n * @example\n * ```javascript\n * connector.post('resource.collection', { data: POST_PAYLOAD })\n * .then((newResource) => console.log(newResource))\n * .catch((error) => console.warn(error));\n * ```\n */\n post<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'POST', K>,\n params?: RequestItemsParams<K>,\n ): Promise<PostRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'POST';\n return this.apiRequest<K, PostRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send GET request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n get<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'GET', K> | undefined | null,\n params?: RequestItemsParams<K>,\n ): Promise<GetRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'GET';\n return this.apiRequest<K, GetRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send PATCH request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n patch<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'PATCH', K>,\n params?: RequestItemsParams<K>,\n ): Promise<PatchRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'PATCH';\n return this.apiRequest<K, PatchRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send PUT request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n put<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'PUT', K>,\n params?: RequestItemsParams<K>,\n ): Promise<PutRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'PUT';\n return this.apiRequest<K, PutRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Shortcut method for send DELETE request to NGW.\n * @param name - NGW route name from {@link https://docs.nextgis.com/docs_ngweb_dev/doc/developer/resource.html#routes | routes}\n * @param options - Request options\n * @param params - Request item params or query params\n */\n delete<K extends keyof RequestItemsParamsMap>(\n name: K,\n options?: RequestOptions<'DELETE', K> | undefined | null,\n params?: RequestItemsParams<K>,\n ): Promise<DeleteRequestItemsResponseMap[K]> {\n options = options || {};\n options.method = 'DELETE';\n return this.apiRequest<K, DeleteRequestItemsResponseMap>(\n name,\n params,\n options,\n );\n }\n\n /**\n * Send request to NGW.\n * @param url - URL address to NGW\n * @param params - Query params\n * @param options - Request options\n */\n async makeQuery<R = unknown>(\n url: string,\n params?: Params | null,\n options: RequestOptions = {},\n ): Promise<R> {\n url = (this.options.baseUrl ? this.options.baseUrl : '') + url;\n if (!url) {\n throw new Error('Empty `url` not allowed');\n }\n\n if (params) {\n const { paramList, ...restParams } = params;\n url = template(url, restParams);\n }\n url = encodeURI(fixUrlStr(url));\n\n options = { withCredentials: this.withCredentials, ...options };\n\n const {\n cache,\n signal: externalSignal,\n method = 'GET',\n headers,\n cacheName,\n cacheProps,\n responseType,\n withCredentials,\n } = options;\n\n const internalAbortController = new AbortController();\n const internalSignal = internalAbortController.signal;\n\n // If the external signal aborts, also abort the internal signal\n if (externalSignal) {\n if (externalSignal.aborted) {\n throw new AbortError();\n }\n externalSignal.addEventListener('abort', () => {\n internalAbortController.abort();\n });\n }\n\n options.signal = internalSignal;\n\n const createPromise = async () => {\n const id = REQUEST_ID++;\n this.activeRequests[id] = internalAbortController;\n try {\n return this._loadData<R>(url, options);\n } finally {\n this._cleanActiveRequest(id);\n }\n };\n\n if (cache && method === 'GET') {\n const cacheOptions = cacheProps\n ? cacheProps\n : {\n ...objectRemoveEmpty({\n headers,\n withCredentials,\n responseType,\n baseUrl: this.options.baseUrl,\n userId: this.user?.id,\n }),\n params,\n };\n return this.cache.add(\n cacheName || url,\n createPromise,\n cacheOptions,\n false,\n );\n }\n\n return createPromise();\n }\n\n // -------------------------------------------------------------------------\n // Resource Methods\n // -------------------------------------------------------------------------\n\n /**\n * {@link ResourcesControl.getOne}\n */\n getResource(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.resources.getOne(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getOneOrFail}\n */\n getResourceOrFail(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem> {\n return this.resources.getOneOrFail(resource, requestOptions);\n }\n\n /**\n * @deprecated - use {@link getResource}\n */\n getResourceBy(\n resource: DeepPartial<Resource>,\n ): Promise<ResourceItem | undefined> {\n return this.resources.getOne(resource);\n }\n\n /**\n * @deprecated - use {@link getResource}\n */\n getResourceByKeyname(keyname: string): Promise<ResourceItem | undefined> {\n return this.resources.getOne(keyname);\n }\n\n /**\n * @deprecated - use {@link getResource}\n */\n getResourceById(id: number): Promise<ResourceItem | undefined> {\n return this.resources.getOne(id);\n }\n\n /**\n * {@link ResourcesControl.getId}\n */\n getResourceId(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<number | undefined> {\n return this.resources.getId(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getIdOrFail}\n */\n getResourceIdOrFail(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<number> {\n return this.resources.getIdOrFail(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getMany}\n */\n getResourcesBy(\n resource: DeepPartial<Resource>,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem[]> {\n return this.resources.getMany(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getParent}\n */\n getResourceParent(\n resource: ResourceDefinition,\n requestOptions?: RequestOptions<'GET'>,\n ): Promise<ResourceItem | undefined> {\n return this.resources.getParent(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.getChildrenOf}\n */\n getResourceChildren(\n resource: ResourceDefinition,\n requestOptions?: GetChildrenOfOptions,\n ): Promise<ResourceItem[]> {\n return this.resources.getChildrenOf(resource, requestOptions);\n }\n\n /**\n * {@link ResourcesControl.update}\n */\n updateResource(\n resource: ResourceIdKeynameDef,\n data: DeepPartial<ResourceItem>,\n ): Promise<ResourceItem | undefined> {\n return this.resources.update(resource, data);\n }\n\n /**\n * {@link ResourcesControl.delete}\n */\n deleteResource(resource: ResourceIdKeynameDef): Promise<void> {\n return this.resources.delete(resource);\n }\n\n /**\n * @internal\n */\n protected _loadData<R = unknown>(\n url: string,\n options: RequestOptions,\n ): Promise<R> {\n options.responseType = options.responseType || 'json';\n\n return new Promise<R>((resolve, reject) => {\n if (this.user) {\n options = options || {};\n options.headers = {\n ...this.getAuthorizationHeaders(),\n ...options.headers,\n };\n }\n\n if (this.requestTransform) {\n const [transUrl, transOptions] = this.requestTransform(url, options);\n url = transUrl;\n options = transOptions;\n }\n\n let runOnAbort: (() => void) | undefined = undefined;\n\n loadData(url, resolve, options, reject, (handler: () => void) => {\n runOnAbort = handler;\n });\n\n options.signal?.addEventListener('abort', () => {\n if (runOnAbort !== undefined) {\n runOnAbort();\n }\n reject(new AbortError());\n });\n }).catch((httpError) => {\n if (httpError.name !== 'AbortError') {\n if (__DEV__) {\n console.warn('DEV WARN', httpError);\n }\n const er = this._handleHttpError(httpError);\n if (er) {\n throw er;\n }\n }\n throw httpError;\n });\n }\n\n private async _login(\n credentials: Credentials,\n options?: RequestOptions,\n ): Promise<UserInfo> {\n try {\n const data = await this.getUserInfo(credentials, options);\n this.user = data;\n this.emitter.emit('login', data);\n return data;\n } catch (er) {\n this.emitter.emit('login:error', er);\n throw er;\n }\n }\n\n private _cleanActiveRequest(requestId: number) {\n delete this.activeRequests[requestId];\n }\n\n private _handleHttpError(er: Error) {\n if (er) {\n if (er instanceof NgwError) {\n if (er.exception === 'nextgisweb.resource.exception.ResourceNotFound') {\n throw new ResourceNotFoundError(er);\n } else if (\n er.exception === 'nextgisweb.core.exception.InsufficientPermissions'\n ) {\n throw new InsufficientPermissionsError(er);\n }\n }\n }\n return er;\n }\n}\n"],"names":["__publicField","objectDeepEqual","defined","isObject","FormData","url","data","EventEmitter","objectRemoveEmpty","fixUrlStr"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKO,MAAM,iBAAiB,KAAM,CAAA;AAAA,EAWlC,YAAY,EAAwB,EAAA;AAClC,IAAM,KAAA,EAAA,CAAA;AAXR,IAAOA,eAAA,CAAA,IAAA,EAAA,MAAA,EAAA,UAAA,CAAA,CAAA;AAEP,IAAAA,eAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA;AAIE,IAAO,MAAA,CAAA,MAAA,CAAO,MAAM,EAAE,CAAA,CAAA;AACtB,IAAO,MAAA,CAAA,cAAA,CAAe,IAAM,EAAA,QAAA,CAAS,SAAS,CAAA,CAAA;AAAA,GAChD;AACF;;;;;ACdO,MAAM,8BAA8B,QAAS,CAAA;AAAA,EAIlD,YAAY,GAA6B,EAAA;AACvC,IAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAJX,IAAOA,eAAA,CAAA,IAAA,EAAA,MAAA,EAAA,uBAAA,CAAA,CAAA;AACP,IAA2BA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAA,gDAAA,CAAA,CAAA;AAIzB,IAAO,MAAA,CAAA,cAAA,CAAe,IAAM,EAAA,qBAAA,CAAsB,SAAS,CAAA,CAAA;AAAA,GAC7D;AACF;;ACfO,SAAS,SAAS,GAAmD,EAAA;AAC1E,EAAA,OAAO,MAAO,CAAA,SAAA,CAAU,QAAS,CAAA,IAAA,CAAK,GAAG,CAAM,KAAA,iBAAA,CAAA;AACjD;;ACGgB,SAAA,eAAA,CACd,MACA,IACS,EAAA;AACT,EAAO,OAAAC,qBAAA,CAAgB,MAAM,IAAI,CAAA,CAAA;AACnC;;ACHA,MAAM,OAAA,GAAU,CAAC,aAAa,CAAA,CAAA;AAYd,SAAA,eAAA,CACd,QACA,EAAA,MAAA,GAAS,EACgB,EAAA;AACzB,EAAS,MAAA,GAAA,MAAA,GAAS,SAAS,IAAO,GAAA,EAAA,CAAA;AAClC,EAAA,MAAM,QAA6B,EAAC,CAAA;AACpC,EAAA,KAAA,MAAW,CAAC,GAAK,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,QAAQ,CAAG,EAAA;AACnD,IAAA,IAAI,OAAQ,CAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,CAAI,CAAA,EAAA;AAC/B,MAAI,IAAA,QAAA,CAAS,KAAK,CAAG,EAAA;AACnB,QAAA,IAAI,QAAQ,YAAc,EAAA;AACxB,UAAM,MAAA,QAAA,GAAW,eAAgB,CAAA,KAAA,EAAgC,GAAG,CAAA,CAAA;AACpE,UAAO,MAAA,CAAA,MAAA,CAAO,OAAO,QAAQ,CAAA,CAAA;AAAA,SACpB,MAAA,IAAA,GAAA,KAAQ,QAAY,IAAA,IAAA,IAAQ,KAAO,EAAA;AAC5C,UAAA,KAAA,CAAM,YAAY,KAAM,CAAA,EAAA,CAAA;AAAA,SAC1B;AAAA,OACF,MAAA,IAAWC,aAAQ,CAAA,KAAK,CAAG,EAAA;AACzB,QAAM,KAAA,CAAA,MAAA,GAAS,GAAG,CAAI,GAAA,KAAA,CAAA;AAAA,OACxB;AAAA,KACF;AAAA,GACF;AACA,EAAO,OAAA,KAAA,CAAA;AACT;;;;;ACvBO,MAAM,gBAAiB,CAAA;AAAA,EAI5B,WAAY,CAAA;AAAA,IACV,SAAA;AAAA,IACA,OAAA;AAAA,GAIC,EAAA;AATH,IAAAF,eAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AASE,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA,CAAA;AACjB,IAAA,IAAA,CAAK,QAAQ,IAAI,KAAA,CAAM,EAAE,SAAA,EAAW,SAAS,CAAA,CAAA;AAAA,GAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAA,CACE,UACA,cACmC,EAAA;AAGnC,IAAM,MAAA,GAAA,GAAM,EAAE,GAAG,cAAe,EAAA,CAAA;AAChC,IAAI,IAAA,OAAO,aAAa,QAAU,EAAA,CAElC,MAAA,IAAW,OAAO,QAAA,KAAa,QAAU,EAAA,CAEzC,MAAA,IAAW,QAAS,CAAA,QAAQ,CAAG,EAAA;AAC7B,MAAI,IAAA,QAAA,CAAS,OAAO,KAAW,CAAA,EAAA;AAC7B,QAAc,QAAS,CAAA,EAAA,CAAA;AAAA,OAClB,MAAA;AACL,QAAA,IAAI,SAAS,OAAS,EAAA;AACpB,UAAmB,QAAS,CAAA,OAAA,CAAA;AAAA,SAC9B;AACA,QAAA,IAAI,SAAS,YAAc,EAAA;AACzB,UAAwB,QAAS,CAAA,YAAA,CAAA;AAAA,SACnC;AAAA,OACF;AAAA,KACF;AAEA,IAAI,IAAA,OAAO,aAAa,QAAU,EAAA;AAChC,MAAA,OAAO,KAAK,gBAAiB,CAAA,EAAE,OAAS,EAAA,QAAA,IAAY,GAAG,CAAA,CAAA;AAAA,KACzD,MAAA,IAAW,OAAO,QAAA,KAAa,QAAU,EAAA;AACvC,MAAO,OAAA,IAAA,CAAK,kBAAmB,CAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AAAA,KAC9C,MAAA,IAAW,QAAS,CAAA,QAAQ,CAAG,EAAA;AAC7B,MAAO,OAAA,IAAA,CAAK,gBAAiB,CAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AAAA,KAC5C;AACA,IAAO,OAAA,OAAA,CAAQ,QAAQ,KAAS,CAAA,CAAA,CAAA;AAAA,GAClC;AAAA,EAEA,YAAA,CACE,UACA,cACuB,EAAA;AACvB,IAAA,OAAO,KAAK,MAAO,CAAA,QAAA,EAAU,cAAc,CAAE,CAAA,IAAA,CAAK,CAAC,GAAQ,KAAA;AACzD,MAAA,IAAI,GAAK,EAAA;AACP,QAAO,OAAA,GAAA,CAAA;AAAA,OACT;AACA,MAAA,MAAM,IAAI,qBAAsB,EAAA,CAAA;AAAA,KACjC,CAAA,CAAA;AAAA,GACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAA,CACE,UACA,cAC6B,EAAA;AAC7B,IAAI,IAAA,OAAO,aAAa,QAAU,EAAA;AAChC,MAAO,OAAA,OAAA,CAAQ,QAAQ,QAAQ,CAAA,CAAA;AAAA,eACtB,OAAO,QAAA,KAAa,QAAY,IAAA,QAAA,CAAS,QAAQ,CAAG,EAAA;AAC7D,MAAA,OAAO,KAAK,MAAO,CAAA,QAAA,EAAU,cAAc,CAAE,CAAA,IAAA,CAAK,CAAC,GAAQ,KAAA;AACzD,QAAA,IAAI,GAAK,EAAA;AACP,UAAA,OAAO,IAAI,QAAS,CAAA,EAAA,CAAA;AAAA,SACtB;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AACA,IAAO,OAAA,OAAA,CAAQ,QAAQ,KAAS,CAAA,CAAA,CAAA;AAAA,GAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAA,CACE,UACA,cACiB,EAAA;AACjB,IAAA,OAAO,KAAK,KAAM,CAAA,QAAA,EAAU,cAAc,CAAE,CAAA,IAAA,CAAK,CAAC,IAAS,KAAA;AACzD,MAAA,IAAI,SAAS,KAAW,CAAA,EAAA;AACtB,QAAA,MAAM,IAAI,KAAM,EAAA,CAAA;AAAA,OAClB;AACA,MAAO,OAAA,IAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,OAAA,CACE,UACA,cACyB,EAAA;AACzB,IAAA,OAAO,KAAK,oBAAqB,CAAA,QAAQ,CAAE,CAAA,IAAA,CAAK,CAAC,KAAU,KAAA;AACzD,MAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,QAAA,MAAM,QAAiC,EAAC,CAAA;AACxC,QAAA,IAAI,SAAS,OAAS,EAAA;AACpB,UAAA,KAAA,CAAM,UAAU,QAAS,CAAA,OAAA,CAAA;AAAA,SACpB,MAAA;AACL,UAAA,MAAA,CAAO,MAAO,CAAA,KAAA,EAAO,eAAgB,CAAA,QAAQ,CAAC,CAAA,CAAA;AAAA,SAChD;AACA,QAAA,OAAO,IAAK,CAAA,SAAA,CACT,GAAI,CAAA,iBAAA,EAAmB,cAAgB,EAAA;AAAA,UACtC,aAAe,EAAA,MAAA;AAAA,UACf,GAAG,KAAA;AAAA,SACJ,CAAA,CACA,IAAK,CAAA,CAAC,SAAc,KAAA;AACnB,UAAI,IAAA,CAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAgB,UAAS,SAAW,EAAA;AACtC,YAAA,KAAA,MAAW,KAAK,SAAW,EAAA;AACzB,cAAA,IAAA,CAAK,MAAM,GAAI,CAAA,eAAA,EAAiB,OAAQ,CAAA,OAAA,CAAQ,CAAC,CAAG,EAAA;AAAA,gBAClD,EAAA,EAAI,EAAE,QAAS,CAAA,EAAA;AAAA,eAChB,CAAA,CAAA;AAAA,aACH;AAAA,WACF;AACA,UAAO,OAAA,SAAA,CAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACL;AACA,MAAO,OAAA,KAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,SAAA,CACE,UACA,cACmC,EAAA;AACnC,IAAA,OAAO,KAAK,MAAO,CAAA,QAAA,EAAU,cAAc,CAAE,CAAA,IAAA,CAAK,CAAC,KAAU,KAAA;AAC3D,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,OAAO,KAAK,MAAO,CAAA,KAAA,CAAM,QAAS,CAAA,MAAA,CAAO,IAAI,cAAc,CAAA,CAAA;AAAA,OAC7D;AACA,MAAO,OAAA,OAAA,CAAQ,QAAQ,KAAS,CAAA,CAAA,CAAA;AAAA,KACjC,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,aAAA,CACE,UACA,cACyB,EAAA;AACzB,IAAO,OAAA,IAAA,CAAK,WAAY,CAAA,QAAQ,CAAE,CAAA,IAAA;AAAA,MAAK,CAAC,MAAA,KACtC,IAAK,CAAA,cAAA,CAAe,QAAQ,cAAc,CAAA;AAAA,KAC5C,CAAA;AAAA,GACF;AAAA,EAEA,MAAA,CACE,UACA,IACmC,EAAA;AACnC,IAAA,OAAO,KAAK,KAAM,CAAA,QAAQ,CAAE,CAAA,IAAA,CAAK,CAAC,EAAO,KAAA;AACvC,MAAA,IAAI,OAAO,KAAW,CAAA,EAAA;AACpB,QAAO,OAAA,IAAA,CAAK,UAAU,GAAI,CAAA,eAAA,EAAiB,EAAE,IAAK,EAAA,EAAG,EAAE,EAAA,EAAI,CAAA,CAAA;AAAA,OAC7D;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QAA6C,EAAA;AAClD,IAAA,OAAO,KAAK,KAAM,CAAA,QAAQ,CAAE,CAAA,IAAA,CAAK,CAAC,EAAO,KAAA;AACvC,MAAA,IAAI,OAAO,KAAW,CAAA,EAAA;AACpB,QAAO,OAAA,IAAA,CAAK,SAAU,CAAA,MAAA,CAAO,eAAiB,EAAA,IAAA,EAAM,EAAE,EAAG,EAAC,CAAE,CAAA,IAAA,CAAK,MAAM;AACrE,UAAA,IAAA,CAAK,wBAAwB,EAAE,CAAA,CAAA;AAC/B,UAAO,OAAA,KAAA,CAAA,CAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACH;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEQ,cACN,CAAA,MAAA,EACA,cACA,EAAA,MAAA,GAAyB,EACA,EAAA;AACzB,IAAA,OAAO,IAAK,CAAA,SAAA,CACT,GAAI,CAAA,qBAAA,EAAuB,cAAgB,EAAA;AAAA,MAC1C,MAAA;AAAA,KACD,CAAA,CACA,IAAK,CAAA,CAAC,KAAU,KAAA;AACf,MAAA,MAAM,oBAAoB,EAAC,CAAA;AAC3B,MAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,QAAA,IAAI,iDAAgB,KAAO,EAAA;AACzB,UAAA,IAAA,CAAK,MAAM,GAAI,CAAA,eAAA,EAAiB,OAAQ,CAAA,OAAA,CAAQ,IAAI,CAAG,EAAA;AAAA,YACrD,EAAA,EAAI,KAAK,QAAS,CAAA,EAAA;AAAA,WACnB,CAAA,CAAA;AAAA,SACH;AACA,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA,CAAA;AAChB,QAAA,IAAA,CAAI,cAAgB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,SAAA,KAAa,IAAK,CAAA,QAAA,CAAS,QAAU,EAAA;AACvD,UAAkB,iBAAA,CAAA,IAAA;AAAA,YAChB,KAAK,cAAe,CAAA,IAAA,CAAK,QAAS,CAAA,EAAA,EAAI,gBAAgB,MAAM,CAAA;AAAA,WAC9D,CAAA;AAAA,SACF;AAAA,OACF;AACA,MAAA,IAAI,kBAAkB,MAAQ,EAAA;AAC5B,QAAA,OAAO,OAAQ,CAAA,GAAA,CAAI,iBAAiB,CAAA,CAAE,KAAK,MAAM;AAC/C,UAAO,OAAA,MAAA,CAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACH;AACA,MAAO,OAAA,MAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACL;AAAA,EAEA,MAAc,wBAAwB,EAAY,EAAA;AAvPpD,IAAA,IAAA,EAAA,CAAA;AAwPI,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,KAAA,CAAM,GAAI,EAAA,CAAA;AAC3B,IAAA,MAAM,WAAuB,EAAC,CAAA;AAC9B,IAAA,KAAA,MAAW,KAAK,GAAK,EAAA;AACnB,MAAM,MAAA,GAAA,GAAA,CAAM,EAAE,GAAA,CAAA,CAAA,KAAA,KAAF,IAAS,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,EAAA,CAAA;AACrB,MAAI,IAAA,CAAC,iBAAiB,UAAU,CAAA,CAAE,SAAS,CAAE,CAAA,GAAG,CAAK,IAAA,GAAA,KAAQ,KAAW,CAAA,EAAA;AACtE,QAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,UAAA,IAAI,QAAQ,EAAI,EAAA;AACd,YAAA,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,WACjB;AAAA,SACK,MAAA;AACL,UAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAChC,UAAA,IAAI,QAAQ,EAAI,EAAA;AACd,YAAA,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,WACjB;AAAA,SACF;AAAA,OACF;AAAA,KACF;AACA,IAAA,KAAA,MAAW,KAAK,QAAU,EAAA;AACxB,MAAK,IAAA,CAAA,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA;AAAA,KACrB;AAAA,GACF;AAAA,EAEQ,kBAAA,CACN,IACA,cACmC,EAAA;AACnC,IAAA,OAAO,KAAK,SAAU,CAAA,GAAA,CAAI,iBAAiB,cAAgB,EAAA,EAAE,IAAI,CAAA,CAAA;AAAA,GACnE;AAAA,EAEQ,gBAAA,CACN,UACA,cACmC,EAAA;AACnC,IAAA,OAAO,KAAK,OAAQ,CAAA,QAAA,EAAU,cAAc,CAAE,CAAA,IAAA,CAAK,CAAC,SAAc,KAAA;AAChE,MAAA,OAAO,UAAU,CAAC,CAAA,CAAA;AAAA,KACnB,CAAA,CAAA;AAAA,GACH;AAAA,EAEQ,qBACN,QACyB,EAAA;AACzB,IAAA,OAAO,QAAQ,GAAI,CAAA,IAAA,CAAK,MAAM,QAAS,CAAA,eAAe,CAAC,CAAE,CAAA,IAAA;AAAA,MACvD,CAAC,SAAc,KAAA;AACb,QAAA,MAAM,QAAwB,EAAC,CAAA;AAC/B,QAAU,SAAA,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA;AACtB,UAAA,IAAI,CAAG,EAAA;AAEL,YAAA,IAAI,QAAS,CAAA,OAAA,IAAW,CAAE,CAAA,QAAA,CAAS,OAAS,EAAA;AAC1C,cAAO,OAAA,QAAA,CAAS,OAAY,KAAA,CAAA,CAAE,QAAS,CAAA,OAAA,CAAA;AAAA,aACzC;AACA,YAAI,IAAAE,aAAA,CAAQ,SAAS,EAAE,CAAA,IAAKA,cAAQ,CAAE,CAAA,QAAA,CAAS,EAAE,CAAG,EAAA;AAClD,cAAO,OAAA,QAAA,CAAS,EAAO,KAAA,CAAA,CAAE,QAAS,CAAA,EAAA,CAAA;AAAA,aACpC;AACA,YAAO,OAAA,eAAA,CAAgB,QAAU,EAAA,CAAA,CAAE,QAAQ,CAAA,CAAA;AAAA,WAC7C;AAAA,SACD,CAAA,CAAA;AACD,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF,CAAA;AAAA,GACF;AACF;;AC/SO,MAAM,aAA6B,EAAC,CAAA;AAEpC,SAAS,aAAa,SAA+B,EAAA;AAC1D,EAAA,UAAA,CAAW,KAAK,SAAS,CAAA,CAAA;AAC3B,CAAA;AAEO,SAAS,cACd,OAC0B,EAAA;AAC1B,EAAO,OAAA,UAAA,CAAW,IAAK,CAAA,CAAC,CAAM,KAAA;AAC5B,IAAA,IAAI,CAAE,CAAA,OAAA,CAAQ,OAAY,KAAA,OAAA,CAAQ,OAAS,EAAA;AACzC,MAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,QAAI,IAAA,CAAA,CAAE,QAAQ,IAAM,EAAA;AAClB,UAAA,OAAOD,qBAAgB,CAAA,CAAA,CAAE,OAAQ,CAAA,IAAA,EAAM,QAAQ,IAAI,CAAA,CAAA;AAAA,SACrD;AAAA,OACK,MAAA;AAEL,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AACH,CAAA;AAEO,SAAS,gBAAgB,SAA+B,EAAA;AAC7D,EAAM,MAAA,KAAA,GAAQ,UAAW,CAAA,OAAA,CAAQ,SAAS,CAAA,CAAA;AAC1C,EAAA,IAAI,UAAU,CAAI,CAAA,EAAA;AAChB,IAAW,UAAA,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AAAA,GAC5B;AACF;;ACjCO,MAAM,mBAAmB,KAAM,CAAA;AAAA,EACpC,WAAA,CAAY,UAAU,YAAc,EAAA;AAClC,IAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AACb,IAAA,IAAA,CAAK,IAAO,GAAA,YAAA,CAAA;AAAA,GACd;AACF;;;;;ACEO,MAAM,qCAAqC,QAAS,CAAA;AAAA,EAKzD,YAAY,GAAmC,EAAA;AAC7C,IAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AALX,IAAOD,eAAA,CAAA,IAAA,EAAA,MAAA,EAAA,8BAAA,CAAA,CAAA;AACP,IACEA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAA,mDAAA,CAAA,CAAA;AAIA,IAAO,MAAA,CAAA,cAAA,CAAe,IAAM,EAAA,4BAAA,CAA6B,SAAS,CAAA,CAAA;AAAA,GACpE;AACF;;ACfA,MAAM,UAAa,GAAA,oBAAA,CAAA;AAEH,SAAA,QAAA,CAAS,KAAa,IAAwC,EAAA;AAC5E,EAAA,OAAO,GAAI,CAAA,OAAA,CAAQ,UAAY,EAAA,CAAC,GAAG,GAAQ,KAAA;AACzC,IAAI,IAAA,KAAA,GAAQ,KAAK,GAAG,CAAA,CAAA;AAEpB,IAAA,IAAI,UAAU,KAAW,CAAA,EAAA;AACvB,MAAM,MAAA,IAAI,KAAM,CAAA,iCAAA,GAAoC,CAAC,CAAA,CAAA;AAAA,KACvD,MAAA,IAAW,OAAO,KAAA,KAAU,UAAY,EAAA;AACtC,MAAA,KAAA,GAAQ,MAAM,IAAI,CAAA,CAAA;AAAA,KACpB;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACR,CAAA,CAAA;AACH;;ACGA,eAAsB,WAGpB,GAA0C,EAAA;AAC1C,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAM,EAAA,SAAA,EAAW,gBAAmB,GAAA,GAAA,CAAA;AAEpD,EAAM,MAAA,QAAA,GAAW,MAAM,SAAA,CAAU,OAAQ,EAAA,CAAA;AACzC,EAAI,IAAA,OAAA,GAAU,QAAY,IAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAEvC,EAAA,IAAI,OAAS,EAAA;AACX,IAAU,OAAA,GAAA,CAAC,GAAG,OAAO,CAAA,CAAA;AACrB,IAAI,IAAA,GAAA,GAAM,QAAQ,KAAM,EAAA,CAAA;AAExB,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAA,MAAM,gBAA2C,EAAC,CAAA;AAGlD,MAAA,KAAA,IAAS,GAAM,GAAA,CAAA,EAAG,GAAM,GAAA,OAAA,CAAQ,QAAQ,GAAO,EAAA,EAAA;AAC7C,QAAM,MAAA,GAAA,GAAM,QAAQ,GAAG,CAAA,CAAA;AACvB,QAAc,aAAA,CAAA,GAAG,CAAI,GAAA,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAA,CAAA;AAG5B,QAAI,IAAA,MAAA,CAAO,GAAG,CAAA,KAAM,KAAW,CAAA,EAAA;AAC7B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAK,EAAA,EAAA,GAAG,CAAsC,oCAAA,CAAA,CAAA,CAAA;AAAA,SAChE;AAAA,OACF;AAGA,MAAA,IAAI,GAAK,EAAA;AACP,QAAM,GAAA,GAAA,QAAA,CAAS,KAAK,aAAa,CAAA,CAAA;AAAA,OACnC;AAAA,KACF;AAEA,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,MAAM,aAAuB,EAAC,CAAA;AAC9B,MAAA,MAAM,YAAY,MAAO,CAAA,SAAA,CAAA;AAGzB,MAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,SAAS,CAAG,EAAA;AAC5B,QAAA,SAAA,CAAU,OAAQ,CAAA,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AAClC,UAAA,UAAA,CAAW,IAAK,CAAA,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,SAClC,CAAA,CAAA;AAAA,OACH;AAGA,MAAA,KAAA,MAAW,KAAK,MAAQ,EAAA;AACtB,QAAA,IAAI,OAAQ,CAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAI,CAAA,EAAA;AAC7B,UAAA,UAAA,CAAW,KAAK,CAAG,EAAA,CAAC,IAAI,MAAO,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA,CAAA;AAAA,SACrC;AAAA,OACF;AAGA,MAAA,IAAI,WAAW,MAAQ,EAAA;AACrB,QAAA,GAAA,GAAM,GAAG,GAAG,CAAA,CAAA,EAAI,UAAW,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,OACtC;AAAA,KACF;AAEA,IAAA,IAAI,GAAK,EAAA;AACP,MAAO,OAAA,SAAA,CAAU,SAAU,CAAA,GAAA,EAAK,MAAQ,EAAA;AAAA,QACtC,SAAW,EAAA,IAAA;AAAA,QACX,GAAG,cAAA;AAAA,OACJ,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAM,MAAA,IAAI,MAAM,wBAAwB,CAAA,CAAA;AAAA,KAC1C;AAAA,GACK,MAAA;AAEL,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF;;ACpFO,SAAS,QAAQ,KAAgC,EAAA;AACtD,EAAI,IAAAG,cAAA,CAAS,KAAK,CAAG,EAAA;AACnB,IAAA,OAAO,KAAM,CAAA,WAAA,IAAe,KAAM,CAAA,SAAA,IAAa,KAAM,CAAA,KAAA,CAAA;AAAA,GACvD;AACA,EAAO,OAAA,KAAA,CAAA;AACT;;AC4BA,IAAI,QAAA,CAAA;AAmHG;AACL,EAAM,MAAA,GAAA,GAAM,QAAQ,KAAK,CAAA,CAAA;AACzB,EAAM,MAAA,IAAA,GAAO,QAAQ,MAAM,CAAA,CAAA;AAC3B,EAAM,MAAA,KAAA,GAAQ,QAAQ,OAAO,CAAA,CAAA;AAC7B,EAAMC,MAAAA,SAAAA,GAAW,QAAQ,WAAW,CAAA,CAAA;AAEpC,EAAM,MAAA,UAAA,GAAa,CAAC,QAAqB,KAAA;AACvC,IAAA,MAAM,QAAgC,GAAA;AAAA,MACpC,OAAS,EAAA,IAAA;AAAA,MACT,QAAU,EAAA,KAAA;AAAA,KACZ,CAAA;AACA,IAAA,MAAM,QAAW,GAAA,GAAA,CAAI,KAAM,CAAA,QAAQ,EAAE,QAAY,IAAA,QAAA,CAAA;AACjD,IAAA,OAAO,SAAS,QAAQ,CAAA,CAAA;AAAA,GAC1B,CAAA;AAEA,EAAA,QAAA,GAAW,CACTC,IACA,EAAA,QAAA,EACA,UAA6C,EAAC,EAC9C,OACA,QACqB,KAAA;AACrB,IAAA,MAAM,EAAE,IAAM,EAAA,OAAA,EAAS,MAAQ,EAAA,IAAA,EAAM,cAAiB,GAAA,OAAA,CAAA;AAEtD,IAAA,MAAM,OAAU,GAAA,IAAI,OAAQ,CAAA,CAAC,SAAS,MAAW,KAAA;AAC/C,MAAM,MAAA,OAAA,GAAU,WAAWA,IAAG,CAAA,CAAA;AAC9B,MAAA,IAAI,OAAS,EAAA;AACX,QAAA,MAAM,UAAa,GAAA;AAAA,UACjB,OAAA,EAAS,WAAW,EAAC;AAAA,UACrB,MAAA;AAAA,SACF,CAAA;AACA,QAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAO,GAAA,IAAA,CAAK,UAAU,IAAI,CAAA,CAAA;AAElE,QAAI,IAAA,IAAA,CAAA;AACJ,QAAA,IAAI,YAAe,GAAA,IAAA,CAAA;AACnB,QAAA,IAAI,IAAM,EAAA;AACR,UAAA,MAAM,WAAW,EAAC,CAAA;AAClB,UACE,IAAA,QAAA,CAAS,IAAI,CACb,IAAA,MAAA,IAAU,SACT,UAAc,IAAA,IAAA,IAAQ,UAAU,IACjC,CAAA,EAAA;AACA,YAAM,MAAA;AAAA,cACJ,IAAM,EAAA,KAAA;AAAA,cACN,IAAA;AAAA,cACA,GAAG,SAAA;AAAA,aACD,GAAA,IAAA,CAAA;AACJ,YAAI,IAAA,IAAA,IAAQ,CAAC,SAAA,CAAU,QAAU,EAAA;AAC/B,cAAA,SAAA,CAAU,QAAW,GAAA,IAAA,CAAA;AAAA,aACvB;AACA,YAAO,MAAA,CAAA,MAAA,CAAO,UAAU,SAAS,CAAA,CAAA;AACjC,YAAe,YAAA,GAAA,KAAA,CAAA;AAAA,WACjB;AACA,UAAA,IAAA,GAAO,IAAID,SAAS,EAAA,CAAA;AACpB,UAAK,IAAA,CAAA,MAAA,CAAO,MAAQ,EAAA,YAAA,EAAc,QAAQ,CAAA,CAAA;AAC1C,UAAA,IAAI,IAAM,EAAA;AACR,YAAA,KAAA,MAAW,KAAK,IAAM,EAAA;AACpB,cAAA,IAAA,CAAK,MAAO,CAAA,CAAA,EAAG,IAAK,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,aACxB;AAAA,WACF;AACA,UAAO,MAAA,CAAA,MAAA,CAAO,WAAW,OAAS,EAAA;AAAA;AAAA,YAEhC,GAAG,KAAK,UAAW,EAAA;AAAA,WACpB,CAAA,CAAA;AAAA,SACH;AAEA,QAAA,IAAI,SAAS,KAAW,CAAA,EAAA;AACtB,UAAO,MAAA,CAAA,MAAA,CAAO,WAAW,OAAS,EAAA;AAAA,YAChC,cAAgB,EAAA,kBAAA;AAAA,YAChB,gBAAA,EAAkB,MAAO,CAAA,UAAA,CAAW,IAAI,CAAA;AAAA,WACzC,CAAA,CAAA;AAAA,SACH;AACA,QAAA,MAAM,MAAM,OAAQ,CAAA,OAAA,CAAQC,IAAK,EAAA,UAAA,EAAY,CAAC,IAAc,KAAA;AAC1D,UAAA,IAAIC,KAAO,GAAA,EAAA,CAAA;AACX,UAAK,IAAA,CAAA,EAAA,CAAG,MAAQ,EAAA,CAAC,KAAe,KAAA;AAC9B,YAAAA,KAAQ,IAAA,KAAA,CAAA;AAAA,WACT,CAAA,CAAA;AACD,UAAK,IAAA,CAAA,EAAA,CAAG,OAAO,MAAM;AACnB,YAAA,IAAIA,KAAM,EAAA;AACR,cAAA,IAAI,iBAAiB,MAAQ,EAAA;AAC3B,gBAAA,OAAA,CAAQA,KAAI,CAAA,CAAA;AAAA,eACP,MAAA;AACL,gBAAI,IAAA,IAAA,CAAA;AACJ,gBAAI,IAAA;AACF,kBAAO,IAAA,GAAA,IAAA,CAAK,MAAMA,KAAI,CAAA,CAAA;AACtB,kBAAA,IAAI,IAAQ,IAAA,IAAA,CAAK,WAAe,IAAA,IAAA,CAAK,WAAa,EAAA;AAChD,oBAAA,MAAA,CAAO,KAAK,OAAO,CAAA,CAAA;AAAA,mBACrB;AAAA,yBACO,EAAI,EAAA;AACX,kBAAA,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,iBACX;AACA,gBAAA,IAAI,SAAS,KAAW,CAAA,EAAA;AACtB,kBAAI,IAAA,OAAA,CAAQ,IAAI,CAAG,EAAA;AACjB,oBAAA,MAAA,CAAO,oBAAoB,CAAA,CAAA;AAAA,mBACtB,MAAA;AACL,oBAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,mBACd;AAAA,iBACF;AAAA,eACF;AAAA,aACF;AACA,YAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,WACjB,CAAA,CAAA;AAAA,SACF,CAAA,CAAA;AACD,QAAA,IAAI,IAAM,EAAA;AACR,UAAA,IAAA,CAAK,KAAK,GAAG,CAAA,CAAA;AAAA,SACf;AACA,QAAI,GAAA,CAAA,EAAA,CAAG,OAAS,EAAA,CAAC,GAAa,KAAA;AAC5B,UAAA,MAAA,CAAO,GAAG,CAAA,CAAA;AAAA,SACX,CAAA,CAAA;AACD,QAAA,IAAI,IAAM,EAAA;AACR,UAAA,GAAA,CAAI,MAAM,IAAI,CAAA,CAAA;AAAA,SAChB;AACA,QAAA,QAAA,CAAS,MAAM;AACb,UAAA,GAAA,CAAI,KAAM,EAAA,CAAA;AAAA,SACX,CAAA,CAAA;AACD,QAAA,GAAA,CAAI,GAAI,EAAA,CAAA;AAAA,OACH,MAAA;AACL,QAAA,MAAM,IAAI,KAAA,CAAM,CAAcD,WAAAA,EAAAA,IAAG,CAAkB,gBAAA,CAAA,CAAA,CAAA;AAAA,OACrD;AAAA,KACD,CAAA,CAAA;AACD,IAAO,OAAA,OAAA,CACJ,IAAK,CAAA,CAACC,KAAS,KAAA;AACd,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA,QAAA,CAASA,KAAI,CAAA,CAAA;AAAA,OACf;AACA,MAAOA,OAAAA,KAAAA,CAAAA;AAAA,KACR,CAAA,CACA,KAAM,CAAA,CAAC,EAAO,KAAA;AACb,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,KAAA,CAAM,EAAE,CAAA,CAAA;AAAA,OACH,MAAA;AACL,QAAM,MAAA,IAAI,MAAM,EAAE,CAAA,CAAA;AAAA,OACpB;AAAA,KACD,CAAA,CAAA;AAAA,GACL,CAAA;AACF;;;;;AC/OA,IAAI,EAAK,GAAA,CAAA,CAAA;AACT,IAAI,UAAa,GAAA,CAAA,CAAA;AAEV,MAAM,YAAa,CAAA;AAAA,EAmBxB,YAAmB,OAA8B,EAAA;AAA9B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA,CAAA;AAdnB,IAAK,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AACL,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAU,IAAIC,mBAAa,EAAA,CAAA,CAAA;AAC3B,IAAA,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA;AAEA,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,EAAS,CAAyB,sBAAA,EAAA,GAAA,CAAI,OAAO,CAAA,CAAA,CAAA,CAAA;AACrD,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAW,EAAA,8BAAA,CAAA,CAAA;AACnB,IAAA,aAAA,CAAA,IAAA,EAAQ,kBAEJ,EAAC,CAAA,CAAA;AACL,IAAQ,aAAA,CAAA,IAAA,EAAA,kBAAA,CAAA,CAAA;AAGN,IAAM,MAAA,KAAA,GAAQ,cAAc,OAAO,CAAA,CAAA;AACnC,IAAA,IAAA,CAAK,QAAQ,IAAI,KAAA,CAAM,EAAE,SAAW,EAAA,OAAA,CAAQ,SAAS,CAAA,CAAA;AACrD,IAAA,IAAI,KAAO,EAAA;AACT,MAAO,OAAA,KAAA,CAAA;AAAA,KACF,MAAA;AACL,MAAA,MAAM,EAAE,KAAA,EAAO,gBAAkB,EAAA,eAAA,KAAoB,IAAK,CAAA,OAAA,CAAA;AAC1D,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,IAAA,CAAK,QAAW,GAAA,KAAA,CAAA;AAAA,OAClB;AACA,MAAA,IAAI,gBAAkB,EAAA;AACpB,QAAA,IAAA,CAAK,gBAAmB,GAAA,gBAAA,CAAA;AAAA,OAC1B;AACA,MAAA,IAAI,oBAAoB,KAAW,CAAA,EAAA;AACjC,QAAA,IAAA,CAAK,eAAkB,GAAA,eAAA,CAAA;AAAA,OACzB;AACA,MAAK,IAAA,CAAA,SAAA,GAAY,IAAI,gBAAiB,CAAA;AAAA,QACpC,SAAW,EAAA,IAAA;AAAA,QACX,SAAS,OAAQ,CAAA,OAAA;AAAA,OAClB,CAAA,CAAA;AACD,MAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAAA,KACnB;AAAA,GACF;AAAA,EAEA,OAAO,OAAO,OAA4C,EAAA;AACxD,IAAO,OAAA,IAAI,KAAK,OAAO,CAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB,GAAA;AACjB,IAAA,IAAA,CAAK,MAAM,KAAM,EAAA,CAAA;AACjB,IAAK,IAAA,CAAA,SAAA,CAAU,MAAM,KAAM,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,oBACE,gBACA,EAAA;AACA,IAAA,IAAA,CAAK,gBAAmB,GAAA,gBAAA,CAAA;AAAA,GAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAuB,EAAA;AAC5B,IAAA,IAAA,CAAK,MAAO,EAAA,CAAA;AACZ,IAAA,IAAA,CAAK,QAAQ,OAAU,GAAA,OAAA,CAAA;AACvB,IAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAAA,GACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,OAAiC,GAAA;AACrC,IAAM,MAAA,IAAA,GAAO,KAAK,OAAQ,CAAA,IAAA,CAAA;AAE1B,IAAA,IAAI,IAAM,EAAA;AACR,MAAM,MAAA,EAAE,KAAO,EAAA,QAAA,EAAa,GAAA,IAAA,CAAA;AAC5B,MAAA,IAAI,SAAS,QAAU,EAAA;AACrB,QAAA,MAAM,IAAK,CAAA,MAAA,CAAO,EAAE,KAAA,EAAO,UAAU,CAAA,CAAA;AAAA,OACvC;AAAA,KACF;AACA,IAAA,MAAM,WAAW,CAAG,EAAA,IAAA,CAAK,QAAQ,CAAA,QAAA,EAAW,KAAK,MAAM,CAAA,CAAA,CAAA;AACvD,IAAA,OAAO,MAAM,IAAK,CAAA,SAAA;AAAA,MAChB,QAAA;AAAA,MACA,EAAC;AAAA,MACD;AAAA,QACE,SAAW,EAAA,OAAA;AAAA,QACX,KAAO,EAAA,IAAA;AAAA,QACP,UAAY,EAAA;AAAA,UACV,IAAI,IAAK,CAAA,EAAA;AAAA,UACT,IAAA;AAAA,UACA,OAAA,EAAS,KAAK,OAAQ,CAAA,OAAA;AAAA,SACxB;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,CAAM,aAA0B,OAA6C,EAAA;AAC3E,IAAA,IAAA,CAAK,MAAO,EAAA,CAAA;AACZ,IAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AACjB,IAAO,OAAA,IAAA,CAAK,MAAO,CAAA,WAAA,EAAa,OAAO,CAAA,CAAA;AAAA,GACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAe,GAAA;AACb,IAAA,IAAA,CAAK,KAAM,EAAA,CAAA;AACX,IAAA,eAAA,CAAgB,IAAI,CAAA,CAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,IAAO,GAAA,KAAA,CAAA,CAAA;AACpB,IAAA,IAAA,CAAK,IAAO,GAAA,KAAA,CAAA,CAAA;AACZ,IAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAChB,IAAK,IAAA,CAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA,CAAA;AAAA,GAC5B;AAAA,EAEA,MAAM,WACJ,CAAA,WAAA,EACA,OACmB,EAAA;AACnB,IAAA,IAAI,IAAK,CAAA,IAAA,IAAQ,IAAK,CAAA,IAAA,CAAK,EAAI,EAAA;AAC7B,MAAA,OAAO,IAAK,CAAA,IAAA,CAAA;AAAA,KACd;AACA,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,IAAA,CAAK,QAAQ,IAAO,GAAA,WAAA,CAAA;AAAA,KACtB;AACA,IAAA,MAAM,QAA2B,GAAA;AAAA,MAC/B,OAAA,EAAS,IAAK,CAAA,uBAAA,CAAwB,WAAW,CAAA;AAAA,MACjD,GAAG,OAAA;AAAA,KACL,CAAA;AAGA,IAAA,OAAO,IAAK,CAAA,SAAA;AAAA,MACV,kCAAA;AAAA,MACA,EAAC;AAAA,MACD,QAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA,EAKA,wBACE,WAC4B,EAAA;AAC5B,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,YAAA,CAAa,WAAW,CAAA,CAAA;AAC5C,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAA;AAAA,QACL,aAAA,EAAe,SAAS,MAAM,CAAA,CAAA;AAAA,OAChC,CAAA;AAAA,KACF;AAAA,GACF;AAAA,EAEA,aAAa,WAA+C,EAAA;AAC1D,IAAc,WAAA,GAAA,WAAA,IAAe,KAAK,OAAQ,CAAA,IAAA,CAAA;AAC1C,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,MAAA,EAAE,KAAO,EAAA,QAAA,EAAa,GAAA,WAAA,CAAA;AAC5B,MAAA,MAAM,GAAM,GAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAA;AAChC,MAAM,MAAA,UAAA,GAAa,mBAAmB,GAAG,CAAA,CAAA;AAEzC,MAEO;AACL,QAAA,OAAO,MAAO,CAAA,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,QAAQ,CAAA,CAAA;AAAA,OAClD;AAAA,KACF;AAAA,GACF;AAAA;AAAA,EAGA,KAAQ,GAAA;AACN,IAAA,KAAA,MAAW,eAAmB,IAAA,MAAA,CAAO,MAAO,CAAA,IAAA,CAAK,cAAc,CAAG,EAAA;AAChE,MAAA,eAAA,CAAgB,KAAM,EAAA,CAAA;AAAA,KACxB;AACA,IAAA,IAAA,CAAK,iBAAiB,EAAC,CAAA;AAAA,GACzB;AAAA,EAEA,oBAAuB,GAAA;AACrB,IAAO,OAAA,EAAE,GAAG,IAAA,CAAK,cAAe,EAAA,CAAA;AAAA,GAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,WAIE,IACA,EAAA,OAAA,GAAiC,EACjC,EAAA,cAAA,GAAiC,EAClB,EAAA;AAzRnB,IAAA,IAAA,EAAA,CAAA;AA0RI,IAAU,OAAA,GAAA,CAAA,EAAA,GAAA,cAAA,CAAe,WAAf,IAAyB,GAAA,EAAA,GAAA,OAAA,CAAA;AACnC,IAAM,MAAA,MAAA,GAASC,wBAAkB,OAAO,CAAA,CAAA;AACxC,IAAA,OAAO,WAAW,EAAE,IAAA,EAAM,QAAQ,cAAgB,EAAA,SAAA,EAAW,MAAM,CAAA,CAAA;AAAA,GACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,IAAA,CACE,IACA,EAAA,OAAA,EACA,MACyC,EAAA;AACzC,IAAA,OAAA,GAAU,WAAW,EAAC,CAAA;AACtB,IAAA,OAAA,CAAQ,MAAS,GAAA,MAAA,CAAA;AACjB,IAAA,OAAO,IAAK,CAAA,UAAA;AAAA,MACV,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,CACE,IACA,EAAA,OAAA,EACA,MACwC,EAAA;AACxC,IAAA,OAAA,GAAU,WAAW,EAAC,CAAA;AACtB,IAAA,OAAA,CAAQ,MAAS,GAAA,KAAA,CAAA;AACjB,IAAA,OAAO,IAAK,CAAA,UAAA;AAAA,MACV,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,CACE,IACA,EAAA,OAAA,EACA,MAC0C,EAAA;AAC1C,IAAA,OAAA,GAAU,WAAW,EAAC,CAAA;AACtB,IAAA,OAAA,CAAQ,MAAS,GAAA,OAAA,CAAA;AACjB,IAAA,OAAO,IAAK,CAAA,UAAA;AAAA,MACV,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,CACE,IACA,EAAA,OAAA,EACA,MACwC,EAAA;AACxC,IAAA,OAAA,GAAU,WAAW,EAAC,CAAA;AACtB,IAAA,OAAA,CAAQ,MAAS,GAAA,KAAA,CAAA;AACjB,IAAA,OAAO,IAAK,CAAA,UAAA;AAAA,MACV,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CACE,IACA,EAAA,OAAA,EACA,MAC2C,EAAA;AAC3C,IAAA,OAAA,GAAU,WAAW,EAAC,CAAA;AACtB,IAAA,OAAA,CAAQ,MAAS,GAAA,QAAA,CAAA;AACjB,IAAA,OAAO,IAAK,CAAA,UAAA;AAAA,MACV,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SACJ,CAAA,GAAA,EACA,MACA,EAAA,OAAA,GAA0B,EACd,EAAA;AApZhB,IAAA,IAAA,EAAA,CAAA;AAqZI,IAAA,GAAA,GAAA,CAAO,KAAK,OAAQ,CAAA,OAAA,GAAU,IAAK,CAAA,OAAA,CAAQ,UAAU,EAAM,IAAA,GAAA,CAAA;AAC3D,IAAA,IAAI,CAAC,GAAK,EAAA;AACR,MAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA,CAAA;AAAA,KAC3C;AAEA,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,MAAM,EAAE,SAAA,EAAW,GAAG,UAAA,EAAe,GAAA,MAAA,CAAA;AACrC,MAAM,GAAA,GAAA,QAAA,CAAS,KAAK,UAAU,CAAA,CAAA;AAAA,KAChC;AACA,IAAM,GAAA,GAAA,SAAA,CAAUC,eAAU,CAAA,GAAG,CAAC,CAAA,CAAA;AAE9B,IAAA,OAAA,GAAU,EAAE,eAAA,EAAiB,IAAK,CAAA,eAAA,EAAiB,GAAG,OAAQ,EAAA,CAAA;AAE9D,IAAM,MAAA;AAAA,MACJ,KAAA;AAAA,MACA,MAAQ,EAAA,cAAA;AAAA,MACR,MAAS,GAAA,KAAA;AAAA,MACT,OAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,KACE,GAAA,OAAA,CAAA;AAEJ,IAAM,MAAA,uBAAA,GAA0B,IAAI,eAAgB,EAAA,CAAA;AACpD,IAAA,MAAM,iBAAiB,uBAAwB,CAAA,MAAA,CAAA;AAG/C,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,IAAI,eAAe,OAAS,EAAA;AAC1B,QAAA,MAAM,IAAI,UAAW,EAAA,CAAA;AAAA,OACvB;AACA,MAAe,cAAA,CAAA,gBAAA,CAAiB,SAAS,MAAM;AAC7C,QAAA,uBAAA,CAAwB,KAAM,EAAA,CAAA;AAAA,OAC/B,CAAA,CAAA;AAAA,KACH;AAEA,IAAA,OAAA,CAAQ,MAAS,GAAA,cAAA,CAAA;AAEjB,IAAA,MAAM,gBAAgB,YAAY;AAChC,MAAA,MAAM,EAAK,GAAA,UAAA,EAAA,CAAA;AACX,MAAK,IAAA,CAAA,cAAA,CAAe,EAAE,CAAI,GAAA,uBAAA,CAAA;AAC1B,MAAI,IAAA;AACF,QAAO,OAAA,IAAA,CAAK,SAAa,CAAA,GAAA,EAAK,OAAO,CAAA,CAAA;AAAA,OACrC,SAAA;AACA,QAAA,IAAA,CAAK,oBAAoB,EAAE,CAAA,CAAA;AAAA,OAC7B;AAAA,KACF,CAAA;AAEA,IAAI,IAAA,KAAA,IAAS,WAAW,KAAO,EAAA;AAC7B,MAAM,MAAA,YAAA,GAAe,aACjB,UACA,GAAA;AAAA,QACE,GAAGD,uBAAkB,CAAA;AAAA,UACnB,OAAA;AAAA,UACA,eAAA;AAAA,UACA,YAAA;AAAA,UACA,OAAA,EAAS,KAAK,OAAQ,CAAA,OAAA;AAAA,UACtB,MAAA,EAAA,CAAQ,EAAK,GAAA,IAAA,CAAA,IAAA,KAAL,IAAW,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,EAAA;AAAA,SACpB,CAAA;AAAA,QACD,MAAA;AAAA,OACF,CAAA;AACJ,MAAA,OAAO,KAAK,KAAM,CAAA,GAAA;AAAA,QAChB,SAAa,IAAA,GAAA;AAAA,QACb,aAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA;AAAA,OACF,CAAA;AAAA,KACF;AAEA,IAAA,OAAO,aAAc,EAAA,CAAA;AAAA,GACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAA,CACE,UACA,cACmC,EAAA;AACnC,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,MAAO,CAAA,QAAA,EAAU,cAAc,CAAA,CAAA;AAAA,GACvD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CACE,UACA,cACuB,EAAA;AACvB,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,YAAa,CAAA,QAAA,EAAU,cAAc,CAAA,CAAA;AAAA,GAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,cACE,QACmC,EAAA;AACnC,IAAO,OAAA,IAAA,CAAK,SAAU,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,GACvC;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,OAAoD,EAAA;AACvE,IAAO,OAAA,IAAA,CAAK,SAAU,CAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,GACtC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,EAA+C,EAAA;AAC7D,IAAO,OAAA,IAAA,CAAK,SAAU,CAAA,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,GACjC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CACE,UACA,cAC6B,EAAA;AAC7B,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,QAAA,EAAU,cAAc,CAAA,CAAA;AAAA,GACtD;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,CACE,UACA,cACiB,EAAA;AACjB,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,WAAY,CAAA,QAAA,EAAU,cAAc,CAAA,CAAA;AAAA,GAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CACE,UACA,cACyB,EAAA;AACzB,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,OAAQ,CAAA,QAAA,EAAU,cAAc,CAAA,CAAA;AAAA,GACxD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CACE,UACA,cACmC,EAAA;AACnC,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,SAAU,CAAA,QAAA,EAAU,cAAc,CAAA,CAAA;AAAA,GAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,CACE,UACA,cACyB,EAAA;AACzB,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,aAAc,CAAA,QAAA,EAAU,cAAc,CAAA,CAAA;AAAA,GAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CACE,UACA,IACmC,EAAA;AACnC,IAAA,OAAO,IAAK,CAAA,SAAA,CAAU,MAAO,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAAA,GAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAA+C,EAAA;AAC5D,IAAO,OAAA,IAAA,CAAK,SAAU,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,GACvC;AAAA;AAAA;AAAA;AAAA,EAKU,SAAA,CACR,KACA,OACY,EAAA;AACZ,IAAQ,OAAA,CAAA,YAAA,GAAe,QAAQ,YAAgB,IAAA,MAAA,CAAA;AAE/C,IAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAW,KAAA;AAzlB/C,MAAA,IAAA,EAAA,CAAA;AA0lBM,MAAA,IAAI,KAAK,IAAM,EAAA;AACb,QAAA,OAAA,GAAU,WAAW,EAAC,CAAA;AACtB,QAAA,OAAA,CAAQ,OAAU,GAAA;AAAA,UAChB,GAAG,KAAK,uBAAwB,EAAA;AAAA,UAChC,GAAG,OAAQ,CAAA,OAAA;AAAA,SACb,CAAA;AAAA,OACF;AAEA,MAAA,IAAI,KAAK,gBAAkB,EAAA;AACzB,QAAA,MAAM,CAAC,QAAU,EAAA,YAAY,IAAI,IAAK,CAAA,gBAAA,CAAiB,KAAK,OAAO,CAAA,CAAA;AACnE,QAAM,GAAA,GAAA,QAAA,CAAA;AACN,QAAU,OAAA,GAAA,YAAA,CAAA;AAAA,OACZ;AAEA,MAAA,IAAI,UAAuC,GAAA,KAAA,CAAA,CAAA;AAE3C,MAAA,QAAA,CAAS,GAAK,EAAA,OAAA,EAAS,OAAS,EAAA,MAAA,EAAQ,CAAC,OAAwB,KAAA;AAC/D,QAAa,UAAA,GAAA,OAAA,CAAA;AAAA,OACd,CAAA,CAAA;AAED,MAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,MAAR,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgB,gBAAiB,CAAA,OAAA,EAAS,MAAM;AAC9C,QAAA,IAAI,eAAe,KAAW,CAAA,EAAA;AAC5B,UAAW,UAAA,EAAA,CAAA;AAAA,SACb;AACA,QAAO,MAAA,CAAA,IAAI,YAAY,CAAA,CAAA;AAAA,OACzB,CAAA,CAAA;AAAA,KACD,CAAA,CAAE,KAAM,CAAA,CAAC,SAAc,KAAA;AACtB,MAAI,IAAA,SAAA,CAAU,SAAS,YAAc,EAAA;AACnC,QAAa;AACX,UAAQ,OAAA,CAAA,IAAA,CAAK,YAAY,SAAS,CAAA,CAAA;AAAA,SACpC;AACA,QAAM,MAAA,EAAA,GAAK,IAAK,CAAA,gBAAA,CAAiB,SAAS,CAAA,CAAA;AAC1C,QAAA,IAAI,EAAI,EAAA;AACN,UAAM,MAAA,EAAA,CAAA;AAAA,SACR;AAAA,OACF;AACA,MAAM,MAAA,SAAA,CAAA;AAAA,KACP,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,MAAc,MACZ,CAAA,WAAA,EACA,OACmB,EAAA;AACnB,IAAI,IAAA;AACF,MAAA,MAAM,IAAO,GAAA,MAAM,IAAK,CAAA,WAAA,CAAY,aAAa,OAAO,CAAA,CAAA;AACxD,MAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AACZ,MAAK,IAAA,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAC/B,MAAO,OAAA,IAAA,CAAA;AAAA,aACA,EAAI,EAAA;AACX,MAAK,IAAA,CAAA,OAAA,CAAQ,IAAK,CAAA,aAAA,EAAe,EAAE,CAAA,CAAA;AACnC,MAAM,MAAA,EAAA,CAAA;AAAA,KACR;AAAA,GACF;AAAA,EAEQ,oBAAoB,SAAmB,EAAA;AAC7C,IAAO,OAAA,IAAA,CAAK,eAAe,SAAS,CAAA,CAAA;AAAA,GACtC;AAAA,EAEQ,iBAAiB,EAAW,EAAA;AAClC,IAAA,IAAI,EAAI,EAAA;AACN,MAAA,IAAI,cAAc,QAAU,EAAA;AAC1B,QAAI,IAAA,EAAA,CAAG,cAAc,gDAAkD,EAAA;AACrE,UAAM,MAAA,IAAI,sBAAsB,EAAE,CAAA,CAAA;AAAA,SACpC,MAAA,IACE,EAAG,CAAA,SAAA,KAAc,mDACjB,EAAA;AACA,UAAM,MAAA,IAAI,6BAA6B,EAAE,CAAA,CAAA;AAAA,SAC3C;AAAA,OACF;AAAA,KACF;AACA,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACF,CAAA;AAjnBE,aAAA,CADW,cACJ,QAAS,EAAA;AAAA,EACd,QAAA;AAAA,EACA,qBAAA;AACF,CAAA,CAAA;;;;"}