{"version":3,"file":"ej2-data.min.js","sources":["../../src/query.js","../../src/util.js","../../src/adaptors.js","../../src/manager.js"],"sourcesContent":["/* eslint-disable valid-jsdoc */\n/* eslint-disable security/detect-object-injection */\nimport { DataUtil } from './util';\nimport { isNullOrUndefined } from '@syncfusion/ej2-base';\n/**\n * Query class is used to build query which is used by the DataManager to communicate with datasource.\n */\nvar Query = /** @class */ (function () {\n /**\n * Constructor for Query class.\n *\n * @param {string|string[]} from?\n * @param from\n * @hidden\n */\n function Query(from) {\n /** @hidden */\n this.subQuery = null;\n /** @hidden */\n this.isChild = false;\n /** @hidden */\n this.distincts = [];\n this.queries = [];\n this.key = '';\n this.fKey = '';\n if (typeof from === 'string') {\n this.fromTable = from;\n }\n else if (from && from instanceof Array) {\n this.lookups = from;\n }\n this.expands = [];\n this.sortedColumns = [];\n this.groupedColumns = [];\n this.subQuery = null;\n this.isChild = false;\n this.params = [];\n this.lazyLoad = [];\n return this;\n }\n /**\n * Sets the primary key.\n *\n * @param {string} field - Defines the column field.\n */\n Query.prototype.setKey = function (field) {\n this.key = field;\n return this;\n };\n /**\n * Sets default DataManager to execute query.\n *\n * @param {DataManager} dataManager - Defines the DataManager.\n */\n Query.prototype.using = function (dataManager) {\n this.dataManager = dataManager;\n return this;\n };\n /**\n * Executes query with the given DataManager.\n *\n * @param {DataManager} dataManager - Defines the DataManager.\n * @param {Function} done - Defines the success callback.\n * @param {Function} fail - Defines the failure callback.\n * @param {Function} always - Defines the callback which will be invoked on either success or failure.\n *\n *
\n     * let dataManager: DataManager = new DataManager([{ ID: '10' }, { ID: '2' }, { ID: '1' }, { ID: '20' }]);\n     * let query: Query = new Query();\n     * query.sortBy('ID', (x: string, y: string): number => { return parseInt(x, 10) - parseInt(y, 10) });\n     * let promise: Promise< Object > = query.execute(dataManager);\n     * promise.then((e: { result: Object }) => { });\n     * 
\n */\n Query.prototype.execute = function (dataManager, done, fail, always) {\n dataManager = dataManager || this.dataManager;\n if (dataManager) {\n return dataManager.executeQuery(this, done, fail, always);\n }\n return DataUtil.throwError('Query - execute() : dataManager needs to be is set using \"using\" function or should be passed as argument');\n };\n /**\n * Executes query with the local datasource.\n *\n * @param {DataManager} dataManager - Defines the DataManager.\n */\n Query.prototype.executeLocal = function (dataManager) {\n dataManager = dataManager || this.dataManager;\n if (dataManager) {\n return dataManager.executeLocal(this);\n }\n return DataUtil.throwError('Query - executeLocal() : dataManager needs to be is set using \"using\" function or should be passed as argument');\n };\n /**\n * Creates deep copy of the Query object.\n */\n Query.prototype.clone = function () {\n var cloned = new Query();\n cloned.queries = this.queries.slice(0);\n cloned.key = this.key;\n cloned.isChild = this.isChild;\n cloned.dataManager = this.dataManager;\n cloned.fromTable = this.fromTable;\n cloned.params = this.params.slice(0);\n cloned.expands = this.expands.slice(0);\n cloned.sortedColumns = this.sortedColumns.slice(0);\n cloned.groupedColumns = this.groupedColumns.slice(0);\n cloned.subQuerySelector = this.subQuerySelector;\n cloned.subQuery = this.subQuery;\n cloned.fKey = this.fKey;\n cloned.isCountRequired = this.isCountRequired;\n cloned.distincts = this.distincts.slice(0);\n cloned.lazyLoad = this.lazyLoad.slice(0);\n return cloned;\n };\n /**\n * Specifies the name of table to retrieve data in query execution.\n *\n * @param {string} tableName - Defines the table name.\n */\n Query.prototype.from = function (tableName) {\n this.fromTable = tableName;\n return this;\n };\n /**\n * Adds additional parameter which will be sent along with the request which will be generated while DataManager execute.\n *\n * @param {string} key - Defines the key of additional parameter.\n * @param {Function|string} value - Defines the value for the key.\n */\n Query.prototype.addParams = function (key, value) {\n if (typeof value === 'function') {\n this.params.push({ key: key, fn: value });\n }\n else {\n this.params.push({ key: key, value: value });\n }\n return this;\n };\n /**\n * @param fields\n * @hidden\n */\n Query.prototype.distinct = function (fields) {\n if (typeof fields === 'string') {\n this.distincts = [].slice.call([fields], 0);\n }\n else {\n this.distincts = fields.slice(0);\n }\n return this;\n };\n /**\n * Expands the related table.\n *\n * @param {string|Object[]} tables\n */\n Query.prototype.expand = function (tables) {\n if (typeof tables === 'string') {\n this.expands = [].slice.call([tables], 0);\n }\n else {\n this.expands = tables.slice(0);\n }\n return this;\n };\n /**\n * Filter data with given filter criteria.\n *\n * @param {string|Predicate} fieldName - Defines the column field or Predicate.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string|number|boolean} value - Defines the values to match with data.\n * @param {boolean} ignoreCase - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreAccent\n * @param matchCase\n */\n Query.prototype.where = function (fieldName, operator, value, ignoreCase, ignoreAccent, matchCase) {\n operator = operator ? (operator).toLowerCase() : null;\n var predicate = null;\n if (typeof fieldName === 'string') {\n predicate = new Predicate(fieldName, operator, value, ignoreCase, ignoreAccent, matchCase);\n }\n else if (fieldName instanceof Predicate) {\n predicate = fieldName;\n }\n this.queries.push({\n fn: 'onWhere',\n e: predicate\n });\n return this;\n };\n /**\n * Search data with given search criteria.\n *\n * @param {string|number|boolean} searchKey - Defines the search key.\n * @param {string|string[]} fieldNames - Defines the collection of column fields.\n * @param {string} operator - Defines the operator how to search data.\n * @param {boolean} ignoreCase - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreAccent\n */\n Query.prototype.search = function (searchKey, fieldNames, operator, ignoreCase, ignoreAccent) {\n if (typeof fieldNames === 'string') {\n fieldNames = [fieldNames];\n }\n if (!operator || operator === 'none') {\n operator = 'contains';\n }\n var comparer = DataUtil.fnOperators[operator];\n this.queries.push({\n fn: 'onSearch',\n e: {\n fieldNames: fieldNames,\n operator: operator,\n searchKey: searchKey,\n ignoreCase: ignoreCase,\n ignoreAccent: ignoreAccent,\n comparer: comparer\n }\n });\n return this;\n };\n /**\n * Sort the data with given sort criteria.\n * By default, sort direction is ascending.\n *\n * @param {string|string[]} fieldName - Defines the single or collection of column fields.\n * @param {string|Function} comparer - Defines the sort direction or custom sort comparer function.\n * @param isFromGroup\n */\n Query.prototype.sortBy = function (fieldName, comparer, isFromGroup) {\n return this.sortByForeignKey(fieldName, comparer, isFromGroup);\n };\n /**\n * Sort the data with given sort criteria.\n * By default, sort direction is ascending.\n *\n * @param {string|string[]} fieldName - Defines the single or collection of column fields.\n * @param {string|Function} comparer - Defines the sort direction or custom sort comparer function.\n * @param isFromGroup\n * @param {string} direction - Defines the sort direction .\n */\n Query.prototype.sortByForeignKey = function (fieldName, comparer, isFromGroup, direction) {\n var order = !isNullOrUndefined(direction) ? direction : 'ascending';\n var sorts;\n var temp;\n if (typeof fieldName === 'string' && DataUtil.endsWith(fieldName.toLowerCase(), ' desc')) {\n fieldName = fieldName.replace(/ desc$/i, '');\n comparer = 'descending';\n }\n if (!comparer || typeof comparer === 'string') {\n order = comparer ? comparer.toLowerCase() : 'ascending';\n comparer = DataUtil.fnSort(comparer);\n }\n if (isFromGroup) {\n sorts = Query.filterQueries(this.queries, 'onSortBy');\n for (var i = 0; i < sorts.length; i++) {\n temp = sorts[i].e.fieldName;\n if (typeof temp === 'string') {\n if (temp === fieldName) {\n return this;\n }\n }\n else if (temp instanceof Array) {\n for (var j = 0; j < temp.length; j++) {\n if (temp[j] === fieldName || fieldName.toLowerCase() === temp[j] + ' desc') {\n return this;\n }\n }\n }\n }\n }\n this.queries.push({\n fn: 'onSortBy',\n e: {\n fieldName: fieldName,\n comparer: comparer,\n direction: order\n }\n });\n return this;\n };\n /**\n * Sorts data in descending order.\n *\n * @param {string} fieldName - Defines the column field.\n */\n Query.prototype.sortByDesc = function (fieldName) {\n return this.sortBy(fieldName, 'descending');\n };\n /**\n * Groups data with the given field name.\n *\n * @param {string} fieldName - Defines the column field.\n * @param fn\n * @param format\n */\n Query.prototype.group = function (fieldName, fn, format) {\n this.sortBy(fieldName, null, true);\n this.queries.push({\n fn: 'onGroup',\n e: {\n fieldName: fieldName,\n comparer: fn ? fn : null,\n format: format ? format : null\n }\n });\n return this;\n };\n /**\n * Gets data based on the given page index and size.\n *\n * @param {number} pageIndex - Defines the current page index.\n * @param {number} pageSize - Defines the no of records per page.\n */\n Query.prototype.page = function (pageIndex, pageSize) {\n this.queries.push({\n fn: 'onPage',\n e: {\n pageIndex: pageIndex,\n pageSize: pageSize\n }\n });\n return this;\n };\n /**\n * Gets data based on the given start and end index.\n *\n * @param {number} start - Defines the start index of the datasource.\n * @param {number} end - Defines the end index of the datasource.\n */\n Query.prototype.range = function (start, end) {\n this.queries.push({\n fn: 'onRange',\n e: {\n start: start,\n end: end\n }\n });\n return this;\n };\n /**\n * Gets data from the top of the data source based on given number of records count.\n *\n * @param {number} nos - Defines the no of records to retrieve from datasource.\n */\n Query.prototype.take = function (nos) {\n this.queries.push({\n fn: 'onTake',\n e: {\n nos: nos\n }\n });\n return this;\n };\n /**\n * Skips data with given number of records count from the top of the data source.\n *\n * @param {number} nos - Defines the no of records skip in the datasource.\n */\n Query.prototype.skip = function (nos) {\n this.queries.push({\n fn: 'onSkip',\n e: { nos: nos }\n });\n return this;\n };\n /**\n * Selects specified columns from the data source.\n *\n * @param {string|string[]} fieldNames - Defines the collection of column fields.\n */\n Query.prototype.select = function (fieldNames) {\n if (typeof fieldNames === 'string') {\n fieldNames = [].slice.call([fieldNames], 0);\n }\n this.queries.push({\n fn: 'onSelect',\n e: { fieldNames: fieldNames }\n });\n return this;\n };\n /**\n * Gets the records in hierarchical relationship from two tables. It requires the foreign key to relate two tables.\n *\n * @param {Query} query - Defines the query to relate two tables.\n * @param {Function} selectorFn - Defines the custom function to select records.\n */\n Query.prototype.hierarchy = function (query, selectorFn) {\n this.subQuerySelector = selectorFn;\n this.subQuery = query;\n return this;\n };\n /**\n * Sets the foreign key which is used to get data from the related table.\n *\n * @param {string} key - Defines the foreign key.\n */\n Query.prototype.foreignKey = function (key) {\n this.fKey = key;\n return this;\n };\n /**\n * It is used to get total number of records in the DataManager execution result.\n */\n Query.prototype.requiresCount = function () {\n this.isCountRequired = true;\n return this;\n };\n //type - sum, avg, min, max\n /**\n * Aggregate the data with given type and field name.\n *\n * @param {string} type - Defines the aggregate type.\n * @param {string} field - Defines the column field to aggregate.\n */\n Query.prototype.aggregate = function (type, field) {\n this.queries.push({\n fn: 'onAggregates',\n e: { field: field, type: type }\n });\n return this;\n };\n /**\n * Pass array of filterColumn query for performing filter operation.\n *\n * @param {QueryOptions[]} queries\n * @param {string} name\n * @hidden\n */\n Query.filterQueries = function (queries, name) {\n return queries.filter(function (q) {\n return q.fn === name;\n });\n };\n /**\n * To get the list of queries which is already filtered in current data source.\n *\n * @param {Object[]} queries\n * @param {string[]} singles\n * @hidden\n */\n Query.filterQueryLists = function (queries, singles) {\n var filtered = queries.filter(function (q) {\n return singles.indexOf(q.fn) !== -1;\n });\n var res = {};\n for (var i = 0; i < filtered.length; i++) {\n if (!res[filtered[i].fn]) {\n res[filtered[i].fn] = filtered[i].e;\n }\n }\n return res;\n };\n return Query;\n}());\nexport { Query };\n/**\n * Predicate class is used to generate complex filter criteria.\n * This will be used by DataManager to perform multiple filtering operation.\n */\nvar Predicate = /** @class */ (function () {\n /**\n * Constructor for Predicate class.\n *\n * @param {string|Predicate} field\n * @param {string} operator\n * @param {string|number|boolean|Predicate|Predicate[]} value\n * @param {boolean=false} ignoreCase\n * @param ignoreAccent\n * @param {boolean} matchCase\n * @hidden\n */\n function Predicate(field, operator, value, ignoreCase, ignoreAccent, matchCase) {\n if (ignoreCase === void 0) { ignoreCase = false; }\n /** @hidden */\n this.ignoreAccent = false;\n /** @hidden */\n this.isComplex = false;\n if (typeof field === 'string') {\n this.field = field;\n this.operator = operator.toLowerCase();\n this.value = value;\n this.matchCase = matchCase;\n this.ignoreCase = ignoreCase;\n this.ignoreAccent = ignoreAccent;\n this.isComplex = false;\n this.comparer = DataUtil.fnOperators.processOperator(this.operator);\n }\n else if (field instanceof Predicate && value instanceof Predicate || value instanceof Array) {\n this.isComplex = true;\n this.condition = operator.toLowerCase();\n this.predicates = [field];\n this.matchCase = field.matchCase;\n this.ignoreCase = field.ignoreCase;\n this.ignoreAccent = field.ignoreAccent;\n if (value instanceof Array) {\n [].push.apply(this.predicates, value);\n }\n else {\n this.predicates.push(value);\n }\n }\n return this;\n }\n /**\n * Adds n-number of new predicates on existing predicate with “and” condition.\n *\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.and = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'and');\n };\n /**\n * Adds new predicate on existing predicate with “and” condition.\n *\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreCase\n * @param ignoreAccent\n */\n Predicate.prototype.and = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'and', ignoreCase, ignoreAccent);\n };\n /**\n * Adds n-number of new predicates on existing predicate with “or” condition.\n *\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.or = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'or');\n };\n /**\n * Adds new predicate on existing predicate with “or” condition.\n *\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreCase\n * @param ignoreAccent\n */\n Predicate.prototype.or = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'or', ignoreCase, ignoreAccent);\n };\n /**\n * Adds n-number of new predicates on existing predicate with “and not” condition.\n *\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.ornot = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'or not');\n };\n /**\n * Adds new predicate on existing predicate with “and not” condition.\n *\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreCase\n * @param ignoreAccent\n */\n Predicate.prototype.ornot = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'ornot', ignoreCase, ignoreAccent);\n };\n /**\n * Adds n-number of new predicates on existing predicate with “and not” condition.\n *\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.andnot = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'and not');\n };\n /**\n * Adds new predicate on existing predicate with “and not” condition.\n *\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreCase\n * @param ignoreAccent\n */\n Predicate.prototype.andnot = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'andnot', ignoreCase, ignoreAccent);\n };\n /**\n * Converts plain JavaScript object to Predicate object.\n *\n * @param {Predicate[]|Predicate} json - Defines single or collection of Predicate.\n */\n Predicate.fromJson = function (json) {\n if (json instanceof Array) {\n var res = [];\n for (var i = 0, len = json.length; i < len; i++) {\n res.push(this.fromJSONData(json[i]));\n }\n return res;\n }\n var pred = json;\n return this.fromJSONData(pred);\n };\n /**\n * Validate the record based on the predicates.\n *\n * @param {Object} record - Defines the datasource record.\n */\n Predicate.prototype.validate = function (record) {\n var predicate = this.predicates ? this.predicates : [];\n var ret;\n var isAnd;\n if (!this.isComplex && this.comparer) {\n if (this.condition && this.condition.indexOf('not') !== -1) {\n this.condition = this.condition.split('not')[0] === '' ? undefined : this.condition.split('not')[0];\n return !this.comparer.call(this, DataUtil.getObject(this.field, record), this.value, this.ignoreCase, this.ignoreAccent);\n }\n else {\n return this.comparer.call(this, DataUtil.getObject(this.field, record), this.value, this.ignoreCase, this.ignoreAccent);\n }\n }\n if (this.condition && this.condition.indexOf('not') !== -1) {\n isAnd = this.condition.indexOf('and') !== -1;\n }\n else {\n isAnd = this.condition === 'and';\n }\n for (var i = 0; i < predicate.length; i++) {\n if (i > 0 && this.condition && this.condition.indexOf('not') !== -1) {\n predicate[i].condition = predicate[i].condition ? predicate[i].condition + 'not' : 'not';\n }\n ret = predicate[i].validate(record);\n if (isAnd) {\n if (!ret) {\n return false;\n }\n }\n else {\n if (ret) {\n return true;\n }\n }\n }\n return isAnd;\n };\n /**\n * Converts predicates to plain JavaScript.\n * This method is uses Json stringify when serializing Predicate object.\n */\n Predicate.prototype.toJson = function () {\n var predicates;\n var p;\n if (this.isComplex) {\n predicates = [];\n p = this.predicates;\n for (var i = 0; i < p.length; i++) {\n predicates.push(p[i].toJson());\n }\n }\n return {\n isComplex: this.isComplex,\n field: this.field,\n operator: this.operator,\n value: this.value,\n ignoreCase: this.ignoreCase,\n ignoreAccent: this.ignoreAccent,\n condition: this.condition,\n predicates: predicates,\n matchCase: this.matchCase\n };\n };\n Predicate.combinePredicates = function (predicates, operator) {\n if (predicates.length === 1) {\n if (!(predicates[0] instanceof Array)) {\n return predicates[0];\n }\n predicates = predicates[0];\n }\n return new Predicate(predicates[0], operator, predicates.slice(1));\n };\n Predicate.combine = function (pred, field, operator, value, condition, ignoreCase, ignoreAccent) {\n if (field instanceof Predicate) {\n return Predicate[condition](pred, field);\n }\n if (typeof field === 'string') {\n return Predicate[condition](pred, new Predicate(field, operator, value, ignoreCase, ignoreAccent));\n }\n return DataUtil.throwError('Predicate - ' + condition + ' : invalid arguments');\n };\n Predicate.fromJSONData = function (json) {\n var preds = json.predicates || [];\n var len = preds.length;\n var predicates = [];\n var result;\n for (var i = 0; i < len; i++) {\n predicates.push(this.fromJSONData(preds[i]));\n }\n if (!json.isComplex) {\n result = new Predicate(json.field, json.operator, json.value, json.ignoreCase, json.ignoreAccent);\n }\n else {\n result = new Predicate(predicates[0], json.condition, predicates.slice(1));\n }\n return result;\n };\n return Predicate;\n}());\nexport { Predicate };\n","/* eslint-disable valid-jsdoc */\n/* eslint-disable security/detect-object-injection */\nimport { isNullOrUndefined } from '@syncfusion/ej2-base';\nimport { DataManager } from './manager';\nimport { Query, Predicate } from './query';\nvar consts = { GroupGuid: '{271bbba0-1ee7}' };\n/**\n * Data manager common utility methods.\n *\n * @hidden\n */\nvar DataUtil = /** @class */ (function () {\n function DataUtil() {\n }\n /**\n * Returns the value by invoking the provided parameter function.\n * If the paramater is not of type function then it will be returned as it is.\n *\n * @param {Function|string|string[]|number} value\n * @param {Object} inst?\n * @param inst\n * @hidden\n */\n DataUtil.getValue = function (value, inst) {\n if (typeof value === 'function') {\n return value.call(inst || {});\n }\n return value;\n };\n /**\n * Returns true if the input string ends with given string.\n *\n * @param {string} input\n * @param {string} substr\n */\n DataUtil.endsWith = function (input, substr) {\n return input.slice && input.slice(-substr.length) === substr;\n };\n /**\n * Returns true if the input string not ends with given string.\n *\n * @param {string} input\n * @param {string} substr\n */\n DataUtil.notEndsWith = function (input, substr) {\n return input.slice && input.slice(-substr.length) !== substr;\n };\n /**\n * Returns true if the input string starts with given string.\n *\n * @param {string} str\n * @param {string} startstr\n * @param input\n * @param start\n */\n DataUtil.startsWith = function (input, start) {\n return input.slice(0, start.length) === start;\n };\n /**\n * Returns true if the input string not starts with given string.\n *\n * @param {string} str\n * @param {string} startstr\n * @param input\n * @param start\n */\n DataUtil.notStartsWith = function (input, start) {\n return input.slice(0, start.length) !== start;\n };\n /**\n * Returns true if the input string pattern(wildcard) matches with given string.\n *\n * @param {string} str\n * @param {string} startstr\n * @param input\n * @param pattern\n */\n DataUtil.wildCard = function (input, pattern) {\n var asteriskSplit;\n var optionalSplit;\n // special character allowed search\n if (pattern.indexOf('[') !== -1) {\n pattern = pattern.split('[').join('[[]');\n }\n if (pattern.indexOf('(') !== -1) {\n pattern = pattern.split('(').join('[(]');\n }\n if (pattern.indexOf(')') !== -1) {\n pattern = pattern.split(')').join('[)]');\n }\n if (pattern.indexOf('\\\\') !== -1) {\n pattern = pattern.split('\\\\').join('[\\\\\\\\]');\n }\n if (pattern.indexOf('*') !== -1) {\n if (pattern.charAt(0) !== '*') {\n pattern = '^' + pattern;\n }\n if (pattern.charAt(pattern.length - 1) !== '*') {\n pattern = pattern + '$';\n }\n asteriskSplit = pattern.split('*');\n for (var i = 0; i < asteriskSplit.length; i++) {\n if (asteriskSplit[i].indexOf('.') === -1) {\n asteriskSplit[i] = asteriskSplit[i] + '.*';\n }\n else {\n asteriskSplit[i] = asteriskSplit[i] + '*';\n }\n }\n pattern = asteriskSplit.join('');\n }\n if (pattern.indexOf('%3f') !== -1 || pattern.indexOf('?') !== -1) {\n optionalSplit = pattern.indexOf('%3f') !== -1 ? pattern.split('%3f') : pattern.split('?');\n pattern = optionalSplit.join('.');\n }\n // eslint-disable-next-line security/detect-non-literal-regexp\n var regexPattern = new RegExp(pattern, 'g');\n return regexPattern.test(input);\n };\n /**\n * Returns true if the input string pattern(like) matches with given string.\n *\n * @param {string} str\n * @param {string} startstr\n * @param input\n * @param pattern\n */\n DataUtil.like = function (input, pattern) {\n if (pattern.indexOf('%') !== -1) {\n if (pattern.charAt(0) === '%' && pattern.lastIndexOf('%') < 2) {\n pattern = pattern.substring(1, pattern.length);\n return DataUtil.startsWith(DataUtil.toLowerCase(input), DataUtil.toLowerCase(pattern));\n }\n else if (pattern.charAt(pattern.length - 1) === '%' && pattern.indexOf('%') > pattern.length - 3) {\n pattern = pattern.substring(0, pattern.length - 1);\n return DataUtil.endsWith(DataUtil.toLowerCase(input), DataUtil.toLowerCase(pattern));\n }\n else if (pattern.lastIndexOf('%') !== pattern.indexOf('%') && pattern.lastIndexOf('%') > pattern.indexOf('%') + 1) {\n pattern = pattern.substring(pattern.indexOf('%') + 1, pattern.lastIndexOf('%'));\n return input.indexOf(pattern) !== -1;\n }\n else {\n return input.indexOf(pattern) !== -1;\n }\n }\n else {\n return false;\n }\n };\n /**\n * To return the sorting function based on the string.\n *\n * @param {string} order\n * @hidden\n */\n DataUtil.fnSort = function (order) {\n order = order ? DataUtil.toLowerCase(order) : 'ascending';\n if (order === 'ascending') {\n return this.fnAscending;\n }\n return this.fnDescending;\n };\n /**\n * Comparer function which is used to sort the data in ascending order.\n *\n * @param {string|number} x\n * @param {string|number} y\n * @returns number\n */\n DataUtil.fnAscending = function (x, y) {\n if (isNullOrUndefined(x) && isNullOrUndefined(y)) {\n return -1;\n }\n if (y === null || y === undefined) {\n return -1;\n }\n if (typeof x === 'string') {\n return x.localeCompare(y);\n }\n if (x === null || x === undefined) {\n return 1;\n }\n return x - y;\n };\n /**\n * Comparer function which is used to sort the data in descending order.\n *\n * @param {string|number} x\n * @param {string|number} y\n * @returns number\n */\n DataUtil.fnDescending = function (x, y) {\n if (isNullOrUndefined(x) && isNullOrUndefined(y)) {\n return -1;\n }\n if (y === null || y === undefined) {\n return 1;\n }\n if (typeof x === 'string') {\n return x.localeCompare(y) * -1;\n }\n if (x === null || x === undefined) {\n return -1;\n }\n return y - x;\n };\n DataUtil.extractFields = function (obj, fields) {\n var newObj = {};\n for (var i = 0; i < fields.length; i++) {\n newObj = this.setValue(fields[i], this.getObject(fields[i], obj), newObj);\n }\n return newObj;\n };\n /**\n * Select objects by given fields from jsonArray.\n *\n * @param {Object[]} jsonArray\n * @param {string[]} fields\n */\n DataUtil.select = function (jsonArray, fields) {\n var newData = [];\n for (var i = 0; i < jsonArray.length; i++) {\n newData.push(this.extractFields(jsonArray[i], fields));\n }\n return newData;\n };\n /**\n * Group the input data based on the field name.\n * It also performs aggregation of the grouped records based on the aggregates paramater.\n *\n * @param {Object[]} jsonArray\n * @param {string} field?\n * @param {Object[]} agg?\n * @param {number} level?\n * @param {Object[]} groupDs?\n * @param field\n * @param aggregates\n * @param level\n * @param groupDs\n * @param format\n * @param isLazyLoad\n */\n DataUtil.group = function (jsonArray, field, aggregates, level, groupDs, format, isLazyLoad) {\n level = level || 1;\n var jsonData = jsonArray;\n var guid = 'GroupGuid';\n if (jsonData.GroupGuid === consts[guid]) {\n var _loop_1 = function (j) {\n if (!isNullOrUndefined(groupDs)) {\n var indx = -1;\n var temp = groupDs.filter(function (e) { return e.key === jsonData[j].key; });\n indx = groupDs.indexOf(temp[0]);\n jsonData[j].items = this_1.group(jsonData[j].items, field, aggregates, jsonData.level + 1, groupDs[indx].items, format, isLazyLoad);\n jsonData[j].count = groupDs[indx].count;\n }\n else {\n jsonData[j].items = this_1.group(jsonData[j].items, field, aggregates, jsonData.level + 1, null, format, isLazyLoad);\n jsonData[j].count = jsonData[j].items.length;\n }\n };\n var this_1 = this;\n for (var j = 0; j < jsonData.length; j++) {\n _loop_1(j);\n }\n jsonData.childLevels += 1;\n return jsonData;\n }\n var grouped = {};\n var groupedArray = [];\n groupedArray.GroupGuid = consts[guid];\n groupedArray.level = level;\n groupedArray.childLevels = 0;\n groupedArray.records = jsonData;\n var _loop_2 = function (i) {\n var val = this_2.getVal(jsonData, i, field);\n if (!isNullOrUndefined(format)) {\n val = format(val, field);\n }\n if (!grouped[val]) {\n grouped[val] = {\n key: val,\n count: 0,\n items: [],\n aggregates: {},\n field: field\n };\n groupedArray.push(grouped[val]);\n if (!isNullOrUndefined(groupDs)) {\n var tempObj = groupDs.filter(function (e) { return e.key === grouped[val].key; });\n grouped[val].count = tempObj[0].count;\n }\n }\n grouped[val].count = !isNullOrUndefined(groupDs) ? grouped[val].count : grouped[val].count += 1;\n if (!isLazyLoad || (isLazyLoad && aggregates.length)) {\n grouped[val].items.push(jsonData[i]);\n }\n };\n var this_2 = this;\n for (var i = 0; i < jsonData.length; i++) {\n _loop_2(i);\n }\n if (aggregates && aggregates.length) {\n var _loop_3 = function (i) {\n var res = {};\n var fn = void 0;\n var aggs = aggregates;\n for (var j = 0; j < aggregates.length; j++) {\n fn = DataUtil.aggregates[aggregates[j].type];\n if (!isNullOrUndefined(groupDs)) {\n var temp = groupDs.filter(function (e) { return e.key === groupedArray[i].key; });\n if (fn) {\n res[aggs[j].field + ' - ' + aggs[j].type] = fn(temp[0].items, aggs[j].field);\n }\n }\n else {\n if (fn) {\n res[aggs[j].field + ' - ' + aggs[j].type] = fn(groupedArray[i].items, aggs[j].field);\n }\n }\n }\n groupedArray[i].aggregates = res;\n };\n for (var i = 0; i < groupedArray.length; i++) {\n _loop_3(i);\n }\n }\n if (isLazyLoad && groupedArray.length && aggregates.length) {\n for (var i = 0; i < groupedArray.length; i++) {\n groupedArray[i].items = [];\n }\n }\n return jsonData.length && groupedArray || jsonData;\n };\n /**\n * It is used to categorize the multiple items based on a specific field in jsonArray.\n * The hierarchical queries are commonly required when you use foreign key binding.\n *\n * @param {string} fKey\n * @param {string} from\n * @param {Object[]} source\n * @param {Group} lookup?\n * @param {string} pKey?\n * @param lookup\n * @param pKey\n * @hidden\n */\n DataUtil.buildHierarchy = function (fKey, from, source, lookup, pKey) {\n var i;\n var grp = {};\n var temp;\n if (lookup.result) {\n lookup = lookup.result;\n }\n if (lookup.GroupGuid) {\n this.throwError('DataManager: Do not have support Grouping in hierarchy');\n }\n for (i = 0; i < lookup.length; i++) {\n var fKeyData = this.getObject(fKey, lookup[i]);\n temp = grp[fKeyData] || (grp[fKeyData] = []);\n temp.push(lookup[i]);\n }\n for (i = 0; i < source.length; i++) {\n var fKeyData = this.getObject(pKey || fKey, source[i]);\n source[i][from] = grp[fKeyData];\n }\n };\n /**\n * The method used to get the field names which started with specified characters.\n *\n * @param {Object} obj\n * @param {string[]} fields?\n * @param {string} prefix?\n * @param fields\n * @param prefix\n * @hidden\n */\n DataUtil.getFieldList = function (obj, fields, prefix) {\n if (prefix === undefined) {\n prefix = '';\n }\n if (fields === undefined || fields === null) {\n return this.getFieldList(obj, [], prefix);\n }\n var copyObj = obj;\n var keys = Object.keys(obj);\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var prop = keys_1[_i];\n if (typeof copyObj[prop] === 'object' && !(copyObj[prop] instanceof Array)) {\n this.getFieldList(copyObj[prop], fields, prefix + prop + '.');\n }\n else {\n fields.push(prefix + prop);\n }\n }\n return fields;\n };\n /**\n * Gets the value of the property in the given object.\n * The complex object can be accessed by providing the field names concatenated with dot(.).\n *\n * @param {string} nameSpace - The name of the property to be accessed.\n * @param {Object} from - Defines the source object.\n */\n DataUtil.getObject = function (nameSpace, from) {\n if (!nameSpace) {\n return from;\n }\n if (!from) {\n return undefined;\n }\n if (nameSpace.indexOf('.') === -1) {\n var lowerCaseNameSpace = nameSpace.charAt(0).toLowerCase() + nameSpace.slice(1);\n var upperCaseNameSpace = nameSpace.charAt(0).toUpperCase() + nameSpace.slice(1);\n if (!isNullOrUndefined(from[nameSpace])) {\n return from[nameSpace];\n }\n else {\n if (!isNullOrUndefined(from[lowerCaseNameSpace])) {\n return from[lowerCaseNameSpace];\n }\n else if (!isNullOrUndefined(from[upperCaseNameSpace])) {\n return from[upperCaseNameSpace];\n }\n else {\n return null;\n }\n }\n }\n var value = from;\n var splits = nameSpace.split('.');\n for (var i = 0; i < splits.length; i++) {\n if (value == null) {\n break;\n }\n value = value[splits[i]];\n if (value === undefined) {\n var casing = splits[i].charAt(0).toUpperCase() + splits[i].slice(1);\n value = from[casing] || from[casing.charAt(0).toLowerCase() + casing.slice(1)] || null;\n }\n from = value;\n }\n return value;\n };\n /**\n * To set value for the nameSpace in desired object.\n *\n * @param {string} nameSpace - String value to the get the inner object.\n * @param {Object} value - Value that you need to set.\n * @param {Object} obj - Object to get the inner object value.\n * @return { [key: string]: Object; } | Object\n * @hidden\n */\n DataUtil.setValue = function (nameSpace, value, obj) {\n var keys = nameSpace.toString().split('.');\n var start = obj || {};\n var fromObj = start;\n var i;\n var length = keys.length;\n var key;\n for (i = 0; i < length; i++) {\n key = keys[i];\n if (i + 1 === length) {\n fromObj[key] = value === undefined ? undefined : value;\n }\n else if (isNullOrUndefined(fromObj[key])) {\n fromObj[key] = {};\n }\n fromObj = fromObj[key];\n }\n return start;\n };\n /**\n * Sort the given data based on the field and comparer.\n *\n * @param {Object[]} ds - Defines the input data.\n * @param {string} field - Defines the field to be sorted.\n * @param {Function} comparer - Defines the comparer function used to sort the records.\n */\n DataUtil.sort = function (ds, field, comparer) {\n if (ds.length <= 1) {\n return ds;\n }\n var middle = parseInt((ds.length / 2).toString(), 10);\n var left = ds.slice(0, middle);\n var right = ds.slice(middle);\n left = this.sort(left, field, comparer);\n right = this.sort(right, field, comparer);\n return this.merge(left, right, field, comparer);\n };\n DataUtil.ignoreDiacritics = function (value) {\n if (typeof value !== 'string') {\n return value;\n }\n var result = value.split('');\n var newValue = result.map(function (temp) { return temp in DataUtil.diacritics ? DataUtil.diacritics[temp] : temp; });\n return newValue.join('');\n };\n DataUtil.merge = function (left, right, fieldName, comparer) {\n var result = [];\n var current;\n while (left.length > 0 || right.length > 0) {\n if (left.length > 0 && right.length > 0) {\n if (comparer) {\n current = comparer(this.getVal(left, 0, fieldName), this.getVal(right, 0, fieldName), left[0], right[0]) <= 0 ? left : right;\n }\n else {\n current = left[0][fieldName] < left[0][fieldName] ? left : right;\n }\n }\n else {\n current = left.length > 0 ? left : right;\n }\n result.push(current.shift());\n }\n return result;\n };\n DataUtil.getVal = function (array, index, field) {\n return field ? this.getObject(field, array[index]) : array[index];\n };\n DataUtil.toLowerCase = function (val) {\n return val ? typeof val === 'string' ? val.toLowerCase() : val.toString() : (val === 0 || val === false) ? val.toString() : '';\n };\n /**\n * To perform the filter operation with specified adaptor and returns the result.\n *\n * @param {Object} adaptor\n * @param {string} fnName\n * @param {Object} param1?\n * @param {Object} param2?\n * @param param1\n * @param param2\n * @hidden\n */\n DataUtil.callAdaptorFunction = function (adaptor, fnName, param1, param2) {\n if (fnName in adaptor) {\n var res = adaptor[fnName](param1, param2);\n if (!isNullOrUndefined(res)) {\n param1 = res;\n }\n }\n return param1;\n };\n DataUtil.getAddParams = function (adp, dm, query) {\n var req = {};\n DataUtil.callAdaptorFunction(adp, 'addParams', {\n dm: dm,\n query: query,\n params: query.params,\n reqParams: req\n });\n return req;\n };\n /**\n * Checks wheather the given input is a plain object or not.\n *\n * @param {Object|Object[]} obj\n */\n DataUtil.isPlainObject = function (obj) {\n return (!!obj) && (obj.constructor === Object);\n };\n /**\n * Returns true when the browser cross origin request.\n */\n DataUtil.isCors = function () {\n var xhr = null;\n var request = 'XMLHttpRequest';\n try {\n xhr = new window[request]();\n }\n catch (e) {\n // No exception handling\n }\n return !!xhr && ('withCredentials' in xhr);\n };\n /**\n * Generate random GUID value which will be prefixed with the given value.\n *\n * @param {string} prefix\n */\n DataUtil.getGuid = function (prefix) {\n var hexs = '0123456789abcdef';\n var rand;\n return (prefix || '') + '00000000-0000-4000-0000-000000000000'.replace(/0/g, function (val, i) {\n if ('crypto' in window && 'getRandomValues' in crypto) {\n var arr = new Uint8Array(1);\n window.crypto.getRandomValues(arr);\n rand = arr[0] % 16 | 0;\n }\n else {\n rand = Math.random() * 16 | 0;\n }\n return hexs[i === 19 ? rand & 0x3 | 0x8 : rand];\n });\n };\n /**\n * Checks wheather the given value is null or not.\n *\n * @param {string|Object} val\n * @returns boolean\n */\n DataUtil.isNull = function (val) {\n return val === undefined || val === null;\n };\n /**\n * To get the required items from collection of objects.\n *\n * @param {Object[]} array\n * @param {string} field\n * @param {Function} comparer\n * @returns Object\n * @hidden\n */\n DataUtil.getItemFromComparer = function (array, field, comparer) {\n var keyVal;\n var current;\n var key;\n var i = 0;\n var castRequired = typeof DataUtil.getVal(array, 0, field) === 'string';\n if (array.length) {\n while (isNullOrUndefined(keyVal) && i < array.length) {\n keyVal = DataUtil.getVal(array, i, field);\n key = array[i++];\n }\n }\n for (; i < array.length; i++) {\n current = DataUtil.getVal(array, i, field);\n if (isNullOrUndefined(current)) {\n continue;\n }\n if (castRequired) {\n keyVal = +keyVal;\n current = +current;\n }\n if (comparer(keyVal, current) > 0) {\n keyVal = current;\n key = array[i];\n }\n }\n return key;\n };\n /**\n * To get distinct values of Array or Array of Objects.\n *\n * @param {Object[]} json\n * @param {string} field\n * @param fieldName\n * @param {boolean} requiresCompleteRecord\n * @returns Object[]\n * * distinct array of objects is return when requiresCompleteRecord set as true.\n * @hidden\n */\n DataUtil.distinct = function (json, fieldName, requiresCompleteRecord) {\n requiresCompleteRecord = isNullOrUndefined(requiresCompleteRecord) ? false : requiresCompleteRecord;\n var result = [];\n var val;\n var tmp = {};\n json.forEach(function (data, index) {\n val = typeof (json[index]) === 'object' ? DataUtil.getVal(json, index, fieldName) : json[index];\n if (!(val in tmp)) {\n result.push(!requiresCompleteRecord ? val : json[index]);\n tmp[val] = 1;\n }\n });\n return result;\n };\n /**\n * Process the given records based on the datamanager string.\n *\n * @param {string} datamanager\n * @param dm\n * @param {Object[]} records\n */\n DataUtil.processData = function (dm, records) {\n var query = this.prepareQuery(dm);\n var sampledata = new DataManager(records);\n if (dm.requiresCounts) {\n query.requiresCount();\n }\n /* eslint-disable @typescript-eslint/no-explicit-any */\n // tslint:disable-next-line:no-any\n var result = sampledata.executeLocal(query);\n /* eslint-enable @typescript-eslint/no-explicit-any */\n var returnValue = {\n result: dm.requiresCounts ? result.result : result,\n count: result.count,\n aggregates: JSON.stringify(result.aggregates)\n };\n return dm.requiresCounts ? returnValue : result;\n };\n DataUtil.prepareQuery = function (dm) {\n var _this = this;\n var query = new Query();\n if (dm.select) {\n query.select(dm.select);\n }\n if (dm.where) {\n var where = DataUtil.parse.parseJson(dm.where);\n where.filter(function (pred) {\n if (isNullOrUndefined(pred.condition)) {\n query.where(pred.field, pred.operator, pred.value, pred.ignoreCase, pred.ignoreAccent);\n }\n else {\n var predicateList = [];\n if (pred.field) {\n predicateList.push(new Predicate(pred.field, pred.operator, pred.value, pred.ignoreCase, pred.ignoreAccent));\n }\n else {\n predicateList = predicateList.concat(_this.getPredicate(pred.predicates));\n }\n if (pred.condition === 'or') {\n query.where(Predicate.or(predicateList));\n }\n else if (pred.condition === 'and') {\n query.where(Predicate.and(predicateList));\n }\n }\n });\n }\n if (dm.search) {\n var search = DataUtil.parse.parseJson(dm.search);\n // tslint:disable-next-line:no-string-literal\n search.filter(function (e) { return query.search(e.key, e.fields, e['operator'], \n // tslint:disable-next-line:no-string-literal\n e['ignoreCase'], e['ignoreAccent']); });\n }\n if (dm.aggregates) {\n dm.aggregates.filter(function (e) { return query.aggregate(e.type, e.field); });\n }\n if (dm.sorted) {\n dm.sorted.filter(function (e) { return query.sortBy(e.name, e.direction); });\n }\n if (dm.skip) {\n query.skip(dm.skip);\n }\n if (dm.take) {\n query.take(dm.take);\n }\n if (dm.group) {\n dm.group.filter(function (grp) { return query.group(grp); });\n }\n return query;\n };\n DataUtil.getPredicate = function (pred) {\n var mainPred = [];\n for (var i = 0; i < pred.length; i++) {\n var e = pred[i];\n if (e.field) {\n mainPred.push(new Predicate(e.field, e.operator, e.value, e.ignoreCase, e.ignoreAccent));\n }\n else {\n var childPred = [];\n // tslint:disable-next-line:typedef\n var cpre = this.getPredicate(e.predicates);\n for (var _i = 0, _a = Object.keys(cpre); _i < _a.length; _i++) {\n var prop = _a[_i];\n childPred.push(cpre[prop]);\n }\n mainPred.push(e.condition === 'or' ? Predicate.or(childPred) : Predicate.and(childPred));\n }\n }\n return mainPred;\n };\n /**\n * Specifies the value which will be used to adjust the date value to server timezone.\n *\n * @default null\n */\n DataUtil.serverTimezoneOffset = null;\n /**\n * Species whether are not to be parsed with serverTimezoneOffset value.\n *\n * @hidden\n */\n DataUtil.timeZoneHandling = true;\n /**\n * Throw error with the given string as message.\n *\n * @param {string} er\n * @param error\n */\n DataUtil.throwError = function (error) {\n try {\n throw new Error(error);\n }\n catch (e) {\n // eslint-disable-next-line no-throw-literal\n throw e.message + '\\n' + e.stack;\n }\n };\n DataUtil.aggregates = {\n /**\n * Calculate sum of the given field in the data.\n *\n * @param {Object[]} ds\n * @param {string} field\n */\n sum: function (ds, field) {\n var result = 0;\n var val;\n var castRequired = typeof DataUtil.getVal(ds, 0, field) !== 'number';\n for (var i = 0; i < ds.length; i++) {\n val = DataUtil.getVal(ds, i, field);\n if (!isNaN(val) && val !== null) {\n if (castRequired) {\n val = +val;\n }\n result += val;\n }\n }\n return result;\n },\n /**\n * Calculate average value of the given field in the data.\n *\n * @param {Object[]} ds\n * @param {string} field\n */\n average: function (ds, field) {\n return DataUtil.aggregates.sum(ds, field) / ds.length;\n },\n /**\n * Returns the min value of the data based on the field.\n *\n * @param {Object[]} ds\n * @param {string|Function} field\n */\n min: function (ds, field) {\n var comparer;\n if (typeof field === 'function') {\n comparer = field;\n field = null;\n }\n return DataUtil.getObject(field, DataUtil.getItemFromComparer(ds, field, comparer || DataUtil.fnAscending));\n },\n /**\n * Returns the max value of the data based on the field.\n *\n * @param {Object[]} ds\n * @param {string} field\n * @returns number\n */\n max: function (ds, field) {\n var comparer;\n if (typeof field === 'function') {\n comparer = field;\n field = null;\n }\n return DataUtil.getObject(field, DataUtil.getItemFromComparer(ds, field, comparer || DataUtil.fnDescending));\n },\n /**\n * Returns the total number of true value present in the data based on the given boolean field name.\n *\n * @param {Object[]} ds\n * @param {string} field\n */\n truecount: function (ds, field) {\n return new DataManager(ds).executeLocal(new Query().where(field, 'equal', true, true)).length;\n },\n /**\n * Returns the total number of false value present in the data based on the given boolean field name.\n *\n * @param {Object[]} ds\n * @param {string} field\n */\n falsecount: function (ds, field) {\n return new DataManager(ds).executeLocal(new Query().where(field, 'equal', false, true)).length;\n },\n /**\n * Returns the length of the given data.\n *\n * @param {Object[]} ds\n * @param {string} field?\n * @param field\n * @returns number\n */\n count: function (ds, field) {\n return ds.length;\n }\n };\n /**\n * Specifies the Object with filter operators.\n */\n DataUtil.operatorSymbols = {\n '<': 'lessthan',\n '>': 'greaterthan',\n '<=': 'lessthanorequal',\n '>=': 'greaterthanorequal',\n '==': 'equal',\n '!=': 'notequal',\n '*=': 'contains',\n '$=': 'endswith',\n '^=': 'startswith'\n };\n /**\n * Specifies the Object with filter operators which will be used for OData filter query generation.\n * * It will be used for date/number type filter query.\n */\n DataUtil.odBiOperator = {\n '<': ' lt ',\n '>': ' gt ',\n '<=': ' le ',\n '>=': ' ge ',\n '==': ' eq ',\n '!=': ' ne ',\n 'lessthan': ' lt ',\n 'lessthanorequal': ' le ',\n 'greaterthan': ' gt ',\n 'greaterthanorequal': ' ge ',\n 'equal': ' eq ',\n 'notequal': ' ne '\n };\n /**\n * Specifies the Object with filter operators which will be used for OData filter query generation.\n * It will be used for string type filter query.\n */\n DataUtil.odUniOperator = {\n '$=': 'endswith',\n '^=': 'startswith',\n '*=': 'substringof',\n 'endswith': 'endswith',\n 'startswith': 'startswith',\n 'contains': 'substringof',\n 'doesnotendwith': 'not endswith',\n 'doesnotstartwith': 'not startswith',\n 'doesnotcontain': 'not substringof',\n 'wildcard': 'wildcard',\n 'like': 'like'\n };\n /**\n * Specifies the Object with filter operators which will be used for ODataV4 filter query generation.\n * It will be used for string type filter query.\n */\n DataUtil.odv4UniOperator = {\n '$=': 'endswith',\n '^=': 'startswith',\n '*=': 'contains',\n 'endswith': 'endswith',\n 'startswith': 'startswith',\n 'contains': 'contains',\n 'doesnotendwith': 'not endswith',\n 'doesnotstartwith': 'not startswith',\n 'doesnotcontain': 'not contains',\n 'wildcard': 'wildcard',\n 'like': 'like'\n };\n DataUtil.diacritics = {\n '\\u24B6': 'A',\n '\\uFF21': 'A',\n '\\u00C0': 'A',\n '\\u00C1': 'A',\n '\\u00C2': 'A',\n '\\u1EA6': 'A',\n '\\u1EA4': 'A',\n '\\u1EAA': 'A',\n '\\u1EA8': 'A',\n '\\u00C3': 'A',\n '\\u0100': 'A',\n '\\u0102': 'A',\n '\\u1EB0': 'A',\n '\\u1EAE': 'A',\n '\\u1EB4': 'A',\n '\\u1EB2': 'A',\n '\\u0226': 'A',\n '\\u01E0': 'A',\n '\\u00C4': 'A',\n '\\u01DE': 'A',\n '\\u1EA2': 'A',\n '\\u00C5': 'A',\n '\\u01FA': 'A',\n '\\u01CD': 'A',\n '\\u0200': 'A',\n '\\u0202': 'A',\n '\\u1EA0': 'A',\n '\\u1EAC': 'A',\n '\\u1EB6': 'A',\n '\\u1E00': 'A',\n '\\u0104': 'A',\n '\\u023A': 'A',\n '\\u2C6F': 'A',\n '\\uA732': 'AA',\n '\\u00C6': 'AE',\n '\\u01FC': 'AE',\n '\\u01E2': 'AE',\n '\\uA734': 'AO',\n '\\uA736': 'AU',\n '\\uA738': 'AV',\n '\\uA73A': 'AV',\n '\\uA73C': 'AY',\n '\\u24B7': 'B',\n '\\uFF22': 'B',\n '\\u1E02': 'B',\n '\\u1E04': 'B',\n '\\u1E06': 'B',\n '\\u0243': 'B',\n '\\u0182': 'B',\n '\\u0181': 'B',\n '\\u24B8': 'C',\n '\\uFF23': 'C',\n '\\u0106': 'C',\n '\\u0108': 'C',\n '\\u010A': 'C',\n '\\u010C': 'C',\n '\\u00C7': 'C',\n '\\u1E08': 'C',\n '\\u0187': 'C',\n '\\u023B': 'C',\n '\\uA73E': 'C',\n '\\u24B9': 'D',\n '\\uFF24': 'D',\n '\\u1E0A': 'D',\n '\\u010E': 'D',\n '\\u1E0C': 'D',\n '\\u1E10': 'D',\n '\\u1E12': 'D',\n '\\u1E0E': 'D',\n '\\u0110': 'D',\n '\\u018B': 'D',\n '\\u018A': 'D',\n '\\u0189': 'D',\n '\\uA779': 'D',\n '\\u01F1': 'DZ',\n '\\u01C4': 'DZ',\n '\\u01F2': 'Dz',\n '\\u01C5': 'Dz',\n '\\u24BA': 'E',\n '\\uFF25': 'E',\n '\\u00C8': 'E',\n '\\u00C9': 'E',\n '\\u00CA': 'E',\n '\\u1EC0': 'E',\n '\\u1EBE': 'E',\n '\\u1EC4': 'E',\n '\\u1EC2': 'E',\n '\\u1EBC': 'E',\n '\\u0112': 'E',\n '\\u1E14': 'E',\n '\\u1E16': 'E',\n '\\u0114': 'E',\n '\\u0116': 'E',\n '\\u00CB': 'E',\n '\\u1EBA': 'E',\n '\\u011A': 'E',\n '\\u0204': 'E',\n '\\u0206': 'E',\n '\\u1EB8': 'E',\n '\\u1EC6': 'E',\n '\\u0228': 'E',\n '\\u1E1C': 'E',\n '\\u0118': 'E',\n '\\u1E18': 'E',\n '\\u1E1A': 'E',\n '\\u0190': 'E',\n '\\u018E': 'E',\n '\\u24BB': 'F',\n '\\uFF26': 'F',\n '\\u1E1E': 'F',\n '\\u0191': 'F',\n '\\uA77B': 'F',\n '\\u24BC': 'G',\n '\\uFF27': 'G',\n '\\u01F4': 'G',\n '\\u011C': 'G',\n '\\u1E20': 'G',\n '\\u011E': 'G',\n '\\u0120': 'G',\n '\\u01E6': 'G',\n '\\u0122': 'G',\n '\\u01E4': 'G',\n '\\u0193': 'G',\n '\\uA7A0': 'G',\n '\\uA77D': 'G',\n '\\uA77E': 'G',\n '\\u24BD': 'H',\n '\\uFF28': 'H',\n '\\u0124': 'H',\n '\\u1E22': 'H',\n '\\u1E26': 'H',\n '\\u021E': 'H',\n '\\u1E24': 'H',\n '\\u1E28': 'H',\n '\\u1E2A': 'H',\n '\\u0126': 'H',\n '\\u2C67': 'H',\n '\\u2C75': 'H',\n '\\uA78D': 'H',\n '\\u24BE': 'I',\n '\\uFF29': 'I',\n '\\u00CC': 'I',\n '\\u00CD': 'I',\n '\\u00CE': 'I',\n '\\u0128': 'I',\n '\\u012A': 'I',\n '\\u012C': 'I',\n '\\u0130': 'I',\n '\\u00CF': 'I',\n '\\u1E2E': 'I',\n '\\u1EC8': 'I',\n '\\u01CF': 'I',\n '\\u0208': 'I',\n '\\u020A': 'I',\n '\\u1ECA': 'I',\n '\\u012E': 'I',\n '\\u1E2C': 'I',\n '\\u0197': 'I',\n '\\u24BF': 'J',\n '\\uFF2A': 'J',\n '\\u0134': 'J',\n '\\u0248': 'J',\n '\\u24C0': 'K',\n '\\uFF2B': 'K',\n '\\u1E30': 'K',\n '\\u01E8': 'K',\n '\\u1E32': 'K',\n '\\u0136': 'K',\n '\\u1E34': 'K',\n '\\u0198': 'K',\n '\\u2C69': 'K',\n '\\uA740': 'K',\n '\\uA742': 'K',\n '\\uA744': 'K',\n '\\uA7A2': 'K',\n '\\u24C1': 'L',\n '\\uFF2C': 'L',\n '\\u013F': 'L',\n '\\u0139': 'L',\n '\\u013D': 'L',\n '\\u1E36': 'L',\n '\\u1E38': 'L',\n '\\u013B': 'L',\n '\\u1E3C': 'L',\n '\\u1E3A': 'L',\n '\\u0141': 'L',\n '\\u023D': 'L',\n '\\u2C62': 'L',\n '\\u2C60': 'L',\n '\\uA748': 'L',\n '\\uA746': 'L',\n '\\uA780': 'L',\n '\\u01C7': 'LJ',\n '\\u01C8': 'Lj',\n '\\u24C2': 'M',\n '\\uFF2D': 'M',\n '\\u1E3E': 'M',\n '\\u1E40': 'M',\n '\\u1E42': 'M',\n '\\u2C6E': 'M',\n '\\u019C': 'M',\n '\\u24C3': 'N',\n '\\uFF2E': 'N',\n '\\u01F8': 'N',\n '\\u0143': 'N',\n '\\u00D1': 'N',\n '\\u1E44': 'N',\n '\\u0147': 'N',\n '\\u1E46': 'N',\n '\\u0145': 'N',\n '\\u1E4A': 'N',\n '\\u1E48': 'N',\n '\\u0220': 'N',\n '\\u019D': 'N',\n '\\uA790': 'N',\n '\\uA7A4': 'N',\n '\\u01CA': 'NJ',\n '\\u01CB': 'Nj',\n '\\u24C4': 'O',\n '\\uFF2F': 'O',\n '\\u00D2': 'O',\n '\\u00D3': 'O',\n '\\u00D4': 'O',\n '\\u1ED2': 'O',\n '\\u1ED0': 'O',\n '\\u1ED6': 'O',\n '\\u1ED4': 'O',\n '\\u00D5': 'O',\n '\\u1E4C': 'O',\n '\\u022C': 'O',\n '\\u1E4E': 'O',\n '\\u014C': 'O',\n '\\u1E50': 'O',\n '\\u1E52': 'O',\n '\\u014E': 'O',\n '\\u022E': 'O',\n '\\u0230': 'O',\n '\\u00D6': 'O',\n '\\u022A': 'O',\n '\\u1ECE': 'O',\n '\\u0150': 'O',\n '\\u01D1': 'O',\n '\\u020C': 'O',\n '\\u020E': 'O',\n '\\u01A0': 'O',\n '\\u1EDC': 'O',\n '\\u1EDA': 'O',\n '\\u1EE0': 'O',\n '\\u1EDE': 'O',\n '\\u1EE2': 'O',\n '\\u1ECC': 'O',\n '\\u1ED8': 'O',\n '\\u01EA': 'O',\n '\\u01EC': 'O',\n '\\u00D8': 'O',\n '\\u01FE': 'O',\n '\\u0186': 'O',\n '\\u019F': 'O',\n '\\uA74A': 'O',\n '\\uA74C': 'O',\n '\\u01A2': 'OI',\n '\\uA74E': 'OO',\n '\\u0222': 'OU',\n '\\u24C5': 'P',\n '\\uFF30': 'P',\n '\\u1E54': 'P',\n '\\u1E56': 'P',\n '\\u01A4': 'P',\n '\\u2C63': 'P',\n '\\uA750': 'P',\n '\\uA752': 'P',\n '\\uA754': 'P',\n '\\u24C6': 'Q',\n '\\uFF31': 'Q',\n '\\uA756': 'Q',\n '\\uA758': 'Q',\n '\\u024A': 'Q',\n '\\u24C7': 'R',\n '\\uFF32': 'R',\n '\\u0154': 'R',\n '\\u1E58': 'R',\n '\\u0158': 'R',\n '\\u0210': 'R',\n '\\u0212': 'R',\n '\\u1E5A': 'R',\n '\\u1E5C': 'R',\n '\\u0156': 'R',\n '\\u1E5E': 'R',\n '\\u024C': 'R',\n '\\u2C64': 'R',\n '\\uA75A': 'R',\n '\\uA7A6': 'R',\n '\\uA782': 'R',\n '\\u24C8': 'S',\n '\\uFF33': 'S',\n '\\u1E9E': 'S',\n '\\u015A': 'S',\n '\\u1E64': 'S',\n '\\u015C': 'S',\n '\\u1E60': 'S',\n '\\u0160': 'S',\n '\\u1E66': 'S',\n '\\u1E62': 'S',\n '\\u1E68': 'S',\n '\\u0218': 'S',\n '\\u015E': 'S',\n '\\u2C7E': 'S',\n '\\uA7A8': 'S',\n '\\uA784': 'S',\n '\\u24C9': 'T',\n '\\uFF34': 'T',\n '\\u1E6A': 'T',\n '\\u0164': 'T',\n '\\u1E6C': 'T',\n '\\u021A': 'T',\n '\\u0162': 'T',\n '\\u1E70': 'T',\n '\\u1E6E': 'T',\n '\\u0166': 'T',\n '\\u01AC': 'T',\n '\\u01AE': 'T',\n '\\u023E': 'T',\n '\\uA786': 'T',\n '\\uA728': 'TZ',\n '\\u24CA': 'U',\n '\\uFF35': 'U',\n '\\u00D9': 'U',\n '\\u00DA': 'U',\n '\\u00DB': 'U',\n '\\u0168': 'U',\n '\\u1E78': 'U',\n '\\u016A': 'U',\n '\\u1E7A': 'U',\n '\\u016C': 'U',\n '\\u00DC': 'U',\n '\\u01DB': 'U',\n '\\u01D7': 'U',\n '\\u01D5': 'U',\n '\\u01D9': 'U',\n '\\u1EE6': 'U',\n '\\u016E': 'U',\n '\\u0170': 'U',\n '\\u01D3': 'U',\n '\\u0214': 'U',\n '\\u0216': 'U',\n '\\u01AF': 'U',\n '\\u1EEA': 'U',\n '\\u1EE8': 'U',\n '\\u1EEE': 'U',\n '\\u1EEC': 'U',\n '\\u1EF0': 'U',\n '\\u1EE4': 'U',\n '\\u1E72': 'U',\n '\\u0172': 'U',\n '\\u1E76': 'U',\n '\\u1E74': 'U',\n '\\u0244': 'U',\n '\\u24CB': 'V',\n '\\uFF36': 'V',\n '\\u1E7C': 'V',\n '\\u1E7E': 'V',\n '\\u01B2': 'V',\n '\\uA75E': 'V',\n '\\u0245': 'V',\n '\\uA760': 'VY',\n '\\u24CC': 'W',\n '\\uFF37': 'W',\n '\\u1E80': 'W',\n '\\u1E82': 'W',\n '\\u0174': 'W',\n '\\u1E86': 'W',\n '\\u1E84': 'W',\n '\\u1E88': 'W',\n '\\u2C72': 'W',\n '\\u24CD': 'X',\n '\\uFF38': 'X',\n '\\u1E8A': 'X',\n '\\u1E8C': 'X',\n '\\u24CE': 'Y',\n '\\uFF39': 'Y',\n '\\u1EF2': 'Y',\n '\\u00DD': 'Y',\n '\\u0176': 'Y',\n '\\u1EF8': 'Y',\n '\\u0232': 'Y',\n '\\u1E8E': 'Y',\n '\\u0178': 'Y',\n '\\u1EF6': 'Y',\n '\\u1EF4': 'Y',\n '\\u01B3': 'Y',\n '\\u024E': 'Y',\n '\\u1EFE': 'Y',\n '\\u24CF': 'Z',\n '\\uFF3A': 'Z',\n '\\u0179': 'Z',\n '\\u1E90': 'Z',\n '\\u017B': 'Z',\n '\\u017D': 'Z',\n '\\u1E92': 'Z',\n '\\u1E94': 'Z',\n '\\u01B5': 'Z',\n '\\u0224': 'Z',\n '\\u2C7F': 'Z',\n '\\u2C6B': 'Z',\n '\\uA762': 'Z',\n '\\u24D0': 'a',\n '\\uFF41': 'a',\n '\\u1E9A': 'a',\n '\\u00E0': 'a',\n '\\u00E1': 'a',\n '\\u00E2': 'a',\n '\\u1EA7': 'a',\n '\\u1EA5': 'a',\n '\\u1EAB': 'a',\n '\\u1EA9': 'a',\n '\\u00E3': 'a',\n '\\u0101': 'a',\n '\\u0103': 'a',\n '\\u1EB1': 'a',\n '\\u1EAF': 'a',\n '\\u1EB5': 'a',\n '\\u1EB3': 'a',\n '\\u0227': 'a',\n '\\u01E1': 'a',\n '\\u00E4': 'a',\n '\\u01DF': 'a',\n '\\u1EA3': 'a',\n '\\u00E5': 'a',\n '\\u01FB': 'a',\n '\\u01CE': 'a',\n '\\u0201': 'a',\n '\\u0203': 'a',\n '\\u1EA1': 'a',\n '\\u1EAD': 'a',\n '\\u1EB7': 'a',\n '\\u1E01': 'a',\n '\\u0105': 'a',\n '\\u2C65': 'a',\n '\\u0250': 'a',\n '\\uA733': 'aa',\n '\\u00E6': 'ae',\n '\\u01FD': 'ae',\n '\\u01E3': 'ae',\n '\\uA735': 'ao',\n '\\uA737': 'au',\n '\\uA739': 'av',\n '\\uA73B': 'av',\n '\\uA73D': 'ay',\n '\\u24D1': 'b',\n '\\uFF42': 'b',\n '\\u1E03': 'b',\n '\\u1E05': 'b',\n '\\u1E07': 'b',\n '\\u0180': 'b',\n '\\u0183': 'b',\n '\\u0253': 'b',\n '\\u24D2': 'c',\n '\\uFF43': 'c',\n '\\u0107': 'c',\n '\\u0109': 'c',\n '\\u010B': 'c',\n '\\u010D': 'c',\n '\\u00E7': 'c',\n '\\u1E09': 'c',\n '\\u0188': 'c',\n '\\u023C': 'c',\n '\\uA73F': 'c',\n '\\u2184': 'c',\n '\\u24D3': 'd',\n '\\uFF44': 'd',\n '\\u1E0B': 'd',\n '\\u010F': 'd',\n '\\u1E0D': 'd',\n '\\u1E11': 'd',\n '\\u1E13': 'd',\n '\\u1E0F': 'd',\n '\\u0111': 'd',\n '\\u018C': 'd',\n '\\u0256': 'd',\n '\\u0257': 'd',\n '\\uA77A': 'd',\n '\\u01F3': 'dz',\n '\\u01C6': 'dz',\n '\\u24D4': 'e',\n '\\uFF45': 'e',\n '\\u00E8': 'e',\n '\\u00E9': 'e',\n '\\u00EA': 'e',\n '\\u1EC1': 'e',\n '\\u1EBF': 'e',\n '\\u1EC5': 'e',\n '\\u1EC3': 'e',\n '\\u1EBD': 'e',\n '\\u0113': 'e',\n '\\u1E15': 'e',\n '\\u1E17': 'e',\n '\\u0115': 'e',\n '\\u0117': 'e',\n '\\u00EB': 'e',\n '\\u1EBB': 'e',\n '\\u011B': 'e',\n '\\u0205': 'e',\n '\\u0207': 'e',\n '\\u1EB9': 'e',\n '\\u1EC7': 'e',\n '\\u0229': 'e',\n '\\u1E1D': 'e',\n '\\u0119': 'e',\n '\\u1E19': 'e',\n '\\u1E1B': 'e',\n '\\u0247': 'e',\n '\\u025B': 'e',\n '\\u01DD': 'e',\n '\\u24D5': 'f',\n '\\uFF46': 'f',\n '\\u1E1F': 'f',\n '\\u0192': 'f',\n '\\uA77C': 'f',\n '\\u24D6': 'g',\n '\\uFF47': 'g',\n '\\u01F5': 'g',\n '\\u011D': 'g',\n '\\u1E21': 'g',\n '\\u011F': 'g',\n '\\u0121': 'g',\n '\\u01E7': 'g',\n '\\u0123': 'g',\n '\\u01E5': 'g',\n '\\u0260': 'g',\n '\\uA7A1': 'g',\n '\\u1D79': 'g',\n '\\uA77F': 'g',\n '\\u24D7': 'h',\n '\\uFF48': 'h',\n '\\u0125': 'h',\n '\\u1E23': 'h',\n '\\u1E27': 'h',\n '\\u021F': 'h',\n '\\u1E25': 'h',\n '\\u1E29': 'h',\n '\\u1E2B': 'h',\n '\\u1E96': 'h',\n '\\u0127': 'h',\n '\\u2C68': 'h',\n '\\u2C76': 'h',\n '\\u0265': 'h',\n '\\u0195': 'hv',\n '\\u24D8': 'i',\n '\\uFF49': 'i',\n '\\u00EC': 'i',\n '\\u00ED': 'i',\n '\\u00EE': 'i',\n '\\u0129': 'i',\n '\\u012B': 'i',\n '\\u012D': 'i',\n '\\u00EF': 'i',\n '\\u1E2F': 'i',\n '\\u1EC9': 'i',\n '\\u01D0': 'i',\n '\\u0209': 'i',\n '\\u020B': 'i',\n '\\u1ECB': 'i',\n '\\u012F': 'i',\n '\\u1E2D': 'i',\n '\\u0268': 'i',\n '\\u0131': 'i',\n '\\u24D9': 'j',\n '\\uFF4A': 'j',\n '\\u0135': 'j',\n '\\u01F0': 'j',\n '\\u0249': 'j',\n '\\u24DA': 'k',\n '\\uFF4B': 'k',\n '\\u1E31': 'k',\n '\\u01E9': 'k',\n '\\u1E33': 'k',\n '\\u0137': 'k',\n '\\u1E35': 'k',\n '\\u0199': 'k',\n '\\u2C6A': 'k',\n '\\uA741': 'k',\n '\\uA743': 'k',\n '\\uA745': 'k',\n '\\uA7A3': 'k',\n '\\u24DB': 'l',\n '\\uFF4C': 'l',\n '\\u0140': 'l',\n '\\u013A': 'l',\n '\\u013E': 'l',\n '\\u1E37': 'l',\n '\\u1E39': 'l',\n '\\u013C': 'l',\n '\\u1E3D': 'l',\n '\\u1E3B': 'l',\n '\\u017F': 'l',\n '\\u0142': 'l',\n '\\u019A': 'l',\n '\\u026B': 'l',\n '\\u2C61': 'l',\n '\\uA749': 'l',\n '\\uA781': 'l',\n '\\uA747': 'l',\n '\\u01C9': 'lj',\n '\\u24DC': 'm',\n '\\uFF4D': 'm',\n '\\u1E3F': 'm',\n '\\u1E41': 'm',\n '\\u1E43': 'm',\n '\\u0271': 'm',\n '\\u026F': 'm',\n '\\u24DD': 'n',\n '\\uFF4E': 'n',\n '\\u01F9': 'n',\n '\\u0144': 'n',\n '\\u00F1': 'n',\n '\\u1E45': 'n',\n '\\u0148': 'n',\n '\\u1E47': 'n',\n '\\u0146': 'n',\n '\\u1E4B': 'n',\n '\\u1E49': 'n',\n '\\u019E': 'n',\n '\\u0272': 'n',\n '\\u0149': 'n',\n '\\uA791': 'n',\n '\\uA7A5': 'n',\n '\\u01CC': 'nj',\n '\\u24DE': 'o',\n '\\uFF4F': 'o',\n '\\u00F2': 'o',\n '\\u00F3': 'o',\n '\\u00F4': 'o',\n '\\u1ED3': 'o',\n '\\u1ED1': 'o',\n '\\u1ED7': 'o',\n '\\u1ED5': 'o',\n '\\u00F5': 'o',\n '\\u1E4D': 'o',\n '\\u022D': 'o',\n '\\u1E4F': 'o',\n '\\u014D': 'o',\n '\\u1E51': 'o',\n '\\u1E53': 'o',\n '\\u014F': 'o',\n '\\u022F': 'o',\n '\\u0231': 'o',\n '\\u00F6': 'o',\n '\\u022B': 'o',\n '\\u1ECF': 'o',\n '\\u0151': 'o',\n '\\u01D2': 'o',\n '\\u020D': 'o',\n '\\u020F': 'o',\n '\\u01A1': 'o',\n '\\u1EDD': 'o',\n '\\u1EDB': 'o',\n '\\u1EE1': 'o',\n '\\u1EDF': 'o',\n '\\u1EE3': 'o',\n '\\u1ECD': 'o',\n '\\u1ED9': 'o',\n '\\u01EB': 'o',\n '\\u01ED': 'o',\n '\\u00F8': 'o',\n '\\u01FF': 'o',\n '\\u0254': 'o',\n '\\uA74B': 'o',\n '\\uA74D': 'o',\n '\\u0275': 'o',\n '\\u01A3': 'oi',\n '\\u0223': 'ou',\n '\\uA74F': 'oo',\n '\\u24DF': 'p',\n '\\uFF50': 'p',\n '\\u1E55': 'p',\n '\\u1E57': 'p',\n '\\u01A5': 'p',\n '\\u1D7D': 'p',\n '\\uA751': 'p',\n '\\uA753': 'p',\n '\\uA755': 'p',\n '\\u24E0': 'q',\n '\\uFF51': 'q',\n '\\u024B': 'q',\n '\\uA757': 'q',\n '\\uA759': 'q',\n '\\u24E1': 'r',\n '\\uFF52': 'r',\n '\\u0155': 'r',\n '\\u1E59': 'r',\n '\\u0159': 'r',\n '\\u0211': 'r',\n '\\u0213': 'r',\n '\\u1E5B': 'r',\n '\\u1E5D': 'r',\n '\\u0157': 'r',\n '\\u1E5F': 'r',\n '\\u024D': 'r',\n '\\u027D': 'r',\n '\\uA75B': 'r',\n '\\uA7A7': 'r',\n '\\uA783': 'r',\n '\\u24E2': 's',\n '\\uFF53': 's',\n '\\u00DF': 's',\n '\\u015B': 's',\n '\\u1E65': 's',\n '\\u015D': 's',\n '\\u1E61': 's',\n '\\u0161': 's',\n '\\u1E67': 's',\n '\\u1E63': 's',\n '\\u1E69': 's',\n '\\u0219': 's',\n '\\u015F': 's',\n '\\u023F': 's',\n '\\uA7A9': 's',\n '\\uA785': 's',\n '\\u1E9B': 's',\n '\\u24E3': 't',\n '\\uFF54': 't',\n '\\u1E6B': 't',\n '\\u1E97': 't',\n '\\u0165': 't',\n '\\u1E6D': 't',\n '\\u021B': 't',\n '\\u0163': 't',\n '\\u1E71': 't',\n '\\u1E6F': 't',\n '\\u0167': 't',\n '\\u01AD': 't',\n '\\u0288': 't',\n '\\u2C66': 't',\n '\\uA787': 't',\n '\\uA729': 'tz',\n '\\u24E4': 'u',\n '\\uFF55': 'u',\n '\\u00F9': 'u',\n '\\u00FA': 'u',\n '\\u00FB': 'u',\n '\\u0169': 'u',\n '\\u1E79': 'u',\n '\\u016B': 'u',\n '\\u1E7B': 'u',\n '\\u016D': 'u',\n '\\u00FC': 'u',\n '\\u01DC': 'u',\n '\\u01D8': 'u',\n '\\u01D6': 'u',\n '\\u01DA': 'u',\n '\\u1EE7': 'u',\n '\\u016F': 'u',\n '\\u0171': 'u',\n '\\u01D4': 'u',\n '\\u0215': 'u',\n '\\u0217': 'u',\n '\\u01B0': 'u',\n '\\u1EEB': 'u',\n '\\u1EE9': 'u',\n '\\u1EEF': 'u',\n '\\u1EED': 'u',\n '\\u1EF1': 'u',\n '\\u1EE5': 'u',\n '\\u1E73': 'u',\n '\\u0173': 'u',\n '\\u1E77': 'u',\n '\\u1E75': 'u',\n '\\u0289': 'u',\n '\\u24E5': 'v',\n '\\uFF56': 'v',\n '\\u1E7D': 'v',\n '\\u1E7F': 'v',\n '\\u028B': 'v',\n '\\uA75F': 'v',\n '\\u028C': 'v',\n '\\uA761': 'vy',\n '\\u24E6': 'w',\n '\\uFF57': 'w',\n '\\u1E81': 'w',\n '\\u1E83': 'w',\n '\\u0175': 'w',\n '\\u1E87': 'w',\n '\\u1E85': 'w',\n '\\u1E98': 'w',\n '\\u1E89': 'w',\n '\\u2C73': 'w',\n '\\u24E7': 'x',\n '\\uFF58': 'x',\n '\\u1E8B': 'x',\n '\\u1E8D': 'x',\n '\\u24E8': 'y',\n '\\uFF59': 'y',\n '\\u1EF3': 'y',\n '\\u00FD': 'y',\n '\\u0177': 'y',\n '\\u1EF9': 'y',\n '\\u0233': 'y',\n '\\u1E8F': 'y',\n '\\u00FF': 'y',\n '\\u1EF7': 'y',\n '\\u1E99': 'y',\n '\\u1EF5': 'y',\n '\\u01B4': 'y',\n '\\u024F': 'y',\n '\\u1EFF': 'y',\n '\\u24E9': 'z',\n '\\uFF5A': 'z',\n '\\u017A': 'z',\n '\\u1E91': 'z',\n '\\u017C': 'z',\n '\\u017E': 'z',\n '\\u1E93': 'z',\n '\\u1E95': 'z',\n '\\u01B6': 'z',\n '\\u0225': 'z',\n '\\u0240': 'z',\n '\\u2C6C': 'z',\n '\\uA763': 'z',\n '\\u0386': '\\u0391',\n '\\u0388': '\\u0395',\n '\\u0389': '\\u0397',\n '\\u038A': '\\u0399',\n '\\u03AA': '\\u0399',\n '\\u038C': '\\u039F',\n '\\u038E': '\\u03A5',\n '\\u03AB': '\\u03A5',\n '\\u038F': '\\u03A9',\n '\\u03AC': '\\u03B1',\n '\\u03AD': '\\u03B5',\n '\\u03AE': '\\u03B7',\n '\\u03AF': '\\u03B9',\n '\\u03CA': '\\u03B9',\n '\\u0390': '\\u03B9',\n '\\u03CC': '\\u03BF',\n '\\u03CD': '\\u03C5',\n '\\u03CB': '\\u03C5',\n '\\u03B0': '\\u03C5',\n '\\u03C9': '\\u03C9',\n '\\u03C2': '\\u03C3'\n };\n DataUtil.fnOperators = {\n /**\n * Returns true when the actual input is equal to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param {boolean} ignoreAccent?\n * @param ignoreCase\n * @param ignoreAccent\n */\n equal: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) === DataUtil.toLowerCase(expected);\n }\n return actual === expected;\n },\n /**\n * Returns true when the actual input is not equal to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n * @param ignoreAccent\n */\n notequal: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n return !DataUtil.fnOperators.equal(actual, expected, ignoreCase);\n },\n /**\n * Returns true when the actual input is less than to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n */\n lessthan: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) < DataUtil.toLowerCase(expected);\n }\n if (isNullOrUndefined(actual)) {\n actual = undefined;\n }\n return actual < expected;\n },\n /**\n * Returns true when the actual input is greater than to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n */\n greaterthan: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) > DataUtil.toLowerCase(expected);\n }\n return actual > expected;\n },\n /**\n * Returns true when the actual input is less than or equal to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n */\n lessthanorequal: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) <= DataUtil.toLowerCase(expected);\n }\n if (isNullOrUndefined(actual)) {\n actual = undefined;\n }\n return actual <= expected;\n },\n /**\n * Returns true when the actual input is greater than or equal to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n */\n greaterthanorequal: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) >= DataUtil.toLowerCase(expected);\n }\n return actual >= expected;\n },\n /**\n * Returns true when the actual input contains the given string.\n *\n * @param {string|number} actual\n * @param {string|number} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n * @param ignoreAccent\n */\n contains: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n DataUtil.toLowerCase(actual).indexOf(DataUtil.toLowerCase(expected)) !== -1;\n }\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n actual.toString().indexOf(expected) !== -1;\n },\n /**\n * Returns true when the actual input not contains the given string.\n *\n * @param {string|number} actual\n * @param {string|number} expected\n * @param {boolean} ignoreCase?\n */\n doesnotcontain: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n DataUtil.toLowerCase(actual).indexOf(DataUtil.toLowerCase(expected)) === -1;\n }\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n actual.toString().indexOf(expected) === -1;\n },\n /**\n * Returns true when the given input value is not null.\n *\n * @param {string|number} actual\n * @returns boolean\n */\n isnotnull: function (actual) {\n return actual !== null && actual !== undefined;\n },\n /**\n * Returns true when the given input value is null.\n *\n * @param {string|number} actual\n * @returns boolean\n */\n isnull: function (actual) {\n return actual === null || actual === undefined;\n },\n /**\n * Returns true when the actual input starts with the given string\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n * @param ignoreAccent\n */\n startswith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.startsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.startsWith(actual, expected);\n },\n /**\n * Returns true when the actual input not starts with the given string\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n doesnotstartwith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.notStartsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.notStartsWith(actual, expected);\n },\n /**\n * Returns true when the actual input like with the given string.\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n like: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.like(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.like(actual, expected);\n },\n /**\n * Returns true when the given input value is empty.\n *\n * @param {string|number} actual\n * @returns boolean\n */\n isempty: function (actual) {\n return actual === undefined || actual === '';\n },\n /**\n * Returns true when the given input value is not empty.\n *\n * @param {string|number} actual\n * @returns boolean\n */\n isnotempty: function (actual) {\n return actual !== undefined && actual !== '';\n },\n /**\n * Returns true when the actual input pattern(wildcard) matches with the given string.\n *\n * @param {string|Date} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n wildcard: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return (actual || typeof actual === 'boolean') && expected && typeof actual !== 'object' &&\n DataUtil.wildCard(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return (actual || typeof actual === 'boolean') && expected && DataUtil.wildCard(actual, expected);\n },\n /**\n * Returns true when the actual input ends with the given string.\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n * @param ignoreAccent\n */\n endswith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.endsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.endsWith(actual, expected);\n },\n /**\n * Returns true when the actual input not ends with the given string.\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n doesnotendwith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.notEndsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.notEndsWith(actual, expected);\n },\n /**\n * It will return the filter operator based on the filter symbol.\n *\n * @param {string} operator\n * @hidden\n */\n processSymbols: function (operator) {\n var fnName = DataUtil.operatorSymbols[operator];\n if (fnName) {\n var fn = DataUtil.fnOperators[fnName];\n return fn;\n }\n return DataUtil.throwError('Query - Process Operator : Invalid operator');\n },\n /**\n * It will return the valid filter operator based on the specified operators.\n *\n * @param {string} operator\n * @hidden\n */\n processOperator: function (operator) {\n var fn = DataUtil.fnOperators[operator];\n if (fn) {\n return fn;\n }\n return DataUtil.fnOperators.processSymbols(operator);\n }\n };\n /**\n * To perform the parse operation on JSON data, like convert to string from JSON or convert to JSON from string.\n */\n DataUtil.parse = {\n /**\n * Parse the given string to the plain JavaScript object.\n *\n * @param {string|Object|Object[]} jsonText\n */\n parseJson: function (jsonText) {\n if (typeof jsonText === 'string' && (/^[\\s]*\\[|^[\\s]*\\{(.)+:/g.test(jsonText) || jsonText.indexOf('\"') === -1)) {\n jsonText = JSON.parse(jsonText, DataUtil.parse.jsonReviver);\n }\n else if (jsonText instanceof Array) {\n DataUtil.parse.iterateAndReviveArray(jsonText);\n }\n else if (typeof jsonText === 'object' && jsonText !== null) {\n DataUtil.parse.iterateAndReviveJson(jsonText);\n }\n return jsonText;\n },\n /**\n * It will perform on array of values.\n *\n * @param {string[]|Object[]} array\n * @hidden\n */\n iterateAndReviveArray: function (array) {\n for (var i = 0; i < array.length; i++) {\n if (typeof array[i] === 'object' && array[i] !== null) {\n DataUtil.parse.iterateAndReviveJson(array[i]);\n // eslint-disable-next-line no-useless-escape\n }\n else if (typeof array[i] === 'string' && (!/^[\\s]*\\[|^[\\s]*\\{(.)+:|\\\"/g.test(array[i]) ||\n array[i].toString().indexOf('\"') === -1)) {\n array[i] = DataUtil.parse.jsonReviver('', array[i]);\n }\n else {\n array[i] = DataUtil.parse.parseJson(array[i]);\n }\n }\n },\n /**\n * It will perform on JSON values\n *\n * @param {JSON} json\n * @hidden\n */\n iterateAndReviveJson: function (json) {\n var value;\n var keys = Object.keys(json);\n for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) {\n var prop = keys_2[_i];\n if (DataUtil.startsWith(prop, '__')) {\n continue;\n }\n value = json[prop];\n if (typeof value === 'object') {\n if (value instanceof Array) {\n DataUtil.parse.iterateAndReviveArray(value);\n }\n else if (value) {\n DataUtil.parse.iterateAndReviveJson(value);\n }\n }\n else {\n json[prop] = DataUtil.parse.jsonReviver(json[prop], value);\n }\n }\n },\n /**\n * It will perform on JSON values\n *\n * @param {string} field\n * @param {string|Date} value\n * @hidden\n */\n jsonReviver: function (field, value) {\n if (typeof value === 'string') {\n // eslint-disable-next-line security/detect-unsafe-regex\n var ms = /^\\/Date\\(([+-]?[0-9]+)([+-][0-9]{4})?\\)\\/$/.exec(value);\n var offSet = DataUtil.timeZoneHandling ? DataUtil.serverTimezoneOffset : null;\n if (ms) {\n return DataUtil.dateParse.toTimeZone(new Date(parseInt(ms[1], 10)), offSet, true);\n // eslint-disable-next-line no-useless-escape, security/detect-unsafe-regex\n }\n else if (/^(\\d{4}\\-\\d\\d\\-\\d\\d([tT][\\d:\\.]*){1})([zZ]|([+\\-])(\\d\\d):?(\\d\\d))?$/.test(value)) {\n var isUTC = value.indexOf('Z') > -1 || value.indexOf('z') > -1;\n var arr = value.split(/[^0-9.]/);\n if (isUTC) {\n if (arr[5].indexOf('.') > -1) {\n var secondsMs = arr[5].split('.');\n arr[5] = secondsMs[0];\n arr[6] = new Date(value).getUTCMilliseconds().toString();\n }\n else {\n arr[6] = '00';\n }\n value = DataUtil.dateParse\n .toTimeZone(new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, parseInt(arr[2], 10), parseInt(arr[3], 10), parseInt(arr[4], 10), parseInt(arr[5] ? arr[5] : '00', 10), parseInt(arr[6], 10)), DataUtil.serverTimezoneOffset, false);\n }\n else {\n var utcFormat = new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, parseInt(arr[2], 10), parseInt(arr[3], 10), parseInt(arr[4], 10), parseInt(arr[5] ? arr[5] : '00', 10));\n var hrs = parseInt(arr[6], 10);\n var mins = parseInt(arr[7], 10);\n if (isNaN(hrs) && isNaN(mins)) {\n return utcFormat;\n }\n if (value.indexOf('+') > -1) {\n utcFormat.setHours(utcFormat.getHours() - hrs, utcFormat.getMinutes() - mins);\n }\n else {\n utcFormat.setHours(utcFormat.getHours() + hrs, utcFormat.getMinutes() + mins);\n }\n value = DataUtil.dateParse\n .toTimeZone(utcFormat, DataUtil.serverTimezoneOffset, false);\n }\n if (DataUtil.serverTimezoneOffset == null) {\n value = DataUtil.dateParse.addSelfOffset(value);\n }\n }\n }\n return value;\n },\n /**\n * Check wheather the given value is JSON or not.\n *\n * @param {Object[]} jsonData\n */\n isJson: function (jsonData) {\n if (typeof jsonData[0] === 'string') {\n return jsonData;\n }\n return DataUtil.parse.parseJson(jsonData);\n },\n /**\n * Checks wheather the given value is GUID or not.\n *\n * @param {string} value\n */\n isGuid: function (value) {\n // eslint-disable-next-line security/detect-unsafe-regex\n var regex = /[A-Fa-f0-9]{8}(?:-[A-Fa-f0-9]{4}){3}-[A-Fa-f0-9]{12}/i;\n var match = regex.exec(value);\n return match != null;\n },\n /**\n * The method used to replace the value based on the type.\n *\n * @param {Object} value\n * @param {boolean} stringify\n * @hidden\n */\n replacer: function (value, stringify) {\n if (DataUtil.isPlainObject(value)) {\n return DataUtil.parse.jsonReplacer(value, stringify);\n }\n if (value instanceof Array) {\n return DataUtil.parse.arrayReplacer(value);\n }\n if (value instanceof Date) {\n return DataUtil.parse.jsonReplacer({ val: value }, stringify).val;\n }\n return value;\n },\n /**\n * It will replace the JSON value.\n *\n * @param {string} key\n * @param {Object} val\n * @param stringify\n * @hidden\n */\n jsonReplacer: function (val, stringify) {\n var value;\n var keys = Object.keys(val);\n for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) {\n var prop = keys_3[_i];\n value = val[prop];\n if (!(value instanceof Date)) {\n continue;\n }\n var d = value;\n if (DataUtil.serverTimezoneOffset == null) {\n val[prop] = DataUtil.dateParse.toTimeZone(d, null).toJSON();\n }\n else {\n d = new Date(+d + DataUtil.serverTimezoneOffset * 3600000);\n val[prop] = DataUtil.dateParse.toTimeZone(DataUtil.dateParse.addSelfOffset(d), null).toJSON();\n }\n }\n return val;\n },\n /**\n * It will replace the Array of value.\n *\n * @param {string} key\n * @param {Object[]} val\n * @hidden\n */\n arrayReplacer: function (val) {\n for (var i = 0; i < val.length; i++) {\n if (DataUtil.isPlainObject(val[i])) {\n val[i] = DataUtil.parse.jsonReplacer(val[i]);\n }\n else if (val[i] instanceof Date) {\n val[i] = DataUtil.parse.jsonReplacer({ date: val[i] }).date;\n }\n }\n return val;\n },\n /**\n * It will replace the Date object with respective to UTC format value.\n *\n * @param {string} key\n * @param {any} value\n * @hidden\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n /* tslint:disable-next-line:no-any */\n jsonDateReplacer: function (key, value) {\n /* eslint-enable @typescript-eslint/no-explicit-any */\n if (key === 'value' && value) {\n if (typeof value === 'string') {\n // eslint-disable-next-line security/detect-unsafe-regex\n var ms = /^\\/Date\\(([+-]?[0-9]+)([+-][0-9]{4})?\\)\\/$/.exec(value);\n if (ms) {\n value = DataUtil.dateParse.toTimeZone(new Date(parseInt(ms[1], 10)), null, true);\n // eslint-disable-next-line no-useless-escape, security/detect-unsafe-regex\n }\n else if (/^(\\d{4}\\-\\d\\d\\-\\d\\d([tT][\\d:\\.]*){1})([zZ]|([+\\-])(\\d\\d):?(\\d\\d))?$/.test(value)) {\n var arr = value.split(/[^0-9]/);\n value = DataUtil.dateParse\n .toTimeZone(new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, parseInt(arr[2], 10), parseInt(arr[3], 10), parseInt(arr[4], 10), parseInt(arr[5], 10)), null, true);\n }\n }\n if (value instanceof Date) {\n value = DataUtil.dateParse.addSelfOffset(value);\n if (DataUtil.serverTimezoneOffset === null) {\n return DataUtil.dateParse.toTimeZone(DataUtil.dateParse.addSelfOffset(value), null).toJSON();\n }\n else {\n value = DataUtil.dateParse.toTimeZone(value, ((value.getTimezoneOffset() / 60)\n - DataUtil.serverTimezoneOffset), false);\n return value.toJSON();\n }\n }\n }\n return value;\n }\n };\n /**\n * @hidden\n */\n DataUtil.dateParse = {\n addSelfOffset: function (input) {\n return new Date(+input - (input.getTimezoneOffset() * 60000));\n },\n toUTC: function (input) {\n return new Date(+input + (input.getTimezoneOffset() * 60000));\n },\n toTimeZone: function (input, offset, utc) {\n if (offset === null) {\n return input;\n }\n var unix = utc ? DataUtil.dateParse.toUTC(input) : input;\n return new Date(+unix - (offset * 3600000));\n },\n toLocalTime: function (input) {\n var datefn = input;\n var timeZone = -datefn.getTimezoneOffset();\n var differenceString = timeZone >= 0 ? '+' : '-';\n var localtimefn = function (num) {\n var norm = Math.floor(Math.abs(num));\n return (norm < 10 ? '0' : '') + norm;\n };\n var val = datefn.getFullYear() + '-' + localtimefn(datefn.getMonth() + 1) + '-' + localtimefn(datefn.getDate()) +\n 'T' + localtimefn(datefn.getHours()) +\n ':' + localtimefn(datefn.getMinutes()) +\n ':' + localtimefn(datefn.getSeconds()) +\n differenceString + localtimefn(timeZone / 60) +\n ':' + localtimefn(timeZone % 60);\n return val;\n }\n };\n return DataUtil;\n}());\nexport { DataUtil };\n","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport { merge, extend, isNullOrUndefined, setValue, getValue } from '@syncfusion/ej2-base';\nimport { DataUtil } from './util';\nimport { Query, Predicate } from './query';\nvar consts = { GroupGuid: '{271bbba0-1ee7}' };\n/**\n * Adaptors are specific data source type aware interfaces that are used by DataManager to communicate with DataSource.\n * This is the base adaptor class that other adaptors can extend.\n *\n * @hidden\n */\nvar Adaptor = /** @class */ (function () {\n /**\n * Constructor for Adaptor class\n *\n * @param {DataOptions} ds?\n * @param ds\n * @hidden\n * @returns aggregates\n */\n function Adaptor(ds) {\n // common options for all the adaptors\n this.options = {\n from: 'table',\n requestType: 'json',\n sortBy: 'sorted',\n select: 'select',\n skip: 'skip',\n group: 'group',\n take: 'take',\n search: 'search',\n count: 'requiresCounts',\n where: 'where',\n aggregates: 'aggregates',\n expand: 'expand'\n };\n /**\n * Specifies the type of adaptor.\n *\n * @default Adaptor\n */\n this.type = Adaptor;\n this.dataSource = ds;\n this.pvt = {};\n }\n /**\n * Returns the data from the query processing.\n *\n * @param {Object} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {Request} xhr?\n * @param ds\n * @param query\n * @param xhr\n * @returns Object\n */\n Adaptor.prototype.processResponse = function (data, ds, query, xhr) {\n return data;\n };\n return Adaptor;\n}());\nexport { Adaptor };\n/**\n * JsonAdaptor is used to process JSON data. It contains methods to process the given JSON data based on the queries.\n *\n * @hidden\n */\nvar JsonAdaptor = /** @class */ (function (_super) {\n __extends(JsonAdaptor, _super);\n function JsonAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Process the JSON data based on the provided queries.\n *\n * @param {DataManager} dataManager\n * @param {Query} query\n * @returns Object\n */\n JsonAdaptor.prototype.processQuery = function (dataManager, query) {\n var result = dataManager.dataSource.json.slice(0);\n var count = result.length;\n var countFlg = true;\n var ret;\n var key;\n var lazyLoad = {};\n var keyCount = 0;\n var group = [];\n var sort = [];\n var page;\n for (var i = 0; i < query.lazyLoad.length; i++) {\n keyCount++;\n lazyLoad[query.lazyLoad[i].key] = query.lazyLoad[i].value;\n }\n var agg = {};\n for (var i = 0; i < query.queries.length; i++) {\n key = query.queries[i];\n if ((key.fn === 'onPage' || key.fn === 'onGroup' || key.fn === 'onSortBy') && query.lazyLoad.length) {\n if (key.fn === 'onGroup') {\n group.push(key.e);\n }\n if (key.fn === 'onPage') {\n page = key.e;\n }\n if (key.fn === 'onSortBy') {\n sort.unshift(key.e);\n }\n continue;\n }\n ret = this[key.fn].call(this, result, key.e, query);\n if (key.fn === 'onAggregates') {\n agg[key.e.field + ' - ' + key.e.type] = ret;\n }\n else {\n result = ret !== undefined ? ret : result;\n }\n if (key.fn === 'onPage' || key.fn === 'onSkip' || key.fn === 'onTake' || key.fn === 'onRange') {\n countFlg = false;\n }\n if (countFlg) {\n count = result.length;\n }\n }\n if (keyCount) {\n var args = {\n query: query, lazyLoad: lazyLoad, result: result, group: group, page: page, sort: sort\n };\n var lazyLoadData = this.lazyLoadGroup(args);\n result = lazyLoadData.result;\n count = lazyLoadData.count;\n }\n if (query.isCountRequired) {\n result = {\n result: result,\n count: count,\n aggregates: agg\n };\n }\n return result;\n };\n /**\n * Perform lazy load grouping in JSON array based on the given query and lazy load details.\n *\n * @param {LazyLoadGroupArgs} args\n */\n JsonAdaptor.prototype.lazyLoadGroup = function (args) {\n var count = 0;\n var agg = this.getAggregate(args.query);\n var result = args.result;\n if (!isNullOrUndefined(args.lazyLoad.onDemandGroupInfo)) {\n var req = args.lazyLoad.onDemandGroupInfo;\n for (var i = req.where.length - 1; i >= 0; i--) {\n result = this.onWhere(result, req.where[i]);\n }\n if (args.group.length !== req.level) {\n var field = args.group[req.level].fieldName;\n result = DataUtil.group(result, field, agg, null, null, args.group[0].comparer, true);\n result = this.onSortBy(result, args.sort[parseInt(req.level.toString(), 10)], args.query, true);\n }\n else {\n for (var i = args.sort.length - 1; i >= req.level; i--) {\n result = this.onSortBy(result, args.sort[parseInt(i.toString(), 10)], args.query, false);\n }\n }\n count = result.length;\n var data = result;\n result = result.slice(req.skip);\n result = result.slice(0, req.take);\n if (args.group.length !== req.level) {\n this.formGroupResult(result, data);\n }\n }\n else {\n var field_1 = args.group[0].fieldName;\n result = DataUtil.group(result, field_1, agg, null, null, args.group[0].comparer, true);\n count = result.length;\n var data = result;\n if (args.sort.length) {\n var sort = args.sort.length > 1 ?\n args.sort.filter(function (x) { return x.fieldName === field_1; })[0] : args.sort[0];\n result = this.onSortBy(result, sort, args.query, true);\n }\n if (args.page) {\n result = this.onPage(result, args.page, args.query);\n }\n this.formGroupResult(result, data);\n }\n return { result: result, count: count };\n };\n JsonAdaptor.prototype.formGroupResult = function (result, data) {\n if (result.length && data.length) {\n var uid = 'GroupGuid';\n var childLevel = 'childLevels';\n var level = 'level';\n var records = 'records';\n result[uid] = data[uid];\n result[childLevel] = data[childLevel];\n result[level] = data[level];\n result[records] = data[records];\n }\n return result;\n };\n /**\n * Separate the aggregate query from the given queries\n *\n * @param {Query} query\n */\n JsonAdaptor.prototype.getAggregate = function (query) {\n var aggQuery = Query.filterQueries(query.queries, 'onAggregates');\n var agg = [];\n if (aggQuery.length) {\n var tmp = void 0;\n for (var i = 0; i < aggQuery.length; i++) {\n tmp = aggQuery[i].e;\n agg.push({ type: tmp.type, field: DataUtil.getValue(tmp.field, query) });\n }\n }\n return agg;\n };\n /**\n * Performs batch update in the JSON array which add, remove and update records.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n */\n JsonAdaptor.prototype.batchRequest = function (dm, changes, e) {\n var i;\n var deletedRecordsLen = changes.deletedRecords.length;\n for (i = 0; i < changes.addedRecords.length; i++) {\n this.insert(dm, changes.addedRecords[i]);\n }\n for (i = 0; i < changes.changedRecords.length; i++) {\n this.update(dm, e.key, changes.changedRecords[i]);\n }\n for (i = 0; i < deletedRecordsLen; i++) {\n this.remove(dm, e.key, changes.deletedRecords[i]);\n }\n return changes;\n };\n /**\n * Performs filter operation with the given data and where query.\n *\n * @param {Object[]} ds\n * @param {{validate:Function}} e\n * @param e.validate\n */\n JsonAdaptor.prototype.onWhere = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.filter(function (obj) {\n if (e) {\n return e.validate(obj);\n }\n });\n };\n /**\n * Returns aggregate function based on the aggregate type.\n *\n * @param {Object[]} ds\n * @param e\n * @param {string} } type\n * @param e.field\n * @param e.type\n */\n JsonAdaptor.prototype.onAggregates = function (ds, e) {\n var fn = DataUtil.aggregates[e.type];\n if (!ds || !fn || ds.length === 0) {\n return null;\n }\n return fn(ds, e.field);\n };\n /**\n * Performs search operation based on the given query.\n *\n * @param {Object[]} ds\n * @param {QueryOptions} e\n */\n JsonAdaptor.prototype.onSearch = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n if (e.fieldNames.length === 0) {\n DataUtil.getFieldList(ds[0], e.fieldNames);\n }\n return ds.filter(function (obj) {\n for (var j = 0; j < e.fieldNames.length; j++) {\n if (e.comparer.call(obj, DataUtil.getObject(e.fieldNames[j], obj), e.searchKey, e.ignoreCase, e.ignoreAccent)) {\n return true;\n }\n }\n return false;\n });\n };\n /**\n * Sort the data with given direction and field.\n *\n * @param {Object[]} ds\n * @param e\n * @param {Object} b\n * @param e.comparer\n * @param e.fieldName\n * @param query\n * @param isLazyLoadGroupSort\n */\n JsonAdaptor.prototype.onSortBy = function (ds, e, query, isLazyLoadGroupSort) {\n if (!ds || !ds.length) {\n return ds;\n }\n var fnCompare;\n var field = DataUtil.getValue(e.fieldName, query);\n if (!field) {\n return ds.sort(e.comparer);\n }\n if (field instanceof Array) {\n field = field.slice(0);\n for (var i = field.length - 1; i >= 0; i--) {\n if (!field[i]) {\n continue;\n }\n fnCompare = e.comparer;\n if (DataUtil.endsWith(field[i], ' desc')) {\n fnCompare = DataUtil.fnSort('descending');\n field[i] = field[i].replace(' desc', '');\n }\n ds = DataUtil.sort(ds, field[i], fnCompare);\n }\n return ds;\n }\n return DataUtil.sort(ds, isLazyLoadGroupSort ? 'key' : field, e.comparer);\n };\n /**\n * Group the data based on the given query.\n *\n * @param {Object[]} ds\n * @param {QueryOptions} e\n * @param {Query} query\n */\n JsonAdaptor.prototype.onGroup = function (ds, e, query) {\n if (!ds || !ds.length) {\n return ds;\n }\n var agg = this.getAggregate(query);\n return DataUtil.group(ds, DataUtil.getValue(e.fieldName, query), agg, null, null, e.comparer);\n };\n /**\n * Retrieves records based on the given page index and size.\n *\n * @param {Object[]} ds\n * @param e\n * @param {number} } pageIndex\n * @param e.pageSize\n * @param {Query} query\n * @param e.pageIndex\n */\n JsonAdaptor.prototype.onPage = function (ds, e, query) {\n var size = DataUtil.getValue(e.pageSize, query);\n var start = (DataUtil.getValue(e.pageIndex, query) - 1) * size;\n var end = start + size;\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(start, end);\n };\n /**\n * Retrieves records based on the given start and end index from query.\n *\n * @param {Object[]} ds\n * @param e\n * @param {number} } end\n * @param e.start\n * @param e.end\n */\n JsonAdaptor.prototype.onRange = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(DataUtil.getValue(e.start), DataUtil.getValue(e.end));\n };\n /**\n * Picks the given count of records from the top of the datasource.\n *\n * @param {Object[]} ds\n * @param {{nos:number}} e\n * @param e.nos\n */\n JsonAdaptor.prototype.onTake = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(0, DataUtil.getValue(e.nos));\n };\n /**\n * Skips the given count of records from the data source.\n *\n * @param {Object[]} ds\n * @param {{nos:number}} e\n * @param e.nos\n */\n JsonAdaptor.prototype.onSkip = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(DataUtil.getValue(e.nos));\n };\n /**\n * Selects specified columns from the data source.\n *\n * @param {Object[]} ds\n * @param {{fieldNames:string}} e\n * @param e.fieldNames\n */\n JsonAdaptor.prototype.onSelect = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return DataUtil.select(ds, DataUtil.getValue(e.fieldNames));\n };\n /**\n * Inserts new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param tableName\n * @param query\n * @param {number} position\n */\n JsonAdaptor.prototype.insert = function (dm, data, tableName, query, position) {\n if (isNullOrUndefined(position)) {\n return dm.dataSource.json.push(data);\n }\n else {\n return dm.dataSource.json.splice(position, 0, data);\n }\n };\n /**\n * Remove the data from the dataSource based on the key field value.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n * @returns null\n */\n JsonAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n var ds = dm.dataSource.json;\n var i;\n if (typeof value === 'object' && !(value instanceof Date)) {\n value = DataUtil.getObject(keyField, value);\n }\n for (i = 0; i < ds.length; i++) {\n if (DataUtil.getObject(keyField, ds[i]) === value) {\n break;\n }\n }\n return i !== ds.length ? ds.splice(i, 1) : null;\n };\n /**\n * Updates existing record and saves the changes to the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n * @returns null\n */\n JsonAdaptor.prototype.update = function (dm, keyField, value, tableName) {\n var ds = dm.dataSource.json;\n var i;\n var key;\n if (!isNullOrUndefined(keyField)) {\n key = getValue(keyField, value);\n }\n for (i = 0; i < ds.length; i++) {\n if (!isNullOrUndefined(keyField) && (getValue(keyField, ds[i])) === key) {\n break;\n }\n }\n return i < ds.length ? merge(ds[i], value) : null;\n };\n return JsonAdaptor;\n}(Adaptor));\nexport { JsonAdaptor };\n/**\n * URL Adaptor of DataManager can be used when you are required to use remote service to retrieve data.\n * It interacts with server-side for all DataManager Queries and CRUD operations.\n *\n * @hidden\n */\nvar UrlAdaptor = /** @class */ (function (_super) {\n __extends(UrlAdaptor, _super);\n function UrlAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Process the query to generate request body.\n *\n * @param {DataManager} dm\n * @param {Query} query\n * @param {Object[]} hierarchyFilters?\n * @param hierarchyFilters\n * @returns p\n */\n // tslint:disable-next-line:max-func-body-length\n UrlAdaptor.prototype.processQuery = function (dm, query, hierarchyFilters) {\n var queries = this.getQueryRequest(query);\n var singles = Query.filterQueryLists(query.queries, ['onSelect', 'onPage', 'onSkip', 'onTake', 'onRange']);\n var params = query.params;\n var url = dm.dataSource.url;\n var temp;\n var skip;\n var take = null;\n var options = this.options;\n var request = { sorts: [], groups: [], filters: [], searches: [], aggregates: [] };\n // calc Paging & Range\n if ('onPage' in singles) {\n temp = singles.onPage;\n skip = DataUtil.getValue(temp.pageIndex, query);\n take = DataUtil.getValue(temp.pageSize, query);\n skip = (skip - 1) * take;\n }\n else if ('onRange' in singles) {\n temp = singles.onRange;\n skip = temp.start;\n take = temp.end - temp.start;\n }\n // Sorting\n for (var i = 0; i < queries.sorts.length; i++) {\n temp = DataUtil.getValue(queries.sorts[i].e.fieldName, query);\n request.sorts.push(DataUtil.callAdaptorFunction(this, 'onEachSort', { name: temp, direction: queries.sorts[i].e.direction }, query));\n }\n // hierarchy\n if (hierarchyFilters) {\n temp = this.getFiltersFrom(hierarchyFilters, query);\n if (temp) {\n request.filters.push(DataUtil.callAdaptorFunction(this, 'onEachWhere', temp.toJson(), query));\n }\n }\n // Filters\n for (var i = 0; i < queries.filters.length; i++) {\n var res = DataUtil.callAdaptorFunction(this, 'onEachWhere', queries.filters[i].e.toJson(), query);\n if ((this.getModuleName &&\n this.getModuleName() === 'ODataV4Adaptor') &&\n !isNullOrUndefined(queries.filters[i].e.key) && queries.filters.length > 1) {\n res = '(' + res + ')';\n }\n request.filters.push(res);\n var keys_3 = typeof request.filters[i] === 'object' ? Object.keys(request.filters[i]) : [];\n for (var _i = 0, keys_1 = keys_3; _i < keys_1.length; _i++) {\n var prop = keys_1[_i];\n if (DataUtil.isNull((request)[prop])) {\n delete request[prop];\n }\n }\n }\n // Searches\n for (var i = 0; i < queries.searches.length; i++) {\n temp = queries.searches[i].e;\n request.searches.push(DataUtil.callAdaptorFunction(this, 'onEachSearch', {\n fields: temp.fieldNames,\n operator: temp.operator,\n key: temp.searchKey,\n ignoreCase: temp.ignoreCase\n }, query));\n }\n // Grouping\n for (var i = 0; i < queries.groups.length; i++) {\n request.groups.push(DataUtil.getValue(queries.groups[i].e.fieldName, query));\n }\n // aggregates\n for (var i = 0; i < queries.aggregates.length; i++) {\n temp = queries.aggregates[i].e;\n request.aggregates.push({ type: temp.type, field: DataUtil.getValue(temp.field, query) });\n }\n var req = {};\n this.getRequestQuery(options, query, singles, request, req);\n // Params\n DataUtil.callAdaptorFunction(this, 'addParams', { dm: dm, query: query, params: params, reqParams: req });\n if (query.lazyLoad.length) {\n for (var i = 0; i < query.lazyLoad.length; i++) {\n req[query.lazyLoad[i].key] = query.lazyLoad[i].value;\n }\n }\n // cleanup\n var keys = Object.keys(req);\n for (var _a = 0, keys_2 = keys; _a < keys_2.length; _a++) {\n var prop = keys_2[_a];\n if (DataUtil.isNull(req[prop]) || req[prop] === '' || req[prop].length === 0) {\n delete req[prop];\n }\n }\n if (!(options.skip in req && options.take in req) && take !== null) {\n req[options.skip] = DataUtil.callAdaptorFunction(this, 'onSkip', skip, query);\n req[options.take] = DataUtil.callAdaptorFunction(this, 'onTake', take, query);\n }\n var p = this.pvt;\n this.pvt = {};\n if (this.options.requestType === 'json') {\n return {\n data: JSON.stringify(req, DataUtil.parse.jsonDateReplacer),\n url: url,\n pvtData: p,\n type: 'POST',\n contentType: 'application/json; charset=utf-8'\n };\n }\n temp = this.convertToQueryString(req, query, dm);\n temp = (dm.dataSource.url.indexOf('?') !== -1 ? '&' : '/') + temp;\n return {\n type: 'GET', url: temp.length ? url.replace(/\\/*$/, temp) : url, pvtData: p\n };\n };\n UrlAdaptor.prototype.getRequestQuery = function (options, query, singles, request, request1) {\n var param = 'param';\n var req = request1;\n req[options.from] = query.fromTable;\n if (options.apply && query.distincts.length) {\n req[options.apply] = 'onDistinct' in this ? DataUtil.callAdaptorFunction(this, 'onDistinct', query.distincts) : '';\n }\n if (!query.distincts.length && options.expand) {\n req[options.expand] = 'onExpand' in this && 'onSelect' in singles ?\n DataUtil.callAdaptorFunction(this, 'onExpand', { selects: DataUtil.getValue(singles.onSelect.fieldNames, query), expands: query.expands }, query) : query.expands;\n }\n req[options.select] = 'onSelect' in singles && !query.distincts.length ?\n DataUtil.callAdaptorFunction(this, 'onSelect', DataUtil.getValue(singles.onSelect.fieldNames, query), query) : '';\n req[options.count] = query.isCountRequired ? DataUtil.callAdaptorFunction(this, 'onCount', query.isCountRequired, query) : '';\n req[options.search] = request.searches.length ? DataUtil.callAdaptorFunction(this, 'onSearch', request.searches, query) : '';\n req[options.skip] = 'onSkip' in singles ?\n DataUtil.callAdaptorFunction(this, 'onSkip', DataUtil.getValue(singles.onSkip.nos, query), query) : '';\n req[options.take] = 'onTake' in singles ?\n DataUtil.callAdaptorFunction(this, 'onTake', DataUtil.getValue(singles.onTake.nos, query), query) : '';\n req[options.where] = request.filters.length || request.searches.length ?\n DataUtil.callAdaptorFunction(this, 'onWhere', request.filters, query) : '';\n req[options.sortBy] = request.sorts.length ? DataUtil.callAdaptorFunction(this, 'onSortBy', request.sorts, query) : '';\n req[options.group] = request.groups.length ? DataUtil.callAdaptorFunction(this, 'onGroup', request.groups, query) : '';\n req[options.aggregates] = request.aggregates.length ?\n DataUtil.callAdaptorFunction(this, 'onAggregates', request.aggregates, query) : '';\n req[param] = [];\n };\n /**\n * Convert the object from processQuery to string which can be added query string.\n *\n * @param {Object} req\n * @param request\n * @param {Query} query\n * @param {DataManager} dm\n */\n UrlAdaptor.prototype.convertToQueryString = function (request, query, dm) {\n return '';\n // this needs to be overridden\n };\n /**\n * Return the data from the data manager processing.\n *\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {Request} xhr?\n * @param {Object} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n */\n UrlAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n if (xhr && xhr.headers.get('Content-Type') &&\n xhr.headers.get('Content-Type').indexOf('application/json') !== -1) {\n var handleTimeZone = DataUtil.timeZoneHandling;\n if (ds && !ds.timeZoneHandling) {\n DataUtil.timeZoneHandling = false;\n }\n data = DataUtil.parse.parseJson(data);\n DataUtil.timeZoneHandling = handleTimeZone;\n }\n var requests = request;\n var pvt = requests.pvtData || {};\n var groupDs = data ? data.groupDs : [];\n if (xhr && xhr.headers.get('Content-Type') &&\n xhr.headers.get('Content-Type').indexOf('xml') !== -1) {\n return (query.isCountRequired ? { result: [], count: 0 } : []);\n }\n var d = JSON.parse(requests.data);\n if (d && d.action === 'batch' && data && data.addedRecords) {\n changes.addedRecords = data.addedRecords;\n return changes;\n }\n if (data && data.d) {\n data = data.d;\n }\n var args = {};\n if (data && 'count' in data) {\n args.count = data.count;\n }\n args.result = data && data.result ? data.result : data;\n var isExpand = false;\n if (Array.isArray(data.result) && data.result.length) {\n var key = 'key';\n var val = 'value';\n var level = 'level';\n if (!isNullOrUndefined(data.result[0][key])) {\n args.result = this.formRemoteGroupedData(args.result, 1, pvt.groups.length - 1);\n }\n if (query && query.lazyLoad.length && pvt.groups.length) {\n for (var i = 0; i < query.lazyLoad.length; i++) {\n if (query.lazyLoad[i][key] === 'onDemandGroupInfo') {\n var value = query.lazyLoad[i][val][level];\n if (pvt.groups.length === value) {\n isExpand = true;\n }\n }\n }\n }\n }\n if (!isExpand) {\n this.getAggregateResult(pvt, data, args, groupDs, query);\n }\n return DataUtil.isNull(args.count) ? args.result : { result: args.result, count: args.count, aggregates: args.aggregates };\n };\n UrlAdaptor.prototype.formRemoteGroupedData = function (data, level, childLevel) {\n for (var i = 0; i < data.length; i++) {\n if (data[i].items.length && Object.keys(data[i].items[0]).indexOf('key') > -1) {\n this.formRemoteGroupedData(data[i].items, level + 1, childLevel - 1);\n }\n }\n var uid = 'GroupGuid';\n var childLvl = 'childLevels';\n var lvl = 'level';\n var records = 'records';\n data[uid] = consts[uid];\n data[lvl] = level;\n data[childLvl] = childLevel;\n data[records] = data[0].items.length ? this.getGroupedRecords(data, !isNullOrUndefined(data[0].items[records])) : [];\n return data;\n };\n UrlAdaptor.prototype.getGroupedRecords = function (data, hasRecords) {\n var childGroupedRecords = [];\n var records = 'records';\n for (var i = 0; i < data.length; i++) {\n if (!hasRecords) {\n for (var j = 0; j < data[i].items.length; j++) {\n childGroupedRecords.push(data[i].items[j]);\n }\n }\n else {\n childGroupedRecords = childGroupedRecords.concat(data[i].items[records]);\n }\n }\n return childGroupedRecords;\n };\n /**\n * Add the group query to the adaptor`s option.\n *\n * @param {Object[]} e\n * @returns void\n */\n UrlAdaptor.prototype.onGroup = function (e) {\n this.pvt.groups = e;\n return e;\n };\n /**\n * Add the aggregate query to the adaptor`s option.\n *\n * @param {Aggregates[]} e\n * @returns void\n */\n UrlAdaptor.prototype.onAggregates = function (e) {\n this.pvt.aggregates = e;\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {Object} e\n * @param query\n * @param original\n */\n UrlAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n var url;\n var key;\n return {\n type: 'POST',\n url: dm.dataSource.batchUrl || dm.dataSource.crudUrl || dm.dataSource.removeUrl || dm.dataSource.url,\n contentType: 'application/json; charset=utf-8',\n dataType: 'json',\n data: JSON.stringify(extend({}, {\n changed: changes.changedRecords,\n added: changes.addedRecords,\n deleted: changes.deletedRecords,\n action: 'batch',\n table: e[url],\n key: e[key]\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {Request} request\n * @returns void\n */\n UrlAdaptor.prototype.beforeSend = function (dm, request) {\n // need to extend this method\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName\n * @param query\n */\n UrlAdaptor.prototype.insert = function (dm, data, tableName, query) {\n return {\n url: dm.dataSource.insertUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: data,\n table: tableName,\n action: 'insert'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {number|string} value\n * @param {string} tableName\n * @param query\n */\n UrlAdaptor.prototype.remove = function (dm, keyField, value, tableName, query) {\n return {\n type: 'POST',\n url: dm.dataSource.removeUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n key: value,\n keyColumn: keyField,\n table: tableName,\n action: 'remove'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * Prepare and return request body which is used to update record.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName\n * @param query\n */\n UrlAdaptor.prototype.update = function (dm, keyField, value, tableName, query) {\n return {\n type: 'POST',\n url: dm.dataSource.updateUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: value,\n action: 'update',\n keyColumn: keyField,\n key: DataUtil.getObject(keyField, value),\n table: tableName\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * To generate the predicate based on the filtered query.\n *\n * @param {Object[]|string[]|number[]} data\n * @param {Query} query\n * @hidden\n */\n UrlAdaptor.prototype.getFiltersFrom = function (data, query) {\n var key = query.fKey;\n var value;\n var prop = key;\n var pKey = query.key;\n var predicats = [];\n if (typeof data[0] !== 'object') {\n prop = null;\n }\n for (var i = 0; i < data.length; i++) {\n if (typeof data[0] === 'object') {\n value = DataUtil.getObject(pKey || prop, data[i]);\n }\n else {\n value = data[i];\n }\n predicats.push(new Predicate(key, 'equal', value));\n }\n return Predicate.or(predicats);\n };\n UrlAdaptor.prototype.getAggregateResult = function (pvt, data, args, groupDs, query) {\n var pData = data;\n if (data && data.result) {\n pData = data.result;\n }\n if (pvt && pvt.aggregates && pvt.aggregates.length) {\n var agg = pvt.aggregates;\n var fn = void 0;\n var aggregateData = pData;\n var res = {};\n if (data.aggregate) {\n aggregateData = data.aggregate;\n }\n for (var i = 0; i < agg.length; i++) {\n fn = DataUtil.aggregates[agg[i].type];\n if (fn) {\n res[agg[i].field + ' - ' + agg[i].type] = fn(aggregateData, agg[i].field);\n }\n }\n args.aggregates = res;\n }\n var key = 'key';\n var isServerGrouping = Array.isArray(data.result) && data.result.length && !isNullOrUndefined(data.result[0][key]);\n if (pvt && pvt.groups && pvt.groups.length && !isServerGrouping) {\n var groups = pvt.groups;\n for (var i = 0; i < groups.length; i++) {\n var level = null;\n if (!isNullOrUndefined(groupDs)) {\n groupDs = DataUtil.group(groupDs, groups[i]);\n }\n var groupQuery = Query.filterQueries(query.queries, 'onGroup')[i].e;\n pData = DataUtil.group(pData, groups[i], pvt.aggregates, level, groupDs, groupQuery.comparer);\n }\n args.result = pData;\n }\n return args;\n };\n UrlAdaptor.prototype.getQueryRequest = function (query) {\n var req = { sorts: [], groups: [], filters: [], searches: [], aggregates: [] };\n req.sorts = Query.filterQueries(query.queries, 'onSortBy');\n req.groups = Query.filterQueries(query.queries, 'onGroup');\n req.filters = Query.filterQueries(query.queries, 'onWhere');\n req.searches = Query.filterQueries(query.queries, 'onSearch');\n req.aggregates = Query.filterQueries(query.queries, 'onAggregates');\n return req;\n };\n UrlAdaptor.prototype.addParams = function (options) {\n var req = options.reqParams;\n if (options.params.length) {\n req.params = {};\n }\n for (var _i = 0, _a = options.params; _i < _a.length; _i++) {\n var tmp = _a[_i];\n if (req[tmp.key]) {\n throw new Error('Query() - addParams: Custom Param is conflicting other request arguments');\n }\n req[tmp.key] = tmp.value;\n if (tmp.fn) {\n req[tmp.key] = tmp.fn.call(options.query, tmp.key, options.query, options.dm);\n }\n req.params[tmp.key] = req[tmp.key];\n }\n };\n return UrlAdaptor;\n}(Adaptor));\nexport { UrlAdaptor };\n/**\n * OData Adaptor that is extended from URL Adaptor, is used for consuming data through OData Service.\n *\n * @hidden\n */\nvar ODataAdaptor = /** @class */ (function (_super) {\n __extends(ODataAdaptor, _super);\n function ODataAdaptor(props) {\n var _this = _super.call(this) || this;\n // options replaced the default adaptor options\n _this.options = extend({}, _this.options, {\n requestType: 'get',\n accept: 'application/json;odata=light;q=1,application/json;odata=verbose;q=0.5',\n multipartAccept: 'multipart/mixed',\n sortBy: '$orderby',\n select: '$select',\n skip: '$skip',\n take: '$top',\n count: '$inlinecount',\n where: '$filter',\n expand: '$expand',\n batch: '$batch',\n changeSet: '--changeset_',\n batchPre: 'batch_',\n contentId: 'Content-Id: ',\n batchContent: 'Content-Type: multipart/mixed; boundary=',\n changeSetContent: 'Content-Type: application/http\\nContent-Transfer-Encoding: binary ',\n batchChangeSetContentType: 'Content-Type: application/json; charset=utf-8 ',\n updateType: 'PUT'\n });\n extend(_this.options, props || {});\n return _this;\n }\n ODataAdaptor.prototype.getModuleName = function () {\n return 'ODataAdaptor';\n };\n /**\n * Generate request string based on the filter criteria from query.\n *\n * @param {Predicate} pred\n * @param {boolean} requiresCast?\n * @param predicate\n * @param query\n * @param requiresCast\n */\n ODataAdaptor.prototype.onPredicate = function (predicate, query, requiresCast) {\n var returnValue = '';\n var operator;\n var guid;\n var val = predicate.value;\n var type = typeof val;\n var field = predicate.field ? ODataAdaptor.getField(predicate.field) : null;\n if (val instanceof Date) {\n val = 'datetime\\'' + DataUtil.parse.replacer(val) + '\\'';\n }\n if (type === 'string') {\n val = val.replace(/'/g, '\\'\\'');\n if (predicate.ignoreCase) {\n val = val.toLowerCase();\n }\n if (predicate.operator !== 'like') {\n val = encodeURIComponent(val);\n }\n if (predicate.operator !== 'wildcard' && predicate.operator !== 'like') {\n val = '\\'' + val + '\\'';\n }\n if (requiresCast) {\n field = 'cast(' + field + ', \\'Edm.String\\')';\n }\n if (DataUtil.parse.isGuid(val)) {\n guid = 'guid';\n }\n if (predicate.ignoreCase) {\n if (!guid) {\n field = 'tolower(' + field + ')';\n }\n val = val.toLowerCase();\n }\n }\n if (predicate.operator === 'isempty' || predicate.operator === 'isnull' || predicate.operator === 'isnotempty' ||\n predicate.operator === 'isnotnull') {\n operator = predicate.operator.indexOf('isnot') !== -1 ? DataUtil.odBiOperator['notequal'] : DataUtil.odBiOperator['equal'];\n val = predicate.operator === 'isnull' || predicate.operator === 'isnotnull' ? null : '\\'\\'';\n }\n else {\n operator = DataUtil.odBiOperator[predicate.operator];\n }\n if (operator) {\n returnValue += field;\n returnValue += operator;\n if (guid) {\n returnValue += guid;\n }\n return returnValue + val;\n }\n if (!isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor') {\n operator = DataUtil.odv4UniOperator[predicate.operator];\n }\n else {\n operator = DataUtil.odUniOperator[predicate.operator];\n }\n if (operator === 'like') {\n val = val;\n if (val.indexOf('%') !== -1) {\n if (val.charAt(0) === '%' && val.lastIndexOf('%') < 2) {\n val = val.substring(1, val.length);\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['startswith'] : DataUtil.odUniOperator['startswith'];\n }\n else if (val.charAt(val.length - 1) === '%' && val.indexOf('%') > val.length - 3) {\n val = val.substring(0, val.length - 1);\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['endswith'] : DataUtil.odUniOperator['endswith'];\n }\n else if (val.lastIndexOf('%') !== val.indexOf('%') && val.lastIndexOf('%') > val.indexOf('%') + 1) {\n val = val.substring(val.indexOf('%') + 1, val.lastIndexOf('%'));\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n }\n else {\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n }\n }\n val = encodeURIComponent(val);\n val = '\\'' + val + '\\'';\n }\n else if (operator === 'wildcard') {\n val = val;\n if (val.indexOf('*') !== -1) {\n var splittedStringValue = val.split('*');\n var splittedValue = void 0;\n var count = 0;\n if (val.indexOf('*') !== 0 && splittedStringValue[0].indexOf('%3f') === -1 &&\n splittedStringValue[0].indexOf('?') === -1) {\n splittedValue = splittedStringValue[0];\n splittedValue = '\\'' + splittedValue + '\\'';\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['startswith'] : DataUtil.odUniOperator['startswith'];\n returnValue += operator + '(';\n returnValue += field + ',';\n if (guid) {\n returnValue += guid;\n }\n returnValue += splittedValue + ')';\n count++;\n }\n if (val.lastIndexOf('*') !== val.length - 1 && splittedStringValue[splittedStringValue.length - 1].indexOf('%3f') === -1 &&\n splittedStringValue[splittedStringValue.length - 1].indexOf('?') === -1) {\n splittedValue = splittedStringValue[splittedStringValue.length - 1];\n splittedValue = '\\'' + splittedValue + '\\'';\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['endswith'] : DataUtil.odUniOperator['endswith'];\n if (count > 0) {\n returnValue += ' and ';\n }\n returnValue += operator + '(';\n returnValue += field + ',';\n if (guid) {\n returnValue += guid;\n }\n returnValue += splittedValue + ')';\n count++;\n }\n if (splittedStringValue.length > 2) {\n for (var i = 1; i < splittedStringValue.length - 1; i++) {\n if (splittedStringValue[i].indexOf('%3f') === -1 && splittedStringValue[i].indexOf('?') === -1) {\n splittedValue = splittedStringValue[i];\n splittedValue = '\\'' + splittedValue + '\\'';\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n if (count > 0) {\n returnValue += ' and ';\n }\n if (operator === 'substringof' || operator === 'not substringof') {\n var temp = splittedValue;\n splittedValue = field;\n field = temp;\n }\n returnValue += operator + '(';\n returnValue += field + ',';\n if (guid) {\n returnValue += guid;\n }\n returnValue += splittedValue + ')';\n count++;\n }\n }\n }\n if (count === 0) {\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n if (val.indexOf('?') !== -1 || val.indexOf('%3f') !== -1) {\n val = val.indexOf('?') !== -1 ? val.split('?').join('') : val.split('%3f').join('');\n }\n val = '\\'' + val + '\\'';\n }\n else {\n operator = 'wildcard';\n }\n }\n else {\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n if (val.indexOf('?') !== -1 || val.indexOf('%3f') !== -1) {\n val = val.indexOf('?') !== -1 ? val.split('?').join('') : val.split('%3f').join('');\n }\n val = '\\'' + val + '\\'';\n }\n }\n if (operator === 'substringof' || operator === 'not substringof') {\n var temp = val;\n val = field;\n field = temp;\n }\n if (operator !== 'wildcard') {\n returnValue += operator + '(';\n returnValue += field + ',';\n if (guid) {\n returnValue += guid;\n }\n returnValue += val + ')';\n }\n return returnValue;\n };\n ODataAdaptor.prototype.addParams = function (options) {\n _super.prototype.addParams.call(this, options);\n delete options.reqParams.params;\n };\n /**\n * Generate request string based on the multiple filter criteria from query.\n *\n * @param {Predicate} pred\n * @param {boolean} requiresCast?\n * @param predicate\n * @param query\n * @param requiresCast\n */\n ODataAdaptor.prototype.onComplexPredicate = function (predicate, query, requiresCast) {\n var res = [];\n for (var i = 0; i < predicate.predicates.length; i++) {\n res.push('(' + this.onEachWhere(predicate.predicates[i], query, requiresCast) + ')');\n }\n return res.join(' ' + predicate.condition + ' ');\n };\n /**\n * Generate query string based on the multiple filter criteria from query.\n *\n * @param {Predicate} filter\n * @param {boolean} requiresCast?\n * @param query\n * @param requiresCast\n */\n ODataAdaptor.prototype.onEachWhere = function (filter, query, requiresCast) {\n return filter.isComplex ? this.onComplexPredicate(filter, query, requiresCast) : this.onPredicate(filter, query, requiresCast);\n };\n /**\n * Generate query string based on the multiple filter criteria from query.\n *\n * @param {string[]} filters\n */\n ODataAdaptor.prototype.onWhere = function (filters) {\n if (this.pvt.search) {\n filters.push(this.onEachWhere(this.pvt.search, null, true));\n }\n return filters.join(' and ');\n };\n /**\n * Generate query string based on the multiple search criteria from query.\n *\n * @param e\n * @param {string} operator\n * @param {string} key\n * @param {boolean} } ignoreCase\n * @param e.fields\n * @param e.operator\n * @param e.key\n * @param e.ignoreCase\n */\n ODataAdaptor.prototype.onEachSearch = function (e) {\n if (e.fields && e.fields.length === 0) {\n DataUtil.throwError('Query() - Search : oData search requires list of field names to search');\n }\n var filter = this.pvt.search || [];\n for (var i = 0; i < e.fields.length; i++) {\n filter.push(new Predicate(e.fields[i], e.operator, e.key, e.ignoreCase));\n }\n this.pvt.search = filter;\n };\n /**\n * Generate query string based on the search criteria from query.\n *\n * @param {Object} e\n */\n ODataAdaptor.prototype.onSearch = function (e) {\n this.pvt.search = Predicate.or(this.pvt.search);\n return '';\n };\n /**\n * Generate query string based on multiple sort criteria from query.\n *\n * @param {QueryOptions} e\n */\n ODataAdaptor.prototype.onEachSort = function (e) {\n var res = [];\n if (e.name instanceof Array) {\n for (var i = 0; i < e.name.length; i++) {\n res.push(ODataAdaptor.getField(e.name[i]) + (e.direction === 'descending' ? ' desc' : ''));\n }\n }\n else {\n res.push(ODataAdaptor.getField(e.name) + (e.direction === 'descending' ? ' desc' : ''));\n }\n return res.join(',');\n };\n /**\n * Returns sort query string.\n *\n * @param {string[]} e\n */\n ODataAdaptor.prototype.onSortBy = function (e) {\n return e.reverse().join(',');\n };\n /**\n * Adds the group query to the adaptor option.\n *\n * @param {Object[]} e\n * @returns string\n */\n ODataAdaptor.prototype.onGroup = function (e) {\n this.pvt.groups = e;\n return [];\n };\n /**\n * Returns the select query string.\n *\n * @param {string[]} e\n */\n ODataAdaptor.prototype.onSelect = function (e) {\n for (var i = 0; i < e.length; i++) {\n e[i] = ODataAdaptor.getField(e[i]);\n }\n return e.join(',');\n };\n /**\n * Add the aggregate query to the adaptor option.\n *\n * @param {Object[]} e\n * @returns string\n */\n ODataAdaptor.prototype.onAggregates = function (e) {\n this.pvt.aggregates = e;\n return '';\n };\n /**\n * Returns the query string which requests total count from the data source.\n *\n * @param {boolean} e\n * @returns string\n */\n ODataAdaptor.prototype.onCount = function (e) {\n return e === true ? 'allpages' : '';\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {Request} request\n * @param {Fetch} settings?\n * @param settings\n */\n ODataAdaptor.prototype.beforeSend = function (dm, request, settings) {\n if (DataUtil.endsWith(settings.url, this.options.batch) && settings.type.toLowerCase() === 'post') {\n request.headers.set('Accept', this.options.multipartAccept);\n request.headers.set('DataServiceVersion', '2.0');\n //request.overrideMimeType('text/plain; charset=x-user-defined');\n }\n else {\n request.headers.set('Accept', this.options.accept);\n }\n request.headers.set('DataServiceVersion', '2.0');\n request.headers.set('MaxDataServiceVersion', '2.0');\n };\n /**\n * Returns the data from the query processing.\n *\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {Request} xhr?\n * @param {Fetch} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n * @returns aggregateResult\n */\n ODataAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n var metaCheck = 'odata.metadata';\n if ((request && request.type === 'GET') && !this.rootUrl && data[metaCheck]) {\n var dataUrls = data[metaCheck].split('/$metadata#');\n this.rootUrl = dataUrls[0];\n this.resourceTableName = dataUrls[1];\n }\n var pvtData = 'pvtData';\n if (!isNullOrUndefined(data.d)) {\n var dataCopy = ((query && query.isCountRequired) ? data.d.results : data.d);\n var metaData = '__metadata';\n if (!isNullOrUndefined(dataCopy)) {\n for (var i = 0; i < dataCopy.length; i++) {\n if (!isNullOrUndefined(dataCopy[i][metaData])) {\n delete dataCopy[i][metaData];\n }\n }\n }\n }\n var pvt = request && request[pvtData];\n var emptyAndBatch = this.processBatchResponse(data, query, xhr, request, changes);\n if (emptyAndBatch) {\n return emptyAndBatch;\n }\n var versionCheck = xhr && request.fetchRequest.headers.get('DataServiceVersion');\n var count = null;\n var version = (versionCheck && parseInt(versionCheck, 10)) || 2;\n if (query && query.isCountRequired) {\n var oDataCount = '__count';\n if (data[oDataCount] || data['odata.count']) {\n count = data[oDataCount] || data['odata.count'];\n }\n if (data.d) {\n data = data.d;\n }\n if (data[oDataCount] || data['odata.count']) {\n count = data[oDataCount] || data['odata.count'];\n }\n }\n if (version === 3 && data.value) {\n data = data.value;\n }\n if (data.d) {\n data = data.d;\n }\n if (version < 3 && data.results) {\n data = data.results;\n }\n var args = {};\n args.count = count;\n args.result = data;\n this.getAggregateResult(pvt, data, args, null, query);\n return DataUtil.isNull(count) ? args.result : { result: args.result, count: args.count, aggregates: args.aggregates };\n };\n /**\n * Converts the request object to query string.\n *\n * @param {Object} req\n * @param request\n * @param {Query} query\n * @param {DataManager} dm\n * @returns tableName\n */\n ODataAdaptor.prototype.convertToQueryString = function (request, query, dm) {\n var res = [];\n var table = 'table';\n var tableName = request[table] || '';\n var format = '$format';\n delete request[table];\n if (dm.dataSource.requiresFormat) {\n request[format] = 'json';\n }\n var keys = Object.keys(request);\n for (var _i = 0, keys_4 = keys; _i < keys_4.length; _i++) {\n var prop = keys_4[_i];\n res.push(prop + '=' + request[prop]);\n }\n res = res.join('&');\n if (dm.dataSource.url && dm.dataSource.url.indexOf('?') !== -1 && !tableName) {\n return res;\n }\n return res.length ? tableName + '?' + res : tableName || '';\n };\n ODataAdaptor.prototype.localTimeReplacer = function (key, convertObj) {\n for (var _i = 0, _a = !isNullOrUndefined(convertObj) ? Object.keys(convertObj) : []; _i < _a.length; _i++) {\n var prop = _a[_i];\n if ((convertObj[prop] instanceof Date)) {\n convertObj[prop] = DataUtil.dateParse.toLocalTime(convertObj[prop]);\n }\n }\n return convertObj;\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName?\n * @param tableName\n */\n ODataAdaptor.prototype.insert = function (dm, data, tableName) {\n return {\n url: (dm.dataSource.insertUrl || dm.dataSource.url).replace(/\\/*$/, tableName ? '/' + tableName : ''),\n data: JSON.stringify(data, this.options.localTime ? this.localTimeReplacer : null)\n };\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {number} value\n * @param {string} tableName?\n * @param tableName\n */\n ODataAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n var url;\n if (typeof value === 'string' && !DataUtil.parse.isGuid(value)) {\n url = \"('\" + value + \"')\";\n }\n else {\n url = \"(\" + value + \")\";\n }\n return {\n type: 'DELETE',\n url: (dm.dataSource.removeUrl || dm.dataSource.url).replace(/\\/*$/, tableName ? '/' + tableName : '') + url\n };\n };\n /**\n * Updates existing record and saves the changes to the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n * @param query\n * @param original\n * @returns this\n */\n ODataAdaptor.prototype.update = function (dm, keyField, value, tableName, query, original) {\n if (this.options.updateType === 'PATCH' && !isNullOrUndefined(original)) {\n value = this.compareAndRemove(value, original, keyField);\n }\n var url;\n if (typeof value[keyField] === 'string' && !DataUtil.parse.isGuid(value[keyField])) {\n url = \"('\" + value[keyField] + \"')\";\n }\n else {\n url = \"(\" + value[keyField] + \")\";\n }\n return {\n type: this.options.updateType,\n url: (dm.dataSource.updateUrl || dm.dataSource.url).replace(/\\/*$/, tableName ? '/' + tableName : '') + url,\n data: JSON.stringify(value, this.options.localTime ? this.localTimeReplacer : null),\n accept: this.options.accept\n };\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n * @param query\n * @param original\n * @returns {Object}\n */\n ODataAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n var initialGuid = e.guid = DataUtil.getGuid(this.options.batchPre);\n var url = (dm.dataSource.batchUrl || this.rootUrl) ?\n (dm.dataSource.batchUrl || this.rootUrl) + '/' + this.options.batch :\n (dm.dataSource.batchUrl || dm.dataSource.url).replace(/\\/*$/, '/' + this.options.batch);\n e.url = this.resourceTableName ? this.resourceTableName : e.url;\n var args = {\n url: e.url,\n key: e.key,\n cid: 1,\n cSet: DataUtil.getGuid(this.options.changeSet)\n };\n var req = '--' + initialGuid + '\\n';\n req += 'Content-Type: multipart/mixed; boundary=' + args.cSet.replace('--', '') + '\\n';\n this.pvt.changeSet = 0;\n req += this.generateInsertRequest(changes.addedRecords, args, dm);\n req += this.generateUpdateRequest(changes.changedRecords, args, dm, original ? original.changedRecords : []);\n req += this.generateDeleteRequest(changes.deletedRecords, args, dm);\n req += args.cSet + '--\\n';\n req += '--' + initialGuid + '--';\n return {\n type: 'POST',\n url: url,\n dataType: 'json',\n contentType: 'multipart/mixed; charset=UTF-8;boundary=' + initialGuid,\n data: req\n };\n };\n /**\n * Generate the string content from the removed records.\n * The result will be send during batch update.\n *\n * @param {Object[]} arr\n * @param {RemoteArgs} e\n * @param dm\n * @returns this\n */\n ODataAdaptor.prototype.generateDeleteRequest = function (arr, e, dm) {\n if (!arr) {\n return '';\n }\n var req = '';\n var stat = {\n 'method': 'DELETE ',\n 'url': function (data, i, key) {\n var url = DataUtil.getObject(key, data[i]);\n if (typeof url === 'number' || DataUtil.parse.isGuid(url)) {\n return '(' + url + ')';\n }\n else if (url instanceof Date) {\n var dateTime = data[i][key];\n return '(' + dateTime.toJSON() + ')';\n }\n else {\n return \"('\" + url + \"')\";\n }\n },\n 'data': function (data, i) { return ''; }\n };\n req = this.generateBodyContent(arr, e, stat, dm);\n return req + '\\n';\n };\n /**\n * Generate the string content from the inserted records.\n * The result will be send during batch update.\n *\n * @param {Object[]} arr\n * @param {RemoteArgs} e\n * @param dm\n */\n ODataAdaptor.prototype.generateInsertRequest = function (arr, e, dm) {\n if (!arr) {\n return '';\n }\n var req = '';\n var stat = {\n 'method': 'POST ',\n 'url': function (data, i, key) { return ''; },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req = this.generateBodyContent(arr, e, stat, dm);\n return req;\n };\n /**\n * Generate the string content from the updated records.\n * The result will be send during batch update.\n *\n * @param {Object[]} arr\n * @param {RemoteArgs} e\n * @param dm\n * @param org\n */\n ODataAdaptor.prototype.generateUpdateRequest = function (arr, e, dm, org) {\n var _this = this;\n if (!arr) {\n return '';\n }\n var req = '';\n arr.forEach(function (change) { return change = _this.compareAndRemove(change, org.filter(function (o) { return DataUtil.getObject(e.key, o) === DataUtil.getObject(e.key, change); })[0], e.key); });\n var stat = {\n 'method': this.options.updateType + ' ',\n 'url': function (data, i, key) {\n if (typeof data[i][key] === 'number' || DataUtil.parse.isGuid(data[i][key])) {\n return '(' + data[i][key] + ')';\n }\n else if (data[i][key] instanceof Date) {\n var date = data[i][key];\n return '(' + date.toJSON() + ')';\n }\n else {\n return \"('\" + data[i][key] + \"')\";\n }\n },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req = this.generateBodyContent(arr, e, stat, dm);\n return req;\n };\n ODataAdaptor.getField = function (prop) {\n return prop.replace(/\\./g, '/');\n };\n ODataAdaptor.prototype.generateBodyContent = function (arr, e, stat, dm) {\n var req = '';\n for (var i = 0; i < arr.length; i++) {\n req += '\\n' + e.cSet + '\\n';\n req += this.options.changeSetContent + '\\n\\n';\n req += stat.method;\n if (stat.method === 'POST ') {\n req += (dm.dataSource.insertUrl || dm.dataSource.crudUrl || e.url) + stat.url(arr, i, e.key) + ' HTTP/1.1\\n';\n }\n else if (stat.method === 'PUT ' || stat.method === 'PATCH ') {\n req += (dm.dataSource.updateUrl || dm.dataSource.crudUrl || e.url) + stat.url(arr, i, e.key) + ' HTTP/1.1\\n';\n }\n else if (stat.method === 'DELETE ') {\n req += (dm.dataSource.removeUrl || dm.dataSource.crudUrl || e.url) + stat.url(arr, i, e.key) + ' HTTP/1.1\\n';\n }\n req += 'Accept: ' + this.options.accept + '\\n';\n req += 'Content-Id: ' + this.pvt.changeSet++ + '\\n';\n req += this.options.batchChangeSetContentType + '\\n';\n if (!isNullOrUndefined(arr[i]['@odata.etag'])) {\n req += 'If-Match: ' + arr[i]['@odata.etag'] + '\\n\\n';\n delete arr[i]['@odata.etag'];\n }\n else {\n req += '\\n';\n }\n req += stat.data(arr, i);\n }\n return req;\n };\n ODataAdaptor.prototype.processBatchResponse = function (data, query, xhr, request, changes) {\n if (xhr && xhr.headers.get('Content-Type') && xhr.headers.get('Content-Type').indexOf('xml') !== -1) {\n return (query.isCountRequired ? { result: [], count: 0 } : []);\n }\n if (request && this.options.batch && DataUtil.endsWith(request.url, this.options.batch) && request.type.toLowerCase() === 'post') {\n var guid = xhr.headers.get('Content-Type');\n var cIdx = void 0;\n var jsonObj = void 0;\n var d = data + '';\n guid = guid.substring(guid.indexOf('=batchresponse') + 1);\n d = d.split(guid);\n if (d.length < 2) {\n return {};\n }\n d = d[1];\n var exVal = /(?:\\bContent-Type.+boundary=)(changesetresponse.+)/i.exec(d);\n if (exVal) {\n d.replace(exVal[0], '');\n }\n var changeGuid = exVal ? exVal[1] : '';\n d = d.split(changeGuid);\n for (var i = d.length; i > -1; i--) {\n if (!/\\bContent-ID:/i.test(d[i]) || !/\\bHTTP.+201/.test(d[i])) {\n continue;\n }\n cIdx = parseInt(/\\bContent-ID: (\\d+)/i.exec(d[i])[1], 10);\n if (changes.addedRecords[cIdx]) {\n jsonObj = DataUtil.parse.parseJson(/^\\{.+\\}/m.exec(d[i])[0]);\n extend({}, changes.addedRecords[cIdx], this.processResponse(jsonObj));\n }\n }\n return changes;\n }\n return null;\n };\n ODataAdaptor.prototype.compareAndRemove = function (data, original, key) {\n var _this = this;\n if (isNullOrUndefined(original)) {\n return data;\n }\n Object.keys(data).forEach(function (prop) {\n if (prop !== key && prop !== '@odata.etag') {\n if (DataUtil.isPlainObject(data[prop])) {\n _this.compareAndRemove(data[prop], original[prop]);\n var final = Object.keys(data[prop]).filter(function (data) { return data !== '@odata.etag'; });\n if (final.length === 0) {\n delete data[prop];\n }\n }\n else if (data[prop] === original[prop]) {\n delete data[prop];\n }\n else if (data[prop] && original[prop] && data[prop].valueOf() === original[prop].valueOf()) {\n delete data[prop];\n }\n }\n });\n return data;\n };\n return ODataAdaptor;\n}(UrlAdaptor));\nexport { ODataAdaptor };\n/**\n * The OData v4 is an improved version of OData protocols.\n * The DataManager uses the ODataV4Adaptor to consume OData v4 services.\n *\n * @hidden\n */\nvar ODataV4Adaptor = /** @class */ (function (_super) {\n __extends(ODataV4Adaptor, _super);\n function ODataV4Adaptor(props) {\n var _this = _super.call(this, props) || this;\n // options replaced the default adaptor options\n _this.options = extend({}, _this.options, {\n requestType: 'get',\n accept: 'application/json, text/javascript, */*; q=0.01',\n multipartAccept: 'multipart/mixed',\n sortBy: '$orderby',\n select: '$select',\n skip: '$skip',\n take: '$top',\n count: '$count',\n search: '$search',\n where: '$filter',\n expand: '$expand',\n batch: '$batch',\n changeSet: '--changeset_',\n batchPre: 'batch_',\n contentId: 'Content-Id: ',\n batchContent: 'Content-Type: multipart/mixed; boundary=',\n changeSetContent: 'Content-Type: application/http\\nContent-Transfer-Encoding: binary ',\n batchChangeSetContentType: 'Content-Type: application/json; charset=utf-8 ',\n updateType: 'PATCH',\n localTime: false,\n apply: '$apply'\n });\n extend(_this.options, props || {});\n return _this;\n }\n /**\n * @hidden\n */\n ODataV4Adaptor.prototype.getModuleName = function () {\n return 'ODataV4Adaptor';\n };\n /**\n * Returns the query string which requests total count from the data source.\n *\n * @param {boolean} e\n * @returns string\n */\n ODataV4Adaptor.prototype.onCount = function (e) {\n return e === true ? 'true' : '';\n };\n /**\n * Generate request string based on the filter criteria from query.\n *\n * @param {Predicate} pred\n * @param {boolean} requiresCast?\n * @param predicate\n * @param query\n * @param requiresCast\n */\n ODataV4Adaptor.prototype.onPredicate = function (predicate, query, requiresCast) {\n var returnValue = '';\n var val = predicate.value;\n var isDate = val instanceof Date;\n if (query instanceof Query) {\n var queries = this.getQueryRequest(query);\n for (var i = 0; i < queries.filters.length; i++) {\n if (queries.filters[i].e.key === predicate.value) {\n requiresCast = true;\n }\n }\n }\n returnValue = _super.prototype.onPredicate.call(this, predicate, query, requiresCast);\n if (isDate) {\n returnValue = returnValue.replace(/datetime'(.*)'$/, '$1');\n }\n if (DataUtil.parse.isGuid(val)) {\n returnValue = returnValue.replace('guid', '').replace(/'/g, '');\n }\n return returnValue;\n };\n /**\n * Generate query string based on the multiple search criteria from query.\n *\n * @param e\n * @param {string} operator\n * @param {string} key\n * @param {boolean} } ignoreCase\n * @param e.fields\n * @param e.operator\n * @param e.key\n * @param e.ignoreCase\n */\n ODataV4Adaptor.prototype.onEachSearch = function (e) {\n var search = this.pvt.searches || [];\n search.push(e.key);\n this.pvt.searches = search;\n };\n /**\n * Generate query string based on the search criteria from query.\n *\n * @param {Object} e\n */\n ODataV4Adaptor.prototype.onSearch = function (e) {\n return this.pvt.searches.join(' OR ');\n };\n /**\n * Returns the expand query string.\n *\n * @param {string} e\n * @param e.selects\n * @param e.expands\n */\n ODataV4Adaptor.prototype.onExpand = function (e) {\n var _this = this;\n var selected = {};\n var expanded = {};\n var expands = e.expands.slice();\n var exArr = [];\n var selects = e.selects.filter(function (item) { return item.indexOf('.') > -1; });\n selects.forEach(function (select) {\n var splits = select.split('.');\n if (!(splits[0] in selected)) {\n selected[splits[0]] = [];\n }\n if (splits.length === 2) {\n if (selected[splits[0]].length && Object.keys(selected).indexOf(splits[0]) !== -1) {\n if (selected[splits[0]][0].indexOf('$expand') !== -1 && selected[splits[0]][0].indexOf(';$select=') === -1) {\n selected[splits[0]][0] = selected[splits[0]][0] + ';' + '$select=' + splits[1];\n }\n else {\n selected[splits[0]][0] = selected[splits[0]][0] + ',' + splits[1];\n }\n }\n else {\n selected[splits[0]].push('$select=' + splits[1]);\n }\n }\n else {\n var sel = '$select=' + splits[splits.length - 1];\n var exp = '';\n var close_1 = '';\n for (var i = 1; i < splits.length - 1; i++) {\n exp = exp + '$expand=' + splits[i] + '(';\n close_1 = close_1 + ')';\n }\n var combineVal = exp + sel + close_1;\n if (selected[splits[0]].length && Object.keys(selected).indexOf(splits[0]) !== -1 &&\n _this.expandQueryIndex(selected[splits[0]], true)) {\n var idx = _this.expandQueryIndex(selected[splits[0]]);\n selected[splits[0]][idx] = selected[splits[0]][idx] + combineVal.replace('$expand=', ',');\n }\n else {\n selected[splits[0]].push(combineVal);\n }\n }\n });\n //Auto expand from select query\n Object.keys(selected).forEach(function (expand) {\n if ((expands.indexOf(expand) === -1)) {\n expands.push(expand);\n }\n });\n expands.forEach(function (expand) {\n expanded[expand] = expand in selected ? expand + \"(\" + selected[expand].join(';') + \")\" : expand;\n });\n Object.keys(expanded).forEach(function (ex) { return exArr.push(expanded[ex]); });\n return exArr.join(',');\n };\n ODataV4Adaptor.prototype.expandQueryIndex = function (query, isExpand) {\n for (var i = 0; i < query.length; i++) {\n if (query[i].indexOf('$expand') !== -1) {\n return isExpand ? true : i;\n }\n }\n return isExpand ? false : 0;\n };\n /**\n * Returns the groupby query string.\n *\n * @param {string} e\n * @param distinctFields\n */\n ODataV4Adaptor.prototype.onDistinct = function (distinctFields) {\n var fields = distinctFields.map(function (field) { return ODataAdaptor.getField(field); }).join(',');\n return \"groupby((\" + fields + \"))\";\n };\n /**\n * Returns the select query string.\n *\n * @param {string[]} e\n */\n ODataV4Adaptor.prototype.onSelect = function (e) {\n return _super.prototype.onSelect.call(this, e.filter(function (item) { return item.indexOf('.') === -1; }));\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {Request} request\n * @param {Fetch} settings\n * @returns void\n */\n ODataV4Adaptor.prototype.beforeSend = function (dm, request, settings) {\n if (settings.type === 'POST' || settings.type === 'PUT' || settings.type === 'PATCH') {\n request.headers.set('Prefer', 'return=representation');\n }\n request.headers.set('Accept', this.options.accept);\n };\n /**\n * Returns the data from the query processing.\n *\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {Request} xhr?\n * @param {Fetch} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n * @returns aggregateResult\n */\n ODataV4Adaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n var metaName = '@odata.context';\n var metaV4Name = '@context';\n if ((request && request.type === 'GET') && !this.rootUrl && (data[metaName] || data[metaV4Name])) {\n var dataUrl = data[metaName] ? data[metaName].split('/$metadata#') : data[metaV4Name].split('/$metadata#');\n this.rootUrl = dataUrl[0];\n this.resourceTableName = dataUrl[1];\n }\n var pvtData = 'pvtData';\n var pvt = request && request[pvtData];\n var emptyAndBatch = _super.prototype.processBatchResponse.call(this, data, query, xhr, request, changes);\n if (emptyAndBatch) {\n return emptyAndBatch;\n }\n var count = null;\n var dataCount = '@odata.count';\n var dataV4Count = '@count';\n if (query && query.isCountRequired) {\n if (dataCount in data) {\n count = data[dataCount];\n }\n else if (dataV4Count in data) {\n count = data[dataV4Count];\n }\n }\n data = !isNullOrUndefined(data.value) ? data.value : data;\n var args = {};\n args.count = count;\n args.result = data;\n this.getAggregateResult(pvt, data, args, null, query);\n return DataUtil.isNull(count) ? args.result : { result: args.result, count: count, aggregates: args.aggregates };\n };\n return ODataV4Adaptor;\n}(ODataAdaptor));\nexport { ODataV4Adaptor };\n/**\n * The Web API is a programmatic interface to define the request and response messages system that is mostly exposed in JSON or XML.\n * The DataManager uses the WebApiAdaptor to consume Web API.\n * Since this adaptor is targeted to interact with Web API created using OData endpoint, it is extended from ODataAdaptor\n *\n * @hidden\n */\nvar WebApiAdaptor = /** @class */ (function (_super) {\n __extends(WebApiAdaptor, _super);\n function WebApiAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n WebApiAdaptor.prototype.getModuleName = function () {\n return 'WebApiAdaptor';\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName?\n * @param tableName\n */\n WebApiAdaptor.prototype.insert = function (dm, data, tableName) {\n return {\n type: 'POST',\n url: dm.dataSource.url,\n data: JSON.stringify(data)\n };\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {number} value\n * @param {string} tableName?\n * @param tableName\n */\n WebApiAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n return {\n type: 'DELETE',\n url: dm.dataSource.url + '/' + value,\n data: JSON.stringify(value)\n };\n };\n /**\n * Prepare and return request body which is used to update record.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n */\n WebApiAdaptor.prototype.update = function (dm, keyField, value, tableName) {\n return {\n type: 'PUT',\n url: dm.dataSource.url,\n data: JSON.stringify(value)\n };\n };\n WebApiAdaptor.prototype.batchRequest = function (dm, changes, e) {\n var _this = this;\n var initialGuid = e.guid = DataUtil.getGuid(this.options.batchPre);\n var url = dm.dataSource.url.replace(/\\/*$/, '/' + this.options.batch);\n e.url = this.resourceTableName ? this.resourceTableName : e.url;\n var req = [];\n var _loop_1 = function (i, x) {\n changes.addedRecords.forEach(function (j, d) {\n var stat = {\n 'method': 'POST ',\n 'url': function (data, i, key) { return ''; },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req.push('--' + initialGuid);\n req.push('Content-Type: application/http; msgtype=request', '');\n req.push('POST ' + '/api/' + (dm.dataSource.insertUrl || dm.dataSource.crudUrl || e.url)\n + stat.url(changes.addedRecords, i, e.key) + ' HTTP/1.1');\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\n req.push('Host: ' + location.host);\n req.push('', j ? JSON.stringify(j) : '');\n });\n };\n //insertion\n for (var i = 0, x = changes.addedRecords.length; i < x; i++) {\n _loop_1(i, x);\n }\n var _loop_2 = function (i, x) {\n changes.changedRecords.forEach(function (j, d) {\n var stat = {\n 'method': _this.options.updateType + ' ',\n 'url': function (data, i, key) { return ''; },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req.push('--' + initialGuid);\n req.push('Content-Type: application/http; msgtype=request', '');\n req.push('PUT ' + '/api/' + (dm.dataSource.updateUrl || dm.dataSource.crudUrl || e.url)\n + stat.url(changes.changedRecords, i, e.key) + ' HTTP/1.1');\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\n req.push('Host: ' + location.host);\n req.push('', j ? JSON.stringify(j) : '');\n });\n };\n //updation\n for (var i = 0, x = changes.changedRecords.length; i < x; i++) {\n _loop_2(i, x);\n }\n var _loop_3 = function (i, x) {\n changes.deletedRecords.forEach(function (j, d) {\n var state = {\n 'mtd': 'DELETE ',\n 'url': function (data, i, key) {\n var url = DataUtil.getObject(key, data[i]);\n if (typeof url === 'number' || DataUtil.parse.isGuid(url)) {\n return '/' + url;\n }\n else if (url instanceof Date) {\n var datTime = data[i][key];\n return '/' + datTime.toJSON();\n }\n else {\n return \"/'\" + url + \"'\";\n }\n },\n 'data': function (data, i) { return ''; }\n };\n req.push('--' + initialGuid);\n req.push('Content-Type: application/http; msgtype=request', '');\n req.push('DELETE ' + '/api/' + (dm.dataSource.removeUrl || dm.dataSource.crudUrl || e.url)\n + state.url(changes.deletedRecords, i, e.key) + ' HTTP/1.1');\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\n req.push('Host: ' + location.host);\n req.push('', j ? JSON.stringify(j) : '');\n });\n };\n //deletion\n for (var i = 0, x = changes.deletedRecords.length; i < x; i++) {\n _loop_3(i, x);\n }\n req.push('--' + initialGuid + '--', '');\n return {\n type: 'POST',\n url: url,\n contentType: 'multipart/mixed; boundary=' + initialGuid,\n data: req.join('\\r\\n')\n };\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {Request} request\n * @param {Fetch} settings\n * @returns void\n */\n WebApiAdaptor.prototype.beforeSend = function (dm, request, settings) {\n request.headers.set('Accept', 'application/json, text/javascript, */*; q=0.01');\n };\n /**\n * Returns the data from the query processing.\n *\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {Request} xhr?\n * @param {Fetch} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n * @returns aggregateResult\n */\n WebApiAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n var pvtData = 'pvtData';\n var pvt = request && request[pvtData];\n var count = null;\n var args = {};\n if (request && request.type.toLowerCase() !== 'post') {\n var versionCheck = xhr && request.fetchRequest.headers.get('DataServiceVersion');\n var version = (versionCheck && parseInt(versionCheck, 10)) || 2;\n if (query && query.isCountRequired) {\n if (!DataUtil.isNull(data.Count)) {\n count = data.Count;\n }\n }\n if (version < 3 && data.Items) {\n data = data.Items;\n }\n args.count = count;\n args.result = data;\n this.getAggregateResult(pvt, data, args, null, query);\n }\n args.result = args.result || data;\n return DataUtil.isNull(count) ? args.result : { result: args.result, count: args.count, aggregates: args.aggregates };\n };\n return WebApiAdaptor;\n}(ODataAdaptor));\nexport { WebApiAdaptor };\n/**\n * WebMethodAdaptor can be used by DataManager to interact with web method.\n *\n * @hidden\n */\nvar WebMethodAdaptor = /** @class */ (function (_super) {\n __extends(WebMethodAdaptor, _super);\n function WebMethodAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Prepare the request body based on the query.\n * The query information can be accessed at the WebMethod using variable named `value`.\n *\n * @param {DataManager} dm\n * @param {Query} query\n * @param {Object[]} hierarchyFilters?\n * @param hierarchyFilters\n * @returns application\n */\n WebMethodAdaptor.prototype.processQuery = function (dm, query, hierarchyFilters) {\n var obj = new UrlAdaptor().processQuery(dm, query, hierarchyFilters);\n var getData = 'data';\n var data = DataUtil.parse.parseJson(obj[getData]);\n var result = {};\n var value = 'value';\n if (data.param) {\n for (var i = 0; i < data.param.length; i++) {\n var param = data.param[i];\n var key = Object.keys(param)[0];\n result[key] = param[key];\n }\n }\n result[value] = data;\n var pvtData = 'pvtData';\n var url = 'url';\n return {\n data: JSON.stringify(result),\n url: obj[url],\n pvtData: obj[pvtData],\n type: 'POST',\n contentType: 'application/json; charset=utf-8'\n };\n };\n return WebMethodAdaptor;\n}(UrlAdaptor));\nexport { WebMethodAdaptor };\n/**\n * RemoteSaveAdaptor, extended from JsonAdaptor and it is used for binding local data and performs all DataManager queries in client-side.\n * It interacts with server-side only for CRUD operations.\n *\n * @hidden\n */\nvar RemoteSaveAdaptor = /** @class */ (function (_super) {\n __extends(RemoteSaveAdaptor, _super);\n /**\n * @hidden\n */\n function RemoteSaveAdaptor() {\n var _this = _super.call(this) || this;\n setValue('beforeSend', UrlAdaptor.prototype.beforeSend, _this);\n return _this;\n }\n RemoteSaveAdaptor.prototype.insert = function (dm, data, tableName, query, position) {\n this.pvt.position = position;\n this.updateType = 'add';\n return {\n url: dm.dataSource.insertUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: data,\n table: tableName,\n action: 'insert'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.remove = function (dm, keyField, val, tableName, query) {\n _super.prototype.remove.call(this, dm, keyField, val);\n return {\n type: 'POST',\n url: dm.dataSource.removeUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n key: val,\n keyColumn: keyField,\n table: tableName,\n action: 'remove'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.update = function (dm, keyField, val, tableName, query) {\n this.updateType = 'update';\n this.updateKey = keyField;\n return {\n type: 'POST',\n url: dm.dataSource.updateUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: val,\n action: 'update',\n keyColumn: keyField,\n key: val[keyField],\n table: tableName\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes, e) {\n var i;\n var newData = request ? JSON.parse(request.data) : data;\n data = newData.action === 'batch' ? DataUtil.parse.parseJson(data) : data;\n if (this.updateType === 'add') {\n _super.prototype.insert.call(this, ds, data, null, null, this.pvt.position);\n }\n if (this.updateType === 'update') {\n _super.prototype.update.call(this, ds, this.updateKey, data);\n }\n this.updateType = undefined;\n if (data.added) {\n for (i = 0; i < data.added.length; i++) {\n _super.prototype.insert.call(this, ds, data.added[i]);\n }\n }\n if (data.changed) {\n for (i = 0; i < data.changed.length; i++) {\n _super.prototype.update.call(this, ds, e.key, data.changed[i]);\n }\n }\n if (data.deleted) {\n for (i = 0; i < data.deleted.length; i++) {\n _super.prototype.remove.call(this, ds, e.key, data.deleted[i]);\n }\n }\n return data;\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * Also perform the changes in the locally cached data to sync with the remote data.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n * @param query\n * @param original\n */\n RemoteSaveAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n return {\n type: 'POST',\n url: dm.dataSource.batchUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n contentType: 'application/json; charset=utf-8',\n dataType: 'json',\n data: JSON.stringify(extend({}, {\n changed: changes.changedRecords,\n added: changes.addedRecords,\n deleted: changes.deletedRecords,\n action: 'batch',\n table: e.url,\n key: e.key\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.addParams = function (options) {\n var urlParams = new UrlAdaptor();\n urlParams.addParams(options);\n };\n return RemoteSaveAdaptor;\n}(JsonAdaptor));\nexport { RemoteSaveAdaptor };\n/**\n * Fetch Adaptor that is extended from URL Adaptor, is used for handle data operations with user defined functions.\n *\n * @hidden\n */\nvar CustomDataAdaptor = /** @class */ (function (_super) {\n __extends(CustomDataAdaptor, _super);\n function CustomDataAdaptor(props) {\n var _this = _super.call(this) || this;\n // options replaced the default adaptor options\n _this.options = extend({}, _this.options, {\n getData: new Function(),\n addRecord: new Function(),\n updateRecord: new Function(),\n deleteRecord: new Function(),\n batchUpdate: new Function()\n });\n extend(_this.options, props || {});\n return _this;\n }\n CustomDataAdaptor.prototype.getModuleName = function () {\n return 'CustomDataAdaptor';\n };\n return CustomDataAdaptor;\n}(UrlAdaptor));\nexport { CustomDataAdaptor };\n/**\n * The GraphqlAdaptor that is extended from URL Adaptor, is used for retrieving data from the Graphql server.\n * It interacts with the Graphql server with all the DataManager Queries and performs CRUD operations.\n *\n * @hidden\n */\nvar GraphQLAdaptor = /** @class */ (function (_super) {\n __extends(GraphQLAdaptor, _super);\n function GraphQLAdaptor(options) {\n var _this = _super.call(this) || this;\n _this.opt = options;\n _this.schema = _this.opt.response;\n _this.query = _this.opt.query;\n /* eslint-disable @typescript-eslint/no-empty-function */\n // tslint:disable-next-line:no-empty\n _this.getVariables = _this.opt.getVariables ? _this.opt.getVariables : function () { };\n /* eslint-enable @typescript-eslint/no-empty-function */\n _this.getQuery = function () { return _this.query; };\n return _this;\n }\n GraphQLAdaptor.prototype.getModuleName = function () {\n return 'GraphQLAdaptor';\n };\n /**\n * Process the JSON data based on the provided queries.\n *\n * @param {DataManager} dm\n * @param {Query} query?\n * @param datamanager\n * @param query\n */\n GraphQLAdaptor.prototype.processQuery = function (datamanager, query) {\n var urlQuery = _super.prototype.processQuery.apply(this, arguments);\n var dm = JSON.parse(urlQuery.data);\n // constructing GraphQL parameters\n var keys = ['skip', 'take', 'sorted', 'table', 'select', 'where',\n 'search', 'requiresCounts', 'aggregates', 'params'];\n var temp = {};\n var str = 'searchwhereparams';\n keys.filter(function (e) {\n temp[e] = str.indexOf(e) > -1 ? JSON.stringify(dm[e]) : dm[e];\n });\n var vars = this.getVariables() || {};\n // tslint:disable-next-line:no-string-literal\n vars['datamanager'] = temp;\n var data = JSON.stringify({\n query: this.getQuery(),\n variables: vars\n });\n urlQuery.data = data;\n return urlQuery;\n };\n /**\n * Returns the data from the query processing.\n * It will also cache the data for later usage.\n *\n * @param {DataResult} data\n * @param {DataManager} ds?\n * @param {Query} query?\n * @param {Request} xhr?\n * @param {Object} request?\n * @param resData\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @returns DataResult\n */\n GraphQLAdaptor.prototype.processResponse = function (resData, ds, query, xhr, request) {\n var res = resData;\n var count;\n var aggregates;\n var result = getValue(this.schema.result, res.data);\n if (this.schema.count) {\n count = getValue(this.schema.count, res.data);\n }\n if (this.schema.aggregates) {\n aggregates = getValue(this.schema.aggregates, res.data);\n aggregates = !isNullOrUndefined(aggregates) ? DataUtil.parse.parseJson(aggregates) : aggregates;\n }\n var pvt = request.pvtData || {};\n var args = { result: result, aggregates: aggregates };\n var data = args;\n if (pvt && pvt.groups && pvt.groups.length) {\n this.getAggregateResult(pvt, data, args, null, query);\n }\n return !isNullOrUndefined(count) ? { result: args.result, count: count, aggregates: aggregates } : args.result;\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n */\n GraphQLAdaptor.prototype.insert = function () {\n var inserted = _super.prototype.insert.apply(this, arguments);\n return this.generateCrudData(inserted, 'insert');\n };\n /**\n * Prepare and returns request body which is used to update a new record in the table.\n */\n GraphQLAdaptor.prototype.update = function () {\n var inserted = _super.prototype.update.apply(this, arguments);\n return this.generateCrudData(inserted, 'update');\n };\n /**\n * Prepare and returns request body which is used to remove a new record in the table.\n */\n GraphQLAdaptor.prototype.remove = function () {\n var inserted = _super.prototype.remove.apply(this, arguments);\n return this.generateCrudData(inserted, 'remove');\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {Object} e\n * @param e.key\n * @param {Query} query\n * @param {Object} original\n */\n GraphQLAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n var batch = _super.prototype.batchRequest.apply(this, arguments);\n // tslint:disable-next-line:typedef\n var bData = JSON.parse(batch.data);\n bData.key = e.key;\n batch.data = JSON.stringify(bData);\n return this.generateCrudData(batch, 'batch');\n };\n GraphQLAdaptor.prototype.generateCrudData = function (crudData, action) {\n var parsed = JSON.parse(crudData.data);\n crudData.data = JSON.stringify({\n query: this.opt.getMutation(action),\n variables: parsed\n });\n return crudData;\n };\n return GraphQLAdaptor;\n}(UrlAdaptor));\nexport { GraphQLAdaptor };\n/**\n * Cache Adaptor is used to cache the data of the visited pages. It prevents new requests for the previously visited pages.\n * You can configure cache page size and duration of caching by using cachingPageSize and timeTillExpiration properties of the DataManager\n *\n * @hidden\n */\nvar CacheAdaptor = /** @class */ (function (_super) {\n __extends(CacheAdaptor, _super);\n /**\n * Constructor for CacheAdaptor class.\n *\n * @param {CacheAdaptor} adaptor?\n * @param {number} timeStamp?\n * @param {number} pageSize?\n * @param adaptor\n * @param timeStamp\n * @param pageSize\n * @hidden\n */\n function CacheAdaptor(adaptor, timeStamp, pageSize) {\n var _this = _super.call(this) || this;\n _this.isCrudAction = false;\n _this.isInsertAction = false;\n if (!isNullOrUndefined(adaptor)) {\n _this.cacheAdaptor = adaptor;\n }\n _this.pageSize = pageSize;\n _this.guidId = DataUtil.getGuid('cacheAdaptor');\n var obj = { keys: [], results: [] };\n window.localStorage.setItem(_this.guidId, JSON.stringify(obj));\n var guid = _this.guidId;\n if (!isNullOrUndefined(timeStamp)) {\n setInterval(function () {\n var data = DataUtil.parse.parseJson(window.localStorage.getItem(guid));\n var forDel = [];\n for (var i = 0; i < data.results.length; i++) {\n var currentTime = +new Date();\n var requestTime = +new Date(data.results[i].timeStamp);\n data.results[i].timeStamp = currentTime - requestTime;\n if (currentTime - requestTime > timeStamp) {\n forDel.push(i);\n }\n }\n for (var i = 0; i < forDel.length; i++) {\n data.results.splice(forDel[i], 1);\n data.keys.splice(forDel[i], 1);\n }\n window.localStorage.removeItem(guid);\n window.localStorage.setItem(guid, JSON.stringify(data));\n }, timeStamp);\n }\n return _this;\n }\n /**\n * It will generate the key based on the URL when we send a request to server.\n *\n * @param {string} url\n * @param {Query} query?\n * @param query\n * @hidden\n */\n CacheAdaptor.prototype.generateKey = function (url, query) {\n var queries = this.getQueryRequest(query);\n var singles = Query.filterQueryLists(query.queries, ['onSelect', 'onPage', 'onSkip', 'onTake', 'onRange']);\n var key = url;\n var page = 'onPage';\n if (page in singles) {\n key += singles[page].pageIndex;\n }\n queries.sorts.forEach(function (obj) {\n key += obj.e.direction + obj.e.fieldName;\n });\n queries.groups.forEach(function (obj) {\n key += obj.e.fieldName;\n });\n queries.searches.forEach(function (obj) {\n key += obj.e.searchKey;\n });\n for (var filter = 0; filter < queries.filters.length; filter++) {\n var currentFilter = queries.filters[filter];\n if (currentFilter.e.isComplex) {\n var newQuery = query.clone();\n newQuery.queries = [];\n for (var i = 0; i < currentFilter.e.predicates.length; i++) {\n newQuery.queries.push({ fn: 'onWhere', e: currentFilter.e.predicates[i], filter: query.queries.filter });\n }\n key += currentFilter.e.condition + this.generateKey(url, newQuery);\n }\n else {\n key += currentFilter.e.field + currentFilter.e.operator + currentFilter.e.value;\n }\n }\n return key;\n };\n /**\n * Process the query to generate request body.\n * If the data is already cached, it will return the cached data.\n *\n * @param {DataManager} dm\n * @param {Query} query?\n * @param {Object[]} hierarchyFilters?\n * @param query\n * @param hierarchyFilters\n */\n CacheAdaptor.prototype.processQuery = function (dm, query, hierarchyFilters) {\n var key = this.generateKey(dm.dataSource.url, query);\n var cachedItems = DataUtil.parse.parseJson(window.localStorage.getItem(this.guidId));\n var data = cachedItems ? cachedItems.results[cachedItems.keys.indexOf(key)] : null;\n if (data != null && !this.isCrudAction && !this.isInsertAction) {\n return data;\n }\n this.isCrudAction = null;\n this.isInsertAction = null;\n /* eslint-disable prefer-spread */\n return this.cacheAdaptor.processQuery.apply(this.cacheAdaptor, [].slice.call(arguments, 0));\n /* eslint-enable prefer-spread */\n };\n /**\n * Returns the data from the query processing.\n * It will also cache the data for later usage.\n *\n * @param {DataResult} data\n * @param {DataManager} ds?\n * @param {Query} query?\n * @param {Request} xhr?\n * @param {Fetch} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n */\n CacheAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n if (this.isInsertAction || (request && this.cacheAdaptor.options.batch &&\n DataUtil.endsWith(request.url, this.cacheAdaptor.options.batch) && request.type.toLowerCase() === 'post')) {\n return this.cacheAdaptor.processResponse(data, ds, query, xhr, request, changes);\n }\n /* eslint-disable prefer-spread */\n data = this.cacheAdaptor.processResponse.apply(this.cacheAdaptor, [].slice.call(arguments, 0));\n /* eslint-enable prefer-spread */\n var key = query ? this.generateKey(ds.dataSource.url, query) : ds.dataSource.url;\n var obj = {};\n obj = DataUtil.parse.parseJson(window.localStorage.getItem(this.guidId));\n var index = obj.keys.indexOf(key);\n if (index !== -1) {\n obj.results.splice(index, 1);\n obj.keys.splice(index, 1);\n }\n obj.results[obj.keys.push(key) - 1] = { keys: key, result: data.result, timeStamp: new Date(), count: data.count };\n while (obj.results.length > this.pageSize) {\n obj.results.splice(0, 1);\n obj.keys.splice(0, 1);\n }\n window.localStorage.setItem(this.guidId, JSON.stringify(obj));\n return data;\n };\n /**\n * Method will trigger before send the request to server side. Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {Request} request\n * @param {Fetch} settings?\n * @param settings\n */\n CacheAdaptor.prototype.beforeSend = function (dm, request, settings) {\n if (!isNullOrUndefined(this.cacheAdaptor.options.batch) && DataUtil.endsWith(settings.url, this.cacheAdaptor.options.batch)\n && settings.type.toLowerCase() === 'post') {\n request.headers.set('Accept', this.cacheAdaptor.options.multipartAccept);\n }\n if (!dm.dataSource.crossDomain) {\n request.headers.set('Accept', this.cacheAdaptor.options.accept);\n }\n };\n /**\n * Updates existing record and saves the changes to the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName\n */\n CacheAdaptor.prototype.update = function (dm, keyField, value, tableName) {\n this.isCrudAction = true;\n return this.cacheAdaptor.update(dm, keyField, value, tableName);\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName?\n * @param tableName\n */\n CacheAdaptor.prototype.insert = function (dm, data, tableName) {\n this.isInsertAction = true;\n return this.cacheAdaptor.insert(dm, data, tableName);\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n */\n CacheAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n this.isCrudAction = true;\n return this.cacheAdaptor.remove(dm, keyField, value, tableName);\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n */\n CacheAdaptor.prototype.batchRequest = function (dm, changes, e) {\n return this.cacheAdaptor.batchRequest(dm, changes, e);\n };\n return CacheAdaptor;\n}(UrlAdaptor));\nexport { CacheAdaptor };\n","/* eslint-disable valid-jsdoc */\n/* eslint-disable security/detect-object-injection */\nimport { Fetch } from '@syncfusion/ej2-base';\nimport { extend, isNullOrUndefined } from '@syncfusion/ej2-base';\nimport { DataUtil } from './util';\nimport { Predicate, Query } from './query';\nimport { ODataAdaptor, JsonAdaptor, CacheAdaptor, RemoteSaveAdaptor, CustomDataAdaptor } from './adaptors';\n/**\n * DataManager is used to manage and manipulate relational data.\n */\nvar DataManager = /** @class */ (function () {\n /**\n * Constructor for DataManager class\n *\n * @param {DataOptions|JSON[]} dataSource?\n * @param {Query} query?\n * @param {AdaptorOptions|string} adaptor?\n * @param dataSource\n * @param query\n * @param adaptor\n * @hidden\n */\n function DataManager(dataSource, query, adaptor) {\n var _this = this;\n /** @hidden */\n this.dateParse = true;\n /** @hidden */\n this.timeZoneHandling = true;\n this.persistQuery = {};\n this.isInitialLoad = false;\n this.requests = [];\n this.isInitialLoad = true;\n if (!dataSource && !this.dataSource) {\n dataSource = [];\n }\n adaptor = adaptor || dataSource.adaptor;\n if (dataSource && dataSource.timeZoneHandling === false) {\n this.timeZoneHandling = dataSource.timeZoneHandling;\n }\n var data;\n if (dataSource instanceof Array) {\n data = {\n json: dataSource,\n offline: true\n };\n }\n else if (typeof dataSource === 'object') {\n if (!dataSource.json) {\n dataSource.json = [];\n }\n if (!dataSource.enablePersistence) {\n dataSource.enablePersistence = false;\n }\n if (!dataSource.id) {\n dataSource.id = '';\n }\n if (!dataSource.ignoreOnPersist) {\n dataSource.ignoreOnPersist = [];\n }\n data = {\n url: dataSource.url,\n insertUrl: dataSource.insertUrl,\n removeUrl: dataSource.removeUrl,\n updateUrl: dataSource.updateUrl,\n crudUrl: dataSource.crudUrl,\n batchUrl: dataSource.batchUrl,\n json: dataSource.json,\n headers: dataSource.headers,\n accept: dataSource.accept,\n data: dataSource.data,\n timeTillExpiration: dataSource.timeTillExpiration,\n cachingPageSize: dataSource.cachingPageSize,\n enableCaching: dataSource.enableCaching,\n requestType: dataSource.requestType,\n key: dataSource.key,\n crossDomain: dataSource.crossDomain,\n jsonp: dataSource.jsonp,\n dataType: dataSource.dataType,\n offline: dataSource.offline !== undefined ? dataSource.offline\n : dataSource.adaptor instanceof RemoteSaveAdaptor || dataSource.adaptor instanceof CustomDataAdaptor ?\n false : dataSource.url ? false : true,\n requiresFormat: dataSource.requiresFormat,\n enablePersistence: dataSource.enablePersistence,\n id: dataSource.id,\n ignoreOnPersist: dataSource.ignoreOnPersist\n };\n }\n else {\n DataUtil.throwError('DataManager: Invalid arguments');\n }\n if (data.requiresFormat === undefined && !DataUtil.isCors()) {\n data.requiresFormat = isNullOrUndefined(data.crossDomain) ? true : data.crossDomain;\n }\n if (data.dataType === undefined) {\n data.dataType = 'json';\n }\n this.dataSource = data;\n this.defaultQuery = query;\n if (this.dataSource.enablePersistence && this.dataSource.id) {\n window.addEventListener('unload', this.setPersistData.bind(this));\n }\n if (data.url && data.offline && !data.json.length) {\n this.isDataAvailable = false;\n this.adaptor = adaptor || new ODataAdaptor();\n this.dataSource.offline = false;\n this.ready = this.executeQuery(query || new Query());\n this.ready.then(function (e) {\n _this.dataSource.offline = true;\n _this.isDataAvailable = true;\n data.json = e.result;\n _this.adaptor = new JsonAdaptor();\n });\n }\n else {\n this.adaptor = data.offline ? new JsonAdaptor() : new ODataAdaptor();\n }\n if (!data.jsonp && this.adaptor instanceof ODataAdaptor) {\n data.jsonp = 'callback';\n }\n this.adaptor = adaptor || this.adaptor;\n if (data.enableCaching) {\n this.adaptor = new CacheAdaptor(this.adaptor, data.timeTillExpiration, data.cachingPageSize);\n }\n return this;\n }\n /**\n * Get the queries maintained in the persisted state.\n * @param {string} id - The identifier of the persisted query to retrieve.\n * @returns {object} The persisted data object.\n */\n DataManager.prototype.getPersistedData = function (id) {\n var persistedData = localStorage.getItem(id || this.dataSource.id);\n return JSON.parse(persistedData);\n };\n /**\n * Set the queries to be maintained in the persisted state.\n * @param {Event} e - The event parameter that triggers the setPersistData method.\n * @param {string} id - The identifier of the persisted query to set.\n * @param {object} persistData - The data to be persisted.\n * @returns {void} .\n */\n DataManager.prototype.setPersistData = function (e, id, persistData) {\n localStorage.setItem(id || this.dataSource.id, JSON.stringify(persistData || this.persistQuery));\n };\n DataManager.prototype.setPersistQuery = function (query) {\n var _this = this;\n var persistedQuery = this.getPersistedData();\n if (this.isInitialLoad && persistedQuery && Object.keys(persistedQuery).length) {\n this.persistQuery = persistedQuery;\n this.persistQuery.queries = this.persistQuery.queries.filter(function (query) {\n if (_this.dataSource.ignoreOnPersist && _this.dataSource.ignoreOnPersist.length) {\n if (query.fn && _this.dataSource.ignoreOnPersist.some(function (keyword) { return query.fn === keyword; })) {\n return false; // Exclude the matching query\n }\n }\n if (query.fn === 'onWhere') {\n var e = query.e;\n if (e && e.isComplex && e.predicates instanceof Array) {\n var allPredicates = e.predicates.map(function (predicateObj) {\n if (predicateObj.predicates && predicateObj.predicates instanceof Array) {\n // Process nested predicate array\n var nestedPredicates = predicateObj.predicates.map(function (nestedPredicate) {\n var field = nestedPredicate.field, operator = nestedPredicate.operator, value = nestedPredicate.value, ignoreCase = nestedPredicate.ignoreCase, ignoreAccent = nestedPredicate.ignoreAccent, matchCase = nestedPredicate.matchCase;\n return new Predicate(field, operator, value, ignoreCase, ignoreAccent, matchCase);\n });\n return predicateObj.condition === 'and' ? Predicate.and(nestedPredicates) : Predicate.or(nestedPredicates);\n }\n else {\n // Process individual predicate\n var field = predicateObj.field, operator = predicateObj.operator, value = predicateObj.value, ignoreCase = predicateObj.ignoreCase, ignoreAccent = predicateObj.ignoreAccent, matchCase = predicateObj.matchCase;\n return new Predicate(field, operator, value, ignoreCase, ignoreAccent, matchCase);\n }\n });\n query.e = new Predicate(allPredicates[0], e.condition, allPredicates.slice(1));\n }\n }\n return true; // Keep all other queries\n });\n var newQuery = extend(new Query(), this.persistQuery);\n this.isInitialLoad = false;\n return (newQuery);\n }\n else {\n this.persistQuery = query;\n this.isInitialLoad = false;\n return query;\n }\n };\n /**\n * Overrides DataManager's default query with given query.\n *\n * @param {Query} query - Defines the new default query.\n */\n DataManager.prototype.setDefaultQuery = function (query) {\n this.defaultQuery = query;\n return this;\n };\n /**\n * Executes the given query with local data source.\n *\n * @param {Query} query - Defines the query to retrieve data.\n */\n DataManager.prototype.executeLocal = function (query) {\n if (!this.defaultQuery && !(query instanceof Query)) {\n DataUtil.throwError('DataManager - executeLocal() : A query is required to execute');\n }\n if (!this.dataSource.json) {\n DataUtil.throwError('DataManager - executeLocal() : Json data is required to execute');\n }\n if (this.dataSource.enablePersistence && this.dataSource.id) {\n query = this.setPersistQuery(query);\n }\n query = query || this.defaultQuery;\n var result = this.adaptor.processQuery(this, query);\n if (query.subQuery) {\n var from = query.subQuery.fromTable;\n var lookup = query.subQuery.lookups;\n var res = query.isCountRequired ? result.result :\n result;\n if (lookup && lookup instanceof Array) {\n DataUtil.buildHierarchy(query.subQuery.fKey, from, res, lookup, query.subQuery.key);\n }\n for (var j = 0; j < res.length; j++) {\n if (res[j][from] instanceof Array) {\n res[j] = extend({}, {}, res[j]);\n res[j][from] = this.adaptor.processResponse(query.subQuery.using(new DataManager(res[j][from].slice(0))).executeLocal(), this, query);\n }\n }\n }\n return this.adaptor.processResponse(result, this, query);\n };\n /**\n * Executes the given query with either local or remote data source.\n * It will be executed as asynchronously and returns Promise object which will be resolved or rejected after action completed.\n *\n * @param {Query|Function} query - Defines the query to retrieve data.\n * @param {Function} done - Defines the callback function and triggers when the Promise is resolved.\n * @param {Function} fail - Defines the callback function and triggers when the Promise is rejected.\n * @param {Function} always - Defines the callback function and triggers when the Promise is resolved or rejected.\n */\n DataManager.prototype.executeQuery = function (query, done, fail, always) {\n var _this = this;\n var makeRequest = 'makeRequest';\n if (this.dataSource.enablePersistence && this.dataSource.id) {\n query = this.setPersistQuery(query);\n }\n if (typeof query === 'function') {\n always = fail;\n fail = done;\n done = query;\n query = null;\n }\n if (!query) {\n query = this.defaultQuery;\n }\n if (!(query instanceof Query)) {\n DataUtil.throwError('DataManager - executeQuery() : A query is required to execute');\n }\n var deffered = new Deferred();\n var args = { query: query };\n if (!this.dataSource.offline && (this.dataSource.url !== undefined && this.dataSource.url !== '')\n || (!isNullOrUndefined(this.adaptor[makeRequest])) || this.isCustomDataAdaptor(this.adaptor)) {\n var result = this.adaptor.processQuery(this, query);\n if (!isNullOrUndefined(this.adaptor[makeRequest])) {\n this.adaptor[makeRequest](result, deffered, args, query);\n }\n else if (!isNullOrUndefined(result.url) || this.isCustomDataAdaptor(this.adaptor)) {\n this.requests = [];\n this.makeRequest(result, deffered, args, query);\n }\n else {\n args = DataManager.getDeferedArgs(query, result, args);\n deffered.resolve(args);\n }\n }\n else {\n DataManager.nextTick(function () {\n var res = _this.executeLocal(query);\n args = DataManager.getDeferedArgs(query, res, args);\n deffered.resolve(args);\n });\n }\n if (done || fail) {\n deffered.promise.then(done, fail);\n }\n if (always) {\n deffered.promise.then(always, always);\n }\n return deffered.promise;\n };\n DataManager.getDeferedArgs = function (query, result, args) {\n if (query.isCountRequired) {\n args.result = result.result;\n args.count = result.count;\n args.aggregates = result.aggregates;\n }\n else {\n args.result = result;\n }\n return args;\n };\n DataManager.nextTick = function (fn) {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n // tslint:disable-next-line:no-any\n (window.setImmediate || window.setTimeout)(fn, 0);\n /* eslint-enable @typescript-eslint/no-explicit-any */\n };\n DataManager.prototype.extendRequest = function (url, fnSuccess, fnFail) {\n return extend({}, {\n type: 'GET',\n dataType: this.dataSource.dataType,\n crossDomain: this.dataSource.crossDomain,\n jsonp: this.dataSource.jsonp,\n cache: true,\n processData: false,\n onSuccess: fnSuccess,\n onFailure: fnFail\n }, url);\n };\n // tslint:disable-next-line:max-func-body-length\n DataManager.prototype.makeRequest = function (url, deffered, args, query) {\n var _this = this;\n var isSelector = !!query.subQuerySelector;\n var fnFail = function (e) {\n args.error = e;\n deffered.reject(args);\n };\n var process = function (data, count, xhr, request, actual, aggregates, virtualSelectRecords) {\n args.xhr = xhr;\n args.count = count ? parseInt(count.toString(), 10) : 0;\n args.result = data;\n args.request = request;\n args.aggregates = aggregates;\n args.actual = actual;\n args.virtualSelectRecords = virtualSelectRecords;\n deffered.resolve(args);\n };\n var fnQueryChild = function (data, selector) {\n var subDeffer = new Deferred();\n var childArgs = { parent: args };\n query.subQuery.isChild = true;\n var subUrl = _this.adaptor.processQuery(_this, query.subQuery, data ? _this.adaptor.processResponse(data) : selector);\n var childReq = _this.makeRequest(subUrl, subDeffer, childArgs, query.subQuery);\n if (!isSelector) {\n subDeffer.then(function (subData) {\n if (data) {\n DataUtil.buildHierarchy(query.subQuery.fKey, query.subQuery.fromTable, data, subData, query.subQuery.key);\n process(data, subData.count, subData.xhr);\n }\n }, fnFail);\n }\n return childReq;\n };\n var fnSuccess = function (data, request) {\n if (_this.isGraphQLAdaptor(_this.adaptor)) {\n // tslint:disable-next-line:no-string-literal\n if (!isNullOrUndefined(data['errors'])) {\n // tslint:disable-next-line:no-string-literal\n return fnFail(data['errors'], request);\n }\n }\n if (_this.isCustomDataAdaptor(_this.adaptor)) {\n request = extend({}, _this.fetchReqOption, request);\n }\n if (request.contentType.indexOf('xml') === -1 && _this.dateParse) {\n data = DataUtil.parse.parseJson(data);\n }\n var result = _this.adaptor.processResponse(data, _this, query, request.fetchRequest, request);\n var count = 0;\n var aggregates = null;\n var virtualSelectRecords = 'virtualSelectRecords';\n var virtualRecords = data[virtualSelectRecords];\n if (query.isCountRequired) {\n count = result.count;\n aggregates = result.aggregates;\n result = result.result;\n }\n if (!query.subQuery) {\n process(result, count, request.fetchRequest, request.type, data, aggregates, virtualRecords);\n return;\n }\n if (!isSelector) {\n fnQueryChild(result, request);\n }\n };\n var req = this.extendRequest(url, fnSuccess, fnFail);\n if (!this.isCustomDataAdaptor(this.adaptor)) {\n var fetch_1 = new Fetch(req);\n fetch_1.beforeSend = function () {\n _this.beforeSend(fetch_1.fetchRequest, fetch_1);\n };\n req = fetch_1.send();\n req.catch(function (e) { return true; }); // to handle failure remote requests.\n this.requests.push(fetch_1);\n }\n else {\n this.fetchReqOption = req;\n var request = req;\n this.adaptor.options.getData({\n data: request.data,\n onSuccess: request.onSuccess, onFailure: request.onFailure\n });\n }\n if (isSelector) {\n var promise = void 0;\n var res = query.subQuerySelector.call(this, { query: query.subQuery, parent: query });\n if (res && res.length) {\n promise = Promise.all([req, fnQueryChild(null, res)]);\n promise.then(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var result = args[0];\n var pResult = _this.adaptor.processResponse(result[0], _this, query, _this.requests[0].fetchRequest, _this.requests[0]);\n var count = 0;\n if (query.isCountRequired) {\n count = pResult.count;\n pResult = pResult.result;\n }\n var cResult = _this.adaptor.processResponse(result[1], _this, query.subQuery, _this.requests[1].fetchRequest, _this.requests[1]);\n count = 0;\n if (query.subQuery.isCountRequired) {\n count = cResult.count;\n cResult = cResult.result;\n }\n DataUtil.buildHierarchy(query.subQuery.fKey, query.subQuery.fromTable, pResult, cResult, query.subQuery.key);\n isSelector = false;\n process(pResult, count, _this.requests[0].fetchRequest);\n });\n }\n else {\n isSelector = false;\n }\n }\n return req;\n };\n DataManager.prototype.beforeSend = function (request, settings) {\n this.adaptor.beforeSend(this, request, settings);\n var headers = this.dataSource.headers;\n var props;\n for (var i = 0; headers && i < headers.length; i++) {\n props = [];\n var keys = Object.keys(headers[i]);\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var prop = keys_1[_i];\n props.push(prop);\n request.headers.set(prop, headers[i][prop]);\n }\n }\n };\n /**\n * Save bulk changes to the given table name.\n * User can add a new record, edit an existing record, and delete a record at the same time.\n * If the datasource from remote, then updated in a single post.\n *\n * @param {Object} changes - Defines the CrudOptions.\n * @param {string} key - Defines the column field.\n * @param {string|Query} tableName - Defines the table name.\n * @param {Query} query - Sets default query for the DataManager.\n * @param original\n */\n DataManager.prototype.saveChanges = function (changes, key, tableName, query, original) {\n var _this = this;\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var args = {\n url: tableName,\n key: key || this.dataSource.key\n };\n var req = this.adaptor.batchRequest(this, changes, args, query || new Query(), original);\n var dofetchRequest = 'dofetchRequest';\n if (this.dataSource.offline) {\n return req;\n }\n if (!isNullOrUndefined(this.adaptor[dofetchRequest])) {\n return this.adaptor[dofetchRequest](req);\n }\n else if (!this.isCustomDataAdaptor(this.adaptor)) {\n var deff_1 = new Deferred();\n var fetch_2 = new Fetch(req);\n fetch_2.beforeSend = function () {\n _this.beforeSend(fetch_2.fetchRequest, fetch_2);\n };\n fetch_2.onSuccess = function (data, request) {\n if (_this.isGraphQLAdaptor(_this.adaptor)) {\n // tslint:disable-next-line:no-string-literal\n if (!isNullOrUndefined(data['errors'])) {\n // tslint:disable-next-line:no-string-literal\n fetch_2.onFailure(JSON.stringify(data['errors']));\n }\n }\n deff_1.resolve(_this.adaptor.processResponse(data, _this, null, request.fetchRequest, request, changes, args));\n };\n fetch_2.onFailure = function (e) {\n deff_1.reject([{ error: e }]);\n };\n fetch_2.send().catch(function (e) { return true; }); // to handle the failure requests.\n return deff_1.promise;\n }\n else {\n return this.dofetchRequest(req, this.adaptor.options.batchUpdate);\n }\n };\n /**\n * Inserts new record in the given table.\n *\n * @param {Object} data - Defines the data to insert.\n * @param {string|Query} tableName - Defines the table name.\n * @param {Query} query - Sets default query for the DataManager.\n * @param position\n */\n DataManager.prototype.insert = function (data, tableName, query, position) {\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var req = this.adaptor.insert(this, data, tableName, query, position);\n var dofetchRequest = 'dofetchRequest';\n if (this.dataSource.offline) {\n return req;\n }\n if (!isNullOrUndefined(this.adaptor[dofetchRequest])) {\n return this.adaptor[dofetchRequest](req);\n }\n else {\n return this.dofetchRequest(req, this.adaptor.options.addRecord);\n }\n };\n /**\n * Removes data from the table with the given key.\n *\n * @param {string} keyField - Defines the column field.\n * @param {Object} value - Defines the value to find the data in the specified column.\n * @param {string|Query} tableName - Defines the table name\n * @param {Query} query - Sets default query for the DataManager.\n */\n DataManager.prototype.remove = function (keyField, value, tableName, query) {\n if (typeof value === 'object') {\n value = DataUtil.getObject(keyField, value);\n }\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var res = this.adaptor.remove(this, keyField, value, tableName, query);\n var dofetchRequest = 'dofetchRequest';\n if (this.dataSource.offline) {\n return res;\n }\n if (!isNullOrUndefined(this.adaptor[dofetchRequest])) {\n return this.adaptor[dofetchRequest](res);\n }\n else {\n var remove = this.adaptor.options.deleteRecord;\n return this.dofetchRequest(res, remove);\n }\n };\n /**\n * Updates existing record in the given table.\n *\n * @param {string} keyField - Defines the column field.\n * @param {Object} value - Defines the value to find the data in the specified column.\n * @param {string|Query} tableName - Defines the table name\n * @param {Query} query - Sets default query for the DataManager.\n * @param original\n */\n DataManager.prototype.update = function (keyField, value, tableName, query, original) {\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var res = this.adaptor.update(this, keyField, value, tableName, query, original);\n var dofetchRequest = 'dofetchRequest';\n if (this.dataSource.offline) {\n return res;\n }\n if (!isNullOrUndefined(this.adaptor[dofetchRequest])) {\n return this.adaptor[dofetchRequest](res);\n }\n else {\n var update = this.adaptor.options.updateRecord;\n return this.dofetchRequest(res, update);\n }\n };\n DataManager.prototype.isCustomDataAdaptor = function (dataSource) {\n return this.adaptor.getModuleName &&\n this.adaptor.getModuleName() === 'CustomDataAdaptor';\n };\n DataManager.prototype.isGraphQLAdaptor = function (dataSource) {\n return this.adaptor.getModuleName &&\n this.adaptor.getModuleName() === 'GraphQLAdaptor';\n };\n DataManager.prototype.successFunc = function (record, request) {\n if (this.isGraphQLAdaptor(this.adaptor)) {\n var data = typeof record === 'object' ? record : JSON.parse(record);\n // tslint:disable-next-line:no-string-literal\n if (!isNullOrUndefined(data['errors'])) {\n // tslint:disable-next-line:no-string-literal\n this.failureFunc(JSON.stringify(data['errors']));\n }\n }\n if (this.isCustomDataAdaptor(this.adaptor)) {\n request = extend({}, this.fetchReqOption, request);\n }\n try {\n DataUtil.parse.parseJson(record);\n }\n catch (e) {\n record = [];\n }\n record = this.adaptor.processResponse(DataUtil.parse.parseJson(record), this, null, request.fetchRequest, request);\n this.fetchDeffered.resolve(record);\n };\n DataManager.prototype.failureFunc = function (e) {\n this.fetchDeffered.reject([{ error: e }]);\n };\n DataManager.prototype.dofetchRequest = function (res, fetchFunc) {\n var _this = this;\n res = extend({}, {\n type: 'POST',\n contentType: 'application/json; charset=utf-8',\n processData: false\n }, res);\n this.fetchDeffered = new Deferred();\n if (!this.isCustomDataAdaptor(this.adaptor)) {\n var fetch_3 = new Fetch(res);\n fetch_3.beforeSend = function () {\n _this.beforeSend(fetch_3.fetchRequest, fetch_3);\n };\n fetch_3.onSuccess = this.successFunc.bind(this);\n fetch_3.onFailure = this.failureFunc.bind(this);\n fetch_3.send().catch(function (e) { return true; }); // to handle the failure requests.\n }\n else {\n this.fetchReqOption = res;\n fetchFunc.call(this, {\n data: res.data, onSuccess: this.successFunc.bind(this),\n onFailure: this.failureFunc.bind(this)\n });\n }\n return this.fetchDeffered.promise;\n };\n DataManager.prototype.clearPersistence = function () {\n window.removeEventListener('unload', this.setPersistData.bind(this));\n this.dataSource.enablePersistence = false;\n this.persistQuery = {};\n window.localStorage.setItem(this.dataSource.id, '[]');\n };\n return DataManager;\n}());\nexport { DataManager };\n/**\n * Deferred is used to handle asynchronous operation.\n */\nvar Deferred = /** @class */ (function () {\n function Deferred() {\n var _this = this;\n /**\n * Promise is an object that represents a value that may not be available yet, but will be resolved at some point in the future.\n */\n this.promise = new Promise(function (resolve, reject) {\n _this.resolve = resolve;\n _this.reject = reject;\n });\n /**\n * Defines the callback function triggers when the Deferred object is resolved.\n */\n this.then = this.promise.then.bind(this.promise);\n /**\n * Defines the callback function triggers when the Deferred object is rejected.\n */\n this.catch = this.promise.catch.bind(this.promise);\n }\n return Deferred;\n}());\nexport { Deferred };\n"],"names":["Query","from","this","subQuery","isChild","distincts","queries","key","fKey","fromTable","Array","lookups","expands","sortedColumns","groupedColumns","params","lazyLoad","prototype","setKey","field","using","dataManager","execute","done","fail","always","executeQuery","DataUtil","throwError","executeLocal","clone","cloned","slice","subQuerySelector","isCountRequired","tableName","addParams","value","push","fn","distinct","fields","call","expand","tables","where","fieldName","operator","ignoreCase","ignoreAccent","matchCase","toLowerCase","predicate","Predicate","e","search","searchKey","fieldNames","comparer","fnOperators","sortBy","isFromGroup","sortByForeignKey","direction","sorts","temp","order","isNullOrUndefined","endsWith","replace","fnSort","filterQueries","i","length","j","sortByDesc","group","format","page","pageIndex","pageSize","range","start","end","take","nos","skip","select","hierarchy","query","selectorFn","foreignKey","requiresCount","aggregate","type","name","filter","q","filterQueryLists","singles","filtered","indexOf","res","isComplex","processOperator","condition","predicates","apply","and","args","_i","arguments","combinePredicates","combine","or","ornot","andnot","fromJson","json","len","fromJSONData","pred","validate","record","ret","isAnd","split","undefined","getObject","toJson","p","preds","consts","GroupGuid","getValue","inst","input","substr","notEndsWith","startsWith","notStartsWith","wildCard","pattern","asteriskSplit","join","charAt","RegExp","test","like","lastIndexOf","substring","fnAscending","fnDescending","x","y","localeCompare","extractFields","obj","newObj","setValue","jsonArray","newData","aggregates","level","groupDs","isLazyLoad","jsonData","this_1","items","count","indx","childLevels","grouped","groupedArray","records","this_2","val","getVal","tempObj","aggs","buildHierarchy","source","lookup","pKey","grp","result","fKeyData","getFieldList","prefix","copyObj","keys_1","Object","keys","prop","nameSpace","lowerCaseNameSpace","upperCaseNameSpace","toUpperCase","splits","casing","toString","fromObj","sort","ds","middle","parseInt","left","right","merge","ignoreDiacritics","map","diacritics","current","shift","array","index","callAdaptorFunction","adaptor","fnName","param1","param2","getAddParams","adp","dm","req","reqParams","isPlainObject","constructor","isCors","xhr","window","getGuid","rand","crypto","arr","Uint8Array","getRandomValues","Math","random","isNull","getItemFromComparer","keyVal","castRequired","requiresCompleteRecord","tmp","forEach","data","processData","prepareQuery","sampledata","DataManager","requiresCounts","returnValue","JSON","stringify","_this","parse","parseJson","predicateList","concat","getPredicate","sorted","mainPred","childPred","cpre","_a","serverTimezoneOffset","timeZoneHandling","error","Error","message","stack","sum","isNaN","average","min","max","truecount","falsecount","operatorSymbols","<",">","<=",">=","==","!=","*=","$=","^=","odBiOperator","lessthan","lessthanorequal","greaterthan","greaterthanorequal","equal","notequal","odUniOperator","endswith","startswith","contains","doesnotendwith","doesnotstartwith","doesnotcontain","wildcard","odv4UniOperator","Ⓐ","A","À","Á","Â","Ầ","Ấ","Ẫ","Ẩ","Ã","Ā","Ă","Ằ","Ắ","Ẵ","Ẳ","Ȧ","Ǡ","Ä","Ǟ","Ả","Å","Ǻ","Ǎ","Ȁ","Ȃ","Ạ","Ậ","Ặ","Ḁ","Ą","Ⱥ","Ɐ","Ꜳ","Æ","Ǽ","Ǣ","Ꜵ","Ꜷ","Ꜹ","Ꜻ","Ꜽ","Ⓑ","B","Ḃ","Ḅ","Ḇ","Ƀ","Ƃ","Ɓ","Ⓒ","C","Ć","Ĉ","Ċ","Č","Ç","Ḉ","Ƈ","Ȼ","Ꜿ","Ⓓ","D","Ḋ","Ď","Ḍ","Ḑ","Ḓ","Ḏ","Đ","Ƌ","Ɗ","Ɖ","Ꝺ","DZ","DŽ","Dz","Dž","Ⓔ","E","È","É","Ê","Ề","Ế","Ễ","Ể","Ẽ","Ē","Ḕ","Ḗ","Ĕ","Ė","Ë","Ẻ","Ě","Ȅ","Ȇ","Ẹ","Ệ","Ȩ","Ḝ","Ę","Ḙ","Ḛ","Ɛ","Ǝ","Ⓕ","F","Ḟ","Ƒ","Ꝼ","Ⓖ","G","Ǵ","Ĝ","Ḡ","Ğ","Ġ","Ǧ","Ģ","Ǥ","Ɠ","Ꞡ","Ᵹ","Ꝿ","Ⓗ","H","Ĥ","Ḣ","Ḧ","Ȟ","Ḥ","Ḩ","Ḫ","Ħ","Ⱨ","Ⱶ","Ɥ","Ⓘ","I","Ì","Í","Î","Ĩ","Ī","Ĭ","İ","Ï","Ḯ","Ỉ","Ǐ","Ȉ","Ȋ","Ị","Į","Ḭ","Ɨ","Ⓙ","J","Ĵ","Ɉ","Ⓚ","K","Ḱ","Ǩ","Ḳ","Ķ","Ḵ","Ƙ","Ⱪ","Ꝁ","Ꝃ","Ꝅ","Ꞣ","Ⓛ","L","Ŀ","Ĺ","Ľ","Ḷ","Ḹ","Ļ","Ḽ","Ḻ","Ł","Ƚ","Ɫ","Ⱡ","Ꝉ","Ꝇ","Ꞁ","LJ","Lj","Ⓜ","M","Ḿ","Ṁ","Ṃ","Ɱ","Ɯ","Ⓝ","N","Ǹ","Ń","Ñ","Ṅ","Ň","Ṇ","Ņ","Ṋ","Ṉ","Ƞ","Ɲ","Ꞑ","Ꞥ","NJ","Nj","Ⓞ","O","Ò","Ó","Ô","Ồ","Ố","Ỗ","Ổ","Õ","Ṍ","Ȭ","Ṏ","Ō","Ṑ","Ṓ","Ŏ","Ȯ","Ȱ","Ö","Ȫ","Ỏ","Ő","Ǒ","Ȍ","Ȏ","Ơ","Ờ","Ớ","Ỡ","Ở","Ợ","Ọ","Ộ","Ǫ","Ǭ","Ø","Ǿ","Ɔ","Ɵ","Ꝋ","Ꝍ","Ƣ","Ꝏ","Ȣ","Ⓟ","P","Ṕ","Ṗ","Ƥ","Ᵽ","Ꝑ","Ꝓ","Ꝕ","Ⓠ","Q","Ꝗ","Ꝙ","Ɋ","Ⓡ","R","Ŕ","Ṙ","Ř","Ȑ","Ȓ","Ṛ","Ṝ","Ŗ","Ṟ","Ɍ","Ɽ","Ꝛ","Ꞧ","Ꞃ","Ⓢ","S","ẞ","Ś","Ṥ","Ŝ","Ṡ","Š","Ṧ","Ṣ","Ṩ","Ș","Ş","Ȿ","Ꞩ","Ꞅ","Ⓣ","T","Ṫ","Ť","Ṭ","Ț","Ţ","Ṱ","Ṯ","Ŧ","Ƭ","Ʈ","Ⱦ","Ꞇ","Ꜩ","Ⓤ","U","Ù","Ú","Û","Ũ","Ṹ","Ū","Ṻ","Ŭ","Ü","Ǜ","Ǘ","Ǖ","Ǚ","Ủ","Ů","Ű","Ǔ","Ȕ","Ȗ","Ư","Ừ","Ứ","Ữ","Ử","Ự","Ụ","Ṳ","Ų","Ṷ","Ṵ","Ʉ","Ⓥ","V","Ṽ","Ṿ","Ʋ","Ꝟ","Ʌ","Ꝡ","Ⓦ","W","Ẁ","Ẃ","Ŵ","Ẇ","Ẅ","Ẉ","Ⱳ","Ⓧ","X","Ẋ","Ẍ","Ⓨ","Y","Ỳ","Ý","Ŷ","Ỹ","Ȳ","Ẏ","Ÿ","Ỷ","Ỵ","Ƴ","Ɏ","Ỿ","Ⓩ","Z","Ź","Ẑ","Ż","Ž","Ẓ","Ẕ","Ƶ","Ȥ","Ɀ","Ⱬ","Ꝣ","ⓐ","a","ẚ","à","á","â","ầ","ấ","ẫ","ẩ","ã","ā","ă","ằ","ắ","ẵ","ẳ","ȧ","ǡ","ä","ǟ","ả","å","ǻ","ǎ","ȁ","ȃ","ạ","ậ","ặ","ḁ","ą","ⱥ","ɐ","ꜳ","æ","ǽ","ǣ","ꜵ","ꜷ","ꜹ","ꜻ","ꜽ","ⓑ","b","ḃ","ḅ","ḇ","ƀ","ƃ","ɓ","ⓒ","c","ć","ĉ","ċ","č","ç","ḉ","ƈ","ȼ","ꜿ","ↄ","ⓓ","d","ḋ","ď","ḍ","ḑ","ḓ","ḏ","đ","ƌ","ɖ","ɗ","ꝺ","dz","dž","ⓔ","e","è","é","ê","ề","ế","ễ","ể","ẽ","ē","ḕ","ḗ","ĕ","ė","ë","ẻ","ě","ȅ","ȇ","ẹ","ệ","ȩ","ḝ","ę","ḙ","ḛ","ɇ","ɛ","ǝ","ⓕ","f","ḟ","ƒ","ꝼ","ⓖ","g","ǵ","ĝ","ḡ","ğ","ġ","ǧ","ģ","ǥ","ɠ","ꞡ","ᵹ","ꝿ","ⓗ","h","ĥ","ḣ","ḧ","ȟ","ḥ","ḩ","ḫ","ẖ","ħ","ⱨ","ⱶ","ɥ","ƕ","ⓘ","i","ì","í","î","ĩ","ī","ĭ","ï","ḯ","ỉ","ǐ","ȉ","ȋ","ị","į","ḭ","ɨ","ı","ⓙ","j","ĵ","ǰ","ɉ","ⓚ","k","ḱ","ǩ","ḳ","ķ","ḵ","ƙ","ⱪ","ꝁ","ꝃ","ꝅ","ꞣ","ⓛ","l","ŀ","ĺ","ľ","ḷ","ḹ","ļ","ḽ","ḻ","ſ","ł","ƚ","ɫ","ⱡ","ꝉ","ꞁ","ꝇ","lj","ⓜ","m","ḿ","ṁ","ṃ","ɱ","ɯ","ⓝ","n","ǹ","ń","ñ","ṅ","ň","ṇ","ņ","ṋ","ṉ","ƞ","ɲ","ʼn","ꞑ","ꞥ","nj","ⓞ","o","ò","ó","ô","ồ","ố","ỗ","ổ","õ","ṍ","ȭ","ṏ","ō","ṑ","ṓ","ŏ","ȯ","ȱ","ö","ȫ","ỏ","ő","ǒ","ȍ","ȏ","ơ","ờ","ớ","ỡ","ở","ợ","ọ","ộ","ǫ","ǭ","ø","ǿ","ɔ","ꝋ","ꝍ","ɵ","ƣ","ȣ","ꝏ","ⓟ","p","ṕ","ṗ","ƥ","ᵽ","ꝑ","ꝓ","ꝕ","ⓠ","q","ɋ","ꝗ","ꝙ","ⓡ","r","ŕ","ṙ","ř","ȑ","ȓ","ṛ","ṝ","ŗ","ṟ","ɍ","ɽ","ꝛ","ꞧ","ꞃ","ⓢ","s","ß","ś","ṥ","ŝ","ṡ","š","ṧ","ṣ","ṩ","ș","ş","ȿ","ꞩ","ꞅ","ẛ","ⓣ","t","ṫ","ẗ","ť","ṭ","ț","ţ","ṱ","ṯ","ŧ","ƭ","ʈ","ⱦ","ꞇ","ꜩ","ⓤ","u","ù","ú","û","ũ","ṹ","ū","ṻ","ŭ","ü","ǜ","ǘ","ǖ","ǚ","ủ","ů","ű","ǔ","ȕ","ȗ","ư","ừ","ứ","ữ","ử","ự","ụ","ṳ","ų","ṷ","ṵ","ʉ","ⓥ","v","ṽ","ṿ","ʋ","ꝟ","ʌ","ꝡ","ⓦ","w","ẁ","ẃ","ŵ","ẇ","ẅ","ẘ","ẉ","ⱳ","ⓧ","x","ẋ","ẍ","ⓨ","y","ỳ","ý","ŷ","ỹ","ȳ","ẏ","ÿ","ỷ","ẙ","ỵ","ƴ","ɏ","ỿ","ⓩ","z","ź","ẑ","ż","ž","ẓ","ẕ","ƶ","ȥ","ɀ","ⱬ","ꝣ","Ά","Έ","Ή","Ί","Ϊ","Ό","Ύ","Ϋ","Ώ","ά","έ","ή","ί","ϊ","ΐ","ό","ύ","ϋ","ΰ","ω","ς","actual","expected","isnotnull","isnull","isempty","isnotempty","processSymbols","jsonText","iterateAndReviveArray","iterateAndReviveJson","jsonReviver","keys_2","ms","exec","offSet","dateParse","toTimeZone","Date","isUTC","secondsMs","getUTCMilliseconds","utcFormat","hrs","mins","setHours","getHours","getMinutes","addSelfOffset","isJson","isGuid","replacer","jsonReplacer","arrayReplacer","keys_3","d","toJSON","date","jsonDateReplacer","getTimezoneOffset","toUTC","offset","utc","unix","toLocalTime","datefn","timeZone","differenceString","localtimefn","num","norm","floor","abs","getFullYear","getMonth","getDate","getSeconds","__extends","extendStatics","b","setPrototypeOf","__proto__","hasOwnProperty","__","create","Adaptor","options","requestType","dataSource","pvt","processResponse","JsonAdaptor","_super","processQuery","countFlg","keyCount","agg","unshift","lazyLoadData","lazyLoadGroup","getAggregate","onDemandGroupInfo","field_1","onSortBy","onPage","formGroupResult","onWhere","aggQuery","batchRequest","changes","deletedRecordsLen","deletedRecords","addedRecords","insert","changedRecords","update","remove","onAggregates","onSearch","isLazyLoadGroupSort","fnCompare","onGroup","size","onRange","onTake","onSkip","onSelect","position","splice","keyField","UrlAdaptor","hierarchyFilters","getQueryRequest","url","request","groups","filters","searches","getFiltersFrom","getModuleName","getRequestQuery","pvtData","contentType","convertToQueryString","request1","selects","headers","get","handleTimeZone","requests","action","isExpand","isArray","formRemoteGroupedData","getAggregateResult","childLevel","getGroupedRecords","hasRecords","childGroupedRecords","original","batchUrl","crudUrl","removeUrl","dataType","extend","changed","added","deleted","table","beforeSend","insertUrl","keyColumn","updateUrl","predicats","pData","aggregateData","isServerGrouping","groupQuery","ODataAdaptor","props","accept","multipartAccept","batch","changeSet","batchPre","contentId","batchContent","changeSetContent","batchChangeSetContentType","updateType","onPredicate","requiresCast","guid","getField","encodeURIComponent","splittedStringValue","splittedValue","onComplexPredicate","onEachWhere","onEachSearch","onEachSort","reverse","onCount","settings","set","rootUrl","dataUrls","resourceTableName","dataCopy","results","emptyAndBatch","processBatchResponse","versionCheck","fetchRequest","version","requiresFormat","keys_4","localTimeReplacer","convertObj","localTime","compareAndRemove","initialGuid","cid","cSet","generateInsertRequest","generateUpdateRequest","generateDeleteRequest","stat","method","generateBodyContent","org","change","o","cIdx","jsonObj","exVal","changeGuid","valueOf","ODataV4Adaptor","isDate","onExpand","selected","expanded","exArr","item","sel","exp","close_1","combineVal","expandQueryIndex","idx","ex","onDistinct","distinctFields","dataUrl","WebApiAdaptor","location","host","state","mtd","Count","Items","WebMethodAdaptor","param","RemoteSaveAdaptor","updateKey","CustomDataAdaptor","getData","Function","addRecord","updateRecord","deleteRecord","batchUpdate","GraphQLAdaptor","opt","schema","response","getVariables","getQuery","datamanager","urlQuery","vars","variables","resData","inserted","generateCrudData","bData","crudData","parsed","getMutation","CacheAdaptor","timeStamp","isCrudAction","isInsertAction","cacheAdaptor","guidId","localStorage","setItem","setInterval","getItem","forDel","currentTime","requestTime","removeItem","generateKey","currentFilter","newQuery","cachedItems","crossDomain","persistQuery","isInitialLoad","offline","enablePersistence","id","ignoreOnPersist","timeTillExpiration","cachingPageSize","enableCaching","jsonp","defaultQuery","addEventListener","setPersistData","bind","isDataAvailable","ready","then","getPersistedData","persistedData","persistData","setPersistQuery","persistedQuery","some","keyword","allPredicates","predicateObj","nestedPredicates","nestedPredicate","setDefaultQuery","deffered","Deferred","isCustomDataAdaptor","makeRequest","getDeferedArgs","resolve","nextTick","promise","setImmediate","setTimeout","extendRequest","fnSuccess","fnFail","cache","onSuccess","onFailure","isSelector","reject","process","virtualSelectRecords","fnQueryChild","selector","subDeffer","childArgs","parent","subUrl","childReq","subData","isGraphQLAdaptor","fetchReqOption","virtualRecords","fetch_1","Fetch","send","catch","Promise","all","pResult","cResult","saveChanges","dofetchRequest","deff_1","fetch_2","successFunc","failureFunc","fetchDeffered","fetchFunc","fetch_3","clearPersistence","removeEventListener"],"mappings":"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VC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KAEd5lC,EAASgC,aAWL2O,MAAO,SAAUk1B,EAAQC,EAAUzkC,EAAYC,GAK3C,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,IAErCzkC,EACOrB,EAASwB,YAAYqkC,KAAY7lC,EAASwB,YAAYskC,GAE1DD,IAAWC,GAWtBl1B,SAAU,SAAUi1B,EAAQC,EAAUzkC,EAAYC,GAK9C,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,KAEjC9lC,EAASgC,YAAY2O,MAAMk1B,EAAQC,EAAUzkC,IAUzDkP,SAAU,SAAUs1B,EAAQC,EAAUzkC,GAClC,MAAIA,GACOrB,EAASwB,YAAYqkC,GAAU7lC,EAASwB,YAAYskC,IAE3DtjC,oBAAkBqjC,KAClBA,MAASz/B,IAENy/B,EAASC,IAUpBr1B,YAAa,SAAUo1B,EAAQC,EAAUzkC,GACrC,MAAIA,GACOrB,EAASwB,YAAYqkC,GAAU7lC,EAASwB,YAAYskC,GAExDD,EAASC,GAUpBt1B,gBAAiB,SAAUq1B,EAAQC,EAAUzkC,GACzC,MAAIA,GACOrB,EAASwB,YAAYqkC,IAAW7lC,EAASwB,YAAYskC,IAE5DtjC,oBAAkBqjC,KAClBA,MAASz/B,IAENy/B,GAAUC,IAUrBp1B,mBAAoB,SAAUm1B,EAAQC,EAAUzkC,GAC5C,MAAIA,GACOrB,EAASwB,YAAYqkC,IAAW7lC,EAASwB,YAAYskC,GAEzDD,GAAUC,GAWrB90B,SAAU,SAAU60B,EAAQC,EAAUzkC,EAAYC,GAK9C,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,IAErCzkC,GACQmB,oBAAkBqjC,KAAYrjC,oBAAkBsjC,KACsB,IAA1E9lC,EAASwB,YAAYqkC,GAAQnhC,QAAQ1E,EAASwB,YAAYskC,KAE1DtjC,oBAAkBqjC,KAAYrjC,oBAAkBsjC,KACX,IAAzCD,EAAOh7B,WAAWnG,QAAQohC,IASlC30B,eAAgB,SAAU00B,EAAQC,EAAUzkC,EAAYC,GAKpD,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,IAErCzkC,GACQmB,oBAAkBqjC,KAAYrjC,oBAAkBsjC,KACsB,IAA1E9lC,EAASwB,YAAYqkC,GAAQnhC,QAAQ1E,EAASwB,YAAYskC,KAE1DtjC,oBAAkBqjC,KAAYrjC,oBAAkBsjC,KACX,IAAzCD,EAAOh7B,WAAWnG,QAAQohC,IAQlCC,UAAW,SAAUF,GACjB,MAAkB,QAAXA,OAA8Bz/B,KAAXy/B,GAQ9BG,OAAQ,SAAUH,GACd,MAAkB,QAAXA,OAA8Bz/B,KAAXy/B,GAW9B90B,WAAY,SAAU80B,EAAQC,EAAUzkC,EAAYC,GAKhD,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,IAErCzkC,EACOwkC,GAAUC,GAAY9lC,EAASgH,WAAWhH,EAASwB,YAAYqkC,GAAS7lC,EAASwB,YAAYskC,IAEjGD,GAAUC,GAAY9lC,EAASgH,WAAW6+B,EAAQC,IAS7D50B,iBAAkB,SAAU20B,EAAQC,EAAUzkC,EAAYC,GAKtD,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,IAErCzkC,EACOwkC,GAAUC,GAAY9lC,EAASiH,cAAcjH,EAASwB,YAAYqkC,GAAS7lC,EAASwB,YAAYskC,IAEpGD,GAAUC,GAAY9lC,EAASiH,cAAc4+B,EAAQC,IAShEr+B,KAAM,SAAUo+B,EAAQC,EAAUzkC,EAAYC,GAK1C,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,IAErCzkC,EACOwkC,GAAUC,GAAY9lC,EAASyH,KAAKzH,EAASwB,YAAYqkC,GAAS7lC,EAASwB,YAAYskC,IAE3FD,GAAUC,GAAY9lC,EAASyH,KAAKo+B,EAAQC,IAQvDG,QAAS,SAAUJ,GACf,WAAkBz/B,KAAXy/B,GAAmC,KAAXA,GAQnCK,WAAY,SAAUL,GAClB,WAAkBz/B,KAAXy/B,GAAmC,KAAXA,GASnCz0B,SAAU,SAAUy0B,EAAQC,EAAUzkC,EAAYC,GAK9C,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,IAErCzkC,GACQwkC,GAA4B,iBAAXA,KAAyBC,GAA8B,gBAAXD,IACjE7lC,EAASkH,SAASlH,EAASwB,YAAYqkC,GAAS7lC,EAASwB,YAAYskC,KAErED,GAA4B,iBAAXA,KAAyBC,GAAY9lC,EAASkH,SAAS2+B,EAAQC,IAW5Fh1B,SAAU,SAAU+0B,EAAQC,EAAUzkC,EAAYC,GAK9C,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,IAErCzkC,EACOwkC,GAAUC,GAAY9lC,EAASyC,SAASzC,EAASwB,YAAYqkC,GAAS7lC,EAASwB,YAAYskC,IAE/FD,GAAUC,GAAY9lC,EAASyC,SAASojC,EAAQC,IAS3D70B,eAAgB,SAAU40B,EAAQC,EAAUzkC,EAAYC,GAKpD,MAJIA,KACAukC,EAAS7lC,EAASsL,iBAAiBu6B,GACnCC,EAAW9lC,EAASsL,iBAAiBw6B,IAErCzkC,EACOwkC,GAAUC,GAAY9lC,EAAS+G,YAAY/G,EAASwB,YAAYqkC,GAAS7lC,EAASwB,YAAYskC,IAElGD,GAAUC,GAAY9lC,EAAS+G,YAAY8+B,EAAQC,IAQ9DK,eAAgB,SAAU/kC,GACtB,GAAI2K,GAAS/L,EAAS4P,gBAAgBxO,EACtC,OAAI2K,GACS/L,EAASgC,YAAY+J,GAG3B/L,EAASC,WAAW,gDAQ/B4E,gBAAiB,SAAUzD,GACvB,GAAIR,GAAKZ,EAASgC,YAAYZ,EAC9B,OAAIR,IAGGZ,EAASgC,YAAYmkC,eAAe/kC,KAMnDpB,EAASqO,OAMLC,UAAW,SAAU83B,GAUjB,MATwB,gBAAbA,KAA0B,0BAA0B5+B,KAAK4+B,KAAwC,IAA3BA,EAAS1hC,QAAQ,KAGzF0hC,YAAoBrnC,OACzBiB,EAASqO,MAAMg4B,sBAAsBD,GAEZ,gBAAbA,IAAsC,OAAbA,GACrCpmC,EAASqO,MAAMi4B,qBAAqBF,GANpCA,EAAWl4B,KAAKG,MAAM+3B,EAAUpmC,EAASqO,MAAMk4B,aAQ5CH,GAQXC,sBAAuB,SAAU16B,GAC7B,IAAK,GAAI9I,GAAI,EAAGA,EAAI8I,EAAM7I,OAAQD,IACN,gBAAb8I,GAAM9I,IAAgC,OAAb8I,EAAM9I,GACtC7C,EAASqO,MAAMi4B,qBAAqB36B,EAAM9I,IAGjB,gBAAb8I,GAAM9I,IAAqB,6BAA6B2E,KAAKmE,EAAM9I,MACzC,IAAtC8I,EAAM9I,GAAGgI,WAAWnG,QAAQ,KAI5BiH,EAAM9I,GAAK7C,EAASqO,MAAMC,UAAU3C,EAAM9I,IAH1C8I,EAAM9I,GAAK7C,EAASqO,MAAMk4B,YAAY,GAAI56B,EAAM9I,KAa5DyjC,qBAAsB,SAAU3gC,GAG5B,IAAK,GAFDjF,GAEKyE,EAAK,EAAGqhC,EADNp8B,OAAOC,KAAK1E,GACSR,EAAKqhC,EAAO1jC,OAAQqC,IAAM,CACtD,GAAImF,GAAOk8B,EAAOrhC,EACdnF,GAASgH,WAAWsD,EAAM,QAIT,iBADrB5J,EAAQiF,EAAK2E,IAEL5J,YAAiB3B,OACjBiB,EAASqO,MAAMg4B,sBAAsB3lC,GAEhCA,GACLV,EAASqO,MAAMi4B,qBAAqB5lC,GAIxCiF,EAAK2E,GAAQtK,EAASqO,MAAMk4B,YAAY5gC,EAAK2E,GAAO5J,MAWhE6lC,YAAa,SAAU/mC,EAAOkB,GAC1B,GAAqB,gBAAVA,GAAoB,CAE3B,GAAI+lC,GAAK,6CAA6CC,KAAKhmC,GACvDimC,EAAS3mC,EAASgP,iBAAmBhP,EAAS+O,qBAAuB,IACzE,IAAI03B,EACA,MAAOzmC,GAAS4mC,UAAUC,WAAW,GAAIC,MAAK57B,SAASu7B,EAAG,GAAI,KAAME,GAAQ,EAG3E,IAAI,sEAAsEn/B,KAAK9G,GAAQ,CACxF,GAAIqmC,GAAQrmC,EAAMgE,QAAQ,MAAQ,GAAKhE,EAAMgE,QAAQ,MAAQ,EACzDqI,EAAMrM,EAAMyF,MAAM,UACtB,IAAI4gC,EAAO,CACP,GAAIh6B,EAAI,GAAGrI,QAAQ,MAAQ,EAAG,CAC1B,GAAIsiC,GAAYj6B,EAAI,GAAG5G,MAAM,IAC7B4G,GAAI,GAAKi6B,EAAU,GACnBj6B,EAAI,GAAK,GAAI+5B,MAAKpmC,GAAOumC,qBAAqBp8B,eAG9CkC,GAAI,GAAK,IAEbrM,GAAQV,EAAS4mC,UACZC,WAAW,GAAIC,MAAK57B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,IAAM,EAAG7B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAKA,EAAI,GAAK,KAAM,IAAK7B,SAAS6B,EAAI,GAAI,KAAM/M,EAAS+O,sBAAsB,OAEtO,CACD,GAAIm4B,GAAY,GAAIJ,MAAK57B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,IAAM,EAAG7B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAKA,EAAI,GAAK,KAAM,KACxKo6B,EAAMj8B,SAAS6B,EAAI,GAAI,IACvBq6B,EAAOl8B,SAAS6B,EAAI,GAAI,GAC5B,IAAIuC,MAAM63B,IAAQ73B,MAAM83B,GACpB,MAAOF,EAEPxmC,GAAMgE,QAAQ,MAAQ,EACtBwiC,EAAUG,SAASH,EAAUI,WAAaH,EAAKD,EAAUK,aAAeH,GAGxEF,EAAUG,SAASH,EAAUI,WAAaH,EAAKD,EAAUK,aAAeH,GAE5E1mC,EAAQV,EAAS4mC,UACZC,WAAWK,EAAWlnC,EAAS+O,sBAAsB,GAEzB,MAAjC/O,EAAS+O,uBACTrO,EAAQV,EAAS4mC,UAAUY,cAAc9mC,KAIrD,MAAOA,IAOX+mC,OAAQ,SAAU9+B,GACd,MAA2B,gBAAhBA,GAAS,GACTA,EAEJ3I,EAASqO,MAAMC,UAAU3F,IAOpC++B,OAAQ,SAAUhnC,GAId,MAAgB,OAFJ,wDACMgmC,KAAKhmC,IAU3BinC,SAAU,SAAUjnC,EAAOyN,GACvB,MAAInO,GAASuM,cAAc7L,GAChBV,EAASqO,MAAMu5B,aAAalnC,EAAOyN,GAE1CzN,YAAiB3B,OACViB,EAASqO,MAAMw5B,cAAcnnC,GAEpCA,YAAiBomC,MACV9mC,EAASqO,MAAMu5B,cAAev+B,IAAK3I,GAASyN,GAAW9E,IAE3D3I,GAUXknC,aAAc,SAAUv+B,EAAK8E,GAGzB,IAAK,GAFDzN,GAEKyE,EAAK,EAAG2iC,EADN19B,OAAOC,KAAKhB,GACSlE,EAAK2iC,EAAOhlC,OAAQqC,IAAM,CACtD,GAAImF,GAAOw9B,EAAO3iC,EAElB,KADAzE,EAAQ2I,EAAIiB,aACWw8B,MAAvB,CAGA,GAAIiB,GAAIrnC,CAC6B,OAAjCV,EAAS+O,qBACT1F,EAAIiB,GAAQtK,EAAS4mC,UAAUC,WAAWkB,EAAG,MAAMC,UAGnDD,EAAI,GAAIjB,OAAMiB,EAAoC,KAAhC/nC,EAAS+O,sBAC3B1F,EAAIiB,GAAQtK,EAAS4mC,UAAUC,WAAW7mC,EAAS4mC,UAAUY,cAAcO,GAAI,MAAMC,WAG7F,MAAO3+B,IASXw+B,cAAe,SAAUx+B,GACrB,IAAK,GAAIxG,GAAI,EAAGA,EAAIwG,EAAIvG,OAAQD,IACxB7C,EAASuM,cAAclD,EAAIxG,IAC3BwG,EAAIxG,GAAK7C,EAASqO,MAAMu5B,aAAav+B,EAAIxG,IAEpCwG,EAAIxG,YAAcikC,QACvBz9B,EAAIxG,GAAK7C,EAASqO,MAAMu5B,cAAeK,KAAM5+B,EAAIxG,KAAMolC,KAG/D,OAAO5+B,IAWX6+B,iBAAkB,SAAUtpC,EAAK8B,GAE7B,GAAY,UAAR9B,GAAmB8B,EAAO,CAC1B,GAAqB,gBAAVA,GAAoB,CAE3B,GAAI+lC,GAAK,6CAA6CC,KAAKhmC,EAC3D,IAAI+lC,EACA/lC,EAAQV,EAAS4mC,UAAUC,WAAW,GAAIC,MAAK57B,SAASu7B,EAAG,GAAI,KAAM,MAAM,OAG1E,IAAI,sEAAsEj/B,KAAK9G,GAAQ,CACxF,GAAIqM,GAAMrM,EAAMyF,MAAM,SACtBzF,GAAQV,EAAS4mC,UACZC,WAAW,GAAIC,MAAK57B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,IAAM,EAAG7B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,IAAK7B,SAAS6B,EAAI,GAAI,KAAM,MAAM,IAGhL,GAAIrM,YAAiBomC,MAEjB,MADApmC,GAAQV,EAAS4mC,UAAUY,cAAc9mC,GACH,OAAlCV,EAAS+O,qBACF/O,EAAS4mC,UAAUC,WAAW7mC,EAAS4mC,UAAUY,cAAc9mC,GAAQ,MAAMsnC,UAGpFtnC,EAAQV,EAAS4mC,UAAUC,WAAWnmC,EAASA,EAAMynC,oBAAsB,GACrEnoC,EAAS+O,sBAAuB,IACzBi5B,SAIzB,MAAOtnC,KAMfV,EAAS4mC,WACLY,cAAe,SAAU3gC,GACrB,MAAO,IAAIigC,OAAMjgC,EAAqC,IAA5BA,EAAMshC,sBAEpCC,MAAO,SAAUvhC,GACb,MAAO,IAAIigC,OAAMjgC,EAAqC,IAA5BA,EAAMshC,sBAEpCtB,WAAY,SAAUhgC,EAAOwhC,EAAQC,GACjC,GAAe,OAAXD,EACA,MAAOxhC,EAEX,IAAI0hC,GAAOD,EAAMtoC,EAAS4mC,UAAUwB,MAAMvhC,GAASA,CACnD,OAAO,IAAIigC,OAAMyB,EAAiB,KAATF,IAE7BG,YAAa,SAAU3hC,GACnB,GAAI4hC,GAAS5hC,EACT6hC,GAAYD,EAAON,oBACnBQ,EAAmBD,GAAY,EAAI,IAAM,IACzCE,EAAc,SAAUC,GACxB,GAAIC,GAAO57B,KAAK67B,MAAM77B,KAAK87B,IAAIH,GAC/B,QAAQC,EAAO,GAAK,IAAM,IAAMA,EAQpC,OANUL,GAAOQ,cAAgB,IAAML,EAAYH,EAAOS,WAAa,GAAK,IAAMN,EAAYH,EAAOU,WACjG,IAAMP,EAAYH,EAAOnB,YACzB,IAAMsB,EAAYH,EAAOlB,cACzB,IAAMqB,EAAYH,EAAOW,cACzBT,EAAmBC,EAAYF,EAAW,IAC1C,IAAME,EAAYF,EAAW,MAIlC1oC,KC70EPqpC,EAAwC,WACxC,GAAIC,GAAgB,SAAUvB,EAAGwB,GAI7B,OAHAD,EAAgBl/B,OAAOo/B,iBAChBC,uBAA2B1qC,QAAS,SAAUgpC,EAAGwB,GAAKxB,EAAE0B,UAAYF,IACvE,SAAUxB,EAAGwB,GAAK,IAAK,GAAIhjC,KAAKgjC,GAAOA,EAAEG,eAAenjC,KAAIwhC,EAAExhC,GAAKgjC,EAAEhjC,MACpDwhC,EAAGwB,GAE5B,OAAO,UAAUxB,EAAGwB,GAEhB,QAASI,KAAOprC,KAAKiO,YAAcu7B,EADnCuB,EAAcvB,EAAGwB,GAEjBxB,EAAEzoC,UAAkB,OAANiqC,EAAan/B,OAAOw/B,OAAOL,IAAMI,EAAGrqC,UAAYiqC,EAAEjqC,UAAW,GAAIqqC,QAMnFljC,GAAWC,UAAW,mBAOtBmjC,EAAyB,WASzB,QAASA,GAAQ7+B,GAEbzM,KAAKurC,SACDxrC,KAAM,QACNyrC,YAAa,OACb9nC,OAAQ,SACR2B,OAAQ,SACRD,KAAM,OACNV,MAAO,QACPQ,KAAM,OACN7B,OAAQ,SACRkH,MAAO,iBACP5H,MAAO,QACPqH,WAAY,aACZvH,OAAQ,UAOZzC,KAAK4F,KAAO0lC,EACZtrC,KAAKyrC,WAAah/B,EAClBzM,KAAK0rC,OAiBT,MAHAJ,GAAQvqC,UAAU4qC,gBAAkB,SAAUv8B,EAAM3C,EAAIlH,EAAO4I,GAC3D,MAAOiB,IAEJk8B,KAQPM,EAA6B,SAAUC,GAEvC,QAASD,KACL,MAAkB,QAAXC,GAAmBA,EAAOplC,MAAMzG,KAAM6G,YAAc7G,KA6Z/D,MA/ZA8qC,GAAUc,EAAaC,GAWvBD,EAAY7qC,UAAU+qC,aAAe,SAAU3qC,EAAaoE,GAWxD,IAAK,GAPDmC,GACArH,EAKAuE,EATA2G,EAASpK,EAAYsqC,WAAWrkC,KAAKtF,MAAM,GAC3CyI,EAAQgB,EAAOhH,OACfwnC,GAAW,EAGXjrC,KACAkrC,EAAW,EACXtnC,KACA8H,KAEKlI,EAAI,EAAGA,EAAIiB,EAAMzE,SAASyD,OAAQD,IACvC0nC,IACAlrC,EAASyE,EAAMzE,SAASwD,GAAGjE,KAAOkF,EAAMzE,SAASwD,GAAGnC,KAGxD,KAAK,GADD8pC,MACK3nC,EAAI,EAAGA,EAAIiB,EAAMnF,QAAQmE,OAAQD,IAEtB,YADhBjE,EAAMkF,EAAMnF,QAAQkE,IACXjC,IAA8B,YAAXhC,EAAIgC,IAA+B,aAAXhC,EAAIgC,KAAsBkD,EAAMzE,SAASyD,QAY7FmD,EAAM1H,KAAKK,EAAIgC,IAAIG,KAAKxC,KAAMuL,EAAQlL,EAAI+C,EAAGmC,GAC9B,iBAAXlF,EAAIgC,GACJ4pC,EAAI5rC,EAAI+C,EAAEnC,MAAQ,MAAQZ,EAAI+C,EAAEwC,MAAQ8B,EAGxC6D,MAAiB1D,KAARH,EAAoBA,EAAM6D,EAExB,WAAXlL,EAAIgC,IAA8B,WAAXhC,EAAIgC,IAA8B,WAAXhC,EAAIgC,IAA8B,YAAXhC,EAAIgC,KACzE0pC,GAAW,GAEXA,IACAxhC,EAAQgB,EAAOhH,UAtBA,YAAXlE,EAAIgC,IACJqC,EAAMtC,KAAK/B,EAAI+C,GAEJ,WAAX/C,EAAIgC,KACJuC,EAAOvE,EAAI+C,GAEA,aAAX/C,EAAIgC,IACJmK,EAAK0/B,QAAQ7rC,EAAI+C,GAkB7B,IAAI4oC,EAAU,CACV,GAAIrlC,IACApB,MAAOA,EAAOzE,SAAUA,EAAUyK,OAAQA,EAAQ7G,MAAOA,EAAOE,KAAMA,EAAM4H,KAAMA,GAElF2/B,EAAensC,KAAKosC,cAAczlC,EACtC4E,GAAS4gC,EAAa5gC,OACtBhB,EAAQ4hC,EAAa5hC,MASzB,MAPIhF,GAAMvD,kBACNuJ,GACIA,OAAQA,EACRhB,MAAOA,EACPP,WAAYiiC,IAGb1gC,GAOXqgC,EAAY7qC,UAAUqrC,cAAgB,SAAUzlC,GAC5C,GAAI4D,GAAQ,EACR0hC,EAAMjsC,KAAKqsC,aAAa1lC,EAAKpB,OAC7BgG,EAAS5E,EAAK4E,MAClB,IAAKtH,oBAAkB0C,EAAK7F,SAASwrC,mBAuBhC,CACD,GAAIC,GAAU5lC,EAAKjC,MAAM,GAAG9B,SAE5B2H,IADAgB,EAAS9J,EAASiD,MAAM6G,EAAQghC,EAASN,EAAK,KAAM,KAAMtlC,EAAKjC,MAAM,GAAGlB,UAAU,IACnEe,MACX6K,GAAO7D,CACX,IAAI5E,EAAK6F,KAAKjI,OAAQ,CAClB,GAAIiI,GAAO7F,EAAK6F,KAAKjI,OAAS,EAC1BoC,EAAK6F,KAAK1G,OAAO,SAAUyD,GAAK,MAAOA,GAAE3G,YAAc2pC,IAAY,GAAK5lC,EAAK6F,KAAK,EACtFjB,GAASvL,KAAKwsC,SAASjhC,EAAQiB,EAAM7F,EAAKpB,OAAO,GAEjDoB,EAAK/B,OACL2G,EAASvL,KAAKysC,OAAOlhC,EAAQ5E,EAAK/B,KAAM+B,EAAKpB,QAEjDvF,KAAK0sC,gBAAgBnhC,EAAQ6D,OApCwB,CAErD,IAAK,GADDtB,GAAMnH,EAAK7F,SAASwrC,kBACfhoC,EAAIwJ,EAAInL,MAAM4B,OAAS,EAAGD,GAAK,EAAGA,IACvCiH,EAASvL,KAAK2sC,QAAQphC,EAAQuC,EAAInL,MAAM2B,GAE5C,IAAIqC,EAAKjC,MAAMH,SAAWuJ,EAAI7D,MAAO,CACjC,GAAIhJ,GAAQ0F,EAAKjC,MAAMoJ,EAAI7D,OAAOrH,SAClC2I,GAAS9J,EAASiD,MAAM6G,EAAQtK,EAAOgrC,EAAK,KAAM,KAAMtlC,EAAKjC,MAAM,GAAGlB,UAAU,GAChF+H,EAASvL,KAAKwsC,SAASjhC,EAAQ5E,EAAK6F,KAAKG,SAASmB,EAAI7D,MAAMqC,WAAY,KAAM3F,EAAKpB,OAAO,OAG1F,KAASjB,EAAIqC,EAAK6F,KAAKjI,OAAS,EAAGD,GAAKwJ,EAAI7D,MAAO3F,IAC/CiH,EAASvL,KAAKwsC,SAASjhC,EAAQ5E,EAAK6F,KAAKG,SAASrI,EAAEgI,WAAY,KAAM3F,EAAKpB,OAAO,EAG1FgF,GAAQgB,EAAOhH,MACf,IAAI6K,GAAO7D,CAEXA,IADAA,EAASA,EAAOzJ,MAAMgM,EAAI1I,OACVtD,MAAM,EAAGgM,EAAI5I,MACzByB,EAAKjC,MAAMH,SAAWuJ,EAAI7D,OAC1BjK,KAAK0sC,gBAAgBnhC,EAAQ6D,GAkBrC,OAAS7D,OAAQA,EAAQhB,MAAOA,IAEpCqhC,EAAY7qC,UAAU2rC,gBAAkB,SAAUnhC,EAAQ6D,GACtD,GAAI7D,EAAOhH,QAAU6K,EAAK7K,OAAQ,CAK9BgH,EAAU,UAAI6D,EAAQ,UACtB7D,EAAiB,YAAI6D,EAAe,YACpC7D,EAAY,MAAI6D,EAAU,MAC1B7D,EAAc,QAAI6D,EAAY,QAElC,MAAO7D,IAOXqgC,EAAY7qC,UAAUsrC,aAAe,SAAU9mC,GAC3C,GAAIqnC,GAAW9sC,EAAMuE,cAAckB,EAAMnF,QAAS,gBAC9C6rC,IACJ,IAAIW,EAASroC,OAET,IAAK,GADD2K,OAAM,GACD5K,EAAI,EAAGA,EAAIsoC,EAASroC,OAAQD,IACjC4K,EAAM09B,EAAStoC,GAAGlB,EAClB6oC,EAAI7pC,MAAOwD,KAAMsJ,EAAItJ,KAAM3E,MAAOQ,EAAS2G,SAAS8G,EAAIjO,MAAOsE,IAGvE,OAAO0mC,IASXL,EAAY7qC,UAAU8rC,aAAe,SAAUh/B,EAAIi/B,EAAS1pC,GACxD,GAAIkB,GACAyoC,EAAoBD,EAAQE,eAAezoC,MAC/C,KAAKD,EAAI,EAAGA,EAAIwoC,EAAQG,aAAa1oC,OAAQD,IACzCtE,KAAKktC,OAAOr/B,EAAIi/B,EAAQG,aAAa3oC,GAEzC,KAAKA,EAAI,EAAGA,EAAIwoC,EAAQK,eAAe5oC,OAAQD,IAC3CtE,KAAKotC,OAAOv/B,EAAIzK,EAAE/C,IAAKysC,EAAQK,eAAe7oC,GAElD,KAAKA,EAAI,EAAGA,EAAIyoC,EAAmBzoC,IAC/BtE,KAAKqtC,OAAOx/B,EAAIzK,EAAE/C,IAAKysC,EAAQE,eAAe1oC,GAElD,OAAOwoC,IASXlB,EAAY7qC,UAAU4rC,QAAU,SAAUlgC,EAAIrJ,GAC1C,MAAKqJ,IAAOA,EAAGlI,OAGRkI,EAAG3G,OAAO,SAAU6D,GACvB,GAAIvG,EACA,MAAOA,GAAEoE,SAASmC,KAJf8C,GAiBfm/B,EAAY7qC,UAAUusC,aAAe,SAAU7gC,EAAIrJ,GAC/C,GAAIf,GAAKZ,EAASuI,WAAW5G,EAAEwC,KAC/B,OAAK6G,IAAOpK,GAAoB,IAAdoK,EAAGlI,OAGdlC,EAAGoK,EAAIrJ,EAAEnC,OAFL,MAUf2qC,EAAY7qC,UAAUwsC,SAAW,SAAU9gC,EAAIrJ,GAC3C,MAAKqJ,IAAOA,EAAGlI,QAGa,IAAxBnB,EAAEG,WAAWgB,QACb9C,EAASgK,aAAagB,EAAG,GAAIrJ,EAAEG,YAE5BkJ,EAAG3G,OAAO,SAAU6D,GACvB,IAAK,GAAInF,GAAI,EAAGA,EAAIpB,EAAEG,WAAWgB,OAAQC,IACrC,GAAIpB,EAAEI,SAAShB,KAAKmH,EAAKlI,EAASqG,UAAU1E,EAAEG,WAAWiB,GAAImF,GAAMvG,EAAEE,UAAWF,EAAEN,WAAYM,EAAEL,cAC5F,OAAO,CAGf,QAAO,KAXA0J,GAyBfm/B,EAAY7qC,UAAUyrC,SAAW,SAAU//B,EAAIrJ,EAAGmC,EAAOioC,GACrD,IAAK/gC,IAAOA,EAAGlI,OACX,MAAOkI,EAEX,IAAIghC,GACAxsC,EAAQQ,EAAS2G,SAAShF,EAAER,UAAW2C,EAC3C,KAAKtE,EACD,MAAOwL,GAAGD,KAAKpJ,EAAEI,SAErB,IAAIvC,YAAiBT,OAAO,CAExB,IAAK,GAAI8D,IADTrD,EAAQA,EAAMa,MAAM,IACDyC,OAAS,EAAGD,GAAK,EAAGA,IAC9BrD,EAAMqD,KAGXmpC,EAAYrqC,EAAEI,SACV/B,EAASyC,SAASjD,EAAMqD,GAAI,WAC5BmpC,EAAYhsC,EAAS2C,OAAO,cAC5BnD,EAAMqD,GAAKrD,EAAMqD,GAAGH,QAAQ,QAAS,KAEzCsI,EAAKhL,EAAS+K,KAAKC,EAAIxL,EAAMqD,GAAImpC,GAErC,OAAOhhC,GAEX,MAAOhL,GAAS+K,KAAKC,EAAI+gC,EAAsB,MAAQvsC,EAAOmC,EAAEI,WASpEooC,EAAY7qC,UAAU2sC,QAAU,SAAUjhC,EAAIrJ,EAAGmC,GAC7C,IAAKkH,IAAOA,EAAGlI,OACX,MAAOkI,EAEX,IAAIw/B,GAAMjsC,KAAKqsC,aAAa9mC,EAC5B,OAAO9D,GAASiD,MAAM+H,EAAIhL,EAAS2G,SAAShF,EAAER,UAAW2C,GAAQ0mC,EAAK,KAAM,KAAM7oC,EAAEI,WAYxFooC,EAAY7qC,UAAU0rC,OAAS,SAAUhgC,EAAIrJ,EAAGmC,GAC5C,GAAIooC,GAAOlsC,EAAS2G,SAAShF,EAAE0B,SAAUS,GACrCP,GAASvD,EAAS2G,SAAShF,EAAEyB,UAAWU,GAAS,GAAKooC,EACtD1oC,EAAMD,EAAQ2oC,CAClB,OAAKlhC,IAAOA,EAAGlI,OAGRkI,EAAG3K,MAAMkD,EAAOC,GAFZwH,GAafm/B,EAAY7qC,UAAU6sC,QAAU,SAAUnhC,EAAIrJ,GAC1C,MAAKqJ,IAAOA,EAAGlI,OAGRkI,EAAG3K,MAAML,EAAS2G,SAAShF,EAAE4B,OAAQvD,EAAS2G,SAAShF,EAAE6B,MAFrDwH,GAWfm/B,EAAY7qC,UAAU8sC,OAAS,SAAUphC,EAAIrJ,GACzC,MAAKqJ,IAAOA,EAAGlI,OAGRkI,EAAG3K,MAAM,EAAGL,EAAS2G,SAAShF,EAAE+B,MAF5BsH,GAWfm/B,EAAY7qC,UAAU+sC,OAAS,SAAUrhC,EAAIrJ,GACzC,MAAKqJ,IAAOA,EAAGlI,OAGRkI,EAAG3K,MAAML,EAAS2G,SAAShF,EAAE+B,MAFzBsH,GAWfm/B,EAAY7qC,UAAUgtC,SAAW,SAAUthC,EAAIrJ,GAC3C,MAAKqJ,IAAOA,EAAGlI,OAGR9C,EAAS4D,OAAOoH,EAAIhL,EAAS2G,SAAShF,EAAEG,aAFpCkJ,GAafm/B,EAAY7qC,UAAUmsC,OAAS,SAAUr/B,EAAIuB,EAAMnN,EAAWsD,EAAOyoC,GACjE,MAAI/pC,qBAAkB+pC,GACXngC,EAAG49B,WAAWrkC,KAAKhF,KAAKgN,GAGxBvB,EAAG49B,WAAWrkC,KAAK6mC,OAAOD,EAAU,EAAG5+B,IAatDw8B,EAAY7qC,UAAUssC,OAAS,SAAUx/B,EAAIqgC,EAAU/rC,EAAOF,GAC1D,GACIqC,GADAmI,EAAKoB,EAAG49B,WAAWrkC,IAKvB,KAHqB,gBAAVjF,IAAwBA,YAAiBomC,QAChDpmC,EAAQV,EAASqG,UAAUomC,EAAU/rC,IAEpCmC,EAAI,EAAGA,EAAImI,EAAGlI,QACX9C,EAASqG,UAAUomC,EAAUzhC,EAAGnI,MAAQnC,EADrBmC,KAK3B,MAAOA,KAAMmI,EAAGlI,OAASkI,EAAGwhC,OAAO3pC,EAAG,GAAK,MAY/CsnC,EAAY7qC,UAAUqsC,OAAS,SAAUv/B,EAAIqgC,EAAU/rC,EAAOF,GAC1D,GACIqC,GACAjE,EAFAoM,EAAKoB,EAAG49B,WAAWrkC,IAMvB,KAHKnD,oBAAkBiqC,KACnB7tC,EAAM+H,WAAS8lC,EAAU/rC,IAExBmC,EAAI,EAAGA,EAAImI,EAAGlI,SACVN,oBAAkBiqC,IAAc9lC,WAAS8lC,EAAUzhC,EAAGnI,MAASjE,GAD7CiE,KAK3B,MAAOA,GAAImI,EAAGlI,OAASuI,QAAML,EAAGnI,GAAInC,GAAS,MAE1CypC,GACTN,GAQE6C,EAA4B,SAAUtC,GAEtC,QAASsC,KACL,MAAkB,QAAXtC,GAAmBA,EAAOplC,MAAMzG,KAAM6G,YAAc7G,KAod/D,MAtdA8qC,GAAUqD,EAAYtC,GActBsC,EAAWptC,UAAU+qC,aAAe,SAAUj+B,EAAItI,EAAO6oC,GACrD,GAIIrqC,GACAqB,EALAhF,EAAUJ,KAAKquC,gBAAgB9oC,GAC/BU,EAAUnG,EAAMkG,iBAAiBT,EAAMnF,SAAU,WAAY,SAAU,SAAU,SAAU,YAC3FS,EAAS0E,EAAM1E,OACfytC,EAAMzgC,EAAG49B,WAAW6C,IAGpBppC,EAAO,KACPqmC,EAAUvrC,KAAKurC,QACfgD,GAAYzqC,SAAW0qC,UAAYC,WAAaC,YAAc1kC,cAE9D,WAAY/D,IACZlC,EAAOkC,EAAQwmC,OAGfrnC,IAFAA,EAAO3D,EAAS2G,SAASrE,EAAKc,UAAWU,IAE1B,IADfL,EAAOzD,EAAS2G,SAASrE,EAAKe,SAAUS,KAGnC,WAAaU,KAElBb,GADArB,EAAOkC,EAAQ2nC,SACH5oC,MACZE,EAAOnB,EAAKkB,IAAMlB,EAAKiB,MAG3B,KAASV,EAAI,EAAGA,EAAIlE,EAAQ0D,MAAMS,OAAQD,IACtCP,EAAOtC,EAAS2G,SAAShI,EAAQ0D,MAAMQ,GAAGlB,EAAER,UAAW2C,GACvDgpC,EAAQzqC,MAAM1B,KAAKX,EAAS6L,oBAAoBtN,KAAM,cAAgB6F,KAAM9B,EAAMF,UAAWzD,EAAQ0D,MAAMQ,GAAGlB,EAAES,WAAa0B,GAG7H6oC,KACArqC,EAAO/D,KAAK2uC,eAAeP,EAAkB7oC,KAEzCgpC,EAAQE,QAAQrsC,KAAKX,EAAS6L,oBAAoBtN,KAAM,cAAe+D,EAAKgE,SAAUxC,GAI9F,KAASjB,EAAI,EAAGA,EAAIlE,EAAQquC,QAAQlqC,OAAQD,IAAK,CAC7C,GAAI8B,GAAM3E,EAAS6L,oBAAoBtN,KAAM,cAAeI,EAAQquC,QAAQnqC,GAAGlB,EAAE2E,SAAUxC,EACtFvF,MAAK4uC,eACmB,mBAAzB5uC,KAAK4uC,kBACJ3qC,oBAAkB7D,EAAQquC,QAAQnqC,GAAGlB,EAAE/C,MAAQD,EAAQquC,QAAQlqC,OAAS,IACzE6B,EAAM,IAAMA,EAAM,KAEtBmoC,EAAQE,QAAQrsC,KAAKgE,EAErB,KAAK,GAAIQ,GAAK,EAAGgF,EAD0B,gBAAvB2iC,GAAQE,QAAQnqC,GAAkBuH,OAAOC,KAAKyiC,EAAQE,QAAQnqC,OAChDsC,EAAKgF,EAAOrH,OAAQqC,IAAM,CACpDmF,EAAOH,EAAOhF,EACdnF,GAASoN,OAAO,EAAU9C,WACnBwiC,GAAQxiC,IAK3B,IAASzH,EAAI,EAAGA,EAAIlE,EAAQsuC,SAASnqC,OAAQD,IACzCP,EAAO3D,EAAQsuC,SAASpqC,GAAGlB,EAC3BmrC,EAAQG,SAAStsC,KAAKX,EAAS6L,oBAAoBtN,KAAM,gBACrDuC,OAAQwB,EAAKR,WACbV,SAAUkB,EAAKlB,SACfxC,IAAK0D,EAAKT,UACVR,WAAYiB,EAAKjB,YAClByC,GAGP,KAASjB,EAAI,EAAGA,EAAIlE,EAAQouC,OAAOjqC,OAAQD,IACvCiqC,EAAQC,OAAOpsC,KAAKX,EAAS2G,SAAShI,EAAQouC,OAAOlqC,GAAGlB,EAAER,UAAW2C,GAGzE,KAASjB,EAAI,EAAGA,EAAIlE,EAAQ4J,WAAWzF,OAAQD,IAC3CP,EAAO3D,EAAQ4J,WAAW1F,GAAGlB,EAC7BmrC,EAAQvkC,WAAW5H,MAAOwD,KAAM7B,EAAK6B,KAAM3E,MAAOQ,EAAS2G,SAASrE,EAAK9C,MAAOsE,IAEpF,IAAIuI,KAIJ,IAHA9N,KAAK6uC,gBAAgBtD,EAAShmC,EAAOU,EAASsoC,EAASzgC,GAEvDrM,EAAS6L,oBAAoBtN,KAAM,aAAe6N,GAAIA,EAAItI,MAAOA,EAAO1E,OAAQA,EAAQkN,UAAWD,IAC/FvI,EAAMzE,SAASyD,OACf,IAAK,GAAID,GAAI,EAAGA,EAAIiB,EAAMzE,SAASyD,OAAQD,IACvCwJ,EAAIvI,EAAMzE,SAASwD,GAAGjE,KAAOkF,EAAMzE,SAASwD,GAAGnC,KAKvD,KAAK,GAAIoO,GAAK,EAAG03B,EADNp8B,OAAOC,KAAKgC,GACSyC,EAAK03B,EAAO1jC,OAAQgM,IAAM,CACtD,GAAIxE,GAAOk8B,EAAO13B,IACd9O,EAASoN,OAAOf,EAAI/B,KAAwB,KAAd+B,EAAI/B,IAAqC,IAArB+B,EAAI/B,GAAMxH,eACrDuJ,GAAI/B,GAGbw/B,EAAQnmC,OAAQ0I,IAAOy9B,EAAQrmC,OAAQ4I,IAAiB,OAAT5I,IACjD4I,EAAIy9B,EAAQnmC,MAAQ3D,EAAS6L,oBAAoBtN,KAAM,SAAUoF,EAAMG,GACvEuI,EAAIy9B,EAAQrmC,MAAQzD,EAAS6L,oBAAoBtN,KAAM,SAAUkF,EAAMK,GAE3E,IAAIyC,GAAIhI,KAAK0rC,GAEb,OADA1rC,MAAK0rC,OAC4B,SAA7B1rC,KAAKurC,QAAQC,aAETp8B,KAAMO,KAAKC,UAAU9B,EAAKrM,EAASqO,MAAM65B,kBACzC2E,IAAKA,EACLQ,QAAS9mC,EACTpC,KAAM,OACNmpC,YAAa,oCAGrBhrC,EAAO/D,KAAKgvC,qBAAqBlhC,EAAKvI,EAAOsI,GAC7C9J,IAA4C,IAApC8J,EAAG49B,WAAW6C,IAAInoC,QAAQ,KAAc,IAAM,KAAOpC,GAEzD6B,KAAM,MAAO0oC,IAAKvqC,EAAKQ,OAAS+pC,EAAInqC,QAAQ,OAAQJ,GAAQuqC,EAAKQ,QAAS9mC,KAGlFmmC,EAAWptC,UAAU8tC,gBAAkB,SAAUtD,EAAShmC,EAAOU,EAASsoC,EAASU,GAC/E,GACInhC,GAAMmhC,CACVnhC,GAAIy9B,EAAQxrC,MAAQwF,EAAMhF,UACtBgrC,EAAQ9kC,OAASlB,EAAMpF,UAAUoE,SACjCuJ,EAAIy9B,EAAQ9kC,OAAS,cAAgBzG,MAAOyB,EAAS6L,oBAAoBtN,KAAM,aAAcuF,EAAMpF,WAAa,KAE/GoF,EAAMpF,UAAUoE,QAAUgnC,EAAQ9oC,SACnCqL,EAAIy9B,EAAQ9oC,QAAU,YAAczC,OAAQ,YAAciG,GACtDxE,EAAS6L,oBAAoBtN,KAAM,YAAckvC,QAASztC,EAAS2G,SAASnC,EAAQ8nC,SAASxqC,WAAYgC,GAAQ7E,QAAS6E,EAAM7E,SAAW6E,GAASA,EAAM7E,SAElKoN,EAAIy9B,EAAQlmC,QAAU,YAAcY,KAAYV,EAAMpF,UAAUoE,OAC5D9C,EAAS6L,oBAAoBtN,KAAM,WAAYyB,EAAS2G,SAASnC,EAAQ8nC,SAASxqC,WAAYgC,GAAQA,GAAS,GACnHuI,EAAIy9B,EAAQhhC,OAAShF,EAAMvD,gBAAkBP,EAAS6L,oBAAoBtN,KAAM,UAAWuF,EAAMvD,gBAAiBuD,GAAS,GAC3HuI,EAAIy9B,EAAQloC,QAAUkrC,EAAQG,SAASnqC,OAAS9C,EAAS6L,oBAAoBtN,KAAM,WAAYuuC,EAAQG,SAAUnpC,GAAS,GAC1HuI,EAAIy9B,EAAQnmC,MAAQ,UAAYa,GAC5BxE,EAAS6L,oBAAoBtN,KAAM,SAAUyB,EAAS2G,SAASnC,EAAQ6nC,OAAO3oC,IAAKI,GAAQA,GAAS,GACxGuI,EAAIy9B,EAAQrmC,MAAQ,UAAYe,GAC5BxE,EAAS6L,oBAAoBtN,KAAM,SAAUyB,EAAS2G,SAASnC,EAAQ4nC,OAAO1oC,IAAKI,GAAQA,GAAS,GACxGuI,EAAIy9B,EAAQ5oC,OAAS4rC,EAAQE,QAAQlqC,QAAUgqC,EAAQG,SAASnqC,OAC5D9C,EAAS6L,oBAAoBtN,KAAM,UAAWuuC,EAAQE,QAASlpC,GAAS,GAC5EuI,EAAIy9B,EAAQ7nC,QAAU6qC,EAAQzqC,MAAMS,OAAS9C,EAAS6L,oBAAoBtN,KAAM,WAAYuuC,EAAQzqC,MAAOyB,GAAS,GACpHuI,EAAIy9B,EAAQ7mC,OAAS6pC,EAAQC,OAAOjqC,OAAS9C,EAAS6L,oBAAoBtN,KAAM,UAAWuuC,EAAQC,OAAQjpC,GAAS,GACpHuI,EAAIy9B,EAAQvhC,YAAcukC,EAAQvkC,WAAWzF,OACzC9C,EAAS6L,oBAAoBtN,KAAM,eAAgBuuC,EAAQvkC,WAAYzE,GAAS,GACpFuI,EAAS,UAUbqgC,EAAWptC,UAAUiuC,qBAAuB,SAAUT,EAAShpC,EAAOsI,GAClE,MAAO,IAkBXsgC,EAAWptC,UAAU4qC,gBAAkB,SAAUv8B,EAAM3C,EAAIlH,EAAO4I,EAAKogC,EAASzB,GAC5E,GAAI3+B,GAAOA,EAAIghC,QAAQC,IAAI,kBAC0C,IAAjEjhC,EAAIghC,QAAQC,IAAI,gBAAgBjpC,QAAQ,oBAA4B,CACpE,GAAIkpC,GAAiB5tC,EAASgP,gBAC1BhE,KAAOA,EAAGgE,mBACVhP,EAASgP,kBAAmB,GAEhCrB,EAAO3N,EAASqO,MAAMC,UAAUX,GAChC3N,EAASgP,iBAAmB4+B,EAEhC,GAAIC,GAAWf,EACX7C,EAAM4D,EAASR,YACf5kC,EAAUkF,EAAOA,EAAKlF,UAC1B,IAAIiE,GAAOA,EAAIghC,QAAQC,IAAI,kBAC6B,IAApDjhC,EAAIghC,QAAQC,IAAI,gBAAgBjpC,QAAQ,OACxC,MAAQZ,GAAMvD,iBAAoBuJ,UAAYhB,MAAO,KAEzD,IAAIi/B,GAAI75B,KAAKG,MAAMw/B,EAASlgC,KAC5B,IAAIo6B,GAAkB,UAAbA,EAAE+F,QAAsBngC,GAAQA,EAAK69B,aAE1C,MADAH,GAAQG,aAAe79B,EAAK69B,aACrBH,CAEP19B,IAAQA,EAAKo6B,IACbp6B,EAAOA,EAAKo6B,EAEhB,IAAI7iC,KACAyI,IAAQ,SAAWA,KACnBzI,EAAK4D,MAAQ6E,EAAK7E,OAEtB5D,EAAK4E,OAAS6D,GAAQA,EAAK7D,OAAS6D,EAAK7D,OAAS6D,CAClD,IAAIogC,IAAW,CACf,IAAIhvC,MAAMivC,QAAQrgC,EAAK7D,SAAW6D,EAAK7D,OAAOhH,OAAQ,CAOlD,GAHKN,oBAAkBmL,EAAK7D,OAAO,GAAM,OACrC5E,EAAK4E,OAASvL,KAAK0vC,sBAAsB/oC,EAAK4E,OAAQ,EAAGmgC,EAAI8C,OAAOjqC,OAAS,IAE7EgB,GAASA,EAAMzE,SAASyD,QAAUmnC,EAAI8C,OAAOjqC,OAC7C,IAAK,GAAID,GAAI,EAAGA,EAAIiB,EAAMzE,SAASyD,OAAQD,IACvC,GAA+B,sBAA3BiB,EAAMzE,SAASwD,GAAM,IAA2B,CAChD,GAAInC,GAAQoD,EAAMzE,SAASwD,GAAM,MAAO,KACpConC,GAAI8C,OAAOjqC,SAAWpC,IACtBqtC,GAAW,IAS/B,MAHKA,IACDxvC,KAAK2vC,mBAAmBjE,EAAKt8B,EAAMzI,EAAMuD,EAAS3E,GAE/C9D,EAASoN,OAAOlI,EAAK4D,OAAS5D,EAAK4E,QAAWA,OAAQ5E,EAAK4E,OAAQhB,MAAO5D,EAAK4D,MAAOP,WAAYrD,EAAKqD,aAElHmkC,EAAWptC,UAAU2uC,sBAAwB,SAAUtgC,EAAMnF,EAAO2lC,GAChE,IAAK,GAAItrC,GAAI,EAAGA,EAAI8K,EAAK7K,OAAQD,IACzB8K,EAAK9K,GAAGgG,MAAM/F,QAAUsH,OAAOC,KAAKsD,EAAK9K,GAAGgG,MAAM,IAAInE,QAAQ,QAAU,GACxEnG,KAAK0vC,sBAAsBtgC,EAAK9K,GAAGgG,MAAOL,EAAQ,EAAG2lC,EAAa,EAW1E,OAJAxgC,GAAQ,UAAIlH,EAAU,UACtBkH,EAAQ,MAAInF,EACZmF,EAAa,YAAIwgC,EACjBxgC,EAAY,QAAIA,EAAK,GAAG9E,MAAM/F,OAASvE,KAAK6vC,kBAAkBzgC,GAAOnL,oBAAkBmL,EAAK,GAAG9E,MAAa,aACrG8E,GAEX++B,EAAWptC,UAAU8uC,kBAAoB,SAAUzgC,EAAM0gC,GAGrD,IAAK,GAFDC,MAEKzrC,EAAI,EAAGA,EAAI8K,EAAK7K,OAAQD,IAC7B,GAAKwrC,EAMDC,EAAsBA,EAAoB9/B,OAAOb,EAAK9K,GAAGgG,MAAa,aALtE,KAAK,GAAI9F,GAAI,EAAGA,EAAI4K,EAAK9K,GAAGgG,MAAM/F,OAAQC,IACtCurC,EAAoB3tC,KAAKgN,EAAK9K,GAAGgG,MAAM9F,GAOnD,OAAOurC,IAQX5B,EAAWptC,UAAU2sC,QAAU,SAAUtqC,GAErC,MADApD,MAAK0rC,IAAI8C,OAASprC,EACXA,GAQX+qC,EAAWptC,UAAUusC,aAAe,SAAUlqC,GAC1CpD,KAAK0rC,IAAI1hC,WAAa5G,GAY1B+qC,EAAWptC,UAAU8rC,aAAe,SAAUh/B,EAAIi/B,EAAS1pC,EAAGmC,EAAOyqC,GAGjE,OACIpqC,KAAM,OACN0oC,IAAKzgC,EAAG49B,WAAWwE,UAAYpiC,EAAG49B,WAAWyE,SAAWriC,EAAG49B,WAAW0E,WAAatiC,EAAG49B,WAAW6C,IACjGS,YAAa,kCACbqB,SAAU,OACVhhC,KAAMO,KAAKC,UAAUygC,aACjBC,QAASxD,EAAQK,eACjBoD,MAAOzD,EAAQG,aACfuD,QAAS1D,EAAQE,eACjBuC,OAAQ,QACRkB,MAAOrtC,MAZXkrC,IAaIjuC,IAAK+C,MAZT/C,KAaGoB,EAASkM,aAAa3N,KAAM6N,EAAItI,OAW3C4oC,EAAWptC,UAAU2vC,WAAa,SAAU7iC,EAAI0gC,KAWhDJ,EAAWptC,UAAUmsC,OAAS,SAAUr/B,EAAIuB,EAAMnN,EAAWsD,GACzD,OACI+oC,IAAKzgC,EAAG49B,WAAWkF,WAAa9iC,EAAG49B,WAAWyE,SAAWriC,EAAG49B,WAAW6C,IACvEl/B,KAAMO,KAAKC,UAAUygC,aACjBluC,MAAOiN,EACPqhC,MAAOxuC,EACPstC,OAAQ,UACT9tC,EAASkM,aAAa3N,KAAM6N,EAAItI,OAY3C4oC,EAAWptC,UAAUssC,OAAS,SAAUx/B,EAAIqgC,EAAU/rC,EAAOF,EAAWsD,GACpE,OACIK,KAAM,OACN0oC,IAAKzgC,EAAG49B,WAAW0E,WAAatiC,EAAG49B,WAAWyE,SAAWriC,EAAG49B,WAAW6C,IACvEl/B,KAAMO,KAAKC,UAAUygC,aACjBhwC,IAAK8B,EACLyuC,UAAW1C,EACXuC,MAAOxuC,EACPstC,OAAQ,UACT9tC,EAASkM,aAAa3N,KAAM6N,EAAItI,OAY3C4oC,EAAWptC,UAAUqsC,OAAS,SAAUv/B,EAAIqgC,EAAU/rC,EAAOF,EAAWsD,GACpE,OACIK,KAAM,OACN0oC,IAAKzgC,EAAG49B,WAAWoF,WAAahjC,EAAG49B,WAAWyE,SAAWriC,EAAG49B,WAAW6C,IACvEl/B,KAAMO,KAAKC,UAAUygC,aACjBluC,MAAOA,EACPotC,OAAQ,SACRqB,UAAW1C,EACX7tC,IAAKoB,EAASqG,UAAUomC,EAAU/rC,GAClCsuC,MAAOxuC,GACRR,EAASkM,aAAa3N,KAAM6N,EAAItI,OAU3C4oC,EAAWptC,UAAU4tC,eAAiB,SAAUv/B,EAAM7J,GAClD,GACIpD,GADA9B,EAAMkF,EAAMjF,KAEZyL,EAAO1L,EACPgL,EAAO9F,EAAMlF,IACbywC,IACmB,iBAAZ1hC,GAAK,KACZrD,EAAO,KAEX,KAAK,GAAIzH,GAAI,EAAGA,EAAI8K,EAAK7K,OAAQD,IAEzBnC,EADmB,gBAAZiN,GAAK,GACJ3N,EAASqG,UAAUuD,GAAQU,EAAMqD,EAAK9K,IAGtC8K,EAAK9K,GAEjBwsC,EAAU1uC,KAAK,GAAIe,GAAU9C,EAAK,QAAS8B,GAE/C,OAAOgB,GAAU6D,GAAG8pC,IAExB3C,EAAWptC,UAAU4uC,mBAAqB,SAAUjE,EAAKt8B,EAAMzI,EAAMuD,EAAS3E,GAC1E,GAAIwrC,GAAQ3hC,CAIZ,IAHIA,GAAQA,EAAK7D,SACbwlC,EAAQ3hC,EAAK7D,QAEbmgC,GAAOA,EAAI1hC,YAAc0hC,EAAI1hC,WAAWzF,OAAQ,CAChD,GAAI0nC,GAAMP,EAAI1hC,WACV3H,MAAK,GACL2uC,EAAgBD,EAChB3qC,IACAgJ,GAAKzJ,YACLqrC,EAAgB5hC,EAAKzJ,UAEzB,KAASrB,EAAI,EAAGA,EAAI2nC,EAAI1nC,OAAQD,KAC5BjC,EAAKZ,EAASuI,WAAWiiC,EAAI3nC,GAAGsB,SAE5BQ,EAAI6lC,EAAI3nC,GAAGrD,MAAQ,MAAQgrC,EAAI3nC,GAAGsB,MAAQvD,EAAG2uC,EAAe/E,EAAI3nC,GAAGrD,OAG3E0F,GAAKqD,WAAa5D,EAEtB,GACI6qC,GAAmBzwC,MAAMivC,QAAQrgC,EAAK7D,SAAW6D,EAAK7D,OAAOhH,SAAWN,oBAAkBmL,EAAK7D,OAAO,GAAM,IAChH,IAAImgC,GAAOA,EAAI8C,QAAU9C,EAAI8C,OAAOjqC,SAAW0sC,EAAkB,CAE7D,IAAK,GADDzC,GAAS9C,EAAI8C,OACRlqC,EAAI,EAAGA,EAAIkqC,EAAOjqC,OAAQD,IAAK,CAE/BL,oBAAkBiG,KACnBA,EAAUzI,EAASiD,MAAMwF,EAASskC,EAAOlqC,IAE7C,IAAI4sC,GAAapxC,EAAMuE,cAAckB,EAAMnF,QAAS,WAAWkE,GAAGlB,CAClE2tC,GAAQtvC,EAASiD,MAAMqsC,EAAOvC,EAAOlqC,GAAIonC,EAAI1hC,WALjC,KAKoDE,EAASgnC,EAAW1tC,UAExFmD,EAAK4E,OAASwlC,EAElB,MAAOpqC,IAEXwnC,EAAWptC,UAAUstC,gBAAkB,SAAU9oC,GAC7C,GAAIuI,IAAQhK,SAAW0qC,UAAYC,WAAaC,YAAc1kC,cAM9D,OALA8D,GAAIhK,MAAQhE,EAAMuE,cAAckB,EAAMnF,QAAS,YAC/C0N,EAAI0gC,OAAS1uC,EAAMuE,cAAckB,EAAMnF,QAAS,WAChD0N,EAAI2gC,QAAU3uC,EAAMuE,cAAckB,EAAMnF,QAAS,WACjD0N,EAAI4gC,SAAW5uC,EAAMuE,cAAckB,EAAMnF,QAAS,YAClD0N,EAAI9D,WAAalK,EAAMuE,cAAckB,EAAMnF,QAAS,gBAC7C0N,GAEXqgC,EAAWptC,UAAUmB,UAAY,SAAUqpC,GACvC,GAAIz9B,GAAMy9B,EAAQx9B,SACdw9B,GAAQ1qC,OAAO0D,SACfuJ,EAAIjN,UAER,KAAK,GAAI+F,GAAK,EAAG2J,EAAKg7B,EAAQ1qC,OAAQ+F,EAAK2J,EAAGhM,OAAQqC,IAAM,CACxD,GAAIsI,GAAMqB,EAAG3J,EACb,IAAIkH,EAAIoB,EAAI7O,KACR,KAAM,IAAIsQ,OAAM,2EAEpB7C,GAAIoB,EAAI7O,KAAO6O,EAAI/M,MACf+M,EAAI7M,KACJyL,EAAIoB,EAAI7O,KAAO6O,EAAI7M,GAAGG,KAAK+oC,EAAQhmC,MAAO2J,EAAI7O,IAAKkrC,EAAQhmC,MAAOgmC,EAAQ19B,KAE9EC,EAAIjN,OAAOqO,EAAI7O,KAAOyN,EAAIoB,EAAI7O,OAG/B8tC,GACT7C,GAOE6F,EAA8B,SAAUtF,GAExC,QAASsF,GAAaC,GAClB,GAAIvhC,GAAQg8B,EAAOrpC,KAAKxC,OAASA,IAuBjC,OArBA6P,GAAM07B,QAAU8E,YAAWxgC,EAAM07B,SAC7BC,YAAa,MACb6F,OAAQ,wEACRC,gBAAiB,kBACjB5tC,OAAQ,WACR2B,OAAQ,UACRD,KAAM,QACNF,KAAM,OACNqF,MAAO,eACP5H,MAAO,UACPF,OAAQ,UACR8uC,MAAO,SACPC,UAAW,eACXC,SAAU,SACVC,UAAW,eACXC,aAAc,2CACdC,iBAAkB,qEAClBC,0BAA2B,iDAC3BC,WAAY,QAEhBzB,SAAOxgC,EAAM07B,QAAS6F,OACfvhC,EA2uBX,MApwBAi7B,GAAUqG,EAActF,GA2BxBsF,EAAapwC,UAAU6tC,cAAgB,WACnC,MAAO,gBAWXuC,EAAapwC,UAAUgxC,YAAc,SAAU7uC,EAAWqC,EAAOysC,GAC7D,GACInvC,GACAovC,EAFAviC,EAAc,GAGd5E,EAAM5H,EAAUf,MAChByD,QAAckF,GACd7J,EAAQiC,EAAUjC,MAAQkwC,EAAae,SAAShvC,EAAUjC,OAAS,IAoCvE,IAnCI6J,YAAey9B,QACfz9B,EAAM,YAAerJ,EAASqO,MAAMs5B,SAASt+B,GAAO,KAE3C,WAATlF,IACAkF,EAAMA,EAAI3G,QAAQ,KAAM,MACpBjB,EAAUJ,aACVgI,EAAMA,EAAI7H,eAEa,SAAvBC,EAAUL,WACViI,EAAMqnC,mBAAmBrnC,IAEF,aAAvB5H,EAAUL,UAAkD,SAAvBK,EAAUL,WAC/CiI,EAAM,IAAOA,EAAM,KAEnBknC,IACA/wC,EAAQ,QAAUA,EAAQ,mBAE1BQ,EAASqO,MAAMq5B,OAAOr+B,KACtBmnC,EAAO,QAEP/uC,EAAUJ,aACLmvC,IACDhxC,EAAQ,WAAaA,EAAQ,KAEjC6J,EAAMA,EAAI7H,gBAGS,YAAvBC,EAAUL,UAAiD,WAAvBK,EAAUL,UAAgD,eAAvBK,EAAUL,UAC1D,cAAvBK,EAAUL,UACVA,GAAoD,IAAzCK,EAAUL,SAASsD,QAAQ,SAAkB1E,EAASsQ,aAAuB,SAAItQ,EAASsQ,aAAoB,MACzHjH,EAA6B,WAAvB5H,EAAUL,UAAgD,cAAvBK,EAAUL,SAA2B,KAAO,MAGrFA,EAAWpB,EAASsQ,aAAa7O,EAAUL,UAE3CA,EAMA,MALA6M,IAAezO,EACfyO,GAAe7M,EACXovC,IACAviC,GAAeuiC,GAEZviC,EAAc5E,CAQzB,IAAiB,UAFbjI,EAJCoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBAIpCntC,EAAS6Q,cAAcpP,EAAUL,UAHjCpB,EAASqR,gBAAgB5P,EAAUL,YAOpB,KAD1BiI,EAAMA,GACE3E,QAAQ,OACU,MAAlB2E,EAAI/B,OAAO,IAAc+B,EAAI3B,YAAY,KAAO,GAChD2B,EAAMA,EAAI1B,UAAU,EAAG0B,EAAIvG,QAC3B1B,EAAYoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBACbntC,EAAS6Q,cAA0B,WAA5E7Q,EAASqR,gBAA4B,YAEL,MAA/BhI,EAAI/B,OAAO+B,EAAIvG,OAAS,IAAcuG,EAAI3E,QAAQ,KAAO2E,EAAIvG,OAAS,GAC3EuG,EAAMA,EAAI1B,UAAU,EAAG0B,EAAIvG,OAAS,GACpC1B,EAAYoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBACfntC,EAAS6Q,cAAwB,SAAxE7Q,EAASqR,gBAA0B,UAElChI,EAAI3B,YAAY,OAAS2B,EAAI3E,QAAQ,MAAQ2E,EAAI3B,YAAY,KAAO2B,EAAI3E,QAAQ,KAAO,GAC5F2E,EAAMA,EAAI1B,UAAU0B,EAAI3E,QAAQ,KAAO,EAAG2E,EAAI3B,YAAY,MAC1DtG,EAAYoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBACfntC,EAAS6Q,cAAwB,SAAxE7Q,EAASqR,gBAA0B,UAGvCjQ,EAAYoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBACfntC,EAAS6Q,cAAwB,SAAxE7Q,EAASqR,gBAA0B,UAI/ChI,EAAM,KADNA,EAAMqnC,mBAAmBrnC,IACN,QAElB,IAAiB,aAAbjI,EAEL,IAA0B,KAD1BiI,EAAMA,GACE3E,QAAQ,KAAa,CACzB,GAAIisC,GAAsBtnC,EAAIlD,MAAM,KAChCyqC,MAAgB,GAChB9nC,EAAQ,CAgCZ,IA/ByB,IAArBO,EAAI3E,QAAQ,OAAyD,IAA3CisC,EAAoB,GAAGjsC,QAAQ,SAChB,IAAzCisC,EAAoB,GAAGjsC,QAAQ,OAE/BksC,EAAgB,KADhBA,EAAgBD,EAAoB,IACG,IAGvC1iC,IAFA7M,EAAYoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBACbntC,EAAS6Q,cAA0B,WAA5E7Q,EAASqR,gBAA4B,YACf,IAC1BpD,GAAezO,EAAQ,IACnBgxC,IACAviC,GAAeuiC,GAEnBviC,GAAe2iC,EAAgB,IAC/B9nC,KAEAO,EAAI3B,YAAY,OAAS2B,EAAIvG,OAAS,IAA6E,IAAxE6tC,EAAoBA,EAAoB7tC,OAAS,GAAG4B,QAAQ,SACjC,IAAtEisC,EAAoBA,EAAoB7tC,OAAS,GAAG4B,QAAQ,OAE5DksC,EAAgB,KADhBA,EAAgBD,EAAoBA,EAAoB7tC,OAAS,IAC1B,IACvC1B,EAAYoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBACfntC,EAAS6Q,cAAwB,SAAxE7Q,EAASqR,gBAA0B,SACnCvI,EAAQ,IACRmF,GAAe,SAEnBA,GAAe7M,EAAW,IAC1B6M,GAAezO,EAAQ,IACnBgxC,IACAviC,GAAeuiC,GAEnBviC,GAAe2iC,EAAgB,IAC/B9nC,KAEA6nC,EAAoB7tC,OAAS,EAC7B,IAAK,GAAID,GAAI,EAAGA,EAAI8tC,EAAoB7tC,OAAS,EAAGD,IAChD,IAA+C,IAA3C8tC,EAAoB9tC,GAAG6B,QAAQ,SAA0D,IAAzCisC,EAAoB9tC,GAAG6B,QAAQ,KAAa,CAQ5F,GAPAksC,EAAgBD,EAAoB9tC,GACpC+tC,EAAgB,IAAOA,EAAgB,IACvCxvC,EAAYoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBACfntC,EAAS6Q,cAAwB,SAAxE7Q,EAASqR,gBAA0B,SACnCvI,EAAQ,IACRmF,GAAe,SAEF,gBAAb7M,GAA2C,oBAAbA,EAAgC,CAC1DkB,EAAOsuC,CACXA,GAAgBpxC,EAChBA,EAAQ8C,EAEZ2L,GAAe7M,EAAW,IAC1B6M,GAAezO,EAAQ,IACnBgxC,IACAviC,GAAeuiC,GAEnBviC,GAAe2iC,EAAgB,IAC/B9nC,IAIE,IAAVA,GACA1H,EAAYoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBACfntC,EAAS6Q,cAAwB,SAAxE7Q,EAASqR,gBAA0B,UACb,IAAtBhI,EAAI3E,QAAQ,OAAuC,IAAxB2E,EAAI3E,QAAQ,SACvC2E,GAA4B,IAAtBA,EAAI3E,QAAQ,KAAc2E,EAAIlD,MAAM,KAAKkB,KAAK,IAAMgC,EAAIlD,MAAM,OAAOkB,KAAK,KAEpFgC,EAAM,IAAOA,EAAM,KAGnBjI,EAAW,eAIfA,GAAYoB,oBAAkBjE,KAAK4uC,gBAA2C,mBAAzB5uC,KAAK4uC,gBACfntC,EAAS6Q,cAAwB,SAAxE7Q,EAASqR,gBAA0B,UACb,IAAtBhI,EAAI3E,QAAQ,OAAuC,IAAxB2E,EAAI3E,QAAQ,SACvC2E,GAA4B,IAAtBA,EAAI3E,QAAQ,KAAc2E,EAAIlD,MAAM,KAAKkB,KAAK,IAAMgC,EAAIlD,MAAM,OAAOkB,KAAK,KAEpFgC,EAAM,IAAOA,EAAM,GAG3B,IAAiB,gBAAbjI,GAA2C,oBAAbA,EAAgC,CAC9D,GAAIkB,GAAO+G,CACXA,GAAM7J,EACNA,EAAQ8C,EAUZ,MARiB,aAAblB,IACA6M,GAAe7M,EAAW,IAC1B6M,GAAezO,EAAQ,IACnBgxC,IACAviC,GAAeuiC,GAEnBviC,GAAe5E,EAAM,KAElB4E,GAEXyhC,EAAapwC,UAAUmB,UAAY,SAAUqpC,GACzCM,EAAO9qC,UAAUmB,UAAUM,KAAKxC,KAAMurC,SAC/BA,GAAQx9B,UAAUlN,QAW7BswC,EAAapwC,UAAUuxC,mBAAqB,SAAUpvC,EAAWqC,EAAOysC,GAEpE,IAAK,GADD5rC,MACK9B,EAAI,EAAGA,EAAIpB,EAAUsD,WAAWjC,OAAQD,IAC7C8B,EAAIhE,KAAK,IAAMpC,KAAKuyC,YAAYrvC,EAAUsD,WAAWlC,GAAIiB,EAAOysC,GAAgB,IAEpF,OAAO5rC,GAAI0C,KAAK,IAAM5F,EAAUqD,UAAY,MAUhD4qC,EAAapwC,UAAUwxC,YAAc,SAAUzsC,EAAQP,EAAOysC,GAC1D,MAAOlsC,GAAOO,UAAYrG,KAAKsyC,mBAAmBxsC,EAAQP,EAAOysC,GAAgBhyC,KAAK+xC,YAAYjsC,EAAQP,EAAOysC,IAOrHb,EAAapwC,UAAU4rC,QAAU,SAAU8B,GAIvC,MAHIzuC,MAAK0rC,IAAIroC,QACTorC,EAAQrsC,KAAKpC,KAAKuyC,YAAYvyC,KAAK0rC,IAAIroC,OAAQ,MAAM,IAElDorC,EAAQ3lC,KAAK,UAcxBqoC,EAAapwC,UAAUyxC,aAAe,SAAUpvC,GACxCA,EAAEb,QAA8B,IAApBa,EAAEb,OAAOgC,QACrB9C,EAASC,WAAW,yEAGxB,KAAK,GADDoE,GAAS9F,KAAK0rC,IAAIroC,WACbiB,EAAI,EAAGA,EAAIlB,EAAEb,OAAOgC,OAAQD,IACjCwB,EAAO1D,KAAK,GAAIe,GAAUC,EAAEb,OAAO+B,GAAIlB,EAAEP,SAAUO,EAAE/C,IAAK+C,EAAEN,YAEhE9C,MAAK0rC,IAAIroC,OAASyC,GAOtBqrC,EAAapwC,UAAUwsC,SAAW,SAAUnqC,GAExC,MADApD,MAAK0rC,IAAIroC,OAASF,EAAU6D,GAAGhH,KAAK0rC,IAAIroC,QACjC,IAOX8tC,EAAapwC,UAAU0xC,WAAa,SAAUrvC,GAC1C,GAAIgD,KACJ,IAAIhD,EAAEyC,eAAgBrF,OAClB,IAAK,GAAI8D,GAAI,EAAGA,EAAIlB,EAAEyC,KAAKtB,OAAQD,IAC/B8B,EAAIhE,KAAK+uC,EAAae,SAAS9uC,EAAEyC,KAAKvB,KAAuB,eAAhBlB,EAAES,UAA6B,QAAU,SAI1FuC,GAAIhE,KAAK+uC,EAAae,SAAS9uC,EAAEyC,OAAyB,eAAhBzC,EAAES,UAA6B,QAAU,IAEvF,OAAOuC,GAAI0C,KAAK,MAOpBqoC,EAAapwC,UAAUyrC,SAAW,SAAUppC,GACxC,MAAOA,GAAEsvC,UAAU5pC,KAAK,MAQ5BqoC,EAAapwC,UAAU2sC,QAAU,SAAUtqC,GAEvC,MADApD,MAAK0rC,IAAI8C,OAASprC,MAQtB+tC,EAAapwC,UAAUgtC,SAAW,SAAU3qC,GACxC,IAAK,GAAIkB,GAAI,EAAGA,EAAIlB,EAAEmB,OAAQD,IAC1BlB,EAAEkB,GAAK6sC,EAAae,SAAS9uC,EAAEkB,GAEnC,OAAOlB,GAAE0F,KAAK,MAQlBqoC,EAAapwC,UAAUusC,aAAe,SAAUlqC,GAE5C,MADApD,MAAK0rC,IAAI1hC,WAAa5G,EACf,IAQX+tC,EAAapwC,UAAU4xC,QAAU,SAAUvvC,GACvC,OAAa,IAANA,EAAa,WAAa,IAWrC+tC,EAAapwC,UAAU2vC,WAAa,SAAU7iC,EAAI0gC,EAASqE,GACnDnxC,EAASyC,SAAS0uC,EAAStE,IAAKtuC,KAAKurC,QAAQgG,QAA0C,SAAhCqB,EAAShtC,KAAK3C,eACrEsrC,EAAQY,QAAQ0D,IAAI,SAAU7yC,KAAKurC,QAAQ+F,iBAC3C/C,EAAQY,QAAQ0D,IAAI,qBAAsB,QAI1CtE,EAAQY,QAAQ0D,IAAI,SAAU7yC,KAAKurC,QAAQ8F,QAE/C9C,EAAQY,QAAQ0D,IAAI,qBAAsB,OAC1CtE,EAAQY,QAAQ0D,IAAI,wBAAyB,QAkBjD1B,EAAapwC,UAAU4qC,gBAAkB,SAAUv8B,EAAM3C,EAAIlH,EAAO4I,EAAKogC,EAASzB,GAE9E,GAAKyB,GAA4B,QAAjBA,EAAQ3oC,OAAoB5F,KAAK8yC,SAAW1jC,EAD5C,kBAC6D,CACzE,GAAI2jC,GAAW3jC,EAFH,kBAEmBxH,MAAM,cACrC5H,MAAK8yC,QAAUC,EAAS,GACxB/yC,KAAKgzC,kBAAoBD,EAAS,GAGtC,IAAK9uC,oBAAkBmL,EAAKo6B,GAAI,CAC5B,GAAIyJ,GAAa1tC,GAASA,EAAMvD,gBAAmBoN,EAAKo6B,EAAE0J,QAAU9jC,EAAKo6B,CAEzE,KAAKvlC,oBAAkBgvC,GACnB,IAAK,GAAI3uC,GAAI,EAAGA,EAAI2uC,EAAS1uC,OAAQD,IAC5BL,oBAAkBgvC,EAAS3uC,GAAW,mBAChC2uC,GAAS3uC,GAAW,WAK3C,GAAIonC,GAAM6C,GAAWA,EAAe,QAChC4E,EAAgBnzC,KAAKozC,qBAAqBhkC,EAAM7J,EAAO4I,EAAKogC,EAASzB,EACzE,IAAIqG,EACA,MAAOA,EAEX,IAAIE,GAAellC,GAAOogC,EAAQ+E,aAAanE,QAAQC,IAAI,sBACvD7kC,EAAQ,KACRgpC,EAAWF,GAAgB1mC,SAAS0mC,EAAc,KAAQ,CAC9D,IAAI9tC,GAASA,EAAMvD,gBAAiB,EAE5BoN,EAAe,SAAKA,EAAK,kBACzB7E,EAAQ6E,EAAe,SAAKA,EAAK,gBAEjCA,EAAKo6B,IACLp6B,EAAOA,EAAKo6B,IAEZp6B,EAAe,SAAKA,EAAK,kBACzB7E,EAAQ6E,EAAe,SAAKA,EAAK,gBAGzB,IAAZmkC,GAAiBnkC,EAAKjN,QACtBiN,EAAOA,EAAKjN,OAEZiN,EAAKo6B,IACLp6B,EAAOA,EAAKo6B,GAEZ+J,EAAU,GAAKnkC,EAAK8jC,UACpB9jC,EAAOA,EAAK8jC,QAEhB,IAAIvsC,KAIJ,OAHAA,GAAK4D,MAAQA,EACb5D,EAAK4E,OAAS6D,EACdpP,KAAK2vC,mBAAmBjE,EAAKt8B,EAAMzI,EAAM,KAAMpB,GACxC9D,EAASoN,OAAOtE,GAAS5D,EAAK4E,QAAWA,OAAQ5E,EAAK4E,OAAQhB,MAAO5D,EAAK4D,MAAOP,WAAYrD,EAAKqD,aAW7GmnC,EAAapwC,UAAUiuC,qBAAuB,SAAUT,EAAShpC,EAAOsI,GACpE,GAAIzH,MAEAnE,EAAYssC,EAAa,OAAK,SAE3BA,GAAa,MAChB1gC,EAAG49B,WAAW+H,iBACdjF,EAAc,QAAI,OAGtB,KAAK,GAAI3nC,GAAK,EAAG6sC,EADN5nC,OAAOC,KAAKyiC,GACS3nC,EAAK6sC,EAAOlvC,OAAQqC,IAAM,CACtD,GAAImF,GAAO0nC,EAAO7sC,EAClBR,GAAIhE,KAAK2J,EAAO,IAAMwiC,EAAQxiC,IAGlC,MADA3F,GAAMA,EAAI0C,KAAK,KACX+E,EAAG49B,WAAW6C,MAA2C,IAApCzgC,EAAG49B,WAAW6C,IAAInoC,QAAQ,OAAgBlE,EACxDmE,EAEJA,EAAI7B,OAAStC,EAAY,IAAMmE,EAAMnE,GAAa,IAE7DkvC,EAAapwC,UAAU2yC,kBAAoB,SAAUrzC,EAAKszC,GACtD,IAAK,GAAI/sC,GAAK,EAAG2J,EAAMtM,oBAAkB0vC,MAAc9nC,OAAOC,KAAK6nC,GAAkB/sC,EAAK2J,EAAGhM,OAAQqC,IAAM,CACvG,GAAImF,GAAOwE,EAAG3J,EACT+sC,GAAW5nC,YAAiBw8B,QAC7BoL,EAAW5nC,GAAQtK,EAAS4mC,UAAU4B,YAAY0J,EAAW5nC,KAGrE,MAAO4nC,IAUXxC,EAAapwC,UAAUmsC,OAAS,SAAUr/B,EAAIuB,EAAMnN,GAChD,OACIqsC,KAAMzgC,EAAG49B,WAAWkF,WAAa9iC,EAAG49B,WAAW6C,KAAKnqC,QAAQ,OAAQlC,EAAY,IAAMA,EAAY,IAClGmN,KAAMO,KAAKC,UAAUR,EAAMpP,KAAKurC,QAAQqI,UAAY5zC,KAAK0zC,kBAAoB,QAYrFvC,EAAapwC,UAAUssC,OAAS,SAAUx/B,EAAIqgC,EAAU/rC,EAAOF,GAC3D,GAAIqsC,EAOJ,OAFIA,GAJiB,gBAAVnsC,IAAuBV,EAASqO,MAAMq5B,OAAOhnC,GAI9C,IAAMA,EAAQ,IAHd,KAAOA,EAAQ,MAMrByD,KAAM,SACN0oC,KAAMzgC,EAAG49B,WAAW0E,WAAatiC,EAAG49B,WAAW6C,KAAKnqC,QAAQ,OAAQlC,EAAY,IAAMA,EAAY,IAAMqsC,IAehH6C,EAAapwC,UAAUqsC,OAAS,SAAUv/B,EAAIqgC,EAAU/rC,EAAOF,EAAWsD,EAAOyqC,GAC7C,UAA5BhwC,KAAKurC,QAAQuG,YAA2B7tC,oBAAkB+rC,KAC1D7tC,EAAQnC,KAAK6zC,iBAAiB1xC,EAAO6tC,EAAU9B,GAEnD,IAAII,EAOJ,OAFIA,GAJ2B,gBAApBnsC,GAAM+rC,IAA2BzsC,EAASqO,MAAMq5B,OAAOhnC,EAAM+rC,IAI9D,IAAM/rC,EAAM+rC,GAAY,IAHxB,KAAO/rC,EAAM+rC,GAAY,MAM/BtoC,KAAM5F,KAAKurC,QAAQuG,WACnBxD,KAAMzgC,EAAG49B,WAAWoF,WAAahjC,EAAG49B,WAAW6C,KAAKnqC,QAAQ,OAAQlC,EAAY,IAAMA,EAAY,IAAMqsC,EACxGl/B,KAAMO,KAAKC,UAAUzN,EAAOnC,KAAKurC,QAAQqI,UAAY5zC,KAAK0zC,kBAAoB,MAC9ErC,OAAQrxC,KAAKurC,QAAQ8F,SAc7BF,EAAapwC,UAAU8rC,aAAe,SAAUh/B,EAAIi/B,EAAS1pC,EAAGmC,EAAOyqC,GACnE,GAAI8D,GAAc1wC,EAAE6uC,KAAOxwC,EAAS4M,QAAQrO,KAAKurC,QAAQkG,UACrDnD,EAAOzgC,EAAG49B,WAAWwE,UAAYjwC,KAAK8yC,SACrCjlC,EAAG49B,WAAWwE,UAAYjwC,KAAK8yC,SAAW,IAAM9yC,KAAKurC,QAAQgG,OAC7D1jC,EAAG49B,WAAWwE,UAAYpiC,EAAG49B,WAAW6C,KAAKnqC,QAAQ,OAAQ,IAAMnE,KAAKurC,QAAQgG,MACrFnuC,GAAEkrC,IAAMtuC,KAAKgzC,kBAAoBhzC,KAAKgzC,kBAAoB5vC,EAAEkrC,GAC5D,IAAI3nC,IACA2nC,IAAKlrC,EAAEkrC,IACPjuC,IAAK+C,EAAE/C,IACP0zC,IAAK,EACLC,KAAMvyC,EAAS4M,QAAQrO,KAAKurC,QAAQiG,YAEpC1jC,EAAM,KAAOgmC,EAAc,IAQ/B,OAPAhmC,IAAO,2CAA6CnH,EAAKqtC,KAAK7vC,QAAQ,KAAM,IAAM,KAClFnE,KAAK0rC,IAAI8F,UAAY,EACrB1jC,GAAO9N,KAAKi0C,sBAAsBnH,EAAQG,aAActmC,EAAMkH,GAC9DC,GAAO9N,KAAKk0C,sBAAsBpH,EAAQK,eAAgBxmC,EAAMkH,EAAImiC,EAAWA,EAAS7C,mBACxFr/B,GAAO9N,KAAKm0C,sBAAsBrH,EAAQE,eAAgBrmC,EAAMkH,GAChEC,GAAOnH,EAAKqtC,KAAO,OACnBlmC,GAAO,KAAOgmC,EAAc,MAExBluC,KAAM,OACN0oC,IAAKA,EACL8B,SAAU,OACVrB,YAAa,2CAA6C+E,EAC1D1kC,KAAMtB,IAYdqjC,EAAapwC,UAAUozC,sBAAwB,SAAU3lC,EAAKpL,EAAGyK,GAC7D,IAAKW,EACD,MAAO,EAEX,IACI4lC,IACAC,OAAU,UACV/F,IAAO,SAAUl/B,EAAM9K,EAAGjE,GACtB,GAAIiuC,GAAM7sC,EAASqG,UAAUzH,EAAK+O,EAAK9K,GACvC,OAAmB,gBAARgqC,IAAoB7sC,EAASqO,MAAMq5B,OAAOmF,GAC1C,IAAMA,EAAM,IAEdA,YAAe/F,MAEb,IADQn5B,EAAK9K,GAAGjE,GACDopC,SAAW,IAG1B,KAAO6E,EAAM,MAG5Bl/B,KAAQ,SAAUA,EAAM9K,GAAK,MAAO,IAGxC,OADMtE,MAAKs0C,oBAAoB9lC,EAAKpL,EAAGgxC,EAAMvmC,GAChC,MAUjBsjC,EAAapwC,UAAUkzC,sBAAwB,SAAUzlC,EAAKpL,EAAGyK,GAC7D,IAAKW,EACD,MAAO,EAEX,IACI4lC,IACAC,OAAU,QACV/F,IAAO,SAAUl/B,EAAM9K,EAAGjE,GAAO,MAAO,IACxC+O,KAAQ,SAAUA,EAAM9K,GAAK,MAAOqL,MAAKC,UAAUR,EAAK9K,IAAM,QAGlE,OADMtE,MAAKs0C,oBAAoB9lC,EAAKpL,EAAGgxC,EAAMvmC,IAYjDsjC,EAAapwC,UAAUmzC,sBAAwB,SAAU1lC,EAAKpL,EAAGyK,EAAI0mC,GACjE,GAAI1kC,GAAQ7P,IACZ,KAAKwO,EACD,MAAO,EAGXA,GAAIW,QAAQ,SAAUqlC,GAAU,MAAOA,GAAS3kC,EAAMgkC,iBAAiBW,EAAQD,EAAIzuC,OAAO,SAAU2uC,GAAK,MAAOhzC,GAASqG,UAAU1E,EAAE/C,IAAKo0C,KAAOhzC,EAASqG,UAAU1E,EAAE/C,IAAKm0C,KAAY,GAAIpxC,EAAE/C,MAC7L,IAAI+zC,IACAC,OAAUr0C,KAAKurC,QAAQuG,WAAa,IACpCxD,IAAO,SAAUl/B,EAAM9K,EAAGjE,GACtB,MAA4B,gBAAjB+O,GAAK9K,GAAGjE,IAAqBoB,EAASqO,MAAMq5B,OAAO/5B,EAAK9K,GAAGjE,IAC3D,IAAM+O,EAAK9K,GAAGjE,GAAO,IAEvB+O,EAAK9K,GAAGjE,YAAgBkoC,MAEtB,IADIn5B,EAAK9K,GAAGjE,GACDopC,SAAW,IAGtB,KAAOr6B,EAAK9K,GAAGjE,GAAO,MAGrC+O,KAAQ,SAAUA,EAAM9K,GAAK,MAAOqL,MAAKC,UAAUR,EAAK9K,IAAM,QAGlE,OADMtE,MAAKs0C,oBAAoB9lC,EAAKpL,EAAGgxC,EAAMvmC,IAGjDsjC,EAAae,SAAW,SAAUnmC,GAC9B,MAAOA,GAAK5H,QAAQ,MAAO,MAE/BgtC,EAAapwC,UAAUuzC,oBAAsB,SAAU9lC,EAAKpL,EAAGgxC,EAAMvmC,GAEjE,IAAK,GADDC,GAAM,GACDxJ,EAAI,EAAGA,EAAIkK,EAAIjK,OAAQD,IAC5BwJ,GAAO,KAAO1K,EAAE4wC,KAAO,KACvBlmC,GAAO9N,KAAKurC,QAAQqG,iBAAmB,OACvC9jC,GAAOsmC,EAAKC,OACQ,UAAhBD,EAAKC,OACLvmC,IAAQD,EAAG49B,WAAWkF,WAAa9iC,EAAG49B,WAAWyE,SAAW9sC,EAAEkrC,KAAO8F,EAAK9F,IAAI9/B,EAAKlK,EAAGlB,EAAE/C,KAAO,cAE1E,SAAhB+zC,EAAKC,QAAqC,WAAhBD,EAAKC,OACpCvmC,IAAQD,EAAG49B,WAAWoF,WAAahjC,EAAG49B,WAAWyE,SAAW9sC,EAAEkrC,KAAO8F,EAAK9F,IAAI9/B,EAAKlK,EAAGlB,EAAE/C,KAAO,cAE1E,YAAhB+zC,EAAKC,SACVvmC,IAAQD,EAAG49B,WAAW0E,WAAatiC,EAAG49B,WAAWyE,SAAW9sC,EAAEkrC,KAAO8F,EAAK9F,IAAI9/B,EAAKlK,EAAGlB,EAAE/C,KAAO,eAEnGyN,GAAO,WAAa9N,KAAKurC,QAAQ8F,OAAS,KAC1CvjC,GAAO,eAAiB9N,KAAK0rC,IAAI8F,YAAc,KAC/C1jC,GAAO9N,KAAKurC,QAAQsG,0BAA4B,KAC3C5tC,oBAAkBuK,EAAIlK,GAAG,gBAK1BwJ,GAAO,MAJPA,GAAO,aAAeU,EAAIlK,GAAG,eAAiB,aACvCkK,GAAIlK,GAAG,gBAKlBwJ,GAAOsmC,EAAKhlC,KAAKZ,EAAKlK,EAE1B,OAAOwJ,IAEXqjC,EAAapwC,UAAUqyC,qBAAuB,SAAUhkC,EAAM7J,EAAO4I,EAAKogC,EAASzB,GAC/E,GAAI3+B,GAAOA,EAAIghC,QAAQC,IAAI,kBAAuE,IAApDjhC,EAAIghC,QAAQC,IAAI,gBAAgBjpC,QAAQ,OAClF,MAAQZ,GAAMvD,iBAAoBuJ,UAAYhB,MAAO,KAEzD,IAAIgkC,GAAWvuC,KAAKurC,QAAQgG,OAAS9vC,EAASyC,SAASqqC,EAAQD,IAAKtuC,KAAKurC,QAAQgG,QAAyC,SAA/BhD,EAAQ3oC,KAAK3C,cAA0B,CAC9H,GAAIgvC,GAAO9jC,EAAIghC,QAAQC,IAAI,gBACvBsF,MAAO,GACPC,MAAU,GACVnL,EAAIp6B,EAAO,EAGf,IAFA6iC,EAAOA,EAAK7oC,UAAU6oC,EAAK9rC,QAAQ,kBAAoB,IACvDqjC,EAAIA,EAAE5hC,MAAMqqC,IACN1tC,OAAS,EACX,QAEJilC,GAAIA,EAAE,EACN,IAAIoL,GAAQ,sDAAsDzM,KAAKqB,EACnEoL,IACApL,EAAErlC,QAAQywC,EAAM,GAAI,GAIxB,KAAK,GAFDC,GAAaD,EAAQA,EAAM,GAAK,GAE3BtwC,GADTklC,EAAIA,EAAE5hC,MAAMitC,IACGtwC,OAAQD,GAAK,EAAGA,IACtB,iBAAiB2E,KAAKugC,EAAEllC,KAAQ,cAAc2E,KAAKugC,EAAEllC,MAG1DowC,EAAO/nC,SAAS,uBAAuBw7B,KAAKqB,EAAEllC,IAAI,GAAI,IAClDwoC,EAAQG,aAAayH,KACrBC,EAAUlzC,EAASqO,MAAMC,UAAU,WAAWo4B,KAAKqB,EAAEllC,IAAI,IACzD+rC,YAAWvD,EAAQG,aAAayH,GAAO10C,KAAK2rC,gBAAgBgJ,KAGpE,OAAO7H,GAEX,MAAO,OAEXqE,EAAapwC,UAAU8yC,iBAAmB,SAAUzkC,EAAM4gC,EAAU3vC,GAChE,GAAIwP,GAAQ7P,IACZ,OAAIiE,qBAAkB+rC,GACX5gC,GAEXvD,OAAOC,KAAKsD,GAAMD,QAAQ,SAAUpD,GAC5BA,IAAS1L,GAAgB,gBAAT0L,IACZtK,EAASuM,cAAcoB,EAAKrD,KAC5B8D,EAAMgkC,iBAAiBzkC,EAAKrD,GAAOikC,EAASjkC,IAEvB,IADTF,OAAOC,KAAKsD,EAAKrD,IAAOjG,OAAO,SAAUsJ,GAAQ,MAAgB,gBAATA,IAC1D7K,cACC6K,GAAKrD,IAGXqD,EAAKrD,KAAUikC,EAASjkC,SACtBqD,GAAKrD,GAEPqD,EAAKrD,IAASikC,EAASjkC,IAASqD,EAAKrD,GAAM+oC,YAAc9E,EAASjkC,GAAM+oC,iBACtE1lC,GAAKrD,MAIjBqD,IAEJ+hC,GACThD,GAQE4G,EAAgC,SAAUlJ,GAE1C,QAASkJ,GAAe3D,GACpB,GAAIvhC,GAAQg8B,EAAOrpC,KAAKxC,KAAMoxC,IAAUpxC,IA0BxC,OAxBA6P,GAAM07B,QAAU8E,YAAWxgC,EAAM07B,SAC7BC,YAAa,MACb6F,OAAQ,iDACRC,gBAAiB,kBACjB5tC,OAAQ,WACR2B,OAAQ,UACRD,KAAM,QACNF,KAAM,OACNqF,MAAO,SACPlH,OAAQ,UACRV,MAAO,UACPF,OAAQ,UACR8uC,MAAO,SACPC,UAAW,eACXC,SAAU,SACVC,UAAW,eACXC,aAAc,2CACdC,iBAAkB,qEAClBC,0BAA2B,iDAC3BC,WAAY,QACZ8B,WAAW,EACXntC,MAAO,WAEX4pC,SAAOxgC,EAAM07B,QAAS6F,OACfvhC,EAgOX,MA5PAi7B,GAAUiK,EAAgBlJ,GAiC1BkJ,EAAeh0C,UAAU6tC,cAAgB,WACrC,MAAO,kBAQXmG,EAAeh0C,UAAU4xC,QAAU,SAAUvvC,GACzC,OAAa,IAANA,EAAa,OAAS,IAWjC2xC,EAAeh0C,UAAUgxC,YAAc,SAAU7uC,EAAWqC,EAAOysC,GAC/D,GAAItiC,GAAc,GACd5E,EAAM5H,EAAUf,MAChB6yC,EAASlqC,YAAey9B,KAC5B,IAAIhjC,YAAiBzF,GAEjB,IAAK,GADDM,GAAUJ,KAAKquC,gBAAgB9oC,GAC1BjB,EAAI,EAAGA,EAAIlE,EAAQquC,QAAQlqC,OAAQD,IACpClE,EAAQquC,QAAQnqC,GAAGlB,EAAE/C,MAAQ6C,EAAUf,QACvC6vC,GAAe,EAW3B,OAPAtiC,GAAcm8B,EAAO9qC,UAAUgxC,YAAYvvC,KAAKxC,KAAMkD,EAAWqC,EAAOysC,GACpEgD,IACAtlC,EAAcA,EAAYvL,QAAQ,kBAAmB,OAErD1C,EAASqO,MAAMq5B,OAAOr+B,KACtB4E,EAAcA,EAAYvL,QAAQ,OAAQ,IAAIA,QAAQ,KAAM,KAEzDuL,GAcXqlC,EAAeh0C,UAAUyxC,aAAe,SAAUpvC,GAC9C,GAAIC,GAASrD,KAAK0rC,IAAIgD,YACtBrrC,GAAOjB,KAAKgB,EAAE/C,KACdL,KAAK0rC,IAAIgD,SAAWrrC,GAOxB0xC,EAAeh0C,UAAUwsC,SAAW,SAAUnqC,GAC1C,MAAOpD,MAAK0rC,IAAIgD,SAAS5lC,KAAK,SASlCisC,EAAeh0C,UAAUk0C,SAAW,SAAU7xC,GAC1C,GAAIyM,GAAQ7P,KACRk1C,KACAC,KACAz0C,EAAU0C,EAAE1C,QAAQoB,QACpBszC,IAiDJ,OAhDchyC,GAAE8rC,QAAQppC,OAAO,SAAUuvC,GAAQ,MAAOA,GAAKlvC,QAAQ,MAAQ,IACrEgJ,QAAQ,SAAU9J,GACtB,GAAI+G,GAAS/G,EAAOuC,MAAM,IAI1B,IAHMwE,EAAO,IAAM8oC,KACfA,EAAS9oC,EAAO,QAEE,IAAlBA,EAAO7H,OACH2wC,EAAS9oC,EAAO,IAAI7H,SAAwD,IAA9CsH,OAAOC,KAAKopC,GAAU/uC,QAAQiG,EAAO,KAChB,IAA/C8oC,EAAS9oC,EAAO,IAAI,GAAGjG,QAAQ,aAAsE,IAAjD+uC,EAAS9oC,EAAO,IAAI,GAAGjG,QAAQ,aACnF+uC,EAAS9oC,EAAO,IAAI,GAAK8oC,EAAS9oC,EAAO,IAAI,GAAK,YAAmBA,EAAO,GAG5E8oC,EAAS9oC,EAAO,IAAI,GAAK8oC,EAAS9oC,EAAO,IAAI,GAAK,IAAMA,EAAO,GAInE8oC,EAAS9oC,EAAO,IAAIhK,KAAK,WAAagK,EAAO,QAGhD,CAID,IAAK,GAHDkpC,GAAM,WAAalpC,EAAOA,EAAO7H,OAAS,GAC1CgxC,EAAM,GACNC,EAAU,GACLlxC,EAAI,EAAGA,EAAI8H,EAAO7H,OAAS,EAAGD,IACnCixC,EAAMA,EAAM,WAAanpC,EAAO9H,GAAK,IACrCkxC,GAAoB,GAExB,IAAIC,GAAaF,EAAMD,EAAME,CAC7B,IAAIN,EAAS9oC,EAAO,IAAI7H,SAAwD,IAA9CsH,OAAOC,KAAKopC,GAAU/uC,QAAQiG,EAAO,KACnEyD,EAAM6lC,iBAAiBR,EAAS9oC,EAAO,KAAK,GAAO,CACnD,GAAIupC,GAAM9lC,EAAM6lC,iBAAiBR,EAAS9oC,EAAO,IACjD8oC,GAAS9oC,EAAO,IAAIupC,GAAOT,EAAS9oC,EAAO,IAAIupC,GAAOF,EAAWtxC,QAAQ,WAAY,SAGrF+wC,GAAS9oC,EAAO,IAAIhK,KAAKqzC,MAKrC5pC,OAAOC,KAAKopC,GAAU/lC,QAAQ,SAAU1M,IACF,IAA7B/B,EAAQyF,QAAQ1D,IACjB/B,EAAQ0B,KAAKK,KAGrB/B,EAAQyO,QAAQ,SAAU1M,GACtB0yC,EAAS1yC,GAAUA,IAAUyyC,GAAWzyC,EAAS,IAAMyyC,EAASzyC,GAAQqG,KAAK,KAAO,IAAMrG,IAE9FoJ,OAAOC,KAAKqpC,GAAUhmC,QAAQ,SAAUymC,GAAM,MAAOR,GAAMhzC,KAAK+yC,EAASS,MAClER,EAAMtsC,KAAK,MAEtBisC,EAAeh0C,UAAU20C,iBAAmB,SAAUnwC,EAAOiqC,GACzD,IAAK,GAAIlrC,GAAI,EAAGA,EAAIiB,EAAMhB,OAAQD,IAC9B,IAAqC,IAAjCiB,EAAMjB,GAAG6B,QAAQ,WACjB,QAAOqpC,GAAkBlrC,CAGjC,QAAOkrC,GAAmB,GAQ9BuF,EAAeh0C,UAAU80C,WAAa,SAAUC,GAE5C,MAAO,YADMA,EAAe9oC,IAAI,SAAU/L,GAAS,MAAOkwC,GAAae,SAASjxC,KAAW6H,KAAK,KAClE,MAOlCisC,EAAeh0C,UAAUgtC,SAAW,SAAU3qC,GAC1C,MAAOyoC,GAAO9qC,UAAUgtC,SAASvrC,KAAKxC,KAAMoD,EAAE0C,OAAO,SAAUuvC,GAAQ,OAA8B,IAAvBA,EAAKlvC,QAAQ,SAW/F4uC,EAAeh0C,UAAU2vC,WAAa,SAAU7iC,EAAI0gC,EAASqE,GACnC,SAAlBA,EAAShtC,MAAqC,QAAlBgtC,EAAShtC,MAAoC,UAAlBgtC,EAAShtC,MAChE2oC,EAAQY,QAAQ0D,IAAI,SAAU,yBAElCtE,EAAQY,QAAQ0D,IAAI,SAAU7yC,KAAKurC,QAAQ8F,SAkB/C0D,EAAeh0C,UAAU4qC,gBAAkB,SAAUv8B,EAAM3C,EAAIlH,EAAO4I,EAAKogC,EAASzB,GAGhF,GAAKyB,GAA4B,QAAjBA,EAAQ3oC,OAAoB5F,KAAK8yC,UAAY1jC,EAF9C,mBAEgEA,EAD9D,aACiF,CAC9F,GAAI2mC,GAAU3mC,EAHH,kBAGoBA,EAHpB,kBAGmCxH,MAAM,eAAiBwH,EAFxD,YAEyExH,MAAM,cAC5F5H,MAAK8yC,QAAUiD,EAAQ,GACvB/1C,KAAKgzC,kBAAoB+C,EAAQ,GAErC,GACIrK,GAAM6C,GAAWA,EAAe,QAChC4E,EAAgBtH,EAAO9qC,UAAUqyC,qBAAqB5wC,KAAKxC,KAAMoP,EAAM7J,EAAO4I,EAAKogC,EAASzB,EAChG,IAAIqG,EACA,MAAOA,EAEX,IAAI5oC,GAAQ,IAGRhF,IAASA,EAAMvD,kBAFH,gBAGKoN,GACb7E,EAAQ6E,EAJA,gBACE,UAKUA,KACpB7E,EAAQ6E,EANE,YASlBA,EAAQnL,oBAAkBmL,EAAKjN,OAAsBiN,EAAbA,EAAKjN,KAC7C,IAAIwE,KAIJ,OAHAA,GAAK4D,MAAQA,EACb5D,EAAK4E,OAAS6D,EACdpP,KAAK2vC,mBAAmBjE,EAAKt8B,EAAMzI,EAAM,KAAMpB,GACxC9D,EAASoN,OAAOtE,GAAS5D,EAAK4E,QAAWA,OAAQ5E,EAAK4E,OAAQhB,MAAOA,EAAOP,WAAYrD,EAAKqD,aAEjG+qC,GACT5D,GASE6E,EAA+B,SAAUnK,GAEzC,QAASmK,KACL,MAAkB,QAAXnK,GAAmBA,EAAOplC,MAAMzG,KAAM6G,YAAc7G,KA6L/D,MA/LA8qC,GAAUkL,EAAenK,GAIzBmK,EAAcj1C,UAAU6tC,cAAgB,WACpC,MAAO,iBAUXoH,EAAcj1C,UAAUmsC,OAAS,SAAUr/B,EAAIuB,EAAMnN,GACjD,OACI2D,KAAM,OACN0oC,IAAKzgC,EAAG49B,WAAW6C,IACnBl/B,KAAMO,KAAKC,UAAUR,KAY7B4mC,EAAcj1C,UAAUssC,OAAS,SAAUx/B,EAAIqgC,EAAU/rC,EAAOF,GAC5D,OACI2D,KAAM,SACN0oC,IAAKzgC,EAAG49B,WAAW6C,IAAM,IAAMnsC,EAC/BiN,KAAMO,KAAKC,UAAUzN,KAY7B6zC,EAAcj1C,UAAUqsC,OAAS,SAAUv/B,EAAIqgC,EAAU/rC,EAAOF,GAC5D,OACI2D,KAAM,MACN0oC,IAAKzgC,EAAG49B,WAAW6C,IACnBl/B,KAAMO,KAAKC,UAAUzN,KAG7B6zC,EAAcj1C,UAAU8rC,aAAe,SAAUh/B,EAAIi/B,EAAS1pC,GAC1D,GAAIyM,GAAQ7P,KACR8zC,EAAc1wC,EAAE6uC,KAAOxwC,EAAS4M,QAAQrO,KAAKurC,QAAQkG,UACrDnD,EAAMzgC,EAAG49B,WAAW6C,IAAInqC,QAAQ,OAAQ,IAAMnE,KAAKurC,QAAQgG,MAC/DnuC,GAAEkrC,IAAMtuC,KAAKgzC,kBAAoBhzC,KAAKgzC,kBAAoB5vC,EAAEkrC,GAmB5D,KAAK,GAlBDxgC,MAkBKxJ,EAAI,EAAGiF,EAAIujC,EAAQG,aAAa1oC,OAAQD,EAAIiF,EAAGjF,KAjB1C,SAAUA,EAAGiF,GACvBujC,EAAQG,aAAa99B,QAAQ,SAAU3K,EAAGglC,GACtC,GAAI4K,IACAC,OAAU,QACV/F,IAAO,SAAUl/B,EAAM9K,EAAGjE,GAAO,MAAO,IACxC+O,KAAQ,SAAUA,EAAM9K,GAAK,MAAOqL,MAAKC,UAAUR,EAAK9K,IAAM,QAElEwJ,GAAI1L,KAAK,KAAO0xC,GAChBhmC,EAAI1L,KAAK,kDAAmD,IAC5D0L,EAAI1L,KAAK,cAAqByL,EAAG49B,WAAWkF,WAAa9iC,EAAG49B,WAAWyE,SAAW9sC,EAAEkrC,KAC9E8F,EAAK9F,IAAIxB,EAAQG,aAAc3oC,EAAGlB,EAAE/C,KAAO,aACjDyN,EAAI1L,KAAK,iDACT0L,EAAI1L,KAAK,SAAW6zC,SAASC,MAC7BpoC,EAAI1L,KAAK,GAAIoC,EAAImL,KAAKC,UAAUpL,GAAK,OAKjCF,EAmBZ,KAAK,GAAIA,GAAI,EAAGiF,EAAIujC,EAAQK,eAAe5oC,OAAQD,EAAIiF,EAAGjF,KAjB5C,SAAUA,EAAGiF,GACvBujC,EAAQK,eAAeh+B,QAAQ,SAAU3K,EAAGglC,GACxC,GAAI4K,IACAC,OAAUxkC,EAAM07B,QAAQuG,WAAa,IACrCxD,IAAO,SAAUl/B,EAAM9K,EAAGjE,GAAO,MAAO,IACxC+O,KAAQ,SAAUA,EAAM9K,GAAK,MAAOqL,MAAKC,UAAUR,EAAK9K,IAAM,QAElEwJ,GAAI1L,KAAK,KAAO0xC,GAChBhmC,EAAI1L,KAAK,kDAAmD,IAC5D0L,EAAI1L,KAAK,aAAoByL,EAAG49B,WAAWoF,WAAahjC,EAAG49B,WAAWyE,SAAW9sC,EAAEkrC,KAC7E8F,EAAK9F,IAAIxB,EAAQK,eAAgB7oC,EAAGlB,EAAE/C,KAAO,aACnDyN,EAAI1L,KAAK,iDACT0L,EAAI1L,KAAK,SAAW6zC,SAASC,MAC7BpoC,EAAI1L,KAAK,GAAIoC,EAAImL,KAAKC,UAAUpL,GAAK,OAKjCF,EA+BZ,KAAK,GAAIA,GAAI,EAAGiF,EAAIujC,EAAQE,eAAezoC,OAAQD,EAAIiF,EAAGjF,KA7B5C,SAAUA,EAAGiF,GACvBujC,EAAQE,eAAe79B,QAAQ,SAAU3K,EAAGglC,GACxC,GAAI2M,IACAC,IAAO,UACP9H,IAAO,SAAUl/B,EAAM9K,EAAGjE,GACtB,GAAIiuC,GAAM7sC,EAASqG,UAAUzH,EAAK+O,EAAK9K,GACvC,OAAmB,gBAARgqC,IAAoB7sC,EAASqO,MAAMq5B,OAAOmF,GAC1C,IAAMA,EAERA,YAAe/F,MAEb,IADOn5B,EAAK9K,GAAGjE,GACDopC,SAGd,KAAO6E,EAAM,KAG5Bl/B,KAAQ,SAAUA,EAAM9K,GAAK,MAAO,IAExCwJ,GAAI1L,KAAK,KAAO0xC,GAChBhmC,EAAI1L,KAAK,kDAAmD,IAC5D0L,EAAI1L,KAAK,gBAAuByL,EAAG49B,WAAW0E,WAAatiC,EAAG49B,WAAWyE,SAAW9sC,EAAEkrC,KAChF6H,EAAM7H,IAAIxB,EAAQE,eAAgB1oC,EAAGlB,EAAE/C,KAAO,aACpDyN,EAAI1L,KAAK,iDACT0L,EAAI1L,KAAK,SAAW6zC,SAASC,MAC7BpoC,EAAI1L,KAAK,GAAIoC,EAAImL,KAAKC,UAAUpL,GAAK,OAKjCF,EAGZ,OADAwJ,GAAI1L,KAAK,KAAO0xC,EAAc,KAAM,KAEhCluC,KAAM,OACN0oC,IAAKA,EACLS,YAAa,6BAA+B+E,EAC5C1kC,KAAMtB,EAAIhF,KAAK,UAYvBktC,EAAcj1C,UAAU2vC,WAAa,SAAU7iC,EAAI0gC,EAASqE,GACxDrE,EAAQY,QAAQ0D,IAAI,SAAU,mDAkBlCmD,EAAcj1C,UAAU4qC,gBAAkB,SAAUv8B,EAAM3C,EAAIlH,EAAO4I,EAAKogC,EAASzB,GAC/E,GACIpB,GAAM6C,GAAWA,EAAe,QAChChkC,EAAQ,KACR5D,IACJ,IAAI4nC,GAA0C,SAA/BA,EAAQ3oC,KAAK3C,cAA0B,CAClD,GAAIowC,GAAellC,GAAOogC,EAAQ+E,aAAanE,QAAQC,IAAI,sBACvDmE,EAAWF,GAAgB1mC,SAAS0mC,EAAc,KAAQ,CAC1D9tC,IAASA,EAAMvD,kBACVP,EAASoN,OAAOO,EAAKinC,SACtB9rC,EAAQ6E,EAAKinC,QAGjB9C,EAAU,GAAKnkC,EAAKknC,QACpBlnC,EAAOA,EAAKknC,OAEhB3vC,EAAK4D,MAAQA,EACb5D,EAAK4E,OAAS6D,EACdpP,KAAK2vC,mBAAmBjE,EAAKt8B,EAAMzI,EAAM,KAAMpB,GAGnD,MADAoB,GAAK4E,OAAS5E,EAAK4E,QAAU6D,EACtB3N,EAASoN,OAAOtE,GAAS5D,EAAK4E,QAAWA,OAAQ5E,EAAK4E,OAAQhB,MAAO5D,EAAK4D,MAAOP,WAAYrD,EAAKqD,aAEtGgsC,GACT7E,GAOEoF,EAAkC,SAAU1K,GAE5C,QAAS0K,KACL,MAAkB,QAAX1K,GAAmBA,EAAOplC,MAAMzG,KAAM6G,YAAc7G,KAoC/D,MAtCA8qC,GAAUyL,EAAkB1K,GAc5B0K,EAAiBx1C,UAAU+qC,aAAe,SAAUj+B,EAAItI,EAAO6oC,GAC3D,GAAIzkC,IAAM,GAAIwkC,IAAarC,aAAaj+B,EAAItI,EAAO6oC,GAE/Ch/B,EAAO3N,EAASqO,MAAMC,UAAUpG,EAAW,MAC3C4B,IAEJ,IAAI6D,EAAKonC,MACL,IAAK,GAAIlyC,GAAI,EAAGA,EAAI8K,EAAKonC,MAAMjyC,OAAQD,IAAK,CACxC,GAAIkyC,GAAQpnC,EAAKonC,MAAMlyC,GACnBjE,EAAMwL,OAAOC,KAAK0qC,GAAO,EAC7BjrC,GAAOlL,GAAOm2C,EAAMn2C,GAG5BkL,EAAY,MAAI6D,CAGhB,QACIA,KAAMO,KAAKC,UAAUrE,GACrB+iC,IAAK3kC,EAAO,IACZmlC,QAASnlC,EAAW,QACpB/D,KAAM,OACNmpC,YAAa,oCAGdwH,GACTpI,GAQEsI,EAAmC,SAAU5K,GAK7C,QAAS4K,KACL,GAAI5mC,GAAQg8B,EAAOrpC,KAAKxC,OAASA,IAEjC,OADA6J,YAAS,aAAcskC,EAAWptC,UAAU2vC,WAAY7gC,GACjDA,EAqGX,MA5GAi7B,GAAU2L,EAAmB5K,GAS7B4K,EAAkB11C,UAAUmsC,OAAS,SAAUr/B,EAAIuB,EAAMnN,EAAWsD,EAAOyoC,GAGvE,MAFAhuC,MAAK0rC,IAAIsC,SAAWA,EACpBhuC,KAAK8xC,WAAa,OAEdxD,IAAKzgC,EAAG49B,WAAWkF,WAAa9iC,EAAG49B,WAAWyE,SAAWriC,EAAG49B,WAAW6C,IACvEl/B,KAAMO,KAAKC,UAAUygC,aACjBluC,MAAOiN,EACPqhC,MAAOxuC,EACPstC,OAAQ,UACT9tC,EAASkM,aAAa3N,KAAM6N,EAAItI,OAG3CkxC,EAAkB11C,UAAUssC,OAAS,SAAUx/B,EAAIqgC,EAAUpjC,EAAK7I,EAAWsD,GAEzE,MADAsmC,GAAO9qC,UAAUssC,OAAO7qC,KAAKxC,KAAM6N,EAAIqgC,EAAUpjC,IAE7ClF,KAAM,OACN0oC,IAAKzgC,EAAG49B,WAAW0E,WAAatiC,EAAG49B,WAAWyE,SAAWriC,EAAG49B,WAAW6C,IACvEl/B,KAAMO,KAAKC,UAAUygC,aACjBhwC,IAAKyK,EACL8lC,UAAW1C,EACXuC,MAAOxuC,EACPstC,OAAQ,UACT9tC,EAASkM,aAAa3N,KAAM6N,EAAItI,OAG3CkxC,EAAkB11C,UAAUqsC,OAAS,SAAUv/B,EAAIqgC,EAAUpjC,EAAK7I,EAAWsD,GAGzE,MAFAvF,MAAK8xC,WAAa,SAClB9xC,KAAK02C,UAAYxI,GAEbtoC,KAAM,OACN0oC,IAAKzgC,EAAG49B,WAAWoF,WAAahjC,EAAG49B,WAAWyE,SAAWriC,EAAG49B,WAAW6C,IACvEl/B,KAAMO,KAAKC,UAAUygC,aACjBluC,MAAO2I,EACPykC,OAAQ,SACRqB,UAAW1C,EACX7tC,IAAKyK,EAAIojC,GACTuC,MAAOxuC,GACRR,EAASkM,aAAa3N,KAAM6N,EAAItI,OAG3CkxC,EAAkB11C,UAAU4qC,gBAAkB,SAAUv8B,EAAM3C,EAAIlH,EAAO4I,EAAKogC,EAASzB,EAAS1pC,GAC5F,GAAIkB,EAUJ,IARA8K,EAA0B,WADZm/B,EAAU5+B,KAAKG,MAAMy+B,EAAQn/B,MAAQA,GACpCmgC,OAAqB9tC,EAASqO,MAAMC,UAAUX,GAAQA,EAC7C,QAApBpP,KAAK8xC,YACLjG,EAAO9qC,UAAUmsC,OAAO1qC,KAAKxC,KAAMyM,EAAI2C,EAAM,KAAM,KAAMpP,KAAK0rC,IAAIsC,UAE9C,WAApBhuC,KAAK8xC,YACLjG,EAAO9qC,UAAUqsC,OAAO5qC,KAAKxC,KAAMyM,EAAIzM,KAAK02C,UAAWtnC,GAE3DpP,KAAK8xC,eAAajqC,GACduH,EAAKmhC,MACL,IAAKjsC,EAAI,EAAGA,EAAI8K,EAAKmhC,MAAMhsC,OAAQD,IAC/BunC,EAAO9qC,UAAUmsC,OAAO1qC,KAAKxC,KAAMyM,EAAI2C,EAAKmhC,MAAMjsC,GAG1D,IAAI8K,EAAKkhC,QACL,IAAKhsC,EAAI,EAAGA,EAAI8K,EAAKkhC,QAAQ/rC,OAAQD,IACjCunC,EAAO9qC,UAAUqsC,OAAO5qC,KAAKxC,KAAMyM,EAAIrJ,EAAE/C,IAAK+O,EAAKkhC,QAAQhsC,GAGnE,IAAI8K,EAAKohC,QACL,IAAKlsC,EAAI,EAAGA,EAAI8K,EAAKohC,QAAQjsC,OAAQD,IACjCunC,EAAO9qC,UAAUssC,OAAO7qC,KAAKxC,KAAMyM,EAAIrJ,EAAE/C,IAAK+O,EAAKohC,QAAQlsC,GAGnE,OAAO8K,IAaXqnC,EAAkB11C,UAAU8rC,aAAe,SAAUh/B,EAAIi/B,EAAS1pC,EAAGmC,EAAOyqC,GACxE,OACIpqC,KAAM,OACN0oC,IAAKzgC,EAAG49B,WAAWwE,UAAYpiC,EAAG49B,WAAWyE,SAAWriC,EAAG49B,WAAW6C,IACtES,YAAa,kCACbqB,SAAU,OACVhhC,KAAMO,KAAKC,UAAUygC,aACjBC,QAASxD,EAAQK,eACjBoD,MAAOzD,EAAQG,aACfuD,QAAS1D,EAAQE,eACjBuC,OAAQ,QACRkB,MAAOrtC,EAAEkrC,IACTjuC,IAAK+C,EAAE/C,KACRoB,EAASkM,aAAa3N,KAAM6N,EAAItI,OAG3CkxC,EAAkB11C,UAAUmB,UAAY,SAAUqpC,IAC9B,GAAI4C,IACVjsC,UAAUqpC,IAEjBkL,GACT7K,GAOE+K,EAAmC,SAAU9K,GAE7C,QAAS8K,GAAkBvF,GACvB,GAAIvhC,GAAQg8B,EAAOrpC,KAAKxC,OAASA,IAUjC,OARA6P,GAAM07B,QAAU8E,YAAWxgC,EAAM07B,SAC7BqL,QAAS,GAAIC,UACbC,UAAW,GAAID,UACfE,aAAc,GAAIF,UAClBG,aAAc,GAAIH,UAClBI,YAAa,GAAIJ,YAErBxG,SAAOxgC,EAAM07B,QAAS6F,OACfvhC,EAKX,MAjBAi7B,GAAU6L,EAAmB9K,GAc7B8K,EAAkB51C,UAAU6tC,cAAgB,WACxC,MAAO,qBAEJ+H,GACTxI,GAQE+I,EAAgC,SAAUrL,GAE1C,QAASqL,GAAe3L,GACpB,GAAI17B,GAAQg8B,EAAOrpC,KAAKxC,OAASA,IASjC,OARA6P,GAAMsnC,IAAM5L,EACZ17B,EAAMunC,OAASvnC,EAAMsnC,IAAIE,SACzBxnC,EAAMtK,MAAQsK,EAAMsnC,IAAI5xC,MAGxBsK,EAAMynC,aAAeznC,EAAMsnC,IAAIG,aAAeznC,EAAMsnC,IAAIG,aAAe,aAEvEznC,EAAM0nC,SAAW,WAAc,MAAO1nC,GAAMtK,OACrCsK,EAsHX,MAjIAi7B,GAAUoM,EAAgBrL,GAa1BqL,EAAen2C,UAAU6tC,cAAgB,WACrC,MAAO,kBAUXsI,EAAen2C,UAAU+qC,aAAe,SAAU0L,EAAajyC,GAC3D,GAAIkyC,GAAW5L,EAAO9qC,UAAU+qC,aAAarlC,MAAMzG,KAAM6G,WACrDgH,EAAK8B,KAAKG,MAAM2nC,EAASroC,MAIzBrL,MAFQ,OAAQ,OAAQ,SAAU,QAAS,SAAU,QACrD,SAAU,iBAAkB,aAAc,UAGzC+B,OAAO,SAAU1C,GAClBW,EAAKX,GAFC,oBAEQ+C,QAAQ/C,IAAM,EAAIuM,KAAKC,UAAU/B,EAAGzK,IAAMyK,EAAGzK,IAE/D,IAAIs0C,GAAO13C,KAAKs3C,kBAEhBI,GAAkB,YAAI3zC,CACtB,IAAIqL,GAAOO,KAAKC,WACZrK,MAAOvF,KAAKu3C,WACZI,UAAWD,GAGf,OADAD,GAASroC,KAAOA,EACTqoC,GAkBXP,EAAen2C,UAAU4qC,gBAAkB,SAAUiM,EAASnrC,EAAIlH,EAAO4I,EAAKogC,GAC1E,GACIhkC,GACAP,EAFA5D,EAAMwxC,EAGNrsC,EAASnD,WAASpI,KAAKo3C,OAAO7rC,OAAQnF,EAAIgJ,KAC1CpP,MAAKo3C,OAAO7sC,QACZA,EAAQnC,WAASpI,KAAKo3C,OAAO7sC,MAAOnE,EAAIgJ,OAExCpP,KAAKo3C,OAAOptC,aACZA,EAAa5B,WAASpI,KAAKo3C,OAAOptC,WAAY5D,EAAIgJ,MAClDpF,EAAc/F,oBAAkB+F,GAAqDA,EAAvCvI,EAASqO,MAAMC,UAAU/F,GAE3E,IAAI0hC,GAAM6C,EAAQO,YACdnoC,GAAS4E,OAAQA,EAAQvB,WAAYA,GACrCoF,EAAOzI,CAIX,OAHI+kC,IAAOA,EAAI8C,QAAU9C,EAAI8C,OAAOjqC,QAChCvE,KAAK2vC,mBAAmBjE,EAAKt8B,EAAMzI,EAAM,KAAMpB,GAE3CtB,oBAAkBsG,GAAyE5D,EAAK4E,QAAnEA,OAAQ5E,EAAK4E,OAAQhB,MAAOA,EAAOP,WAAYA,IAKxFktC,EAAen2C,UAAUmsC,OAAS,WAC9B,GAAI2K,GAAWhM,EAAO9qC,UAAUmsC,OAAOzmC,MAAMzG,KAAM6G,UACnD,OAAO7G,MAAK83C,iBAAiBD,EAAU,WAK3CX,EAAen2C,UAAUqsC,OAAS,WAC9B,GAAIyK,GAAWhM,EAAO9qC,UAAUqsC,OAAO3mC,MAAMzG,KAAM6G,UACnD,OAAO7G,MAAK83C,iBAAiBD,EAAU,WAK3CX,EAAen2C,UAAUssC,OAAS,WAC9B,GAAIwK,GAAWhM,EAAO9qC,UAAUssC,OAAO5mC,MAAMzG,KAAM6G,UACnD,OAAO7G,MAAK83C,iBAAiBD,EAAU,WAa3CX,EAAen2C,UAAU8rC,aAAe,SAAUh/B,EAAIi/B,EAAS1pC,EAAGmC,EAAOyqC,GACrE,GAAIuB,GAAQ1F,EAAO9qC,UAAU8rC,aAAapmC,MAAMzG,KAAM6G,WAElDkxC,EAAQpoC,KAAKG,MAAMyhC,EAAMniC,KAG7B,OAFA2oC,GAAM13C,IAAM+C,EAAE/C,IACdkxC,EAAMniC,KAAOO,KAAKC,UAAUmoC,GACrB/3C,KAAK83C,iBAAiBvG,EAAO,UAExC2F,EAAen2C,UAAU+2C,iBAAmB,SAAUE,EAAUzI,GAC5D,GAAI0I,GAAStoC,KAAKG,MAAMkoC,EAAS5oC,KAKjC,OAJA4oC,GAAS5oC,KAAOO,KAAKC,WACjBrK,MAAOvF,KAAKm3C,IAAIe,YAAY3I,GAC5BoI,UAAWM,IAERD,GAEJd,GACT/I,GAQEgK,EAA8B,SAAUtM,GAaxC,QAASsM,GAAa5qC,EAAS6qC,EAAWtzC,GACtC,GAAI+K,GAAQg8B,EAAOrpC,KAAKxC,OAASA,IACjC6P,GAAMwoC,cAAe,EACrBxoC,EAAMyoC,gBAAiB,EAClBr0C,oBAAkBsJ,KACnBsC,EAAM0oC,aAAehrC,GAEzBsC,EAAM/K,SAAWA,EACjB+K,EAAM2oC,OAAS/2C,EAAS4M,QAAQ,eAChC,IAAI1E,IAAQmC,QAAUonC,WACtB9kC,QAAOqqC,aAAaC,QAAQ7oC,EAAM2oC,OAAQ7oC,KAAKC,UAAUjG,GACzD,IAAIsoC,GAAOpiC,EAAM2oC,MAqBjB,OApBKv0C,qBAAkBm0C,IACnBO,YAAY,WAGR,IAAK,GAFDvpC,GAAO3N,EAASqO,MAAMC,UAAU3B,OAAOqqC,aAAaG,QAAQ3G,IAC5D4G,KACKv0C,EAAI,EAAGA,EAAI8K,EAAK8jC,QAAQ3uC,OAAQD,IAAK,CAC1C,GAAIw0C,IAAe,GAAIvQ,MACnBwQ,GAAe,GAAIxQ,MAAKn5B,EAAK8jC,QAAQ5uC,GAAG8zC,UAC5ChpC,GAAK8jC,QAAQ5uC,GAAG8zC,UAAYU,EAAcC,EACtCD,EAAcC,EAAcX,GAC5BS,EAAOz2C,KAAKkC,GAGpB,IAASA,EAAI,EAAGA,EAAIu0C,EAAOt0C,OAAQD,IAC/B8K,EAAK8jC,QAAQjF,OAAO4K,EAAOv0C,GAAI,GAC/B8K,EAAKtD,KAAKmiC,OAAO4K,EAAOv0C,GAAI,EAEhC8J,QAAOqqC,aAAaO,WAAW/G,GAC/B7jC,OAAOqqC,aAAaC,QAAQzG,EAAMtiC,KAAKC,UAAUR,KAClDgpC,GAEAvoC,EA2KX,MAvNAi7B,GAAUqN,EAActM,GAsDxBsM,EAAap3C,UAAUk4C,YAAc,SAAU3K,EAAK/oC,GAChD,GAAInF,GAAUJ,KAAKquC,gBAAgB9oC,GAC/BU,EAAUnG,EAAMkG,iBAAiBT,EAAMnF,SAAU,WAAY,SAAU,SAAU,SAAU,YAC3FC,EAAMiuC,CACC,WACCroC,KACR5F,GAAO4F,EAAY,OAAEpB,WAEzBzE,EAAQ0D,MAAMqL,QAAQ,SAAUxF,GAC5BtJ,GAAOsJ,EAAIvG,EAAES,UAAY8F,EAAIvG,EAAER,YAEnCxC,EAAQouC,OAAOr/B,QAAQ,SAAUxF,GAC7BtJ,GAAOsJ,EAAIvG,EAAER,YAEjBxC,EAAQsuC,SAASv/B,QAAQ,SAAUxF,GAC/BtJ,GAAOsJ,EAAIvG,EAAEE,WAEjB,KAAK,GAAIwC,GAAS,EAAGA,EAAS1F,EAAQquC,QAAQlqC,OAAQuB,IAAU,CAC5D,GAAIozC,GAAgB94C,EAAQquC,QAAQ3oC,EACpC,IAAIozC,EAAc91C,EAAEiD,UAAW,CAC3B,GAAI8yC,GAAW5zC,EAAM3D,OACrBu3C,GAAS/4C,UACT,KAAK,GAAIkE,GAAI,EAAGA,EAAI40C,EAAc91C,EAAEoD,WAAWjC,OAAQD,IACnD60C,EAAS/4C,QAAQgC,MAAOC,GAAI,UAAWe,EAAG81C,EAAc91C,EAAEoD,WAAWlC,GAAIwB,OAAQP,EAAMnF,QAAQ0F,QAEnGzF,IAAO64C,EAAc91C,EAAEmD,UAAYvG,KAAKi5C,YAAY3K,EAAK6K,OAGzD94C,IAAO64C,EAAc91C,EAAEnC,MAAQi4C,EAAc91C,EAAEP,SAAWq2C,EAAc91C,EAAEjB,MAGlF,MAAO9B,IAYX83C,EAAap3C,UAAU+qC,aAAe,SAAUj+B,EAAItI,EAAO6oC,GACvD,GAAI/tC,GAAML,KAAKi5C,YAAYprC,EAAG49B,WAAW6C,IAAK/oC,GAC1C6zC,EAAc33C,EAASqO,MAAMC,UAAU3B,OAAOqqC,aAAaG,QAAQ54C,KAAKw4C,SACxEppC,EAAOgqC,EAAcA,EAAYlG,QAAQkG,EAAYttC,KAAK3F,QAAQ9F,IAAQ,IAC9E,OAAY,OAAR+O,GAAiBpP,KAAKq4C,cAAiBr4C,KAAKs4C,gBAGhDt4C,KAAKq4C,aAAe,KACpBr4C,KAAKs4C,eAAiB,KAEft4C,KAAKu4C,aAAazM,aAAarlC,MAAMzG,KAAKu4C,gBAAiBz2C,MAAMU,KAAKqE,UAAW,KAL7EuI,GAwBf+oC,EAAap3C,UAAU4qC,gBAAkB,SAAUv8B,EAAM3C,EAAIlH,EAAO4I,EAAKogC,EAASzB,GAC9E,GAAI9sC,KAAKs4C,gBAAmB/J,GAAWvuC,KAAKu4C,aAAahN,QAAQgG,OAC7D9vC,EAASyC,SAASqqC,EAAQD,IAAKtuC,KAAKu4C,aAAahN,QAAQgG,QAAyC,SAA/BhD,EAAQ3oC,KAAK3C,cAChF,MAAOjD,MAAKu4C,aAAa5M,gBAAgBv8B,EAAM3C,EAAIlH,EAAO4I,EAAKogC,EAASzB,EAG5E19B,GAAOpP,KAAKu4C,aAAa5M,gBAAgBllC,MAAMzG,KAAKu4C,gBAAiBz2C,MAAMU,KAAKqE,UAAW,GAE3F,IAAIxG,GAAMkF,EAAQvF,KAAKi5C,YAAYxsC,EAAGg/B,WAAW6C,IAAK/oC,GAASkH,EAAGg/B,WAAW6C,IACzE3kC,KAEA0D,GADJ1D,EAAMlI,EAASqO,MAAMC,UAAU3B,OAAOqqC,aAAaG,QAAQ54C,KAAKw4C,UAChD1sC,KAAK3F,QAAQ9F,EAM7B,MALe,IAAXgN,IACA1D,EAAIupC,QAAQjF,OAAO5gC,EAAO,GAC1B1D,EAAImC,KAAKmiC,OAAO5gC,EAAO,IAE3B1D,EAAIupC,QAAQvpC,EAAImC,KAAK1J,KAAK/B,GAAO,IAAOyL,KAAMzL,EAAKkL,OAAQ6D,EAAK7D,OAAQ6sC,UAAW,GAAI7P,MAAQh+B,MAAO6E,EAAK7E,OACpGZ,EAAIupC,QAAQ3uC,OAASvE,KAAK8E,UAC7B6E,EAAIupC,QAAQjF,OAAO,EAAG,GACtBtkC,EAAImC,KAAKmiC,OAAO,EAAG,EAGvB,OADA7/B,QAAOqqC,aAAaC,QAAQ14C,KAAKw4C,OAAQ7oC,KAAKC,UAAUjG,IACjDyF,GAUX+oC,EAAap3C,UAAU2vC,WAAa,SAAU7iC,EAAI0gC,EAASqE,IAClD3uC,oBAAkBjE,KAAKu4C,aAAahN,QAAQgG,QAAU9vC,EAASyC,SAAS0uC,EAAStE,IAAKtuC,KAAKu4C,aAAahN,QAAQgG,QAC9E,SAAhCqB,EAAShtC,KAAK3C,eACjBsrC,EAAQY,QAAQ0D,IAAI,SAAU7yC,KAAKu4C,aAAahN,QAAQ+F,iBAEvDzjC,EAAG49B,WAAW4N,aACf9K,EAAQY,QAAQ0D,IAAI,SAAU7yC,KAAKu4C,aAAahN,QAAQ8F,SAWhE8G,EAAap3C,UAAUqsC,OAAS,SAAUv/B,EAAIqgC,EAAU/rC,EAAOF,GAE3D,MADAjC,MAAKq4C,cAAe,EACbr4C,KAAKu4C,aAAanL,OAAOv/B,EAAIqgC,EAAU/rC,EAAOF,IAUzDk2C,EAAap3C,UAAUmsC,OAAS,SAAUr/B,EAAIuB,EAAMnN,GAEhD,MADAjC,MAAKs4C,gBAAiB,EACft4C,KAAKu4C,aAAarL,OAAOr/B,EAAIuB,EAAMnN,IAW9Ck2C,EAAap3C,UAAUssC,OAAS,SAAUx/B,EAAIqgC,EAAU/rC,EAAOF,GAE3D,MADAjC,MAAKq4C,cAAe,EACbr4C,KAAKu4C,aAAalL,OAAOx/B,EAAIqgC,EAAU/rC,EAAOF,IAUzDk2C,EAAap3C,UAAU8rC,aAAe,SAAUh/B,EAAIi/B,EAAS1pC,GACzD,MAAOpD,MAAKu4C,aAAa1L,aAAah/B,EAAIi/B,EAAS1pC,IAEhD+0C,GACThK,GC/sFE3+B,EAA6B,WAY7B,QAASA,GAAYi8B,EAAYlmC,EAAOgI,GACpC,GAAIsC,GAAQ7P,IAEZA,MAAKqoC,WAAY,EAEjBroC,KAAKyQ,kBAAmB,EACxBzQ,KAAKs5C,gBACLt5C,KAAKu5C,eAAgB,EACrBv5C,KAAKsvC,YACLtvC,KAAKu5C,eAAgB,EAChB9N,GAAezrC,KAAKyrC,aACrBA,MAEJl+B,EAAUA,GAAWk+B,EAAWl+B,QAC5Bk+B,IAA8C,IAAhCA,EAAWh7B,mBACzBzQ,KAAKyQ,iBAAmBg7B,EAAWh7B,iBAEvC,IAAIrB,EAoFJ,OAnFIq8B,aAAsBjrC,OACtB4O,GACIhI,KAAMqkC,EACN+N,SAAS,GAGc,gBAAf/N,IACPA,EAAWrkC,OACZqkC,EAAWrkC,SAEVqkC,EAAWgO,oBACZhO,EAAWgO,mBAAoB,GAE9BhO,EAAWiO,KACZjO,EAAWiO,GAAK,IAEfjO,EAAWkO,kBACZlO,EAAWkO,oBAEfvqC,GACIk/B,IAAK7C,EAAW6C,IAChBqC,UAAWlF,EAAWkF,UACtBR,UAAW1E,EAAW0E,UACtBU,UAAWpF,EAAWoF,UACtBX,QAASzE,EAAWyE,QACpBD,SAAUxE,EAAWwE,SACrB7oC,KAAMqkC,EAAWrkC,KACjB+nC,QAAS1D,EAAW0D,QACpBkC,OAAQ5F,EAAW4F,OACnBjiC,KAAMq8B,EAAWr8B,KACjBwqC,mBAAoBnO,EAAWmO,mBAC/BC,gBAAiBpO,EAAWoO,gBAC5BC,cAAerO,EAAWqO,cAC1BtO,YAAaC,EAAWD,YACxBnrC,IAAKorC,EAAWprC,IAChBg5C,YAAa5N,EAAW4N,YACxBU,MAAOtO,EAAWsO,MAClB3J,SAAU3E,EAAW2E,SACrBoJ,YAAgC3xC,KAAvB4jC,EAAW+N,QAAwB/N,EAAW+N,UACjD/N,EAAWl+B,kBAAmBkpC,IAAqBhL,EAAWl+B,kBAAmBopC,MACvElL,EAAW6C,IAC3BkF,eAAgB/H,EAAW+H,eAC3BiG,kBAAmBhO,EAAWgO,kBAC9BC,GAAIjO,EAAWiO,GACfC,gBAAiBlO,EAAWkO,kBAIhCl4C,EAASC,WAAW,sCAEImG,KAAxBuH,EAAKokC,gBAAiC/xC,EAASyM,WAC/CkB,EAAKokC,iBAAiBvvC,oBAAkBmL,EAAKiqC,cAAsBjqC,EAAKiqC,iBAEtDxxC,KAAlBuH,EAAKghC,WACLhhC,EAAKghC,SAAW,QAEpBpwC,KAAKyrC,WAAar8B,EAClBpP,KAAKg6C,aAAez0C,EAChBvF,KAAKyrC,WAAWgO,mBAAqBz5C,KAAKyrC,WAAWiO,IACrDtrC,OAAO6rC,iBAAiB,SAAUj6C,KAAKk6C,eAAeC,KAAKn6C,OAE3DoP,EAAKk/B,KAAOl/B,EAAKoqC,UAAYpqC,EAAKhI,KAAK7C,QACvCvE,KAAKo6C,iBAAkB,EACvBp6C,KAAKuN,QAAUA,GAAW,GAAI4jC,GAC9BnxC,KAAKyrC,WAAW+N,SAAU,EAC1Bx5C,KAAKq6C,MAAQr6C,KAAKwB,aAAa+D,GAAS,GAAIzF,IAC5CE,KAAKq6C,MAAMC,KAAK,SAAUl3C,GACtByM,EAAM47B,WAAW+N,SAAU,EAC3B3pC,EAAMuqC,iBAAkB,EACxBhrC,EAAKhI,KAAOhE,EAAEmI,OACdsE,EAAMtC,QAAU,GAAIq+B,MAIxB5rC,KAAKuN,QAAU6B,EAAKoqC,QAAU,GAAI5N,GAAgB,GAAIuF,IAErD/hC,EAAK2qC,OAAS/5C,KAAKuN,kBAAmB4jC,KACvC/hC,EAAK2qC,MAAQ,YAEjB/5C,KAAKuN,QAAUA,GAAWvN,KAAKuN,QAC3B6B,EAAK0qC,gBACL95C,KAAKuN,QAAU,GAAI4qC,GAAan4C,KAAKuN,QAAS6B,EAAKwqC,mBAAoBxqC,EAAKyqC,kBAEzE75C,KAghBX,MAzgBAwP,GAAYzO,UAAUw5C,iBAAmB,SAAUb,GAC/C,GAAIc,GAAgB/B,aAAaG,QAAQc,GAAM15C,KAAKyrC,WAAWiO,GAC/D,OAAO/pC,MAAKG,MAAM0qC,IAStBhrC,EAAYzO,UAAUm5C,eAAiB,SAAU92C,EAAGs2C,EAAIe,GACpDhC,aAAaC,QAAQgB,GAAM15C,KAAKyrC,WAAWiO,GAAI/pC,KAAKC,UAAU6qC,GAAez6C,KAAKs5C,gBAEtF9pC,EAAYzO,UAAU25C,gBAAkB,SAAUn1C,GAC9C,GAAIsK,GAAQ7P,KACR26C,EAAiB36C,KAAKu6C,kBAC1B,IAAIv6C,KAAKu5C,eAAiBoB,GAAkB9uC,OAAOC,KAAK6uC,GAAgBp2C,OAAQ,CAC5EvE,KAAKs5C,aAAeqB,EACpB36C,KAAKs5C,aAAal5C,QAAUJ,KAAKs5C,aAAal5C,QAAQ0F,OAAO,SAAUP,GACnE,GAAIsK,EAAM47B,WAAWkO,iBAAmB9pC,EAAM47B,WAAWkO,gBAAgBp1C,QACjEgB,EAAMlD,IAAMwN,EAAM47B,WAAWkO,gBAAgBiB,KAAK,SAAUC,GAAW,MAAOt1C,GAAMlD,KAAOw4C,IAC3F,OAAO,CAGf,IAAiB,YAAbt1C,EAAMlD,GAAkB,CACxB,GAAIe,GAAImC,EAAMnC,CACd,IAAIA,GAAKA,EAAEiD,WAAajD,EAAEoD,qBAAsBhG,OAAO,CACnD,GAAIs6C,GAAgB13C,EAAEoD,WAAWwG,IAAI,SAAU+tC,GAC3C,GAAIA,EAAav0C,YAAcu0C,EAAav0C,qBAAsBhG,OAAO,CAErE,GAAIw6C,GAAmBD,EAAav0C,WAAWwG,IAAI,SAAUiuC,GACzD,GAAIh6C,GAAQg6C,EAAgBh6C,MAAO4B,EAAWo4C,EAAgBp4C,SAAUV,EAAQ84C,EAAgB94C,MAAOW,EAAam4C,EAAgBn4C,WAAYC,EAAek4C,EAAgBl4C,aAAcC,EAAYi4C,EAAgBj4C,SACzN,OAAO,IAAIG,GAAUlC,EAAO4B,EAAUV,EAAOW,EAAYC,EAAcC,IAE3E,OAAkC,QAA3B+3C,EAAax0C,UAAsBpD,EAAUuD,IAAIs0C,GAAoB73C,EAAU6D,GAAGg0C,GAIzF,GAAI/5C,GAAQ85C,EAAa95C,MAAO4B,EAAWk4C,EAAal4C,SAAUV,EAAQ44C,EAAa54C,MAAOW,EAAai4C,EAAaj4C,WAAYC,EAAeg4C,EAAah4C,aAAcC,EAAY+3C,EAAa/3C,SACvM,OAAO,IAAIG,GAAUlC,EAAO4B,EAAUV,EAAOW,EAAYC,EAAcC,IAG/EuC,GAAMnC,EAAI,GAAID,GAAU23C,EAAc,GAAI13C,EAAEmD,UAAWu0C,EAAch5C,MAAM,KAGnF,OAAO,GAEX,IAAIq3C,GAAW9I,SAAO,GAAIvwC,GAASE,KAAKs5C,aAExC,OADAt5C,MAAKu5C,eAAgB,IAMrB,MAFAv5C,MAAKs5C,aAAe/zC,EACpBvF,KAAKu5C,eAAgB,EACdh0C,GAQfiK,EAAYzO,UAAUm6C,gBAAkB,SAAU31C,GAE9C,MADAvF,MAAKg6C,aAAez0C,EACbvF,MAOXwP,EAAYzO,UAAUY,aAAe,SAAU4D,GACtCvF,KAAKg6C,cAAkBz0C,YAAiBzF,IACzC2B,EAASC,WAAW,iEAEnB1B,KAAKyrC,WAAWrkC,MACjB3F,EAASC,WAAW,mEAEpB1B,KAAKyrC,WAAWgO,mBAAqBz5C,KAAKyrC,WAAWiO,KACrDn0C,EAAQvF,KAAK06C,gBAAgBn1C,IAEjCA,EAAQA,GAASvF,KAAKg6C,YACtB,IAAIzuC,GAASvL,KAAKuN,QAAQu+B,aAAa9rC,KAAMuF,EAC7C,IAAIA,EAAMtF,SAAU,CAChB,GAAIF,GAAOwF,EAAMtF,SAASM,UACtB6K,EAAS7F,EAAMtF,SAASQ,QACxB2F,EAAMb,EAAMvD,gBAAkBuJ,EAAOA,OACrCA,CACAH,IAAUA,YAAkB5K,QAC5BiB,EAASyJ,eAAe3F,EAAMtF,SAASK,KAAMP,EAAMqG,EAAKgF,EAAQ7F,EAAMtF,SAASI,IAEnF,KAAK,GAAImE,GAAI,EAAGA,EAAI4B,EAAI7B,OAAQC,IACxB4B,EAAI5B,GAAGzE,YAAiBS,SACxB4F,EAAI5B,GAAK6rC,eAAejqC,EAAI5B,IAC5B4B,EAAI5B,GAAGzE,GAAQC,KAAKuN,QAAQo+B,gBAAgBpmC,EAAMtF,SAASiB,MAAM,GAAIsO,GAAYpJ,EAAI5B,GAAGzE,GAAM+B,MAAM,KAAKH,eAAgB3B,KAAMuF,IAI3I,MAAOvF,MAAKuN,QAAQo+B,gBAAgBpgC,EAAQvL,KAAMuF,IAWtDiK,EAAYzO,UAAUS,aAAe,SAAU+D,EAAOlE,EAAMC,EAAMC,GAC9D,GAAIsO,GAAQ7P,IAERA,MAAKyrC,WAAWgO,mBAAqBz5C,KAAKyrC,WAAWiO,KACrDn0C,EAAQvF,KAAK06C,gBAAgBn1C,IAEZ,kBAAVA,KACPhE,EAASD,EACTA,EAAOD,EACPA,EAAOkE,EACPA,EAAQ,MAEPA,IACDA,EAAQvF,KAAKg6C,cAEXz0C,YAAiBzF,IACnB2B,EAASC,WAAW,gEAExB,IAAIy5C,GAAW,GAAIC,GACfz0C,GAASpB,MAAOA,EACpB,KAAKvF,KAAKyrC,WAAW+N,aAAoC3xC,KAAxB7H,KAAKyrC,WAAW6C,KAA6C,KAAxBtuC,KAAKyrC,WAAW6C,MAC7ErqC,oBAAkBjE,KAAKuN,QAAmB,cAAOvN,KAAKq7C,oBAAoBr7C,KAAKuN,SAAU,CAC9F,GAAIhC,GAASvL,KAAKuN,QAAQu+B,aAAa9rC,KAAMuF,EACxCtB,qBAAkBjE,KAAKuN,QAAmB,cAGrCtJ,oBAAkBsH,EAAO+iC,MAAQtuC,KAAKq7C,oBAAoBr7C,KAAKuN,UACrEvN,KAAKsvC,YACLtvC,KAAKs7C,YAAY/vC,EAAQ4vC,EAAUx0C,EAAMpB,KAGzCoB,EAAO6I,EAAY+rC,eAAeh2C,EAAOgG,EAAQ5E,GACjDw0C,EAASK,QAAQ70C,IARjB3G,KAAKuN,QAAmB,YAAEhC,EAAQ4vC,EAAUx0C,EAAMpB,OAYtDiK,GAAYisC,SAAS,WACjB,GAAIr1C,GAAMyJ,EAAMlO,aAAa4D,EAC7BoB,GAAO6I,EAAY+rC,eAAeh2C,EAAOa,EAAKO,GAC9Cw0C,EAASK,QAAQ70C,IASzB,QANItF,GAAQC,IACR65C,EAASO,QAAQpB,KAAKj5C,EAAMC,GAE5BC,GACA45C,EAASO,QAAQpB,KAAK/4C,EAAQA,GAE3B45C,EAASO,SAEpBlsC,EAAY+rC,eAAiB,SAAUh2C,EAAOgG,EAAQ5E,GASlD,MARIpB,GAAMvD,iBACN2E,EAAK4E,OAASA,EAAOA,OACrB5E,EAAK4D,MAAQgB,EAAOhB,MACpB5D,EAAKqD,WAAauB,EAAOvB,YAGzBrD,EAAK4E,OAASA,EAEX5E,GAEX6I,EAAYisC,SAAW,SAAUp5C,IAG5B+L,OAAOutC,cAAgBvtC,OAAOwtC,YAAYv5C,EAAI,IAGnDmN,EAAYzO,UAAU86C,cAAgB,SAAUvN,EAAKwN,EAAWC,GAC5D,MAAO1L,cACHzqC,KAAM,MACNwqC,SAAUpwC,KAAKyrC,WAAW2E,SAC1BiJ,YAAar5C,KAAKyrC,WAAW4N,YAC7BU,MAAO/5C,KAAKyrC,WAAWsO,MACvBiC,OAAO,EACP3sC,aAAa,EACb4sC,UAAWH,EACXI,UAAWH,GACZzN,IAGP9+B,EAAYzO,UAAUu6C,YAAc,SAAUhN,EAAK6M,EAAUx0C,EAAMpB,GAC/D,GAAIsK,GAAQ7P,KACRm8C,IAAe52C,EAAMxD,iBACrBg6C,EAAS,SAAU34C,GACnBuD,EAAK+J,MAAQtN,EACb+3C,EAASiB,OAAOz1C,IAEhB01C,EAAU,SAAUjtC,EAAM7E,EAAO4D,EAAKogC,EAASjH,EAAQt9B,EAAYsyC,GACnE31C,EAAKwH,IAAMA,EACXxH,EAAK4D,MAAQA,EAAQoC,SAASpC,EAAM+B,WAAY,IAAM,EACtD3F,EAAK4E,OAAS6D,EACdzI,EAAK4nC,QAAUA,EACf5nC,EAAKqD,WAAaA,EAClBrD,EAAK2gC,OAASA,EACd3gC,EAAK21C,qBAAuBA,EAC5BnB,EAASK,QAAQ70C,IAEjB41C,EAAe,SAAUntC,EAAMotC,GAC/B,GAAIC,GAAY,GAAIrB,GAChBsB,GAAcC,OAAQh2C,EAC1BpB,GAAMtF,SAASC,SAAU,CACzB,IAAI08C,GAAS/sC,EAAMtC,QAAQu+B,aAAaj8B,EAAOtK,EAAMtF,SAAUmP,EAAOS,EAAMtC,QAAQo+B,gBAAgBv8B,GAAQotC,GACxGK,EAAWhtC,EAAMyrC,YAAYsB,EAAQH,EAAWC,EAAWn3C,EAAMtF,SASrE,OARKk8C,IACDM,EAAUnC,KAAK,SAAUwC,GACjB1tC,IACA3N,EAASyJ,eAAe3F,EAAMtF,SAASK,KAAMiF,EAAMtF,SAASM,UAAW6O,EAAM0tC,EAASv3C,EAAMtF,SAASI,KACrGg8C,EAAQjtC,EAAM0tC,EAAQvyC,MAAOuyC,EAAQ3uC,OAE1C4tC,GAEAc,GAEPf,EAAY,SAAU1sC,EAAMm/B,GAC5B,GAAI1+B,EAAMktC,iBAAiBltC,EAAMtC,WAExBtJ,oBAAkBmL,EAAa,QAEhC,MAAO2sC,GAAO3sC,EAAa,OAG/BS,GAAMwrC,oBAAoBxrC,EAAMtC,WAChCghC,EAAU8B,YAAWxgC,EAAMmtC,eAAgBzO,KAEH,IAAxCA,EAAQQ,YAAY5oC,QAAQ,QAAiB0J,EAAMw4B,YACnDj5B,EAAO3N,EAASqO,MAAMC,UAAUX,GAEpC,IAAI7D,GAASsE,EAAMtC,QAAQo+B,gBAAgBv8B,EAAMS,EAAOtK,EAAOgpC,EAAQ+E,aAAc/E,GACjFhkC,EAAQ,EACRP,EAAa,KAEbizC,EAAiB7tC,EAAyB,oBAM9C,IALI7J,EAAMvD,kBACNuI,EAAQgB,EAAOhB,MACfP,EAAauB,EAAOvB,WACpBuB,EAASA,EAAOA,SAEfhG,EAAMtF,SAEP,WADAo8C,GAAQ9wC,EAAQhB,EAAOgkC,EAAQ+E,aAAc/E,EAAQ3oC,KAAMwJ,EAAMpF,EAAYizC,EAG5Ed,IACDI,EAAahxC,EAAQgjC,IAGzBzgC,EAAM9N,KAAK67C,cAAcvN,EAAKwN,EAAWC,EAC7C,IAAK/7C,KAAKq7C,oBAAoBr7C,KAAKuN,SAS9B,CACDvN,KAAKg9C,eAAiBlvC,CACtB,IAAIygC,GAAUzgC,CACd9N,MAAKuN,QAAQg+B,QAAQqL,SACjBxnC,KAAMm/B,EAAQn/B,KACd6sC,UAAW1N,EAAQ0N,UAAWC,UAAW3N,EAAQ2N,gBAdZ,CACzC,GAAIgB,GAAU,GAAIC,SAAMrvC,EACxBovC,GAAQxM,WAAa,WACjB7gC,EAAM6gC,WAAWwM,EAAQ5J,aAAc4J,KAE3CpvC,EAAMovC,EAAQE,QACVC,MAAM,SAAUj6C,GAAK,OAAO,IAChCpD,KAAKsvC,SAASltC,KAAK86C,GAUvB,GAAIf,EAAY,CACZ,GACI/1C,GAAMb,EAAMxD,iBAAiBS,KAAKxC,MAAQuF,MAAOA,EAAMtF,SAAU08C,OAAQp3C,GACzEa,IAAOA,EAAI7B,OACD+4C,QAAQC,KAAKzvC,EAAKyuC,EAAa,KAAMn2C,KACvCk0C,KAAK,WAET,IAAK,GADD3zC,MACKC,EAAK,EAAGA,EAAKC,UAAUtC,OAAQqC,IACpCD,EAAKC,GAAMC,UAAUD,EAEzB,IAAI2E,GAAS5E,EAAK,GACd62C,EAAU3tC,EAAMtC,QAAQo+B,gBAAgBpgC,EAAO,GAAIsE,EAAOtK,EAAOsK,EAAMy/B,SAAS,GAAGgE,aAAczjC,EAAMy/B,SAAS,IAChH/kC,EAAQ,CACRhF,GAAMvD,kBACNuI,EAAQizC,EAAQjzC,MAChBizC,EAAUA,EAAQjyC,OAEtB,IAAIkyC,GAAU5tC,EAAMtC,QAAQo+B,gBAAgBpgC,EAAO,GAAIsE,EAAOtK,EAAMtF,SAAU4P,EAAMy/B,SAAS,GAAGgE,aAAczjC,EAAMy/B,SAAS,GAC7H/kC,GAAQ,EACJhF,EAAMtF,SAAS+B,kBACfuI,EAAQkzC,EAAQlzC,MAChBkzC,EAAUA,EAAQlyC,QAEtB9J,EAASyJ,eAAe3F,EAAMtF,SAASK,KAAMiF,EAAMtF,SAASM,UAAWi9C,EAASC,EAASl4C,EAAMtF,SAASI,KACxG87C,GAAa,EACbE,EAAQmB,EAASjzC,EAAOsF,EAAMy/B,SAAS,GAAGgE,gBAI9C6I,GAAa,EAGrB,MAAOruC,IAEX0B,EAAYzO,UAAU2vC,WAAa,SAAUnC,EAASqE,GAClD5yC,KAAKuN,QAAQmjC,WAAW1wC,KAAMuuC,EAASqE,EAGvC,KAAK,GADDxB,GADAjC,EAAUnvC,KAAKyrC,WAAW0D,QAErB7qC,EAAI,EAAG6qC,GAAW7qC,EAAI6qC,EAAQ5qC,OAAQD,IAAK,CAChD8sC,IAEA,KAAK,GAAIxqC,GAAK,EAAGgF,EADNC,OAAOC,KAAKqjC,EAAQ7qC,IACCsC,EAAKgF,EAAOrH,OAAQqC,IAAM,CACtD,GAAImF,GAAOH,EAAOhF,EAClBwqC,GAAMhvC,KAAK2J,GACXwiC,EAAQY,QAAQ0D,IAAI9mC,EAAMojC,EAAQ7qC,GAAGyH,OAejDyD,EAAYzO,UAAU28C,YAAc,SAAU5Q,EAASzsC,EAAK4B,EAAWsD,EAAOyqC,GAC1E,GAAIngC,GAAQ7P,IACRiC,aAAqBnC,KACrByF,EAAQtD,EACRA,EAAY,KAEhB,IAAI0E,IACA2nC,IAAKrsC,EACL5B,IAAKA,GAAOL,KAAKyrC,WAAWprC,KAE5ByN,EAAM9N,KAAKuN,QAAQs/B,aAAa7sC,KAAM8sC,EAASnmC,EAAMpB,GAAS,GAAIzF,GAASkwC,EAE/E,IAAIhwC,KAAKyrC,WAAW+N,QAChB,MAAO1rC,EAEX,IAAK7J,oBAAkBjE,KAAKuN,QAAsB,gBAG7C,CAAA,GAAKvN,KAAKq7C,oBAAoBr7C,KAAKuN,SAuBpC,MAAOvN,MAAK29C,eAAe7vC,EAAK9N,KAAKuN,QAAQg+B,QAAQ0L,YAtBrD,IAAI2G,GAAS,GAAIxC,GACbyC,EAAU,GAAIV,SAAMrvC,EAkBxB,OAjBA+vC,GAAQnN,WAAa,WACjB7gC,EAAM6gC,WAAWmN,EAAQvK,aAAcuK,IAE3CA,EAAQ5B,UAAY,SAAU7sC,EAAMm/B,GAC5B1+B,EAAMktC,iBAAiBltC,EAAMtC,WAExBtJ,oBAAkBmL,EAAa,SAEhCyuC,EAAQ3B,UAAUvsC,KAAKC,UAAUR,EAAa,UAGtDwuC,EAAOpC,QAAQ3rC,EAAMtC,QAAQo+B,gBAAgBv8B,EAAMS,EAAO,KAAM0+B,EAAQ+E,aAAc/E,EAASzB,EAASnmC,KAE5Gk3C,EAAQ3B,UAAY,SAAU94C,GAC1Bw6C,EAAOxB,SAAU1rC,MAAOtN,MAE5By6C,EAAQT,OAAOC,MAAM,SAAUj6C,GAAK,OAAO,IACpCw6C,EAAOlC,QAtBd,MAAO17C,MAAKuN,QAAsB,eAAEO,IAoC5C0B,EAAYzO,UAAUmsC,OAAS,SAAU99B,EAAMnN,EAAWsD,EAAOyoC,GACzD/rC,YAAqBnC,KACrByF,EAAQtD,EACRA,EAAY,KAEhB,IAAI6L,GAAM9N,KAAKuN,QAAQ2/B,OAAOltC,KAAMoP,EAAMnN,EAAWsD,EAAOyoC,EAE5D,OAAIhuC,MAAKyrC,WAAW+N,QACT1rC,EAEN7J,oBAAkBjE,KAAKuN,QAAsB,gBAIvCvN,KAAK29C,eAAe7vC,EAAK9N,KAAKuN,QAAQg+B,QAAQuL,WAH9C92C,KAAKuN,QAAsB,eAAEO,IAc5C0B,EAAYzO,UAAUssC,OAAS,SAAUa,EAAU/rC,EAAOF,EAAWsD,GAC5C,gBAAVpD,KACPA,EAAQV,EAASqG,UAAUomC,EAAU/rC,IAErCF,YAAqBnC,KACrByF,EAAQtD,EACRA,EAAY,KAEhB,IAAImE,GAAMpG,KAAKuN,QAAQ8/B,OAAOrtC,KAAMkuC,EAAU/rC,EAAOF,EAAWsD,EAEhE,IAAIvF,KAAKyrC,WAAW+N,QAChB,MAAOpzC,EAEX,IAAKnC,oBAAkBjE,KAAKuN,QAAsB,gBAG7C,CACD,GAAI8/B,GAASrtC,KAAKuN,QAAQg+B,QAAQyL,YAClC,OAAOh3C,MAAK29C,eAAev3C,EAAKinC,GAJhC,MAAOrtC,MAAKuN,QAAsB,eAAEnH,IAgB5CoJ,EAAYzO,UAAUqsC,OAAS,SAAUc,EAAU/rC,EAAOF,EAAWsD,EAAOyqC,GACpE/tC,YAAqBnC,KACrByF,EAAQtD,EACRA,EAAY,KAEhB,IAAImE,GAAMpG,KAAKuN,QAAQ6/B,OAAOptC,KAAMkuC,EAAU/rC,EAAOF,EAAWsD,EAAOyqC,EAEvE,IAAIhwC,KAAKyrC,WAAW+N,QAChB,MAAOpzC,EAEX,IAAKnC,oBAAkBjE,KAAKuN,QAAsB,gBAG7C,CACD,GAAI6/B,GAASptC,KAAKuN,QAAQg+B,QAAQwL,YAClC,OAAO/2C,MAAK29C,eAAev3C,EAAKgnC,GAJhC,MAAOptC,MAAKuN,QAAsB,eAAEnH,IAO5CoJ,EAAYzO,UAAUs6C,oBAAsB,SAAU5P,GAClD,MAAOzrC,MAAKuN,QAAQqhC,eACiB,sBAAjC5uC,KAAKuN,QAAQqhC,iBAErBp/B,EAAYzO,UAAUg8C,iBAAmB,SAAUtR,GAC/C,MAAOzrC,MAAKuN,QAAQqhC,eACiB,mBAAjC5uC,KAAKuN,QAAQqhC,iBAErBp/B,EAAYzO,UAAU+8C,YAAc,SAAUr2C,EAAQ8mC,GAClD,GAAIvuC,KAAK+8C,iBAAiB/8C,KAAKuN,SAAU,CACrC,GAAI6B,GAAyB,gBAAX3H,GAAsBA,EAASkI,KAAKG,MAAMrI,EAEvDxD,qBAAkBmL,EAAa,SAEhCpP,KAAK+9C,YAAYpuC,KAAKC,UAAUR,EAAa,SAGjDpP,KAAKq7C,oBAAoBr7C,KAAKuN,WAC9BghC,EAAU8B,YAAWrwC,KAAKg9C,eAAgBzO,GAE9C,KACI9sC,EAASqO,MAAMC,UAAUtI,GAE7B,MAAOrE,GACHqE,KAEJA,EAASzH,KAAKuN,QAAQo+B,gBAAgBlqC,EAASqO,MAAMC,UAAUtI,GAASzH,KAAM,KAAMuuC,EAAQ+E,aAAc/E,GAC1GvuC,KAAKg+C,cAAcxC,QAAQ/zC,IAE/B+H,EAAYzO,UAAUg9C,YAAc,SAAU36C,GAC1CpD,KAAKg+C,cAAc5B,SAAU1rC,MAAOtN,MAExCoM,EAAYzO,UAAU48C,eAAiB,SAAUv3C,EAAK63C,GAClD,GAAIpuC,GAAQ7P,IAOZ,IANAoG,EAAMiqC,aACFzqC,KAAM,OACNmpC,YAAa,kCACb1/B,aAAa,GACdjJ,GACHpG,KAAKg+C,cAAgB,GAAI5C,GACpBp7C,KAAKq7C,oBAAoBr7C,KAAKuN,SAU/BvN,KAAKg9C,eAAiB52C,EACtB63C,EAAUz7C,KAAKxC,MACXoP,KAAMhJ,EAAIgJ,KAAM6sC,UAAWj8C,KAAK89C,YAAY3D,KAAKn6C,MACjDk8C,UAAWl8C,KAAK+9C,YAAY5D,KAAKn6C,YAbI,CACzC,GAAIk+C,GAAU,GAAIf,SAAM/2C,EACxB83C,GAAQxN,WAAa,WACjB7gC,EAAM6gC,WAAWwN,EAAQ5K,aAAc4K,IAE3CA,EAAQjC,UAAYj8C,KAAK89C,YAAY3D,KAAKn6C,MAC1Ck+C,EAAQhC,UAAYl8C,KAAK+9C,YAAY5D,KAAKn6C,MAC1Ck+C,EAAQd,OAAOC,MAAM,SAAUj6C,GAAK,OAAO,IAS/C,MAAOpD,MAAKg+C,cAActC,SAE9BlsC,EAAYzO,UAAUo9C,iBAAmB,WACrC/vC,OAAOgwC,oBAAoB,SAAUp+C,KAAKk6C,eAAeC,KAAKn6C,OAC9DA,KAAKyrC,WAAWgO,mBAAoB,EACpCz5C,KAAKs5C,gBACLlrC,OAAOqqC,aAAaC,QAAQ14C,KAAKyrC,WAAWiO,GAAI,OAE7ClqC,KAMP4rC,EAA0B,WAC1B,QAASA,KACL,GAAIvrC,GAAQ7P,IAIZA,MAAK07C,QAAU,GAAI4B,SAAQ,SAAU9B,EAASY,GAC1CvsC,EAAM2rC,QAAUA,EAChB3rC,EAAMusC,OAASA,IAKnBp8C,KAAKs6C,KAAOt6C,KAAK07C,QAAQpB,KAAKH,KAAKn6C,KAAK07C,SAIxC17C,KAAKq9C,MAAQr9C,KAAK07C,QAAQ2B,MAAMlD,KAAKn6C,KAAK07C,SAE9C,MAAON"}