@steedos/odata-v4-sql 2.2.52-beta.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +22 -0
- package/README.md +62 -0
- package/lib/index.d.ts +31 -0
- package/lib/index.js +22 -0
- package/lib/index.js.map +1 -0
- package/lib/visitor.d.ts +72 -0
- package/lib/visitor.js +393 -0
- package/lib/visitor.js.map +1 -0
- package/package.json +46 -0
- package/src/index.ts +45 -0
- package/src/visitor.ts +411 -0
- package/test/mssql.spec.js +142 -0
- package/test/oracle.spec.js +138 -0
- package/test/query.spec.js +93 -0
- package/test/where-parameters.spec.js +141 -0
- package/test/where.spec.js +149 -0
- package/tsconfig.json +11 -0
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Steedos Licensing
|
|
2
|
+
|
|
3
|
+
SOFTWARE LICENSING
|
|
4
|
+
|
|
5
|
+
To determine under which license you may use a file from the Steedos source code,
|
|
6
|
+
please resort to the header of that file.
|
|
7
|
+
|
|
8
|
+
If the file has no header, the following rules apply
|
|
9
|
+
1. enterprise features are licensed under Steedos Enterprise Terms, see License.enterprise.txt
|
|
10
|
+
2. source code that is neither (1) is licensed under MIT, see https://opensource.org/licenses/MIT
|
|
11
|
+
|
|
12
|
+
On request, licenses under different terms are available.
|
|
13
|
+
|
|
14
|
+
Source code of enterprise features are files that
|
|
15
|
+
* are in folders named "ee" or start with "ee_", or in subfolders of such folders.
|
|
16
|
+
* contain the strings "ee_" in its filename name.
|
|
17
|
+
The files can be found by running the command `find . -iname ee -or -iname "*_ee*" -or -iname "*ee_*"`
|
|
18
|
+
|
|
19
|
+
STEEDOS TRADEMARK GUIDELINES
|
|
20
|
+
|
|
21
|
+
Your use of the mark Steedos is subject to Steedos, Inc's prior written approval. For trademark approval or any questions
|
|
22
|
+
you have about using these trademarks, please email zhuangjianguo@steedos.com
|
package/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* @Author: baozhoutao@steedos.com
|
|
3
|
+
* @Date: 2022-07-05 15:03:38
|
|
4
|
+
* @LastEditors: baozhoutao@steedos.com
|
|
5
|
+
* @LastEditTime: 2022-07-05 15:14:04
|
|
6
|
+
* @Description:
|
|
7
|
+
-->
|
|
8
|
+
# OData V4 Service modules - SQL Connector
|
|
9
|
+
|
|
10
|
+
Service OData v4 requests from an SQL data store.
|
|
11
|
+
|
|
12
|
+
## Synopsis
|
|
13
|
+
The OData V4 SQL Connector provides functionality to convert the various types of OData segments
|
|
14
|
+
into SQL query statements, that you can execute over an SQL database.
|
|
15
|
+
|
|
16
|
+
## Potential usage scenarios
|
|
17
|
+
|
|
18
|
+
- Create high speed, standard compliant data sharing APIs
|
|
19
|
+
|
|
20
|
+
## Usage as server - TypeScript
|
|
21
|
+
```javascript
|
|
22
|
+
import { createFilter } from '@steedos/odata-v4-sql'
|
|
23
|
+
|
|
24
|
+
//example request: GET /api/Users?$filter=Id eq 42
|
|
25
|
+
app.get("/api/Users", (req: Request, res: Response) => {
|
|
26
|
+
const filter = createFilter(req.query.$filter);
|
|
27
|
+
// request instance from mssql module
|
|
28
|
+
request.query(`SELECT * FROM Users WHERE ${filter.where}`, function(err, data){
|
|
29
|
+
res.json({
|
|
30
|
+
'@odata.context': req.protocol + '://' + req.get('host') + '/api/$metadata#Users',
|
|
31
|
+
value: data
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Advanced TypeScript example available [here](https://raw.githubusercontent.com/jaystack/odata-v4-sql/master/src/example/sql.ts).
|
|
38
|
+
|
|
39
|
+
## Usage ES5
|
|
40
|
+
```javascript
|
|
41
|
+
var createFilter = require('@steedos/odata-v4-sql').createFilter;
|
|
42
|
+
|
|
43
|
+
app.get("/api/Users", function(req, res) {
|
|
44
|
+
var filter = createFilter(req.query.$filter);
|
|
45
|
+
// request instance from mssql module
|
|
46
|
+
request.query(filter.from("Users"), function(err, data){
|
|
47
|
+
res.json({
|
|
48
|
+
'@odata.context': req.protocol + '://' + req.get('host') + '/api/$metadata#Users',
|
|
49
|
+
value: data
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
})
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Supported OData segments
|
|
56
|
+
|
|
57
|
+
* $filter
|
|
58
|
+
* $select
|
|
59
|
+
* $skip
|
|
60
|
+
* $top
|
|
61
|
+
* $orderby
|
|
62
|
+
* $expand
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Visitor, SQLLang } from "./visitor";
|
|
2
|
+
export { SQLLang } from "./visitor";
|
|
3
|
+
import { Token } from "odata-v4-parser/lib/lexer";
|
|
4
|
+
export interface SqlOptions {
|
|
5
|
+
useParameters?: boolean;
|
|
6
|
+
type?: SQLLang;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Creates an SQL query descriptor from an OData query string
|
|
10
|
+
* @param {string} odataQuery - An OData query string
|
|
11
|
+
* @return {string} SQL query descriptor
|
|
12
|
+
* @example
|
|
13
|
+
* const filter = createQuery("$filter=Size eq 4 and Age gt 18");
|
|
14
|
+
* let sqlQuery = `SELECT * FROM table WHERE ${filter.where}`;
|
|
15
|
+
*/
|
|
16
|
+
export declare function createQuery(odataQuery: string, options?: SqlOptions): Visitor;
|
|
17
|
+
export declare function createQuery(odataQuery: string, options?: SqlOptions, type?: SQLLang): Visitor;
|
|
18
|
+
export declare function createQuery(odataQuery: Token, options?: SqlOptions): Visitor;
|
|
19
|
+
export declare function createQuery(odataQuery: Token, options?: SqlOptions, type?: SQLLang): Visitor;
|
|
20
|
+
/**
|
|
21
|
+
* Creates an SQL WHERE clause from an OData filter expression string
|
|
22
|
+
* @param {string} odataFilter - A filter expression in OData $filter format
|
|
23
|
+
* @return {string} SQL WHERE clause
|
|
24
|
+
* @example
|
|
25
|
+
* const filter = createFilter("Size eq 4 and Age gt 18");
|
|
26
|
+
* let sqlQuery = `SELECT * FROM table WHERE ${filter}`;
|
|
27
|
+
*/
|
|
28
|
+
export declare function createFilter(odataFilter: string, options?: SqlOptions): Visitor;
|
|
29
|
+
export declare function createFilter(odataFilter: string, options?: SqlOptions, type?: SQLLang): Visitor;
|
|
30
|
+
export declare function createFilter(odataFilter: Token, options?: SqlOptions): Visitor;
|
|
31
|
+
export declare function createFilter(odataFilter: Token, options?: SqlOptions, type?: SQLLang): Visitor;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createFilter = exports.createQuery = exports.SQLLang = void 0;
|
|
4
|
+
const visitor_1 = require("./visitor");
|
|
5
|
+
var visitor_2 = require("./visitor");
|
|
6
|
+
Object.defineProperty(exports, "SQLLang", { enumerable: true, get: function () { return visitor_2.SQLLang; } });
|
|
7
|
+
const odata_v4_parser_1 = require("odata-v4-parser");
|
|
8
|
+
function createQuery(odataQuery, options = {}, type) {
|
|
9
|
+
if (typeof type != "undefined" && type)
|
|
10
|
+
options.type = type;
|
|
11
|
+
let ast = (typeof odataQuery == "string" ? (0, odata_v4_parser_1.query)(odataQuery) : odataQuery);
|
|
12
|
+
return new visitor_1.Visitor(options).Visit(ast).asType();
|
|
13
|
+
}
|
|
14
|
+
exports.createQuery = createQuery;
|
|
15
|
+
function createFilter(odataFilter, options = {}, type) {
|
|
16
|
+
if (typeof type != "undefined" && type)
|
|
17
|
+
options.type = type;
|
|
18
|
+
let ast = (typeof odataFilter == "string" ? (0, odata_v4_parser_1.filter)(odataFilter) : odataFilter);
|
|
19
|
+
return new visitor_1.Visitor(options).Visit(ast).asType();
|
|
20
|
+
}
|
|
21
|
+
exports.createFilter = createFilter;
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAA6C;AAC7C,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,qDAAgD;AAoBhD,SAAgB,WAAW,CAAC,UAAyB,EAAE,UAAsB,EAAE,EAAE,IAAa;IAC1F,IAAI,OAAO,IAAI,IAAI,WAAW,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC5D,IAAI,GAAG,GAAgB,CAAC,OAAO,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAA,uBAAK,EAAS,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAChG,OAAO,IAAI,iBAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;AACpD,CAAC;AAJD,kCAIC;AAcD,SAAgB,YAAY,CAAC,WAA0B,EAAE,UAAsB,EAAE,EAAE,IAAa;IAC5F,IAAI,OAAO,IAAI,IAAI,WAAW,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC5D,IAAI,GAAG,GAAgB,CAAC,OAAO,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAA,wBAAM,EAAS,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACpG,OAAO,IAAI,iBAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;AACpD,CAAC;AAJD,oCAIC"}
|
package/lib/visitor.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Token } from "odata-v4-parser/lib/lexer";
|
|
2
|
+
import { Literal } from "odata-v4-literal";
|
|
3
|
+
import { SqlOptions } from "./index";
|
|
4
|
+
export declare class SQLLiteral extends Literal {
|
|
5
|
+
static convert(type: string, value: string): any;
|
|
6
|
+
'Edm.String'(value: string): string;
|
|
7
|
+
'Edm.Guid'(value: string): string;
|
|
8
|
+
'Edm.Date'(value: string): string;
|
|
9
|
+
'Edm.DateTimeOffset'(value: string): any;
|
|
10
|
+
'Edm.Boolean'(value: string): any;
|
|
11
|
+
'null'(value: string): string;
|
|
12
|
+
}
|
|
13
|
+
export declare enum SQLLang {
|
|
14
|
+
ANSI = 0,
|
|
15
|
+
MsSql = 1,
|
|
16
|
+
MySql = 2,
|
|
17
|
+
PostgreSql = 3,
|
|
18
|
+
Oracle = 4
|
|
19
|
+
}
|
|
20
|
+
export declare class Visitor {
|
|
21
|
+
protected options: SqlOptions;
|
|
22
|
+
type: SQLLang;
|
|
23
|
+
select: string;
|
|
24
|
+
where: string;
|
|
25
|
+
orderby: string;
|
|
26
|
+
skip: number;
|
|
27
|
+
limit: number;
|
|
28
|
+
inlinecount: boolean;
|
|
29
|
+
navigationProperty: string;
|
|
30
|
+
includes: Visitor[];
|
|
31
|
+
parameters: any;
|
|
32
|
+
protected parameterSeed: number;
|
|
33
|
+
protected originalWhere: string;
|
|
34
|
+
ast: Token;
|
|
35
|
+
constructor(options?: SqlOptions);
|
|
36
|
+
from(table: string): string;
|
|
37
|
+
asMsSql(): this;
|
|
38
|
+
asOracleSql(): this;
|
|
39
|
+
asAnsiSql(): this;
|
|
40
|
+
asType(): this;
|
|
41
|
+
Visit(node: Token, context?: any): this;
|
|
42
|
+
protected VisitODataUri(node: Token, context: any): void;
|
|
43
|
+
protected VisitExpand(node: Token, context: any): void;
|
|
44
|
+
protected VisitExpandItem(node: Token, context: any): void;
|
|
45
|
+
protected VisitExpandPath(node: Token, context: any): void;
|
|
46
|
+
protected VisitQueryOptions(node: Token, context: any): void;
|
|
47
|
+
protected VisitInlineCount(node: Token, context: any): void;
|
|
48
|
+
protected VisitFilter(node: Token, context: any): void;
|
|
49
|
+
protected VisitOrderBy(node: Token, context: any): void;
|
|
50
|
+
protected VisitOrderByItem(node: Token, context: any): void;
|
|
51
|
+
protected VisitSkip(node: Token, context: any): void;
|
|
52
|
+
protected VisitTop(node: Token, context: any): void;
|
|
53
|
+
protected VisitSelect(node: Token, context: any): void;
|
|
54
|
+
protected VisitSelectItem(node: Token, context: any): void;
|
|
55
|
+
protected VisitAndExpression(node: Token, context: any): void;
|
|
56
|
+
protected VisitOrExpression(node: Token, context: any): void;
|
|
57
|
+
protected VisitBoolParenExpression(node: Token, context: any): void;
|
|
58
|
+
protected VisitCommonExpression(node: Token, context: any): void;
|
|
59
|
+
protected VisitFirstMemberExpression(node: Token, context: any): void;
|
|
60
|
+
protected VisitMemberExpression(node: Token, context: any): void;
|
|
61
|
+
protected VisitPropertyPathExpression(node: Token, context: any): void;
|
|
62
|
+
protected VisitSingleNavigationExpression(node: Token, context: any): void;
|
|
63
|
+
protected VisitODataIdentifier(node: Token, context: any): void;
|
|
64
|
+
protected VisitEqualsExpression(node: Token, context: any): void;
|
|
65
|
+
protected VisitNotEqualsExpression(node: Token, context: any): void;
|
|
66
|
+
protected VisitLesserThanExpression(node: Token, context: any): void;
|
|
67
|
+
protected VisitLesserOrEqualsExpression(node: Token, context: any): void;
|
|
68
|
+
protected VisitGreaterThanExpression(node: Token, context: any): void;
|
|
69
|
+
protected VisitGreaterOrEqualsExpression(node: Token, context: any): void;
|
|
70
|
+
protected VisitLiteral(node: Token, context: any): void;
|
|
71
|
+
protected VisitMethodCallExpression(node: Token, context: any): void;
|
|
72
|
+
}
|
package/lib/visitor.js
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Visitor = exports.SQLLang = exports.SQLLiteral = void 0;
|
|
4
|
+
const odata_v4_literal_1 = require("odata-v4-literal");
|
|
5
|
+
class SQLLiteral extends odata_v4_literal_1.Literal {
|
|
6
|
+
static convert(type, value) {
|
|
7
|
+
return (new SQLLiteral(type, value)).valueOf();
|
|
8
|
+
}
|
|
9
|
+
'Edm.String'(value) { return "'" + decodeURIComponent(value).slice(1, -1).replace(/''/g, "'") + "'"; }
|
|
10
|
+
'Edm.Guid'(value) { return "'" + decodeURIComponent(value) + "'"; }
|
|
11
|
+
'Edm.Date'(value) { return "'" + value + "'"; }
|
|
12
|
+
'Edm.DateTimeOffset'(value) { return "'" + value.replace("T", " ").replace("Z", " ").trim() + "'"; }
|
|
13
|
+
'Edm.Boolean'(value) {
|
|
14
|
+
value = value || '';
|
|
15
|
+
switch (value.toLowerCase()) {
|
|
16
|
+
case 'true': return 1;
|
|
17
|
+
case 'false': return 0;
|
|
18
|
+
default: return "NULL";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
'null'(value) { return "NULL"; }
|
|
22
|
+
}
|
|
23
|
+
exports.SQLLiteral = SQLLiteral;
|
|
24
|
+
var SQLLang;
|
|
25
|
+
(function (SQLLang) {
|
|
26
|
+
SQLLang[SQLLang["ANSI"] = 0] = "ANSI";
|
|
27
|
+
SQLLang[SQLLang["MsSql"] = 1] = "MsSql";
|
|
28
|
+
SQLLang[SQLLang["MySql"] = 2] = "MySql";
|
|
29
|
+
SQLLang[SQLLang["PostgreSql"] = 3] = "PostgreSql";
|
|
30
|
+
SQLLang[SQLLang["Oracle"] = 4] = "Oracle";
|
|
31
|
+
})(SQLLang = exports.SQLLang || (exports.SQLLang = {}));
|
|
32
|
+
class Visitor {
|
|
33
|
+
constructor(options = {}) {
|
|
34
|
+
this.select = "";
|
|
35
|
+
this.where = "";
|
|
36
|
+
this.orderby = "";
|
|
37
|
+
this.includes = [];
|
|
38
|
+
this.parameters = new Map();
|
|
39
|
+
this.parameterSeed = 0;
|
|
40
|
+
this.options = options;
|
|
41
|
+
if (this.options.useParameters != false)
|
|
42
|
+
this.options.useParameters = true;
|
|
43
|
+
this.type = options.type || SQLLang.ANSI;
|
|
44
|
+
}
|
|
45
|
+
from(table) {
|
|
46
|
+
let sql = `SELECT ${this.select} FROM [${table}] WHERE ${this.where} ORDER BY ${this.orderby}`;
|
|
47
|
+
switch (this.type) {
|
|
48
|
+
case SQLLang.Oracle:
|
|
49
|
+
case SQLLang.MsSql:
|
|
50
|
+
if (typeof this.skip == "number")
|
|
51
|
+
sql += ` OFFSET ${this.skip} ROWS`;
|
|
52
|
+
if (typeof this.limit == "number") {
|
|
53
|
+
if (typeof this.skip != "number")
|
|
54
|
+
sql += " OFFSET 0 ROWS";
|
|
55
|
+
sql += ` FETCH NEXT ${this.limit} ROWS ONLY`;
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
case SQLLang.MySql:
|
|
59
|
+
case SQLLang.PostgreSql:
|
|
60
|
+
default:
|
|
61
|
+
if (typeof this.limit == "number")
|
|
62
|
+
sql += ` LIMIT ${this.limit}`;
|
|
63
|
+
if (typeof this.skip == "number")
|
|
64
|
+
sql += ` OFFSET ${this.skip}`;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
return sql;
|
|
68
|
+
}
|
|
69
|
+
asMsSql() {
|
|
70
|
+
this.type = SQLLang.MsSql;
|
|
71
|
+
let rx = new RegExp("\\?", "g");
|
|
72
|
+
let keys = this.parameters.keys();
|
|
73
|
+
this.originalWhere = this.where;
|
|
74
|
+
this.where = this.where.replace(rx, () => `@${keys.next().value}`);
|
|
75
|
+
this.includes.forEach((item) => item.asMsSql());
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
asOracleSql() {
|
|
79
|
+
this.type = SQLLang.Oracle;
|
|
80
|
+
let rx = new RegExp("\\?", "g");
|
|
81
|
+
let keys = this.parameters.keys();
|
|
82
|
+
this.originalWhere = this.where;
|
|
83
|
+
this.where = this.where.replace(rx, () => `:${keys.next().value}`);
|
|
84
|
+
this.includes.forEach((item) => item.asOracleSql());
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
asAnsiSql() {
|
|
88
|
+
this.type = SQLLang.ANSI;
|
|
89
|
+
this.where = this.originalWhere || this.where;
|
|
90
|
+
this.includes.forEach((item) => item.asAnsiSql());
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
asType() {
|
|
94
|
+
switch (this.type) {
|
|
95
|
+
case SQLLang.MsSql: return this.asMsSql();
|
|
96
|
+
case SQLLang.ANSI:
|
|
97
|
+
case SQLLang.MySql:
|
|
98
|
+
case SQLLang.PostgreSql: return this.asAnsiSql();
|
|
99
|
+
case SQLLang.Oracle: return this.asOracleSql();
|
|
100
|
+
default: return this;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
Visit(node, context) {
|
|
104
|
+
this.ast = this.ast || node;
|
|
105
|
+
context = context || { target: "where" };
|
|
106
|
+
if (node) {
|
|
107
|
+
var visitor = this[`Visit${node.type}`];
|
|
108
|
+
if (visitor)
|
|
109
|
+
visitor.call(this, node, context);
|
|
110
|
+
else
|
|
111
|
+
console.log(`Unhandled node type: ${node.type}`, node);
|
|
112
|
+
}
|
|
113
|
+
if (node == this.ast) {
|
|
114
|
+
if (!this.select)
|
|
115
|
+
this.select = `*`;
|
|
116
|
+
if (!this.where)
|
|
117
|
+
this.where = "1 = 1";
|
|
118
|
+
if (!this.orderby)
|
|
119
|
+
this.orderby = "1";
|
|
120
|
+
}
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
VisitODataUri(node, context) {
|
|
124
|
+
this.Visit(node.value.resource, context);
|
|
125
|
+
this.Visit(node.value.query, context);
|
|
126
|
+
}
|
|
127
|
+
VisitExpand(node, context) {
|
|
128
|
+
node.value.items.forEach((item) => {
|
|
129
|
+
let expandPath = item.value.path.raw;
|
|
130
|
+
let visitor = this.includes.filter(v => v.navigationProperty == expandPath)[0];
|
|
131
|
+
if (!visitor) {
|
|
132
|
+
visitor = new Visitor(this.options);
|
|
133
|
+
visitor.parameterSeed = this.parameterSeed;
|
|
134
|
+
this.includes.push(visitor);
|
|
135
|
+
}
|
|
136
|
+
visitor.Visit(item);
|
|
137
|
+
this.parameterSeed = visitor.parameterSeed;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
VisitExpandItem(node, context) {
|
|
141
|
+
this.Visit(node.value.path, context);
|
|
142
|
+
if (node.value.options)
|
|
143
|
+
node.value.options.forEach((item) => this.Visit(item, context));
|
|
144
|
+
}
|
|
145
|
+
VisitExpandPath(node, context) {
|
|
146
|
+
this.navigationProperty = node.raw;
|
|
147
|
+
}
|
|
148
|
+
VisitQueryOptions(node, context) {
|
|
149
|
+
node.value.options.forEach((option) => this.Visit(option, context));
|
|
150
|
+
}
|
|
151
|
+
VisitInlineCount(node, context) {
|
|
152
|
+
this.inlinecount = odata_v4_literal_1.Literal.convert(node.value.value, node.value.raw);
|
|
153
|
+
}
|
|
154
|
+
VisitFilter(node, context) {
|
|
155
|
+
context.target = "where";
|
|
156
|
+
this.Visit(node.value, context);
|
|
157
|
+
if (!this.where)
|
|
158
|
+
this.where = "1 = 1";
|
|
159
|
+
}
|
|
160
|
+
VisitOrderBy(node, context) {
|
|
161
|
+
context.target = "orderby";
|
|
162
|
+
node.value.items.forEach((item, i) => {
|
|
163
|
+
this.Visit(item, context);
|
|
164
|
+
if (i < node.value.items.length - 1)
|
|
165
|
+
this.orderby += ", ";
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
VisitOrderByItem(node, context) {
|
|
169
|
+
this.Visit(node.value.expr, context);
|
|
170
|
+
this.orderby += node.value.direction > 0 ? " ASC" : " DESC";
|
|
171
|
+
}
|
|
172
|
+
VisitSkip(node, context) {
|
|
173
|
+
this.skip = +node.value.raw;
|
|
174
|
+
}
|
|
175
|
+
VisitTop(node, context) {
|
|
176
|
+
this.limit = +node.value.raw;
|
|
177
|
+
}
|
|
178
|
+
VisitSelect(node, context) {
|
|
179
|
+
context.target = "select";
|
|
180
|
+
node.value.items.forEach((item, i) => {
|
|
181
|
+
this.Visit(item, context);
|
|
182
|
+
if (i < node.value.items.length - 1)
|
|
183
|
+
this.select += ", ";
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
VisitSelectItem(node, context) {
|
|
187
|
+
let item = node.raw.replace(/\//g, '.');
|
|
188
|
+
this.select += `[${item}]`;
|
|
189
|
+
}
|
|
190
|
+
VisitAndExpression(node, context) {
|
|
191
|
+
this.Visit(node.value.left, context);
|
|
192
|
+
this.where += " AND ";
|
|
193
|
+
this.Visit(node.value.right, context);
|
|
194
|
+
}
|
|
195
|
+
VisitOrExpression(node, context) {
|
|
196
|
+
this.Visit(node.value.left, context);
|
|
197
|
+
this.where += " OR ";
|
|
198
|
+
this.Visit(node.value.right, context);
|
|
199
|
+
}
|
|
200
|
+
VisitBoolParenExpression(node, context) {
|
|
201
|
+
this.where += "(";
|
|
202
|
+
this.Visit(node.value, context);
|
|
203
|
+
this.where += ")";
|
|
204
|
+
}
|
|
205
|
+
VisitCommonExpression(node, context) {
|
|
206
|
+
this.Visit(node.value, context);
|
|
207
|
+
}
|
|
208
|
+
VisitFirstMemberExpression(node, context) {
|
|
209
|
+
this.Visit(node.value, context);
|
|
210
|
+
}
|
|
211
|
+
VisitMemberExpression(node, context) {
|
|
212
|
+
this.Visit(node.value, context);
|
|
213
|
+
}
|
|
214
|
+
VisitPropertyPathExpression(node, context) {
|
|
215
|
+
if (node.value.current && node.value.next) {
|
|
216
|
+
this.Visit(node.value.current, context);
|
|
217
|
+
context.identifier += ".";
|
|
218
|
+
this.Visit(node.value.next, context);
|
|
219
|
+
}
|
|
220
|
+
else
|
|
221
|
+
this.Visit(node.value, context);
|
|
222
|
+
}
|
|
223
|
+
VisitSingleNavigationExpression(node, context) {
|
|
224
|
+
if (node.value.current && node.value.next) {
|
|
225
|
+
this.Visit(node.value.current, context);
|
|
226
|
+
this.Visit(node.value.next, context);
|
|
227
|
+
}
|
|
228
|
+
else
|
|
229
|
+
this.Visit(node.value, context);
|
|
230
|
+
}
|
|
231
|
+
VisitODataIdentifier(node, context) {
|
|
232
|
+
this[context.target] += `[${node.value.name}]`;
|
|
233
|
+
context.identifier = node.value.name;
|
|
234
|
+
}
|
|
235
|
+
VisitEqualsExpression(node, context) {
|
|
236
|
+
this.Visit(node.value.left, context);
|
|
237
|
+
this.where += " = ";
|
|
238
|
+
this.Visit(node.value.right, context);
|
|
239
|
+
if (this.options.useParameters && context.literal == null) {
|
|
240
|
+
this.where = this.where.replace(/= \?$/, "IS NULL").replace(new RegExp(`\\? = \\[${context.identifier}\\]$`), `[${context.identifier}] IS NULL`);
|
|
241
|
+
}
|
|
242
|
+
else if (context.literal == "NULL") {
|
|
243
|
+
this.where = this.where.replace(/= NULL$/, "IS NULL").replace(new RegExp(`NULL = \\[${context.identifier}\\]$`), `[${context.identifier}] IS NULL`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
VisitNotEqualsExpression(node, context) {
|
|
247
|
+
this.Visit(node.value.left, context);
|
|
248
|
+
this.where += " <> ";
|
|
249
|
+
this.Visit(node.value.right, context);
|
|
250
|
+
if (this.options.useParameters && context.literal == null) {
|
|
251
|
+
this.where = this.where.replace(/<> \?$/, "IS NOT NULL").replace(new RegExp(`\\? <> \\[${context.identifier}\\]$`), `[${context.identifier}] IS NOT NULL`);
|
|
252
|
+
}
|
|
253
|
+
else if (context.literal == "NULL") {
|
|
254
|
+
this.where = this.where.replace(/<> NULL$/, "IS NOT NULL").replace(new RegExp(`NULL <> \\[${context.identifier}\\]$`), `[${context.identifier}] IS NOT NULL`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
VisitLesserThanExpression(node, context) {
|
|
258
|
+
this.Visit(node.value.left, context);
|
|
259
|
+
this.where += " < ";
|
|
260
|
+
this.Visit(node.value.right, context);
|
|
261
|
+
}
|
|
262
|
+
VisitLesserOrEqualsExpression(node, context) {
|
|
263
|
+
this.Visit(node.value.left, context);
|
|
264
|
+
this.where += " <= ";
|
|
265
|
+
this.Visit(node.value.right, context);
|
|
266
|
+
}
|
|
267
|
+
VisitGreaterThanExpression(node, context) {
|
|
268
|
+
this.Visit(node.value.left, context);
|
|
269
|
+
this.where += " > ";
|
|
270
|
+
this.Visit(node.value.right, context);
|
|
271
|
+
}
|
|
272
|
+
VisitGreaterOrEqualsExpression(node, context) {
|
|
273
|
+
this.Visit(node.value.left, context);
|
|
274
|
+
this.where += " >= ";
|
|
275
|
+
this.Visit(node.value.right, context);
|
|
276
|
+
}
|
|
277
|
+
VisitLiteral(node, context) {
|
|
278
|
+
if (this.options.useParameters) {
|
|
279
|
+
let name = `p${this.parameterSeed++}`;
|
|
280
|
+
let value = odata_v4_literal_1.Literal.convert(node.value, node.raw);
|
|
281
|
+
context.literal = value;
|
|
282
|
+
this.parameters.set(name, value);
|
|
283
|
+
this.where += "?";
|
|
284
|
+
}
|
|
285
|
+
else
|
|
286
|
+
this.where += (context.literal = SQLLiteral.convert(node.value, node.raw));
|
|
287
|
+
}
|
|
288
|
+
VisitMethodCallExpression(node, context) {
|
|
289
|
+
var method = node.value.method;
|
|
290
|
+
var params = node.value.parameters || [];
|
|
291
|
+
switch (method) {
|
|
292
|
+
case "contains":
|
|
293
|
+
this.Visit(params[0], context);
|
|
294
|
+
if (this.options.useParameters) {
|
|
295
|
+
let name = `p${this.parameterSeed++}`;
|
|
296
|
+
let value = odata_v4_literal_1.Literal.convert(params[1].value, params[1].raw);
|
|
297
|
+
this.parameters.set(name, `%${value}%`);
|
|
298
|
+
this.where += " like ?";
|
|
299
|
+
}
|
|
300
|
+
else
|
|
301
|
+
this.where += ` like '%${SQLLiteral.convert(params[1].value, params[1].raw).slice(1, -1)}%'`;
|
|
302
|
+
break;
|
|
303
|
+
case "endswith":
|
|
304
|
+
this.Visit(params[0], context);
|
|
305
|
+
if (this.options.useParameters) {
|
|
306
|
+
let name = `p${this.parameterSeed++}`;
|
|
307
|
+
let value = odata_v4_literal_1.Literal.convert(params[1].value, params[1].raw);
|
|
308
|
+
this.parameters.set(name, `%${value}`);
|
|
309
|
+
this.where += " like ?";
|
|
310
|
+
}
|
|
311
|
+
else
|
|
312
|
+
this.where += ` like '%${SQLLiteral.convert(params[1].value, params[1].raw).slice(1, -1)}'`;
|
|
313
|
+
break;
|
|
314
|
+
case "startswith":
|
|
315
|
+
this.Visit(params[0], context);
|
|
316
|
+
if (this.options.useParameters) {
|
|
317
|
+
let name = `p${this.parameterSeed++}`;
|
|
318
|
+
let value = odata_v4_literal_1.Literal.convert(params[1].value, params[1].raw);
|
|
319
|
+
this.parameters.set(name, `${value}%`);
|
|
320
|
+
this.where += " like ?";
|
|
321
|
+
}
|
|
322
|
+
else
|
|
323
|
+
this.where += ` like '${SQLLiteral.convert(params[1].value, params[1].raw).slice(1, -1)}%'`;
|
|
324
|
+
break;
|
|
325
|
+
case "indexof":
|
|
326
|
+
let fn = "";
|
|
327
|
+
switch (this.type) {
|
|
328
|
+
case SQLLang.MsSql:
|
|
329
|
+
fn = "CHARINDEX";
|
|
330
|
+
break;
|
|
331
|
+
case SQLLang.ANSI:
|
|
332
|
+
case SQLLang.MySql:
|
|
333
|
+
case SQLLang.PostgreSql:
|
|
334
|
+
default:
|
|
335
|
+
fn = "INSTR";
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
if (fn === "CHARINDEX") {
|
|
339
|
+
const tmp = params[0];
|
|
340
|
+
params[0] = params[1];
|
|
341
|
+
params[1] = tmp;
|
|
342
|
+
}
|
|
343
|
+
this.where += `${fn}(`;
|
|
344
|
+
this.Visit(params[0], context);
|
|
345
|
+
this.where += ', ';
|
|
346
|
+
this.Visit(params[1], context);
|
|
347
|
+
this.where += ") - 1";
|
|
348
|
+
break;
|
|
349
|
+
case "round":
|
|
350
|
+
this.where += "ROUND(";
|
|
351
|
+
this.Visit(params[0], context);
|
|
352
|
+
this.where += ")";
|
|
353
|
+
break;
|
|
354
|
+
case "length":
|
|
355
|
+
this.where += "LEN(";
|
|
356
|
+
this.Visit(params[0], context);
|
|
357
|
+
this.where += ")";
|
|
358
|
+
break;
|
|
359
|
+
case "tolower":
|
|
360
|
+
this.where += "LCASE(";
|
|
361
|
+
this.Visit(params[0], context);
|
|
362
|
+
this.where += ")";
|
|
363
|
+
break;
|
|
364
|
+
case "toupper":
|
|
365
|
+
this.where += "UCASE(";
|
|
366
|
+
this.Visit(params[0], context);
|
|
367
|
+
this.where += ")";
|
|
368
|
+
break;
|
|
369
|
+
case "floor":
|
|
370
|
+
case "ceiling":
|
|
371
|
+
case "year":
|
|
372
|
+
case "month":
|
|
373
|
+
case "day":
|
|
374
|
+
case "hour":
|
|
375
|
+
case "minute":
|
|
376
|
+
case "second":
|
|
377
|
+
this.where += `${method.toUpperCase()}(`;
|
|
378
|
+
this.Visit(params[0], context);
|
|
379
|
+
this.where += ")";
|
|
380
|
+
break;
|
|
381
|
+
case "now":
|
|
382
|
+
this.where += "NOW()";
|
|
383
|
+
break;
|
|
384
|
+
case "trim":
|
|
385
|
+
this.where += "TRIM(' ' FROM ";
|
|
386
|
+
this.Visit(params[0], context);
|
|
387
|
+
this.where += ")";
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
exports.Visitor = Visitor;
|
|
393
|
+
//# sourceMappingURL=visitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visitor.js","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":";;;AACA,uDAA2C;AAG3C,MAAa,UAAW,SAAQ,0BAAO;IACtC,MAAM,CAAC,OAAO,CAAC,IAAW,EAAE,KAAY;QACjC,OAAO,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACnD,CAAC;IACJ,YAAY,CAAC,KAAY,IAAG,OAAO,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC5G,UAAU,CAAC,KAAY,IAAG,OAAO,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACzE,UAAU,CAAC,KAAY,IAAG,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC;IACrD,oBAAoB,CAAC,KAAY,IAAO,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IAC9G,aAAa,CAAC,KAAY;QACnB,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC;QACpB,QAAQ,KAAK,CAAC,WAAW,EAAE,EAAC;YACxB,KAAK,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;YACtB,KAAK,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;SAC1B;IACL,CAAC;IACJ,MAAM,CAAC,KAAY,IAAG,OAAO,MAAM,CAAC,CAAC,CAAC;CACtC;AAjBD,gCAiBC;AAED,IAAY,OAMX;AAND,WAAY,OAAO;IAClB,qCAAI,CAAA;IACJ,uCAAK,CAAA;IACL,uCAAK,CAAA;IACL,iDAAU,CAAA;IACV,yCAAM,CAAA;AACP,CAAC,EANW,OAAO,GAAP,eAAO,KAAP,eAAO,QAMlB;AAED,MAAa,OAAO;IAgBnB,YAAY,UAAsB,EAAE;QAbpC,WAAM,GAAU,EAAE,CAAC;QACnB,UAAK,GAAU,EAAE,CAAC;QAClB,YAAO,GAAU,EAAE,CAAC;QAKpB,aAAQ,GAAa,EAAE,CAAC;QACxB,eAAU,GAAO,IAAI,GAAG,EAAE,CAAC;QACjB,kBAAa,GAAU,CAAC,CAAC;QAKlC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,KAAK;YAAE,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;QAC3E,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,KAAY;QAChB,IAAI,GAAG,GAAG,UAAU,IAAI,CAAC,MAAM,UAAU,KAAK,WAAW,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/F,QAAQ,IAAI,CAAC,IAAI,EAAC;YACd,KAAK,OAAO,CAAC,MAAM,CAAC;YACvB,KAAK,OAAO,CAAC,KAAK;gBACjB,IAAI,OAAO,IAAI,CAAC,IAAI,IAAI,QAAQ;oBAAE,GAAG,IAAI,WAAW,IAAI,CAAC,IAAI,OAAO,CAAC;gBACrE,IAAI,OAAO,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAC;oBACjC,IAAI,OAAO,IAAI,CAAC,IAAI,IAAI,QAAQ;wBAAE,GAAG,IAAI,gBAAgB,CAAC;oBAC1D,GAAG,IAAI,eAAe,IAAI,CAAC,KAAK,YAAY,CAAC;iBAC7C;gBACD,MAAM;YACP,KAAK,OAAO,CAAC,KAAK,CAAC;YACnB,KAAK,OAAO,CAAC,UAAU,CAAC;YACxB;gBACC,IAAI,OAAO,IAAI,CAAC,KAAK,IAAI,QAAQ;oBAAE,GAAG,IAAI,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjE,IAAI,OAAO,IAAI,CAAC,IAAI,IAAI,QAAQ;oBAAE,GAAG,IAAI,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;gBAChE,MAAM;SACP;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,OAAO;QACN,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;QAC1B,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACb,CAAC;IAEA,WAAW;QACT,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;QAC3B,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAEF,SAAS;QACR,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM;QACL,QAAQ,IAAI,CAAC,IAAI,EAAC;YACjB,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,KAAK,OAAO,CAAC,IAAI,CAAC;YAClB,KAAK,OAAO,CAAC,KAAK,CAAC;YACnB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;YACjD,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;SACrB;IACF,CAAC;IAED,KAAK,CAAC,IAAU,EAAE,OAAY;QAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC;QAC5B,OAAO,GAAG,OAAO,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAEzC,IAAI,IAAI,EAAC;YACR,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACxC,IAAI,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;;gBAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;SAC5D;QAED,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,EAAC;YACpB,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;SACtC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAES,aAAa,CAAC,IAAU,EAAE,OAAW;QAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAES,WAAW,CAAC,IAAW,EAAE,OAAY;QACxC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9B,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;YACrC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,OAAO,EAAC;gBACT,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAChD,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC/B;YACD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC;IAES,eAAe,CAAC,IAAW,EAAE,OAAY;QAC/C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5F,CAAC;IAES,eAAe,CAAC,IAAW,EAAE,OAAY;QAC/C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC;IACvC,CAAC;IAEM,iBAAiB,CAAC,IAAU,EAAE,OAAW;QAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IAES,gBAAgB,CAAC,IAAU,EAAE,OAAW;QACjD,IAAI,CAAC,WAAW,GAAG,0BAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtE,CAAC;IAES,WAAW,CAAC,IAAU,EAAE,OAAW;QAC5C,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;IACvC,CAAC;IAES,YAAY,CAAC,IAAU,EAAE,OAAW;QAC7C,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QAC3D,CAAC,CAAC,CAAC;IACJ,CAAC;IAES,gBAAgB,CAAC,IAAU,EAAE,OAAW;QACjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,CAAC;IAES,SAAS,CAAC,IAAU,EAAE,OAAW;QAC1C,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IAC7B,CAAC;IAES,QAAQ,CAAC,IAAU,EAAE,OAAW;QACzC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IAC9B,CAAC;IAES,WAAW,CAAC,IAAU,EAAE,OAAW;QAC5C,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1B,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QAC1D,CAAC,CAAC,CAAC;IACJ,CAAC;IAES,eAAe,CAAC,IAAU,EAAE,OAAW;QAChD,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC;IAC5B,CAAC;IAES,kBAAkB,CAAC,IAAU,EAAE,OAAW;QACnD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAES,iBAAiB,CAAC,IAAU,EAAE,OAAW;QAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAES,wBAAwB,CAAC,IAAU,EAAE,OAAW;QACzD,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IACnB,CAAC;IAES,qBAAqB,CAAC,IAAU,EAAE,OAAW;QACtD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAES,0BAA0B,CAAC,IAAU,EAAE,OAAW;QAC3D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAES,qBAAqB,CAAC,IAAU,EAAE,OAAW;QACtD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAES,2BAA2B,CAAC,IAAU,EAAE,OAAW;QAC5D,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAC;YACzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACrC;;YAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAES,+BAA+B,CAAC,IAAU,EAAE,OAAW;QAChE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAC;YACzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACrC;;YAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAES,oBAAoB,CAAC,IAAU,EAAE,OAAW;QACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;QAC/C,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACtC,CAAC;IAES,qBAAqB,CAAC,IAAU,EAAE,OAAW;QACtD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,EAAC;YACzD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,YAAY,OAAO,CAAC,UAAU,MAAM,CAAC,EAAE,IAAI,OAAO,CAAC,UAAU,WAAW,CAAC,CAAC;SACjJ;aAAK,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,EAAC;YACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,aAAa,OAAO,CAAC,UAAU,MAAM,CAAC,EAAE,IAAI,OAAO,CAAC,UAAU,WAAW,CAAC,CAAC;SACpJ;IACF,CAAC;IAES,wBAAwB,CAAC,IAAU,EAAE,OAAW;QACzD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,EAAC;YACzD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,aAAa,OAAO,CAAC,UAAU,MAAM,CAAC,EAAE,IAAI,OAAO,CAAC,UAAU,eAAe,CAAC,CAAC;SAC3J;aAAK,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,EAAC;YACnC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,cAAc,OAAO,CAAC,UAAU,MAAM,CAAC,EAAE,IAAI,OAAO,CAAC,UAAU,eAAe,CAAC,CAAC;SAC9J;IACF,CAAC;IAES,yBAAyB,CAAC,IAAU,EAAE,OAAW;QAC1D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAES,6BAA6B,CAAC,IAAU,EAAE,OAAW;QAC9D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAES,0BAA0B,CAAC,IAAU,EAAE,OAAW;QAC3D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAES,8BAA8B,CAAC,IAAU,EAAE,OAAW;QAC/D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAES,YAAY,CAAC,IAAU,EAAE,OAAW;QAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAC;YAC9B,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACtC,IAAI,KAAK,GAAG,0BAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;SAClB;;YAAK,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF,CAAC;IAES,yBAAyB,CAAC,IAAU,EAAE,OAAW;QAC1D,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAC/B,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;QACzC,QAAQ,MAAM,EAAC;YACd,KAAK,UAAU;gBACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAC;oBAC9B,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;oBACtC,IAAI,KAAK,GAAG,0BAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC5D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;oBACxC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;iBACxB;;oBAAK,IAAI,CAAC,KAAK,IAAI,WAAW,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnG,MAAM;YACP,KAAK,UAAU;gBACd,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAC;oBAC9B,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;oBACtC,IAAI,KAAK,GAAG,0BAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC5D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;oBACvC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;iBACxB;;oBAAK,IAAI,CAAC,KAAK,IAAI,WAAW,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAClG,MAAM;YACP,KAAK,YAAY;gBAChB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAC;oBAC9B,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;oBACtC,IAAI,KAAK,GAAG,0BAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC5D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;oBACvC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;iBACxB;;oBAAK,IAAI,CAAC,KAAK,IAAI,UAAU,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClG,MAAM;YACP,KAAK,SAAS;gBACb,IAAI,EAAE,GAAG,EAAE,CAAC;gBACZ,QAAQ,IAAI,CAAC,IAAI,EAAE;oBAClB,KAAK,OAAO,CAAC,KAAK;wBACjB,EAAE,GAAG,WAAW,CAAC;wBACjB,MAAM;oBACP,KAAK,OAAO,CAAC,IAAI,CAAC;oBAClB,KAAK,OAAO,CAAC,KAAK,CAAC;oBACnB,KAAK,OAAO,CAAC,UAAU,CAAC;oBACxB;wBACC,EAAE,GAAG,OAAO,CAAC;wBACb,MAAM;iBACP;gBACD,IAAI,EAAE,KAAK,WAAW,EAAC;oBACtB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACtB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACtB,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;iBAChB;gBACD,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG,CAAC;gBACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC;gBACtB,MAAM;YACP,KAAK,OAAO;gBACX,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;gBACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;gBAClB,MAAM;YACP,KAAK,QAAQ;gBACZ,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;gBACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;gBAClB,MAAM;YACP,KAAK,SAAS;gBACb,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;gBACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;gBAClB,MAAM;YACP,KAAK,SAAS;gBACb,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;gBACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;gBAClB,MAAM;YACP,KAAK,OAAO,CAAC;YACb,KAAK,SAAS,CAAC;YACf,KAAK,MAAM,CAAC;YACZ,KAAK,OAAO,CAAC;YACb,KAAK,KAAK,CAAC;YACX,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ;gBACZ,IAAI,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC;gBACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;gBAClB,MAAM;YACP,KAAK,KAAK;gBACT,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC;gBACtB,MAAM;YACP,KAAK,MAAM;gBACV,IAAI,CAAC,KAAK,IAAI,gBAAgB,CAAC;gBAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/B,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;gBAClB,MAAM;SACP;IACF,CAAC;CAED;AA3XD,0BA2XC"}
|