dsl-to-sql 1.0.0-fabric-1p-development.1
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/.turbo/turbo-build.log +9 -0
- package/.turbo/turbo-check-types.log +4 -0
- package/.turbo/turbo-lint.log +126 -0
- package/README.md +45 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +236 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/constants.ts.html +826 -0
- package/coverage/src/database_types.ts.html +136 -0
- package/coverage/src/epm-query-builder/EpmQueryBuilder.ts.html +166 -0
- package/coverage/src/epm-query-builder/base/BaseAdvancedAggregations.ts.html +568 -0
- package/coverage/src/epm-query-builder/base/BaseAnalyticalFunctions.ts.html +694 -0
- package/coverage/src/epm-query-builder/base/BaseCTEGenerator.ts.html +1459 -0
- package/coverage/src/epm-query-builder/base/BaseCountQueryBuilder.ts.html +400 -0
- package/coverage/src/epm-query-builder/base/BaseMeasureBuilder.ts.html +295 -0
- package/coverage/src/epm-query-builder/base/BaseOrderBuilder.ts.html +670 -0
- package/coverage/src/epm-query-builder/base/BasePaginationBuilder.ts.html +364 -0
- package/coverage/src/epm-query-builder/base/BaseQueryBuilder.ts.html +238 -0
- package/coverage/src/epm-query-builder/base/BaseRollupBuilder.ts.html +532 -0
- package/coverage/src/epm-query-builder/base/BaseSqlBuilder.ts.html +601 -0
- package/coverage/src/epm-query-builder/base/BaseSuperFilterBuilder.ts.html +1966 -0
- package/coverage/src/epm-query-builder/base/BaseUtilities.ts.html +1798 -0
- package/coverage/src/epm-query-builder/base/ColumnRefUtils.ts.html +211 -0
- package/coverage/src/epm-query-builder/base/RelationshipResolver.ts.html +706 -0
- package/coverage/src/epm-query-builder/base/SharedFilterBuilder.ts.html +1717 -0
- package/coverage/src/epm-query-builder/base/index.html +326 -0
- package/coverage/src/epm-query-builder/constants/Aggregations.ts.html +133 -0
- package/coverage/src/epm-query-builder/constants/Database.ts.html +103 -0
- package/coverage/src/epm-query-builder/constants/Source.ts.html +106 -0
- package/coverage/src/epm-query-builder/constants/index.html +146 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbAdvancedAggregations.ts.html +286 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbJoinBuilder.ts.html +280 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbMeasureBuilder.ts.html +1924 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbOrderBuilder.ts.html +769 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbPaginationBuilder.ts.html +643 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbQueryBuilder.ts.html +2644 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbRollupBuilder.ts.html +478 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/DuckDbSuperFilterBuilder.ts.html +1195 -0
- package/coverage/src/epm-query-builder/dialects/duckdb/index.html +221 -0
- package/coverage/src/epm-query-builder/errors/QueryBuilderErrors.ts.html +280 -0
- package/coverage/src/epm-query-builder/errors/index.html +116 -0
- package/coverage/src/epm-query-builder/index.html +116 -0
- package/coverage/src/epm-query-builder/interfaces/IDatabaseQueryBuilder.ts.html +100 -0
- package/coverage/src/epm-query-builder/interfaces/index.html +131 -0
- package/coverage/src/epm-query-builder/interfaces/index.ts.html +88 -0
- package/coverage/src/epm-query-builder/utils/format.ts.html +151 -0
- package/coverage/src/epm-query-builder/utils/index.html +146 -0
- package/coverage/src/epm-query-builder/utils/sql.ts.html +247 -0
- package/coverage/src/epm-query-builder/utils/validation.ts.html +124 -0
- package/coverage/src/epm-query-builder/validation/QueryOptionsValidator.ts.html +631 -0
- package/coverage/src/epm-query-builder/validation/SqlQueryValidator.ts.html +475 -0
- package/coverage/src/epm-query-builder/validation/index.html +131 -0
- package/coverage/src/filters/FilterConditionBuilder.ts.html +427 -0
- package/coverage/src/filters/filter-types.ts.html +484 -0
- package/coverage/src/filters/index.html +131 -0
- package/coverage/src/index.html +176 -0
- package/coverage/src/index.ts.html +103 -0
- package/coverage/src/js-lib/JsToSqlParser.ts.html +736 -0
- package/coverage/src/js-lib/ParseContext.ts.html +532 -0
- package/coverage/src/js-lib/db/azuresql/AzureSqlCallExpressionVisitor.ts.html +196 -0
- package/coverage/src/js-lib/db/azuresql/index.html +116 -0
- package/coverage/src/js-lib/db/base/ArrayExpressionVisitor.ts.html +133 -0
- package/coverage/src/js-lib/db/base/AssignmentExpressionVisitor.ts.html +187 -0
- package/coverage/src/js-lib/db/base/BinaryExpressionVisitor.ts.html +223 -0
- package/coverage/src/js-lib/db/base/CallExpressionVisitor.ts.html +5479 -0
- package/coverage/src/js-lib/db/base/IdentifierVisitor.ts.html +283 -0
- package/coverage/src/js-lib/db/base/LiteralVisitor.ts.html +199 -0
- package/coverage/src/js-lib/db/base/MemberExpressionVisitor.ts.html +193 -0
- package/coverage/src/js-lib/db/base/ProgramVisitor.ts.html +139 -0
- package/coverage/src/js-lib/db/base/UnaryExpressionVisitor.ts.html +181 -0
- package/coverage/src/js-lib/db/base/VisitorInterface.ts.html +103 -0
- package/coverage/src/js-lib/db/base/index.html +251 -0
- package/coverage/src/js-lib/db/bigquery/BigQueryCallExpressionVisitor.ts.html +1747 -0
- package/coverage/src/js-lib/db/bigquery/index.html +116 -0
- package/coverage/src/js-lib/db/commonTransforms.ts.html +2074 -0
- package/coverage/src/js-lib/db/databricks/DatabricksCallExpressionVisitor.ts.html +1303 -0
- package/coverage/src/js-lib/db/databricks/index.html +116 -0
- package/coverage/src/js-lib/db/fabricsql/FabricSqlCallExpressionVisitor.ts.html +196 -0
- package/coverage/src/js-lib/db/fabricsql/index.html +116 -0
- package/coverage/src/js-lib/db/fabricwarehouse/FabricWarehouseCallExpressionVisitor.ts.html +292 -0
- package/coverage/src/js-lib/db/fabricwarehouse/index.html +116 -0
- package/coverage/src/js-lib/db/index.html +116 -0
- package/coverage/src/js-lib/db/postgresql/PostgreSqlCallExpressionVisitor.ts.html +985 -0
- package/coverage/src/js-lib/db/postgresql/index.html +116 -0
- package/coverage/src/js-lib/db/redshift/RedshiftCallExpressionVisitor.ts.html +685 -0
- package/coverage/src/js-lib/db/redshift/index.html +116 -0
- package/coverage/src/js-lib/db/sample/SampleCallExpressionVisitor.ts.html +196 -0
- package/coverage/src/js-lib/db/sample/index.html +116 -0
- package/coverage/src/js-lib/db/snowflake/SnowflakeCallExpressionVisitor.ts.html +1447 -0
- package/coverage/src/js-lib/db/snowflake/index.html +116 -0
- package/coverage/src/js-lib/db/validator/FormulaValidator.ts.html +4162 -0
- package/coverage/src/js-lib/db/validator/index.html +116 -0
- package/coverage/src/js-lib/index.html +131 -0
- package/coverage/src/js-lib/objects/BaseObject.ts.html +169 -0
- package/coverage/src/js-lib/objects/DateObject.ts.html +169 -0
- package/coverage/src/js-lib/objects/PctObject.ts.html +178 -0
- package/coverage/src/js-lib/objects/index.html +146 -0
- package/coverage/src/query-builder/PaginationBuilder.ts.html +142 -0
- package/coverage/src/query-builder/QueryBuilder.ts.html +3118 -0
- package/coverage/src/query-builder/SuperFilterBuilder.ts.html +1969 -0
- package/coverage/src/query-builder/index.html +146 -0
- package/coverage/src/runtime_var.ts.html +109 -0
- package/coverage/src/sql-lib/binary_expr.ts.html +133 -0
- package/coverage/src/sql-lib/case.ts.html +133 -0
- package/coverage/src/sql-lib/column.ts.html +139 -0
- package/coverage/src/sql-lib/else.ts.html +124 -0
- package/coverage/src/sql-lib/function.ts.html +112 -0
- package/coverage/src/sql-lib/index.html +251 -0
- package/coverage/src/sql-lib/join.ts.html +127 -0
- package/coverage/src/sql-lib/literal.ts.html +130 -0
- package/coverage/src/sql-lib/select.ts.html +547 -0
- package/coverage/src/sql-lib/unary_expr.ts.html +112 -0
- package/coverage/src/sql-lib/when.ts.html +130 -0
- package/coverage/src/sql_query_gen.ts.html +535 -0
- package/coverage/src/superFilter/DateFilterFactory.ts.html +625 -0
- package/coverage/src/superFilter/dateFunction.ts.html +193 -0
- package/coverage/src/superFilter/index.html +131 -0
- package/coverage/src/utils.ts.html +571 -0
- package/dist/index.cjs +8440 -0
- package/dist/index.d.cts +927 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +927 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8387 -0
- package/dist/index.js.map +1 -0
- package/eslint.config.js +4 -0
- package/jest.config.ts +44 -0
- package/package.json +45 -0
- package/src/constants.ts +247 -0
- package/src/epm-query-builder/EpmQueryBuilder.ts +27 -0
- package/src/epm-query-builder/base/BaseAdvancedAggregations.ts +161 -0
- package/src/epm-query-builder/base/BaseAnalyticalFunctions.ts +203 -0
- package/src/epm-query-builder/base/BaseCTEGenerator.ts +458 -0
- package/src/epm-query-builder/base/BaseCountQueryBuilder.ts +105 -0
- package/src/epm-query-builder/base/BaseMeasureBuilder.ts +87 -0
- package/src/epm-query-builder/base/BaseOrderBuilder.ts +195 -0
- package/src/epm-query-builder/base/BasePaginationBuilder.ts +93 -0
- package/src/epm-query-builder/base/BaseQueryBuilder.ts +51 -0
- package/src/epm-query-builder/base/BaseRollupBuilder.ts +149 -0
- package/src/epm-query-builder/base/BaseSqlBuilder.ts +172 -0
- package/src/epm-query-builder/base/BaseSuperFilterBuilder.ts +627 -0
- package/src/epm-query-builder/base/BaseUtilities.ts +571 -0
- package/src/epm-query-builder/base/ColumnRefUtils.ts +42 -0
- package/src/epm-query-builder/base/RelationshipResolver.ts +207 -0
- package/src/epm-query-builder/base/SharedFilterBuilder.ts +544 -0
- package/src/epm-query-builder/constants/Aggregations.ts +16 -0
- package/src/epm-query-builder/constants/Database.ts +6 -0
- package/src/epm-query-builder/constants/Source.ts +7 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbAdvancedAggregations.ts +67 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbJoinBuilder.ts +65 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbMeasureBuilder.ts +626 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbOrderBuilder.ts +228 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbPaginationBuilder.ts +186 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbQueryBuilder.ts +853 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbRollupBuilder.ts +131 -0
- package/src/epm-query-builder/dialects/duckdb/DuckDbSuperFilterBuilder.ts +370 -0
- package/src/epm-query-builder/errors/QueryBuilderErrors.ts +65 -0
- package/src/epm-query-builder/interfaces/IDatabaseQueryBuilder.ts +5 -0
- package/src/epm-query-builder/interfaces/index.ts +1 -0
- package/src/epm-query-builder/types/query-builder-types.d.ts +289 -0
- package/src/epm-query-builder/utils/format.ts +22 -0
- package/src/epm-query-builder/utils/sql.ts +54 -0
- package/src/epm-query-builder/utils/validation.ts +13 -0
- package/src/epm-query-builder/validation/QueryOptionsValidator.ts +182 -0
- package/src/epm-query-builder/validation/SqlQueryValidator.ts +130 -0
- package/src/filters/FilterConditionBuilder.ts +114 -0
- package/src/filters/filter-types.ts +133 -0
- package/src/index.ts +10 -0
- package/src/js-lib/JsToSqlParser.ts +217 -0
- package/src/js-lib/ParseContext.ts +149 -0
- package/src/js-lib/db/base/ArrayExpressionVisitor.ts +16 -0
- package/src/js-lib/db/base/AssignmentExpressionVisitor.ts +34 -0
- package/src/js-lib/db/base/BinaryExpressionVisitor.ts +46 -0
- package/src/js-lib/db/base/CallExpressionVisitor.ts +1798 -0
- package/src/js-lib/db/base/IdentifierVisitor.ts +66 -0
- package/src/js-lib/db/base/LiteralVisitor.ts +38 -0
- package/src/js-lib/db/base/MemberExpressionVisitor.ts +36 -0
- package/src/js-lib/db/base/ProgramVisitor.ts +18 -0
- package/src/js-lib/db/base/UnaryExpressionVisitor.ts +32 -0
- package/src/js-lib/db/base/VisitorInterface.ts +6 -0
- package/src/js-lib/db/validator/FormulaValidator.ts +1235 -0
- package/src/js-lib/objects/BaseObject.ts +28 -0
- package/src/js-lib/objects/DateObject.ts +28 -0
- package/src/js-lib/objects/PctObject.ts +31 -0
- package/src/query-builder/PaginationBuilder.ts +19 -0
- package/src/query-builder/QueryBuilder.ts +1035 -0
- package/src/query-builder/SuperFilterBuilder.ts +628 -0
- package/src/runtime_var.ts +8 -0
- package/src/sql-lib/binary_expr.ts +16 -0
- package/src/sql-lib/case.ts +16 -0
- package/src/sql-lib/column.ts +18 -0
- package/src/sql-lib/else.ts +13 -0
- package/src/sql-lib/function.ts +9 -0
- package/src/sql-lib/join.ts +14 -0
- package/src/sql-lib/literal.ts +15 -0
- package/src/sql-lib/select.ts +154 -0
- package/src/sql-lib/unary_expr.ts +9 -0
- package/src/sql-lib/when.ts +15 -0
- package/src/sql-types.d.ts +565 -0
- package/src/sql_query_gen.ts +150 -0
- package/src/superFilter/DateFilterFactory.ts +180 -0
- package/src/superFilter/dateFunction.ts +36 -0
- package/src/utils.ts +354 -0
- package/test-output/report/junit.xml +329 -0
- package/tests/JsToSqlParser.test.ts +163 -0
- package/tests/QueryBuilder.test.ts +1320 -0
- package/tests/js-lib/CallExpressionVisitor.test.ts +820 -0
- package/tests/mocks/MockQueryResolver.ts +14 -0
- package/tests/sanity.test.ts +146 -0
- package/tests/sql-lib/binary_expr.test.ts +75 -0
- package/tests/sql-lib/case.test.ts +117 -0
- package/tests/sql-lib/column.test.ts +87 -0
- package/tests/sql-lib/else.test.ts +56 -0
- package/tests/sql-lib/function.test.ts +96 -0
- package/tests/sql-lib/literal.test.ts +75 -0
- package/tests/sql-lib/select.test.ts +245 -0
- package/tests/sql-lib/unary_expr.test.ts +32 -0
- package/tests/utils.test.ts +13 -0
- package/tsconfig.json +24 -0
- package/tsdown.config.ts +23 -0
|
@@ -0,0 +1,1798 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/epm-query-builder/base/BaseUtilities.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../../index.html">All files</a> / <a href="index.html">src/epm-query-builder/base</a> BaseUtilities.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">0% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>0/208</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">0% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>0/207</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">0% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>0/70</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">0% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>0/204</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
645
|
+
<span class="cline-any cline-no"> </span>
|
|
646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
648
|
+
<span class="cline-any cline-no"> </span>
|
|
649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
651
|
+
<span class="cline-any cline-no"> </span>
|
|
652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
654
|
+
<span class="cline-any cline-no"> </span>
|
|
655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-no"> </span>
|
|
658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
660
|
+
<span class="cline-any cline-no"> </span>
|
|
661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
663
|
+
<span class="cline-any cline-no"> </span>
|
|
664
|
+
<span class="cline-any cline-no"> </span>
|
|
665
|
+
<span class="cline-any cline-no"> </span>
|
|
666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
671
|
+
<span class="cline-any cline-no"> </span>
|
|
672
|
+
<span class="cline-any cline-no"> </span>
|
|
673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
674
|
+
<span class="cline-any cline-no"> </span>
|
|
675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
677
|
+
<span class="cline-any cline-no"> </span>
|
|
678
|
+
<span class="cline-any cline-no"> </span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-no"> </span>
|
|
681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
682
|
+
<span class="cline-any cline-no"> </span>
|
|
683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
685
|
+
<span class="cline-any cline-no"> </span>
|
|
686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
689
|
+
<span class="cline-any cline-no"> </span>
|
|
690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
691
|
+
<span class="cline-any cline-no"> </span>
|
|
692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
693
|
+
<span class="cline-any cline-no"> </span>
|
|
694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-no"> </span>
|
|
698
|
+
<span class="cline-any cline-no"> </span>
|
|
699
|
+
<span class="cline-any cline-no"> </span>
|
|
700
|
+
<span class="cline-any cline-no"> </span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-no"> </span>
|
|
703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
705
|
+
<span class="cline-any cline-no"> </span>
|
|
706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-no"> </span>
|
|
709
|
+
<span class="cline-any cline-no"> </span>
|
|
710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
712
|
+
<span class="cline-any cline-no"> </span>
|
|
713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
715
|
+
<span class="cline-any cline-no"> </span>
|
|
716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
718
|
+
<span class="cline-any cline-no"> </span>
|
|
719
|
+
<span class="cline-any cline-no"> </span>
|
|
720
|
+
<span class="cline-any cline-no"> </span>
|
|
721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
723
|
+
<span class="cline-any cline-no"> </span>
|
|
724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
726
|
+
<span class="cline-any cline-no"> </span>
|
|
727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
731
|
+
<span class="cline-any cline-no"> </span>
|
|
732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
736
|
+
<span class="cline-any cline-no"> </span>
|
|
737
|
+
<span class="cline-any cline-no"> </span>
|
|
738
|
+
<span class="cline-any cline-no"> </span>
|
|
739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
740
|
+
<span class="cline-any cline-no"> </span>
|
|
741
|
+
<span class="cline-any cline-no"> </span>
|
|
742
|
+
<span class="cline-any cline-no"> </span>
|
|
743
|
+
<span class="cline-any cline-no"> </span>
|
|
744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
745
|
+
<span class="cline-any cline-no"> </span>
|
|
746
|
+
<span class="cline-any cline-no"> </span>
|
|
747
|
+
<span class="cline-any cline-no"> </span>
|
|
748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
749
|
+
<span class="cline-any cline-no"> </span>
|
|
750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
752
|
+
<span class="cline-any cline-no"> </span>
|
|
753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
755
|
+
<span class="cline-any cline-no"> </span>
|
|
756
|
+
<span class="cline-any cline-no"> </span>
|
|
757
|
+
<span class="cline-any cline-no"> </span>
|
|
758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
759
|
+
<span class="cline-any cline-no"> </span>
|
|
760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
761
|
+
<span class="cline-any cline-neutral"> </span>
|
|
762
|
+
<span class="cline-any cline-no"> </span>
|
|
763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
765
|
+
<span class="cline-any cline-no"> </span>
|
|
766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
768
|
+
<span class="cline-any cline-no"> </span>
|
|
769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
771
|
+
<span class="cline-any cline-no"> </span>
|
|
772
|
+
<span class="cline-any cline-no"> </span>
|
|
773
|
+
<span class="cline-any cline-no"> </span>
|
|
774
|
+
<span class="cline-any cline-neutral"> </span>
|
|
775
|
+
<span class="cline-any cline-neutral"> </span>
|
|
776
|
+
<span class="cline-any cline-no"> </span>
|
|
777
|
+
<span class="cline-any cline-neutral"> </span>
|
|
778
|
+
<span class="cline-any cline-neutral"> </span>
|
|
779
|
+
<span class="cline-any cline-no"> </span>
|
|
780
|
+
<span class="cline-any cline-no"> </span>
|
|
781
|
+
<span class="cline-any cline-no"> </span>
|
|
782
|
+
<span class="cline-any cline-no"> </span>
|
|
783
|
+
<span class="cline-any cline-no"> </span>
|
|
784
|
+
<span class="cline-any cline-neutral"> </span>
|
|
785
|
+
<span class="cline-any cline-no"> </span>
|
|
786
|
+
<span class="cline-any cline-neutral"> </span>
|
|
787
|
+
<span class="cline-any cline-neutral"> </span>
|
|
788
|
+
<span class="cline-any cline-no"> </span>
|
|
789
|
+
<span class="cline-any cline-no"> </span>
|
|
790
|
+
<span class="cline-any cline-no"> </span>
|
|
791
|
+
<span class="cline-any cline-no"> </span>
|
|
792
|
+
<span class="cline-any cline-no"> </span>
|
|
793
|
+
<span class="cline-any cline-no"> </span>
|
|
794
|
+
<span class="cline-any cline-no"> </span>
|
|
795
|
+
<span class="cline-any cline-no"> </span>
|
|
796
|
+
<span class="cline-any cline-no"> </span>
|
|
797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
798
|
+
<span class="cline-any cline-neutral"> </span>
|
|
799
|
+
<span class="cline-any cline-no"> </span>
|
|
800
|
+
<span class="cline-any cline-no"> </span>
|
|
801
|
+
<span class="cline-any cline-no"> </span>
|
|
802
|
+
<span class="cline-any cline-no"> </span>
|
|
803
|
+
<span class="cline-any cline-no"> </span>
|
|
804
|
+
<span class="cline-any cline-no"> </span>
|
|
805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
807
|
+
<span class="cline-any cline-neutral"> </span>
|
|
808
|
+
<span class="cline-any cline-neutral"> </span>
|
|
809
|
+
<span class="cline-any cline-no"> </span>
|
|
810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
811
|
+
<span class="cline-any cline-neutral"> </span>
|
|
812
|
+
<span class="cline-any cline-no"> </span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-neutral"> </span>
|
|
815
|
+
<span class="cline-any cline-no"> </span>
|
|
816
|
+
<span class="cline-any cline-no"> </span>
|
|
817
|
+
<span class="cline-any cline-neutral"> </span>
|
|
818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
819
|
+
<span class="cline-any cline-neutral"> </span>
|
|
820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
822
|
+
<span class="cline-any cline-neutral"> </span>
|
|
823
|
+
<span class="cline-any cline-neutral"> </span>
|
|
824
|
+
<span class="cline-any cline-neutral"> </span>
|
|
825
|
+
<span class="cline-any cline-neutral"> </span>
|
|
826
|
+
<span class="cline-any cline-no"> </span>
|
|
827
|
+
<span class="cline-any cline-no"> </span>
|
|
828
|
+
<span class="cline-any cline-neutral"> </span>
|
|
829
|
+
<span class="cline-any cline-neutral"> </span>
|
|
830
|
+
<span class="cline-any cline-neutral"> </span>
|
|
831
|
+
<span class="cline-any cline-neutral"> </span>
|
|
832
|
+
<span class="cline-any cline-neutral"> </span>
|
|
833
|
+
<span class="cline-any cline-neutral"> </span>
|
|
834
|
+
<span class="cline-any cline-neutral"> </span>
|
|
835
|
+
<span class="cline-any cline-neutral"> </span>
|
|
836
|
+
<span class="cline-any cline-no"> </span>
|
|
837
|
+
<span class="cline-any cline-no"> </span>
|
|
838
|
+
<span class="cline-any cline-neutral"> </span>
|
|
839
|
+
<span class="cline-any cline-no"> </span>
|
|
840
|
+
<span class="cline-any cline-no"> </span>
|
|
841
|
+
<span class="cline-any cline-neutral"> </span>
|
|
842
|
+
<span class="cline-any cline-neutral"> </span>
|
|
843
|
+
<span class="cline-any cline-no"> </span>
|
|
844
|
+
<span class="cline-any cline-neutral"> </span>
|
|
845
|
+
<span class="cline-any cline-neutral"> </span>
|
|
846
|
+
<span class="cline-any cline-no"> </span>
|
|
847
|
+
<span class="cline-any cline-no"> </span>
|
|
848
|
+
<span class="cline-any cline-no"> </span>
|
|
849
|
+
<span class="cline-any cline-no"> </span>
|
|
850
|
+
<span class="cline-any cline-no"> </span>
|
|
851
|
+
<span class="cline-any cline-no"> </span>
|
|
852
|
+
<span class="cline-any cline-neutral"> </span>
|
|
853
|
+
<span class="cline-any cline-neutral"> </span>
|
|
854
|
+
<span class="cline-any cline-no"> </span>
|
|
855
|
+
<span class="cline-any cline-neutral"> </span>
|
|
856
|
+
<span class="cline-any cline-neutral"> </span>
|
|
857
|
+
<span class="cline-any cline-no"> </span>
|
|
858
|
+
<span class="cline-any cline-no"> </span>
|
|
859
|
+
<span class="cline-any cline-no"> </span>
|
|
860
|
+
<span class="cline-any cline-no"> </span>
|
|
861
|
+
<span class="cline-any cline-neutral"> </span>
|
|
862
|
+
<span class="cline-any cline-no"> </span>
|
|
863
|
+
<span class="cline-any cline-neutral"> </span>
|
|
864
|
+
<span class="cline-any cline-neutral"> </span>
|
|
865
|
+
<span class="cline-any cline-no"> </span>
|
|
866
|
+
<span class="cline-any cline-neutral"> </span>
|
|
867
|
+
<span class="cline-any cline-neutral"> </span>
|
|
868
|
+
<span class="cline-any cline-no"> </span>
|
|
869
|
+
<span class="cline-any cline-no"> </span>
|
|
870
|
+
<span class="cline-any cline-neutral"> </span>
|
|
871
|
+
<span class="cline-any cline-no"> </span>
|
|
872
|
+
<span class="cline-any cline-no"> </span>
|
|
873
|
+
<span class="cline-any cline-no"> </span>
|
|
874
|
+
<span class="cline-any cline-no"> </span>
|
|
875
|
+
<span class="cline-any cline-no"> </span>
|
|
876
|
+
<span class="cline-any cline-neutral"> </span>
|
|
877
|
+
<span class="cline-any cline-neutral"> </span>
|
|
878
|
+
<span class="cline-any cline-neutral"> </span>
|
|
879
|
+
<span class="cline-any cline-no"> </span>
|
|
880
|
+
<span class="cline-any cline-neutral"> </span>
|
|
881
|
+
<span class="cline-any cline-neutral"> </span>
|
|
882
|
+
<span class="cline-any cline-no"> </span>
|
|
883
|
+
<span class="cline-any cline-no"> </span>
|
|
884
|
+
<span class="cline-any cline-no"> </span>
|
|
885
|
+
<span class="cline-any cline-no"> </span>
|
|
886
|
+
<span class="cline-any cline-no"> </span>
|
|
887
|
+
<span class="cline-any cline-no"> </span>
|
|
888
|
+
<span class="cline-any cline-no"> </span>
|
|
889
|
+
<span class="cline-any cline-neutral"> </span>
|
|
890
|
+
<span class="cline-any cline-neutral"> </span>
|
|
891
|
+
<span class="cline-any cline-neutral"> </span>
|
|
892
|
+
<span class="cline-any cline-neutral"> </span>
|
|
893
|
+
<span class="cline-any cline-no"> </span>
|
|
894
|
+
<span class="cline-any cline-no"> </span>
|
|
895
|
+
<span class="cline-any cline-no"> </span>
|
|
896
|
+
<span class="cline-any cline-neutral"> </span>
|
|
897
|
+
<span class="cline-any cline-no"> </span>
|
|
898
|
+
<span class="cline-any cline-neutral"> </span>
|
|
899
|
+
<span class="cline-any cline-no"> </span>
|
|
900
|
+
<span class="cline-any cline-neutral"> </span>
|
|
901
|
+
<span class="cline-any cline-no"> </span>
|
|
902
|
+
<span class="cline-any cline-neutral"> </span>
|
|
903
|
+
<span class="cline-any cline-neutral"> </span>
|
|
904
|
+
<span class="cline-any cline-neutral"> </span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-no"> </span>
|
|
907
|
+
<span class="cline-any cline-neutral"> </span>
|
|
908
|
+
<span class="cline-any cline-neutral"> </span>
|
|
909
|
+
<span class="cline-any cline-no"> </span>
|
|
910
|
+
<span class="cline-any cline-neutral"> </span>
|
|
911
|
+
<span class="cline-any cline-neutral"> </span>
|
|
912
|
+
<span class="cline-any cline-no"> </span>
|
|
913
|
+
<span class="cline-any cline-no"> </span>
|
|
914
|
+
<span class="cline-any cline-no"> </span>
|
|
915
|
+
<span class="cline-any cline-no"> </span>
|
|
916
|
+
<span class="cline-any cline-no"> </span>
|
|
917
|
+
<span class="cline-any cline-no"> </span>
|
|
918
|
+
<span class="cline-any cline-neutral"> </span>
|
|
919
|
+
<span class="cline-any cline-no"> </span>
|
|
920
|
+
<span class="cline-any cline-no"> </span>
|
|
921
|
+
<span class="cline-any cline-no"> </span>
|
|
922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
923
|
+
<span class="cline-any cline-no"> </span>
|
|
924
|
+
<span class="cline-any cline-neutral"> </span>
|
|
925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
926
|
+
<span class="cline-any cline-no"> </span>
|
|
927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
928
|
+
<span class="cline-any cline-neutral"> </span>
|
|
929
|
+
<span class="cline-any cline-no"> </span>
|
|
930
|
+
<span class="cline-any cline-neutral"> </span>
|
|
931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
932
|
+
<span class="cline-any cline-no"> </span>
|
|
933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
935
|
+
<span class="cline-any cline-no"> </span>
|
|
936
|
+
<span class="cline-any cline-no"> </span>
|
|
937
|
+
<span class="cline-any cline-neutral"> </span>
|
|
938
|
+
<span class="cline-any cline-no"> </span>
|
|
939
|
+
<span class="cline-any cline-neutral"> </span>
|
|
940
|
+
<span class="cline-any cline-neutral"> </span>
|
|
941
|
+
<span class="cline-any cline-no"> </span>
|
|
942
|
+
<span class="cline-any cline-no"> </span>
|
|
943
|
+
<span class="cline-any cline-neutral"> </span>
|
|
944
|
+
<span class="cline-any cline-neutral"> </span>
|
|
945
|
+
<span class="cline-any cline-no"> </span>
|
|
946
|
+
<span class="cline-any cline-neutral"> </span>
|
|
947
|
+
<span class="cline-any cline-neutral"> </span>
|
|
948
|
+
<span class="cline-any cline-neutral"> </span>
|
|
949
|
+
<span class="cline-any cline-no"> </span>
|
|
950
|
+
<span class="cline-any cline-neutral"> </span>
|
|
951
|
+
<span class="cline-any cline-neutral"> </span>
|
|
952
|
+
<span class="cline-any cline-no"> </span>
|
|
953
|
+
<span class="cline-any cline-no"> </span>
|
|
954
|
+
<span class="cline-any cline-neutral"> </span>
|
|
955
|
+
<span class="cline-any cline-neutral"> </span>
|
|
956
|
+
<span class="cline-any cline-no"> </span>
|
|
957
|
+
<span class="cline-any cline-neutral"> </span>
|
|
958
|
+
<span class="cline-any cline-neutral"> </span>
|
|
959
|
+
<span class="cline-any cline-no"> </span>
|
|
960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
961
|
+
<span class="cline-any cline-no"> </span>
|
|
962
|
+
<span class="cline-any cline-neutral"> </span>
|
|
963
|
+
<span class="cline-any cline-no"> </span>
|
|
964
|
+
<span class="cline-any cline-neutral"> </span>
|
|
965
|
+
<span class="cline-any cline-no"> </span>
|
|
966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
967
|
+
<span class="cline-any cline-no"> </span>
|
|
968
|
+
<span class="cline-any cline-neutral"> </span>
|
|
969
|
+
<span class="cline-any cline-no"> </span>
|
|
970
|
+
<span class="cline-any cline-neutral"> </span>
|
|
971
|
+
<span class="cline-any cline-no"> </span>
|
|
972
|
+
<span class="cline-any cline-neutral"> </span>
|
|
973
|
+
<span class="cline-any cline-no"> </span>
|
|
974
|
+
<span class="cline-any cline-neutral"> </span>
|
|
975
|
+
<span class="cline-any cline-neutral"> </span>
|
|
976
|
+
<span class="cline-any cline-neutral"> </span>
|
|
977
|
+
<span class="cline-any cline-no"> </span>
|
|
978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
980
|
+
<span class="cline-any cline-neutral"> </span>
|
|
981
|
+
<span class="cline-any cline-no"> </span>
|
|
982
|
+
<span class="cline-any cline-neutral"> </span>
|
|
983
|
+
<span class="cline-any cline-neutral"> </span>
|
|
984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
985
|
+
<span class="cline-any cline-no"> </span>
|
|
986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
987
|
+
<span class="cline-any cline-neutral"> </span>
|
|
988
|
+
<span class="cline-any cline-neutral"> </span>
|
|
989
|
+
<span class="cline-any cline-no"> </span>
|
|
990
|
+
<span class="cline-any cline-neutral"> </span>
|
|
991
|
+
<span class="cline-any cline-no"> </span>
|
|
992
|
+
<span class="cline-any cline-neutral"> </span>
|
|
993
|
+
<span class="cline-any cline-no"> </span>
|
|
994
|
+
<span class="cline-any cline-neutral"> </span>
|
|
995
|
+
<span class="cline-any cline-no"> </span>
|
|
996
|
+
<span class="cline-any cline-neutral"> </span>
|
|
997
|
+
<span class="cline-any cline-no"> </span>
|
|
998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
999
|
+
<span class="cline-any cline-no"> </span>
|
|
1000
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1001
|
+
<span class="cline-any cline-no"> </span>
|
|
1002
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1003
|
+
<span class="cline-any cline-no"> </span>
|
|
1004
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1005
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1006
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1007
|
+
<span class="cline-any cline-no"> </span>
|
|
1008
|
+
<span class="cline-any cline-no"> </span>
|
|
1009
|
+
<span class="cline-any cline-no"> </span>
|
|
1010
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1011
|
+
<span class="cline-any cline-no"> </span>
|
|
1012
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1014
|
+
<span class="cline-any cline-no"> </span>
|
|
1015
|
+
<span class="cline-any cline-no"> </span>
|
|
1016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1017
|
+
<span class="cline-any cline-no"> </span>
|
|
1018
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1019
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1020
|
+
<span class="cline-any cline-no"> </span>
|
|
1021
|
+
<span class="cline-any cline-no"> </span>
|
|
1022
|
+
<span class="cline-any cline-no"> </span>
|
|
1023
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1025
|
+
<span class="cline-any cline-no"> </span>
|
|
1026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1028
|
+
<span class="cline-any cline-no"> </span>
|
|
1029
|
+
<span class="cline-any cline-no"> </span>
|
|
1030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1031
|
+
<span class="cline-any cline-no"> </span>
|
|
1032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1034
|
+
<span class="cline-any cline-no"> </span>
|
|
1035
|
+
<span class="cline-any cline-no"> </span>
|
|
1036
|
+
<span class="cline-any cline-no"> </span>
|
|
1037
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1038
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1039
|
+
<span class="cline-any cline-no"> </span>
|
|
1040
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </span>
|
|
1043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1044
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1047
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1048
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1049
|
+
<span class="cline-any cline-no"> </span>
|
|
1050
|
+
<span class="cline-any cline-no"> </span>
|
|
1051
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1052
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1053
|
+
<span class="cline-any cline-no"> </span>
|
|
1054
|
+
<span class="cline-any cline-no"> </span>
|
|
1055
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1056
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1058
|
+
<span class="cline-any cline-no"> </span>
|
|
1059
|
+
<span class="cline-any cline-no"> </span>
|
|
1060
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1061
|
+
<span class="cline-any cline-no"> </span>
|
|
1062
|
+
<span class="cline-any cline-no"> </span>
|
|
1063
|
+
<span class="cline-any cline-no"> </span>
|
|
1064
|
+
<span class="cline-any cline-no"> </span>
|
|
1065
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1066
|
+
<span class="cline-any cline-no"> </span>
|
|
1067
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1068
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-no"> </span>
|
|
1073
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1075
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1076
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1077
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1078
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1079
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1080
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1081
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1082
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1083
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1084
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1085
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1086
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1087
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1088
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1089
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1091
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1092
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1093
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1094
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1095
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1096
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1097
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1098
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1099
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1100
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1101
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1102
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1103
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1104
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1105
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1106
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1107
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1108
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1109
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1110
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1111
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1114
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1115
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1116
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1119
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1120
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1121
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1122
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1123
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1124
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1125
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1126
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1127
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1128
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1129
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1130
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1131
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1132
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1133
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1135
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1136
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1137
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1138
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1139
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1140
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1141
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1142
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1143
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1144
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1145
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1146
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1147
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1148
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1149
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1152
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1153
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1154
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1155
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1158
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1159
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1160
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1161
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1162
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1163
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1165
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1166
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1167
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1168
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1169
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1170
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1171
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1172
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1173
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1174
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1175
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1176
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1177
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1178
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1179
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1180
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1181
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1182
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1183
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1184
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1185
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1186
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1187
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1188
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1189
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1190
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1191
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1192
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1193
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1194
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1197
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1198
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1201
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1202
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1203
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1204
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1205
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1206
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1207
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1208
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// helpers: shared utilities used across dialects and builders
|
|
1209
|
+
import {
|
|
1210
|
+
EpmQueryBuilderOptions,
|
|
1211
|
+
RowColumnConfig,
|
|
1212
|
+
OrderByConfig,
|
|
1213
|
+
} from '@epm-query-builder/types/query-builder-types';
|
|
1214
|
+
import * as ColumnRefUtils from '@epm-query-builder/base/ColumnRefUtils';
|
|
1215
|
+
impo<span class="fstat-no" title="function not covered" >rt</span> { mapAggregationType as mapAgg } from '@epm-query-builder/constants/Aggregations';
|
|
1216
|
+
import {<span class="cstat-no" title="statement not covered" > SOURCE_TYPES } from '@epm-query-builder/constants/Source';</span>
|
|
1217
|
+
import * as Validation from '@epm-query-builder/utils/validation';
|
|
1218
|
+
impo<span class="fstat-no" title="function not covered" >rt</span> * as Format from '@epm-query-builder/utils/format';
|
|
1219
|
+
import *<span class="cstat-no" title="statement not covered" > as Sql from '@epm-query-builder/u</span>tils/sql';
|
|
1220
|
+
|
|
1221
|
+
expo<span class="fstat-no" title="function not covered" >rt</span> class BaseUtilities {
|
|
1222
|
+
static<span class="cstat-no" title="statement not covered" > buildSqlSelect(</span>
|
|
1223
|
+
items: string[],
|
|
1224
|
+
<span class="fstat-no" title="function not covered" > ta</span>bleName: string,
|
|
1225
|
+
wher<span class="cstat-no" title="statement not covered" >eClause?: string,</span>
|
|
1226
|
+
groupBy?: string[],
|
|
1227
|
+
<span class="fstat-no" title="function not covered" > or</span>derBy?: string,<span class="branch-0 cbranch-no" title="branch not covered" ></span>
|
|
1228
|
+
limi<span class="cstat-no" title="statement not covered" >t?: string,</span>
|
|
1229
|
+
): string {
|
|
1230
|
+
<span class="fstat-no" title="function not covered" > re</span>turn Sql.buildSqlSelect(items, tableName, whereClause, groupBy, orderBy, limit);
|
|
1231
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1232
|
+
|
|
1233
|
+
st<span class="fstat-no" title="function not covered" >at</span>ic formatColumnWithAlias(column: string, alias: string): string {
|
|
1234
|
+
retu<span class="cstat-no" title="statement not covered" >rn `${column} AS "${alias}"`;</span>
|
|
1235
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1236
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1237
|
+
static buildCTETemplate(name: string, query: string): string {
|
|
1238
|
+
return `${name} AS (${query})`;
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1241
|
+
static validateRequiredFields(obj: unknown, fields: string[]): boolean {
|
|
1242
|
+
retu<span class="cstat-no" title="statement not covered" >rn Validation.validat<span class="fstat-no" title="function not covered" >eR</span>equiredFie<span class="cstat-no" title="statement not covered" >lds(obj, fields);</span></span>
|
|
1243
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1244
|
+
|
|
1245
|
+
static<span class="cstat-no" title="statement not covered" > combineConditions(conditions: string[], </span>operator: 'AND' | 'OR' = 'AND'): string {
|
|
1246
|
+
return Sql.combineConditions(conditions, operator);
|
|
1247
|
+
}<span class="fstat-no" title="function not covered" ></span>
|
|
1248
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1249
|
+
static for<span class="cstat-no" title="statement not covered" >matValue(value: string | number </span>| boolean): string {
|
|
1250
|
+
return Format.formatValue(value);
|
|
1251
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1252
|
+
|
|
1253
|
+
static stringT<span class="cstat-no" title="statement not covered" >oDate(value: string): string {</span>
|
|
1254
|
+
if (!value) return 'NULL';
|
|
1255
|
+
|
|
1256
|
+
const dateFo<span class="cstat-no" title="statement not covered" >rmats = [</span>
|
|
1257
|
+
/^\d{4}-\d{2}-\d{2}$/, // YYYY-MM-DD
|
|
1258
|
+
/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/, // YYYY-MM-DD HH:mm:ss
|
|
1259
|
+
/^\d{2}\/\d{2}\/\d{4}$/, // MM/DD/YYYY
|
|
1260
|
+
/^\d{2}-\d<span class="cstat-no" title="statement not covered" >{2}-\d{4}$/, // MM-DD-</span>YYYY
|
|
1261
|
+
];
|
|
1262
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1263
|
+
if (dateFormats.some((format) => format.test(value))) {
|
|
1264
|
+
return `DA<span class="cstat-no" title="statement not covered" >TE('${value}')`;</span>
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
<span class="fstat-no" title="function not covered" > re</span>turn `'${value.replace(/'/g, "''")}'`;<span class="branch-0 cbranch-no" title="branch not covered" ></span>
|
|
1268
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1269
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1270
|
+
static<span class="cstat-no" title="statement not covered" > formatValueForDataType(value: string | number | boolean, dataType: string): string {</span>
|
|
1271
|
+
if (!dat<span class="cstat-no" title="statement not covered" >aType) {</span>
|
|
1272
|
+
return this.formatValue(value);
|
|
1273
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1274
|
+
|
|
1275
|
+
<span class="fstat-no" title="function not covered" > sw</span>itch (dataType.toLowerCase()) {
|
|
1276
|
+
ca<span class="cstat-no" title="statement not covered" >se 'string':</span>
|
|
1277
|
+
return `'${String(value).replace(/'/g, "''")}'`;
|
|
1278
|
+
<span class="fstat-no" title="function not covered" ></span> case 'date':
|
|
1279
|
+
case 'datetime':<span class="cstat-no" title="statement not covered" ></span>
|
|
1280
|
+
<span class="cstat-no" title="statement not covered" > return this.stringToDat</span>e(String(value));
|
|
1281
|
+
case 'number':
|
|
1282
|
+
<span class="fstat-no" title="function not covered" ></span> case 'decimal':
|
|
1283
|
+
ca<span class="cstat-no" title="statement not covered" >se 'integer':</span>
|
|
1284
|
+
return String(value);
|
|
1285
|
+
<span class="fstat-no" title="function not covered" ></span> case 'boolean':
|
|
1286
|
+
<span class="cstat-no" title="statement not covered" > return String(value).toLowerCase() === 'true' ? 'TRUE' : 'FALSE';</span>
|
|
1287
|
+
default:
|
|
1288
|
+
<span class="fstat-no" title="function not covered" ></span> return this.formatValue(value);
|
|
1289
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1290
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1291
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1292
|
+
static buildColumnReference(
|
|
1293
|
+
<span class="fstat-no" title="function not covered" > ta</span>bleName: string | undefined,
|
|
1294
|
+
colu<span class="cstat-no" title="statement not covered" >mnName: string,</span>
|
|
1295
|
+
useQuotes = true,
|
|
1296
|
+
):<span class="fstat-no" title="function not covered" > s</span>tring {
|
|
1297
|
+
if (<span class="cstat-no" title="statement not covered" >!tableName) return columnName;</span>
|
|
1298
|
+
|
|
1299
|
+
if (useQuotes) {
|
|
1300
|
+
return `"${tableName}"."${columnName}"`;
|
|
1301
|
+
<span class="fstat-no" title="function not covered" > }</span>
|
|
1302
|
+
return `${tableName}.<span class="cstat-no" title="statement not covered" >${columnName}`;</span>
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
static extractTableNameFromId(columnId: string): string | null {
|
|
1306
|
+
return ColumnRefUtils.getTableNameFromId(columnId);
|
|
1307
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1308
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1309
|
+
static getEffe<span class="cstat-no" title="statement not covered" >ctiveColumnName(config:</span> RowColumnConfig): string {
|
|
1310
|
+
const actualColumnId = this.extractColumnIdFromHierarchy(config.id);
|
|
1311
|
+
retu<span class="cstat-no" title="statement not covered" >rn actualColumnId;</span>
|
|
1312
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1313
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1314
|
+
static extract<span class="cstat-no" title="statement not covered" >ColumnIdFromHierarch</span>y(columnId: string): string {
|
|
1315
|
+
return ColumnRefUtils.extractColumnIdFromHierarchy(columnId);
|
|
1316
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1317
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1318
|
+
static ext<span class="cstat-no" title="statement not covered" >ractTableNameFromColumnId(col</span>umnId: string, columnName: string): string {
|
|
1319
|
+
return ColumnRefUtils.extractTableNameFromColumnId(columnId, columnName);
|
|
1320
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1321
|
+
|
|
1322
|
+
st<span class="fstat-no" title="function not covered" >at</span>ic formColumnId(tableName: string, columnName: string): string {
|
|
1323
|
+
if (<span class="cstat-no" title="statement not covered" >!tableName || !columnName) return columnName || '';</span>
|
|
1324
|
+
return `"${tableName}"."${columnName}"`;
|
|
1325
|
+
}<span class="fstat-no" title="function not covered" ></span>
|
|
1326
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1327
|
+
static<span class="cstat-no" title="statement not covered" > isValidTableName(tableName: string): boolean {</span>
|
|
1328
|
+
return /<span class="cstat-no" title="statement not covered" >^[a-zA-Z0-9_[\]().\s]+$/.test(tabl</span>eName);
|
|
1329
|
+
}
|
|
1330
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1331
|
+
static getEffectiveTableName(config: RowColumnConfig, options: EpmQueryBuilderOptions): string {
|
|
1332
|
+
<span class="fstat-no" title="function not covered" > re</span>turn (
|
|
1333
|
+
co<span class="cstat-no" title="statement not covered" >nfig.tableName ||</span>
|
|
1334
|
+
BaseUtilities.extractTableNameFromId(config.id) ||
|
|
1335
|
+
<span class="fstat-no" title="function not covered" ></span> BaseUtilities.getDefaultTableName(options)
|
|
1336
|
+
);<span class="cstat-no" title="statement not covered" ></span>
|
|
1337
|
+
}
|
|
1338
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
1339
|
+
static<span class="cstat-no" title="statement not covered" > getDefaultTableName(options: EpmQueryBuilderOpti</span>ons): string {
|
|
1340
|
+
const allItems = [
|
|
1341
|
+
<span class="fstat-no" title="function not covered" ></span> ...(options.rows || []),
|
|
1342
|
+
..<span class="cstat-no" title="statement not covered" >.(options.columns || []),</span>
|
|
1343
|
+
...(op<span class="cstat-no" title="statement not covered" >tions.value</span>s || []),
|
|
1344
|
+
];<span class="cstat-no" title="statement not covered" ></span>
|
|
1345
|
+
|
|
1346
|
+
<span class="fstat-no" title="function not covered" > fo</span>r (const item of allItems) {
|
|
1347
|
+
if<span class="cstat-no" title="statement not covered" > (item.tableName) return item.tableName;</span>
|
|
1348
|
+
}
|
|
1349
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
1350
|
+
for <span class="cstat-no" title="statement not covered" >(const item of allItems) {</span>
|
|
1351
|
+
const <span class="cstat-no" title="statement not covered" >tableFromId</span> = BaseUtilities.extractTableNameFromId(item.id);
|
|
1352
|
+
if (tableFromId) r<span class="cstat-no" title="statement not covered" >eturn tableFrom<span class="fstat-no" title="function not covered" >Id</span>;</span>
|
|
1353
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1354
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1355
|
+
const tablesFromFilters = this.extractTableNames(options);
|
|
1356
|
+
if (<span class="cstat-no" title="statement not covered" >tablesFromFilters.length > 0) {</span>
|
|
1357
|
+
return tablesFromFilters[0];
|
|
1358
|
+
<span class="fstat-no" title="function not covered" > }</span>
|
|
1359
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1360
|
+
retu<span class="cstat-no" title="statement not covered" >rn '';<span class="fstat-no" title="function not covered" ></span></span>
|
|
1361
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1362
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1363
|
+
static buildDistinctSelect(<span class="cstat-no" title="statement not covered" ></span>
|
|
1364
|
+
columns: string[],<span class="cstat-no" title="statement not covered" ></span>
|
|
1365
|
+
tableName: string,<span class="cstat-no" title="statement not covered" ></span>
|
|
1366
|
+
whereCla<span class="cstat-no" title="statement not covered" >use?: string,</span>
|
|
1367
|
+
orderBy?: st<span class="cstat-no" title="statement not covered" >ring,</span>
|
|
1368
|
+
): string {
|
|
1369
|
+
return Sql.buildDistinctSelect(columns, tableName, whereClause, orderBy);
|
|
1370
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1371
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
|
|
1372
|
+
static buildCo<span class="cstat-no" title="statement not covered" >untQuery(tableName: string, whereClause?: string): string {</span>
|
|
1373
|
+
let query = `SEL<span class="cstat-no" title="statement not covered" >ECT COUNT(*) FROM ${tableName}`;<span class="fstat-no" title="function not covered" ></span></span>
|
|
1374
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1375
|
+
if (whereClause) {<span class="cstat-no" title="statement not covered" ></span>
|
|
1376
|
+
query += ` WHERE ${whereClause}`;
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
return query;
|
|
1380
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1381
|
+
|
|
1382
|
+
st<span class="fstat-no" title="function not covered" >at</span>ic sanitizeIdentifier(identifier: string): string {
|
|
1383
|
+
retu<span class="cstat-no" title="statement not covered" >rn Format.sanitizeIdentifier(identifier);</span>
|
|
1384
|
+
}
|
|
1385
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
1386
|
+
static isEmptyOrWhi<span class="cstat-no" title="statement not covered" >tespace(value: string | undefined | null): bo</span>olean {
|
|
1387
|
+
retu<span class="cstat-no" title="statement not covered" >rn Validation.isEmptyOrWhitespace(value);</span>
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1390
|
+
static isValidIdentifier(identifier: string): boolean {
|
|
1391
|
+
return Validation.isValidIdentifier(identifier);
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
static ensureArray<T>(value: T | T[] | undefined): T[] {
|
|
1395
|
+
if (!value) return [];
|
|
1396
|
+
<span class="fstat-no" title="function not covered" > re</span>turn Array.isArray(value) ? value : [value];
|
|
1397
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1398
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1399
|
+
static hasValue<T>(value: T | undefined | null): value is T {
|
|
1400
|
+
return value !== undefined && value !== null;
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
static buildOrderByClause(orderItems: OrderByConfig[]): string {
|
|
1404
|
+
if (!orderItems?.length) return '';
|
|
1405
|
+
|
|
1406
|
+
<span class="fstat-no" title="function not covered" > co</span>nst clauses = orderItems.map((item) => {
|
|
1407
|
+
co<span class="cstat-no" title="statement not covered" >nst direction = item.type?.toUpperCase() === 'DESC' ? 'DESC' : 'ASC';</span>
|
|
1408
|
+
return<span class="cstat-no" title="statement not covered" > `${item.columnName} ${direction}`;</span>
|
|
1409
|
+
});
|
|
1410
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1411
|
+
retu<span class="cstat-no" title="statement not covered" >rn `ORDER BY ${clauses.join(', ')}`;</span>
|
|
1412
|
+
}
|
|
1413
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
1414
|
+
static<span class="cstat-no" title="statement not covered" > extractUniqueTableNames(options</span>: EpmQueryBuilderOptions): string[] {
|
|
1415
|
+
const tables = new Set<string>();
|
|
1416
|
+
<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1417
|
+
[...(options.rows || []), ..<span class="cstat-no" title="statement not covered" >.(options.columns <span class="fstat-no" title="function not covered" >||</span> []), ...(opt<span class="cstat-no" title="statement not covered" >ions.values || [])].forEach(</span></span>
|
|
1418
|
+
(i<span class="cstat-no" title="statement not covered" >tem) => {</span>
|
|
1419
|
+
if (<span class="cstat-no" title="statement not covered" >!item) retu</span>rn;
|
|
1420
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1421
|
+
cons<span class="cstat-no" title="statement not covered" >t directTableName = item.ta</span>bleName;
|
|
1422
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1423
|
+
const inferredTableName =
|
|
1424
|
+
<span class="fstat-no" title="function not covered" ></span> !directTableName && item.id ? BaseUtilities.getTableNameFromId(item.id) : null;
|
|
1425
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1426
|
+
const effectiveTableName = directTableName || inferredTableName;
|
|
1427
|
+
<span class="fstat-no" title="function not covered" ></span> if (effectiveTableName) {
|
|
1428
|
+
<span class="cstat-no" title="statement not covered" > tables.add(effectiveTableName);</span>
|
|
1429
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1430
|
+
},<span class="cstat-no" title="statement not covered" ></span>
|
|
1431
|
+
);<span class="cstat-no" title="statement not covered" ></span>
|
|
1432
|
+
|
|
1433
|
+
if (<span class="cstat-no" title="statement not covered" >options.superFilters?.children) {</span>
|
|
1434
|
+
options.superFilters.children.forEach((child) => {
|
|
1435
|
+
<span class="fstat-no" title="function not covered" ></span> if (child.filters?.tableNames) {
|
|
1436
|
+
<span class="cstat-no" title="statement not covered" > child.filters.tableNames.forEach((tableName) => {</span>
|
|
1437
|
+
if (tableName) tables.add(tableName);
|
|
1438
|
+
<span class="fstat-no" title="function not covered" ></span> });
|
|
1439
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1440
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
1441
|
+
}
|
|
1442
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1443
|
+
retu<span class="cstat-no" title="statement not covered" >rn Array.from(tables);<span class="fstat-no" title="function not covered" ></span></span>
|
|
1444
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1445
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
|
|
1446
|
+
static buildLimitC<span class="cstat-no" title="statement not covered" >lause(offset?: number, limi</span>t?: number): string {
|
|
1447
|
+
return Sql.buildLimitClause(offset, limit);
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1450
|
+
static<span class="cstat-no" title="statement not covered" > buildMonthOrderKey(columnExpre</span>ssion: string): string {
|
|
1451
|
+
const expr = `TRIM(CAST(${columnExpression} AS VARCHAR))`;
|
|
1452
|
+
<span class="fstat-no" title="function not covered" > re</span>turn `COALESCE(
|
|
1453
|
+
EXTRACT(MON<span class="cstat-no" title="statement not covered" >TH FROM TRY_STRPTIME(${e</span>xpr}, '%b')),
|
|
1454
|
+
EXTRACT(MONTH FROM <span class="cstat-no" title="statement not covered" >TRY_STRPTIME(${expr}, '%B')),</span>
|
|
1455
|
+
EXTRACT(MONT<span class="cstat-no" title="statement not covered" >H FROM TRY_STRPTIME(LOWER(${expr}), '%b')),</span>
|
|
1456
|
+
<span class="cstat-no" title="statement not covered" > EXTRACT(MONTH FROM TRY_STRPTIME(LOWER(${expr}), '%B')),</span>
|
|
1457
|
+
TRY_CAST(${colu<span class="cstat-no" title="statement not covered" >mnExpression} AS INTEGER),</span>
|
|
1458
|
+
<span class="cstat-no" title="statement not covered" > 13</span>
|
|
1459
|
+
)`;<span class="cstat-no" title="statement not covered" ></span>
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
static buildQuarterOrderKey(columnExpression: string): string {
|
|
1463
|
+
const expr = `TRIM(LOWER(CAST(${columnExpression} AS VARCHAR)))`;
|
|
1464
|
+
return `COALESCE(<span class="cstat-no" title="statement not covered" ></span>
|
|
1465
|
+
EXTR<span class="cstat-no" title="statement not covered" >ACT(QUARTER FROM TRY_STRPTIME(${expr}, '%b')),</span>
|
|
1466
|
+
EXTRACT(<span class="cstat-no" title="statement not covered" >QUARTER FROM TRY_STRPTIME(${expr}, '%B')),</span>
|
|
1467
|
+
CASE WHEN ${expr} LIKE 'q1%' THEN 1 WHEN ${expr} LIKE 'q2%' THEN 2 WHEN ${expr} LIKE 'q3%' THEN 3 WHEN ${expr} LIKE 'q4%' THEN 4 ELSE NULL END,
|
|
1468
|
+
TRY_<span class="cstat-no" title="statement not covered" >CAST(${columnExpression} AS INTEGER</span>),
|
|
1469
|
+
5
|
|
1470
|
+
)`;<span class="cstat-no" title="statement not covered" ></span>
|
|
1471
|
+
}
|
|
1472
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1473
|
+
static buildMeasureExpression(
|
|
1474
|
+
tableName: string,
|
|
1475
|
+
columnName: string,
|
|
1476
|
+
aggregationType?: string,<span class="cstat-no" title="statement not covered" ></span>
|
|
1477
|
+
): str<span class="cstat-no" title="statement not covered" >ing {</span>
|
|
1478
|
+
if (!aggregationType || aggregationType === 'NONE') {
|
|
1479
|
+
<span class="fstat-no" title="function not covered" ></span> return `"${tableName}"."${columnName}"`;
|
|
1480
|
+
}<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
|
|
1481
|
+
|
|
1482
|
+
<span class="fstat-no" title="function not covered" > co</span>nst mappedAggregation = this.mapAggregationType(aggregationType);
|
|
1483
|
+
return `${mappedA<span class="cstat-no" title="statement not covered" >ggregation}("${tabl</span>eName}"."${columnName}")`;
|
|
1484
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1485
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1486
|
+
static mapAggregationTy<span class="cstat-no" title="statement not covered" >pe(aggregationType: string): stri</span>ng {
|
|
1487
|
+
retu<span class="cstat-no" title="statement not covered" >rn mapAgg(aggregationType);</span>
|
|
1488
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1489
|
+
|
|
1490
|
+
static buildWhereCondition(condi<span class="cstat-no" title="statement not covered" >tions: string[], operator: 'AND'</span> | 'OR' = 'AND'): string {
|
|
1491
|
+
cons<span class="cstat-no" title="statement not covered" >t validConditions = conditions.filter((condition) => condition && condition.trim());</span>
|
|
1492
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1493
|
+
if (validConditions.length === 0) return '';
|
|
1494
|
+
if (<span class="cstat-no" title="statement not covered" >validCondit</span>ions.length === 1) return validConditions[0];
|
|
1495
|
+
|
|
1496
|
+
<span class="fstat-no" title="function not covered" > re</span>turn `(${validConditions.join(` ${operator} `)})`;
|
|
1497
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1498
|
+
|
|
1499
|
+
st<span class="fstat-no" title="function not covered" >at</span>ic getTableNameFromId(columnId: string): string | null {
|
|
1500
|
+
retu<span class="cstat-no" title="statement not covered" >rn ColumnRefUtils.getTableNameFromId(columnId);</span>
|
|
1501
|
+
}
|
|
1502
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
1503
|
+
static<span class="cstat-no" title="statement not covered" > getTableNameFromColumnId(columnId: string, column</span>Name?: string): string {
|
|
1504
|
+
if (!columnId) return '';
|
|
1505
|
+
<span class="fstat-no" title="function not covered" > if</span> (columnName) {
|
|
1506
|
+
re<span class="cstat-no" title="statement not covered" >turn this.extractTableNameFromColumnId(columnId, columnName);</span>
|
|
1507
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1508
|
+
return this.getTableNameFromId(columnId) || '';
|
|
1509
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1510
|
+
|
|
1511
|
+
st<span class="fstat-no" title="function not covered" >at</span>ic sanitizeHierarchyPrefix(columnId: string): string {
|
|
1512
|
+
return ColumnRef<span class="cstat-no" title="statement not covered" >Utils.extractColumnIdFro</span>mHierarchy(columnId);
|
|
1513
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1514
|
+
|
|
1515
|
+
st<span class="fstat-no" title="function not covered" >at</span>ic extractTableNames(options: EpmQueryBuilderOptions): string[] {
|
|
1516
|
+
if (!options.superF<span class="cstat-no" title="statement not covered" >ilters?.children) {</span>
|
|
1517
|
+
return [];
|
|
1518
|
+
}
|
|
1519
|
+
const tableNames = new Set<string>();
|
|
1520
|
+
opti<span class="cstat-no" title="statement not covered" >ons.superFilters.children.forEach((child) =</span>> {
|
|
1521
|
+
if (child.filters?.tableNames) {
|
|
1522
|
+
<span class="fstat-no" title="function not covered" ></span> child.filters.tableNames.forEach((tableName) => {
|
|
1523
|
+
tableNames.add(tableN<span class="cstat-no" title="statement not covered" >ame);</span>
|
|
1524
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1525
|
+
}
|
|
1526
|
+
});
|
|
1527
|
+
return Array<span class="cstat-no" title="statement not covered" >.from(tableNames);</span>
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
static formatC<span class="cstat-no" title="statement not covered" >olumnReferenceForDb(</span>
|
|
1531
|
+
config: RowColumnConfig,
|
|
1532
|
+
options: Epm<span class="cstat-no" title="statement not covered" >QueryBuilderOptions,</span>
|
|
1533
|
+
): string {
|
|
1534
|
+
const source<span class="cstat-no" title="statement not covered" > = this.getSource(options);</span>
|
|
1535
|
+
const actualColumnId = this.extractColumnIdFromHierarchy(config.id);
|
|
1536
|
+
const idForD<span class="cstat-no" title="statement not covered" >b = source === SOURCE_TYPES.BLEND ? conf</span>ig.id : actualColumnId;
|
|
1537
|
+
if (options.databaseDetails?.databaseType === 'duckdb') {
|
|
1538
|
+
const useD<span class="cstat-no" title="statement not covered" >ot = this.shouldUseDotNotation(options);</span>
|
|
1539
|
+
if (useDot) {
|
|
1540
|
+
const ta<span class="cstat-no" title="statement not covered" >bleName =</span>
|
|
1541
|
+
config.tableName ||
|
|
1542
|
+
this.g<span class="cstat-no" title="statement not covered" >etTableNameFromId(config.id) ||</span>
|
|
1543
|
+
this.getDefaultTableNameFromOptions(options) ||
|
|
1544
|
+
this.e<span class="cstat-no" title="statement not covered" >xtractTableNames(options)[0] ||</span>
|
|
1545
|
+
'';
|
|
1546
|
+
const effectiveColumnName = idForDb;
|
|
1547
|
+
<span class="fstat-no" title="function not covered" ></span> if (tableName) {
|
|
1548
|
+
return this.buil<span class="cstat-no" title="statement not covered" >dColumnReference(tableName, effectiveColumnName);</span>
|
|
1549
|
+
}
|
|
1550
|
+
return `"${effectiveColumnName}"`;
|
|
1551
|
+
}
|
|
1552
|
+
re<span class="cstat-no" title="statement not covered" >turn `"${idForDb}"`;</span>
|
|
1553
|
+
}
|
|
1554
|
+
const tableName =
|
|
1555
|
+
config.tableName ||
|
|
1556
|
+
this.getTa<span class="cstat-no" title="statement not covered" >bleNameFromI</span>d(config.id) ||
|
|
1557
|
+
this.extractTableNames(options)[0] ||
|
|
1558
|
+
'';
|
|
1559
|
+
const effectiveColumnName = idForDb;
|
|
1560
|
+
return `${ta<span class="cstat-no" title="statement not covered" >bleName}.${ef</span>fectiveColumnName}`;
|
|
1561
|
+
}
|
|
1562
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1563
|
+
static buildDimensionReference(
|
|
1564
|
+
items: RowCo<span class="cstat-no" title="statement not covered" >lumnConfig[] </span>| undefined,
|
|
1565
|
+
options: EpmQueryBuilderOptions,
|
|
1566
|
+
): string[] {<span class="cstat-no" title="statement not covered" ></span>
|
|
1567
|
+
return items?.map((item) => this.formatColumnReferenceForDb(item, options)) || [];
|
|
1568
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1569
|
+
|
|
1570
|
+
static getDefa<span class="cstat-no" title="statement not covered" >ultTableNameFromOp</span>tions(options: EpmQueryBuilderOptions): string {
|
|
1571
|
+
const rows = options.rows || [];
|
|
1572
|
+
const column<span class="cstat-no" title="statement not covered" >s = options.columns ||</span> [];
|
|
1573
|
+
const values = options.values || [];
|
|
1574
|
+
const allIte<span class="cstat-no" title="statement not covered" >ms = [...row</span>s, ...columns, ...values];
|
|
1575
|
+
if (allItems.length > 0 && allItems[0].tableName) {
|
|
1576
|
+
return allItems[0].tableName;
|
|
1577
|
+
<span class="fstat-no" title="function not covered" > }</span>
|
|
1578
|
+
cons<span class="cstat-no" title="statement not covered" >t tablesFromFilters = this.extractTableNames(options);</span>
|
|
1579
|
+
if (tablesFromFilters.lengt<span class="cstat-no" title="statement not covered" >h > 0) {</span>
|
|
1580
|
+
return<span class="cstat-no" title="statement not covered" > tablesFromFilters[0];</span>
|
|
1581
|
+
}
|
|
1582
|
+
retu<span class="cstat-no" title="statement not covered" >rn '';</span>
|
|
1583
|
+
}
|
|
1584
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
1585
|
+
static<span class="cstat-no" title="statement not covered" > formatTableColumnReference(tableName: string, columnName: string): string {</span>
|
|
1586
|
+
return `<span class="cstat-no" title="statement not covered" >"${tableName}"."${col</span>umnName}"`;
|
|
1587
|
+
}
|
|
1588
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1589
|
+
static sanitizeIdentifierString(identifier: string): string {
|
|
1590
|
+
<span class="fstat-no" title="function not covered" > re</span>turn identifier.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
1591
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1592
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1593
|
+
static<span class="cstat-no" title="statement not covered" > isValidTableNameString(tableName: string): stri</span>ng | boolean {
|
|
1594
|
+
return /^[a-zA-Z0-9_[\]().\s]+$/.test(tableName);
|
|
1595
|
+
}<span class="fstat-no" title="function not covered" ></span>
|
|
1596
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1597
|
+
static formatTableNameForDb(tableName: string, databaseType?: string): string {
|
|
1598
|
+
<span class="fstat-no" title="function not covered" > if</span> (databaseType === 'duckdb' || tableName.includes(' ') || tableName.includes('-')) {
|
|
1599
|
+
re<span class="cstat-no" title="statement not covered" >turn `"${tableName}"`;</span>
|
|
1600
|
+
}<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
|
|
1601
|
+
return tableName;
|
|
1602
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1603
|
+
|
|
1604
|
+
st<span class="fstat-no" title="function not covered" >at</span>ic shouldUseDotNotation(options: EpmQueryBuilderOptions): boolean {
|
|
1605
|
+
const src = this.getS<span class="cstat-no" title="statement not covered" >ource(options);</span>
|
|
1606
|
+
return src === SOURCE_TY<span class="cstat-no" title="statement not covered" >PES.BLEND;</span>
|
|
1607
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1608
|
+
|
|
1609
|
+
st<span class="fstat-no" title="function not covered" >at</span>ic getSource(options: EpmQueryBuilderOptions): string {
|
|
1610
|
+
cons<span class="cstat-no" title="statement not covered" >t source =</span>
|
|
1611
|
+
(options as unknown as { config?: { source?: string } })?.config?.source ||
|
|
1612
|
+
<span class="fstat-no" title="function not covered" ></span> (options as unknown as { source?: string })?.source ||
|
|
1613
|
+
th<span class="cstat-no" title="statement not covered" >is.safeGet<string>(</span>
|
|
1614
|
+
options.databaseDetails as unknown as Record<string, unknown>,
|
|
1615
|
+
<span class="fstat-no" title="function not covered" ></span> 'source',
|
|
1616
|
+
<span class="cstat-no" title="statement not covered" > '',</span>
|
|
1617
|
+
) ||
|
|
1618
|
+
'';
|
|
1619
|
+
<span class="fstat-no" title="function not covered" > re</span>turn String(source || '').toLowerCase();
|
|
1620
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1621
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1622
|
+
static buildFilterConditionForOperator(
|
|
1623
|
+
<span class="fstat-no" title="function not covered" > co</span>lumn: string,
|
|
1624
|
+
operator: string,<span class="cstat-no" title="statement not covered" ></span>
|
|
1625
|
+
valu<span class="cstat-no" title="statement not covered" >e: string | number | boolean,</span>
|
|
1626
|
+
): string {
|
|
1627
|
+
const formattedValue = typeof value === 'string' ? BaseUtilities.formatValue(value) : value;
|
|
1628
|
+
<span class="fstat-no" title="function not covered" > sw</span>itch (operator.toUpperCase()) {
|
|
1629
|
+
ca<span class="cstat-no" title="statement not covered" >se 'IS_EQUAL_TO':</span>
|
|
1630
|
+
case '<span class="cstat-no" title="statement not covered" >IS':</span>
|
|
1631
|
+
return `${column} = ${formattedValue}`;
|
|
1632
|
+
case 'IS_NOT_EQUAL_TO'<span class="cstat-no" title="statement not covered" >:</span>
|
|
1633
|
+
case 'IS_NOT':<span class="cstat-no" title="statement not covered" ></span>
|
|
1634
|
+
<span class="cstat-no" title="statement not covered" > return `${column} != ${formattedValue}`;</span>
|
|
1635
|
+
case '<span class="cstat-no" title="statement not covered" >IS_GREATER_THAN':</span>
|
|
1636
|
+
return `${column} > ${formattedValue}`;
|
|
1637
|
+
case 'IS_GREATER_THAN_OR_EQUAL<span class="cstat-no" title="statement not covered" >_TO':</span>
|
|
1638
|
+
return `${column} >= ${formattedValue}`;
|
|
1639
|
+
case 'IS_LESS_THAN':
|
|
1640
|
+
<span class="fstat-no" title="function not covered" > re</span>turn `${col<span class="cstat-no" title="statement not covered" >umn} < ${formattedValue}`;</span>
|
|
1641
|
+
case 'IS_LESS_THAN_OR_EQUAL_TO':
|
|
1642
|
+
return `${column<span class="cstat-no" title="statement not covered" >} <= ${formattedValue}`;</span>
|
|
1643
|
+
ca<span class="cstat-no" title="statement not covered" >se 'IS_BLANK':</span>
|
|
1644
|
+
return `${column} IS NULL`;
|
|
1645
|
+
case 'IS_NOT_BLANK':
|
|
1646
|
+
return `${column} IS NOT NULL`;
|
|
1647
|
+
default:
|
|
1648
|
+
return `${column} = ${formattedValue}`;
|
|
1649
|
+
}
|
|
1650
|
+
}
|
|
1651
|
+
|
|
1652
|
+
static normalizeComparisonOperator(operator: string): string {
|
|
1653
|
+
const canonical = (operator || '')
|
|
1654
|
+
.toLowerCase()
|
|
1655
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
1656
|
+
.replace(/^_+|_+$/g, '');
|
|
1657
|
+
switch (canonical) {
|
|
1658
|
+
case 'is':
|
|
1659
|
+
case 'equals':
|
|
1660
|
+
case 'is_equal_to':
|
|
1661
|
+
return '=';
|
|
1662
|
+
case 'is_not':
|
|
1663
|
+
case 'not_equals':
|
|
1664
|
+
case 'is_not_equal_to':
|
|
1665
|
+
return '!=';
|
|
1666
|
+
case 'is_greater_than':
|
|
1667
|
+
return '>';
|
|
1668
|
+
case 'is_greater_than_or_equal_to':
|
|
1669
|
+
return '>=';
|
|
1670
|
+
case 'is_less_than':
|
|
1671
|
+
return '<';
|
|
1672
|
+
case 'is_less_than_or_equal_to':
|
|
1673
|
+
return '<=';
|
|
1674
|
+
case 'is_blank':
|
|
1675
|
+
return 'IS NULL';
|
|
1676
|
+
case 'is_not_blank':
|
|
1677
|
+
return 'IS NOT NULL';
|
|
1678
|
+
default:
|
|
1679
|
+
return '=';
|
|
1680
|
+
}
|
|
1681
|
+
}
|
|
1682
|
+
|
|
1683
|
+
static validateRequiredField<T>(
|
|
1684
|
+
value: T | undefined | null,
|
|
1685
|
+
fieldName: string,
|
|
1686
|
+
context?: string,
|
|
1687
|
+
): T {
|
|
1688
|
+
if (value === undefined || value === null) {
|
|
1689
|
+
const contextMsg = context ? ` in ${context}` : '';
|
|
1690
|
+
throw new Error(`Required field '${fieldName}' is missing${contextMsg}`);
|
|
1691
|
+
}
|
|
1692
|
+
return value;
|
|
1693
|
+
}
|
|
1694
|
+
|
|
1695
|
+
static safeGet<T>(
|
|
1696
|
+
obj: Record<string, unknown> | undefined,
|
|
1697
|
+
key: string,
|
|
1698
|
+
defaultValue?: T,
|
|
1699
|
+
): T | undefined {
|
|
1700
|
+
if (!obj || !(key in obj)) {
|
|
1701
|
+
return defaultValue;
|
|
1702
|
+
}
|
|
1703
|
+
return obj[key] as T;
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1706
|
+
static extractDimensionsFromOptions(options: EpmQueryBuilderOptions): string[] {
|
|
1707
|
+
const rowDimensions = this.buildDimensionReference(options.rows, options);
|
|
1708
|
+
const columnDimensions = this.buildDimensionReference(options.columns, options);
|
|
1709
|
+
return [...rowDimensions, ...columnDimensions];
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
static extractMeasuresFromOptions(options: EpmQueryBuilderOptions): unknown[] {
|
|
1713
|
+
return options.values || [];
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
static getSelectedColumnsFromOptions(options: EpmQueryBuilderOptions): string[] {
|
|
1717
|
+
if (options.rows?.length) {
|
|
1718
|
+
return options.rows.map((row) => row.columnName);
|
|
1719
|
+
}
|
|
1720
|
+
return options.selectedColumns || [];
|
|
1721
|
+
}
|
|
1722
|
+
|
|
1723
|
+
static hasDimensionsInOptions(options: EpmQueryBuilderOptions): boolean {
|
|
1724
|
+
const rowCount = options.rows?.length || 0;
|
|
1725
|
+
const columnCount = options.columns?.length || 0;
|
|
1726
|
+
return rowCount + columnCount > 0;
|
|
1727
|
+
}
|
|
1728
|
+
|
|
1729
|
+
static hasMeasuresInOptions(options: EpmQueryBuilderOptions): boolean {
|
|
1730
|
+
return (options.values?.length || 0) > 0;
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1733
|
+
static shouldGenerateRollupForOptions(options: EpmQueryBuilderOptions): boolean {
|
|
1734
|
+
return !options.skipRollup && this.hasDimensionsInOptions(options);
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
static shouldGenerateAnalyticalQueryForOptions(options: EpmQueryBuilderOptions): boolean {
|
|
1738
|
+
return (
|
|
1739
|
+
this.hasMeasuresInOptions(options) ||
|
|
1740
|
+
(this.shouldGenerateRollupForOptions(options) && this.hasMeasuresInOptions(options))
|
|
1741
|
+
);
|
|
1742
|
+
}
|
|
1743
|
+
|
|
1744
|
+
static formatColumnNameWithFallbackString(columnName: string, columnId: string): string {
|
|
1745
|
+
const actualColumnId = this.extractColumnIdFromHierarchy(columnId);
|
|
1746
|
+
return columnName || actualColumnId;
|
|
1747
|
+
}
|
|
1748
|
+
|
|
1749
|
+
static buildBasicGroupByClauseForOptions(options: EpmQueryBuilderOptions): string {
|
|
1750
|
+
const dimensions = this.extractDimensionsFromOptions(options);
|
|
1751
|
+
return dimensions.length > 0 ? `GROUP BY ${dimensions.join(', ')}` : '';
|
|
1752
|
+
}
|
|
1753
|
+
|
|
1754
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1755
|
+
static generateConcatenatedIdMeasure(dimensionMappings: Record<string, any>): [string, string] {
|
|
1756
|
+
if (!dimensionMappings || Object.keys(dimensionMappings).length === 0) {
|
|
1757
|
+
return ['', ''];
|
|
1758
|
+
}
|
|
1759
|
+
|
|
1760
|
+
const targetTable = Object.keys(dimensionMappings)[0];
|
|
1761
|
+
const mappings = dimensionMappings[targetTable];
|
|
1762
|
+
|
|
1763
|
+
if (!mappings || mappings.length === 0) {
|
|
1764
|
+
return ['', targetTable];
|
|
1765
|
+
}
|
|
1766
|
+
|
|
1767
|
+
const concatenatedColumns = mappings
|
|
1768
|
+
.map(
|
|
1769
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1770
|
+
(mapping: any) => `COALESCE("${mapping.targetTable}"."${mapping.targetField}", '')`,
|
|
1771
|
+
)
|
|
1772
|
+
.join(" || '|' || ");
|
|
1773
|
+
|
|
1774
|
+
const measure = `MEASURE '${targetTable}'[CONCATENATED_IDS] = ${concatenatedColumns}`;
|
|
1775
|
+
|
|
1776
|
+
return [measure, targetTable];
|
|
1777
|
+
}
|
|
1778
|
+
}
|
|
1779
|
+
</pre></td></tr></table></pre>
|
|
1780
|
+
|
|
1781
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1782
|
+
</div><!-- /wrapper -->
|
|
1783
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1784
|
+
Code coverage generated by
|
|
1785
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1786
|
+
at 2025-12-03T07:39:44.024Z
|
|
1787
|
+
</div>
|
|
1788
|
+
<script src="../../../prettify.js"></script>
|
|
1789
|
+
<script>
|
|
1790
|
+
window.onload = function () {
|
|
1791
|
+
prettyPrint();
|
|
1792
|
+
};
|
|
1793
|
+
</script>
|
|
1794
|
+
<script src="../../../sorter.js"></script>
|
|
1795
|
+
<script src="../../../block-navigation.js"></script>
|
|
1796
|
+
</body>
|
|
1797
|
+
</html>
|
|
1798
|
+
|