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,2644 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/epm-query-builder/dialects/duckdb/DuckDbQueryBuilder.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/dialects/duckdb</a> DuckDbQueryBuilder.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/405</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/344</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/63</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/393</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>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a>
|
|
768
|
+
<a name='L703'></a><a href='#L703'>703</a>
|
|
769
|
+
<a name='L704'></a><a href='#L704'>704</a>
|
|
770
|
+
<a name='L705'></a><a href='#L705'>705</a>
|
|
771
|
+
<a name='L706'></a><a href='#L706'>706</a>
|
|
772
|
+
<a name='L707'></a><a href='#L707'>707</a>
|
|
773
|
+
<a name='L708'></a><a href='#L708'>708</a>
|
|
774
|
+
<a name='L709'></a><a href='#L709'>709</a>
|
|
775
|
+
<a name='L710'></a><a href='#L710'>710</a>
|
|
776
|
+
<a name='L711'></a><a href='#L711'>711</a>
|
|
777
|
+
<a name='L712'></a><a href='#L712'>712</a>
|
|
778
|
+
<a name='L713'></a><a href='#L713'>713</a>
|
|
779
|
+
<a name='L714'></a><a href='#L714'>714</a>
|
|
780
|
+
<a name='L715'></a><a href='#L715'>715</a>
|
|
781
|
+
<a name='L716'></a><a href='#L716'>716</a>
|
|
782
|
+
<a name='L717'></a><a href='#L717'>717</a>
|
|
783
|
+
<a name='L718'></a><a href='#L718'>718</a>
|
|
784
|
+
<a name='L719'></a><a href='#L719'>719</a>
|
|
785
|
+
<a name='L720'></a><a href='#L720'>720</a>
|
|
786
|
+
<a name='L721'></a><a href='#L721'>721</a>
|
|
787
|
+
<a name='L722'></a><a href='#L722'>722</a>
|
|
788
|
+
<a name='L723'></a><a href='#L723'>723</a>
|
|
789
|
+
<a name='L724'></a><a href='#L724'>724</a>
|
|
790
|
+
<a name='L725'></a><a href='#L725'>725</a>
|
|
791
|
+
<a name='L726'></a><a href='#L726'>726</a>
|
|
792
|
+
<a name='L727'></a><a href='#L727'>727</a>
|
|
793
|
+
<a name='L728'></a><a href='#L728'>728</a>
|
|
794
|
+
<a name='L729'></a><a href='#L729'>729</a>
|
|
795
|
+
<a name='L730'></a><a href='#L730'>730</a>
|
|
796
|
+
<a name='L731'></a><a href='#L731'>731</a>
|
|
797
|
+
<a name='L732'></a><a href='#L732'>732</a>
|
|
798
|
+
<a name='L733'></a><a href='#L733'>733</a>
|
|
799
|
+
<a name='L734'></a><a href='#L734'>734</a>
|
|
800
|
+
<a name='L735'></a><a href='#L735'>735</a>
|
|
801
|
+
<a name='L736'></a><a href='#L736'>736</a>
|
|
802
|
+
<a name='L737'></a><a href='#L737'>737</a>
|
|
803
|
+
<a name='L738'></a><a href='#L738'>738</a>
|
|
804
|
+
<a name='L739'></a><a href='#L739'>739</a>
|
|
805
|
+
<a name='L740'></a><a href='#L740'>740</a>
|
|
806
|
+
<a name='L741'></a><a href='#L741'>741</a>
|
|
807
|
+
<a name='L742'></a><a href='#L742'>742</a>
|
|
808
|
+
<a name='L743'></a><a href='#L743'>743</a>
|
|
809
|
+
<a name='L744'></a><a href='#L744'>744</a>
|
|
810
|
+
<a name='L745'></a><a href='#L745'>745</a>
|
|
811
|
+
<a name='L746'></a><a href='#L746'>746</a>
|
|
812
|
+
<a name='L747'></a><a href='#L747'>747</a>
|
|
813
|
+
<a name='L748'></a><a href='#L748'>748</a>
|
|
814
|
+
<a name='L749'></a><a href='#L749'>749</a>
|
|
815
|
+
<a name='L750'></a><a href='#L750'>750</a>
|
|
816
|
+
<a name='L751'></a><a href='#L751'>751</a>
|
|
817
|
+
<a name='L752'></a><a href='#L752'>752</a>
|
|
818
|
+
<a name='L753'></a><a href='#L753'>753</a>
|
|
819
|
+
<a name='L754'></a><a href='#L754'>754</a>
|
|
820
|
+
<a name='L755'></a><a href='#L755'>755</a>
|
|
821
|
+
<a name='L756'></a><a href='#L756'>756</a>
|
|
822
|
+
<a name='L757'></a><a href='#L757'>757</a>
|
|
823
|
+
<a name='L758'></a><a href='#L758'>758</a>
|
|
824
|
+
<a name='L759'></a><a href='#L759'>759</a>
|
|
825
|
+
<a name='L760'></a><a href='#L760'>760</a>
|
|
826
|
+
<a name='L761'></a><a href='#L761'>761</a>
|
|
827
|
+
<a name='L762'></a><a href='#L762'>762</a>
|
|
828
|
+
<a name='L763'></a><a href='#L763'>763</a>
|
|
829
|
+
<a name='L764'></a><a href='#L764'>764</a>
|
|
830
|
+
<a name='L765'></a><a href='#L765'>765</a>
|
|
831
|
+
<a name='L766'></a><a href='#L766'>766</a>
|
|
832
|
+
<a name='L767'></a><a href='#L767'>767</a>
|
|
833
|
+
<a name='L768'></a><a href='#L768'>768</a>
|
|
834
|
+
<a name='L769'></a><a href='#L769'>769</a>
|
|
835
|
+
<a name='L770'></a><a href='#L770'>770</a>
|
|
836
|
+
<a name='L771'></a><a href='#L771'>771</a>
|
|
837
|
+
<a name='L772'></a><a href='#L772'>772</a>
|
|
838
|
+
<a name='L773'></a><a href='#L773'>773</a>
|
|
839
|
+
<a name='L774'></a><a href='#L774'>774</a>
|
|
840
|
+
<a name='L775'></a><a href='#L775'>775</a>
|
|
841
|
+
<a name='L776'></a><a href='#L776'>776</a>
|
|
842
|
+
<a name='L777'></a><a href='#L777'>777</a>
|
|
843
|
+
<a name='L778'></a><a href='#L778'>778</a>
|
|
844
|
+
<a name='L779'></a><a href='#L779'>779</a>
|
|
845
|
+
<a name='L780'></a><a href='#L780'>780</a>
|
|
846
|
+
<a name='L781'></a><a href='#L781'>781</a>
|
|
847
|
+
<a name='L782'></a><a href='#L782'>782</a>
|
|
848
|
+
<a name='L783'></a><a href='#L783'>783</a>
|
|
849
|
+
<a name='L784'></a><a href='#L784'>784</a>
|
|
850
|
+
<a name='L785'></a><a href='#L785'>785</a>
|
|
851
|
+
<a name='L786'></a><a href='#L786'>786</a>
|
|
852
|
+
<a name='L787'></a><a href='#L787'>787</a>
|
|
853
|
+
<a name='L788'></a><a href='#L788'>788</a>
|
|
854
|
+
<a name='L789'></a><a href='#L789'>789</a>
|
|
855
|
+
<a name='L790'></a><a href='#L790'>790</a>
|
|
856
|
+
<a name='L791'></a><a href='#L791'>791</a>
|
|
857
|
+
<a name='L792'></a><a href='#L792'>792</a>
|
|
858
|
+
<a name='L793'></a><a href='#L793'>793</a>
|
|
859
|
+
<a name='L794'></a><a href='#L794'>794</a>
|
|
860
|
+
<a name='L795'></a><a href='#L795'>795</a>
|
|
861
|
+
<a name='L796'></a><a href='#L796'>796</a>
|
|
862
|
+
<a name='L797'></a><a href='#L797'>797</a>
|
|
863
|
+
<a name='L798'></a><a href='#L798'>798</a>
|
|
864
|
+
<a name='L799'></a><a href='#L799'>799</a>
|
|
865
|
+
<a name='L800'></a><a href='#L800'>800</a>
|
|
866
|
+
<a name='L801'></a><a href='#L801'>801</a>
|
|
867
|
+
<a name='L802'></a><a href='#L802'>802</a>
|
|
868
|
+
<a name='L803'></a><a href='#L803'>803</a>
|
|
869
|
+
<a name='L804'></a><a href='#L804'>804</a>
|
|
870
|
+
<a name='L805'></a><a href='#L805'>805</a>
|
|
871
|
+
<a name='L806'></a><a href='#L806'>806</a>
|
|
872
|
+
<a name='L807'></a><a href='#L807'>807</a>
|
|
873
|
+
<a name='L808'></a><a href='#L808'>808</a>
|
|
874
|
+
<a name='L809'></a><a href='#L809'>809</a>
|
|
875
|
+
<a name='L810'></a><a href='#L810'>810</a>
|
|
876
|
+
<a name='L811'></a><a href='#L811'>811</a>
|
|
877
|
+
<a name='L812'></a><a href='#L812'>812</a>
|
|
878
|
+
<a name='L813'></a><a href='#L813'>813</a>
|
|
879
|
+
<a name='L814'></a><a href='#L814'>814</a>
|
|
880
|
+
<a name='L815'></a><a href='#L815'>815</a>
|
|
881
|
+
<a name='L816'></a><a href='#L816'>816</a>
|
|
882
|
+
<a name='L817'></a><a href='#L817'>817</a>
|
|
883
|
+
<a name='L818'></a><a href='#L818'>818</a>
|
|
884
|
+
<a name='L819'></a><a href='#L819'>819</a>
|
|
885
|
+
<a name='L820'></a><a href='#L820'>820</a>
|
|
886
|
+
<a name='L821'></a><a href='#L821'>821</a>
|
|
887
|
+
<a name='L822'></a><a href='#L822'>822</a>
|
|
888
|
+
<a name='L823'></a><a href='#L823'>823</a>
|
|
889
|
+
<a name='L824'></a><a href='#L824'>824</a>
|
|
890
|
+
<a name='L825'></a><a href='#L825'>825</a>
|
|
891
|
+
<a name='L826'></a><a href='#L826'>826</a>
|
|
892
|
+
<a name='L827'></a><a href='#L827'>827</a>
|
|
893
|
+
<a name='L828'></a><a href='#L828'>828</a>
|
|
894
|
+
<a name='L829'></a><a href='#L829'>829</a>
|
|
895
|
+
<a name='L830'></a><a href='#L830'>830</a>
|
|
896
|
+
<a name='L831'></a><a href='#L831'>831</a>
|
|
897
|
+
<a name='L832'></a><a href='#L832'>832</a>
|
|
898
|
+
<a name='L833'></a><a href='#L833'>833</a>
|
|
899
|
+
<a name='L834'></a><a href='#L834'>834</a>
|
|
900
|
+
<a name='L835'></a><a href='#L835'>835</a>
|
|
901
|
+
<a name='L836'></a><a href='#L836'>836</a>
|
|
902
|
+
<a name='L837'></a><a href='#L837'>837</a>
|
|
903
|
+
<a name='L838'></a><a href='#L838'>838</a>
|
|
904
|
+
<a name='L839'></a><a href='#L839'>839</a>
|
|
905
|
+
<a name='L840'></a><a href='#L840'>840</a>
|
|
906
|
+
<a name='L841'></a><a href='#L841'>841</a>
|
|
907
|
+
<a name='L842'></a><a href='#L842'>842</a>
|
|
908
|
+
<a name='L843'></a><a href='#L843'>843</a>
|
|
909
|
+
<a name='L844'></a><a href='#L844'>844</a>
|
|
910
|
+
<a name='L845'></a><a href='#L845'>845</a>
|
|
911
|
+
<a name='L846'></a><a href='#L846'>846</a>
|
|
912
|
+
<a name='L847'></a><a href='#L847'>847</a>
|
|
913
|
+
<a name='L848'></a><a href='#L848'>848</a>
|
|
914
|
+
<a name='L849'></a><a href='#L849'>849</a>
|
|
915
|
+
<a name='L850'></a><a href='#L850'>850</a>
|
|
916
|
+
<a name='L851'></a><a href='#L851'>851</a>
|
|
917
|
+
<a name='L852'></a><a href='#L852'>852</a>
|
|
918
|
+
<a name='L853'></a><a href='#L853'>853</a>
|
|
919
|
+
<a name='L854'></a><a href='#L854'>854</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
920
|
+
<span class="cline-any cline-neutral"> </span>
|
|
921
|
+
<span class="cline-any cline-neutral"> </span>
|
|
922
|
+
<span class="cline-any cline-neutral"> </span>
|
|
923
|
+
<span class="cline-any cline-neutral"> </span>
|
|
924
|
+
<span class="cline-any cline-neutral"> </span>
|
|
925
|
+
<span class="cline-any cline-neutral"> </span>
|
|
926
|
+
<span class="cline-any cline-neutral"> </span>
|
|
927
|
+
<span class="cline-any cline-neutral"> </span>
|
|
928
|
+
<span class="cline-any cline-neutral"> </span>
|
|
929
|
+
<span class="cline-any cline-neutral"> </span>
|
|
930
|
+
<span class="cline-any cline-neutral"> </span>
|
|
931
|
+
<span class="cline-any cline-neutral"> </span>
|
|
932
|
+
<span class="cline-any cline-neutral"> </span>
|
|
933
|
+
<span class="cline-any cline-neutral"> </span>
|
|
934
|
+
<span class="cline-any cline-neutral"> </span>
|
|
935
|
+
<span class="cline-any cline-neutral"> </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-no"> </span>
|
|
940
|
+
<span class="cline-any cline-no"> </span>
|
|
941
|
+
<span class="cline-any cline-no"> </span>
|
|
942
|
+
<span class="cline-any cline-no"> </span>
|
|
943
|
+
<span class="cline-any cline-no"> </span>
|
|
944
|
+
<span class="cline-any cline-neutral"> </span>
|
|
945
|
+
<span class="cline-any cline-neutral"> </span>
|
|
946
|
+
<span class="cline-any cline-neutral"> </span>
|
|
947
|
+
<span class="cline-any cline-no"> </span>
|
|
948
|
+
<span class="cline-any cline-no"> </span>
|
|
949
|
+
<span class="cline-any cline-no"> </span>
|
|
950
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
955
|
+
<span class="cline-any cline-no"> </span>
|
|
956
|
+
<span class="cline-any cline-neutral"> </span>
|
|
957
|
+
<span class="cline-any cline-neutral"> </span>
|
|
958
|
+
<span class="cline-any cline-no"> </span>
|
|
959
|
+
<span class="cline-any cline-no"> </span>
|
|
960
|
+
<span class="cline-any cline-neutral"> </span>
|
|
961
|
+
<span class="cline-any cline-neutral"> </span>
|
|
962
|
+
<span class="cline-any cline-no"> </span>
|
|
963
|
+
<span class="cline-any cline-neutral"> </span>
|
|
964
|
+
<span class="cline-any cline-no"> </span>
|
|
965
|
+
<span class="cline-any cline-no"> </span>
|
|
966
|
+
<span class="cline-any cline-neutral"> </span>
|
|
967
|
+
<span class="cline-any cline-neutral"> </span>
|
|
968
|
+
<span class="cline-any cline-no"> </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-neutral"> </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-neutral"> </span>
|
|
978
|
+
<span class="cline-any cline-neutral"> </span>
|
|
979
|
+
<span class="cline-any cline-neutral"> </span>
|
|
980
|
+
<span class="cline-any cline-no"> </span>
|
|
981
|
+
<span class="cline-any cline-no"> </span>
|
|
982
|
+
<span class="cline-any cline-no"> </span>
|
|
983
|
+
<span class="cline-any cline-no"> </span>
|
|
984
|
+
<span class="cline-any cline-neutral"> </span>
|
|
985
|
+
<span class="cline-any cline-neutral"> </span>
|
|
986
|
+
<span class="cline-any cline-neutral"> </span>
|
|
987
|
+
<span class="cline-any cline-no"> </span>
|
|
988
|
+
<span class="cline-any cline-no"> </span>
|
|
989
|
+
<span class="cline-any cline-no"> </span>
|
|
990
|
+
<span class="cline-any cline-no"> </span>
|
|
991
|
+
<span class="cline-any cline-no"> </span>
|
|
992
|
+
<span class="cline-any cline-no"> </span>
|
|
993
|
+
<span class="cline-any cline-no"> </span>
|
|
994
|
+
<span class="cline-any cline-no"> </span>
|
|
995
|
+
<span class="cline-any cline-no"> </span>
|
|
996
|
+
<span class="cline-any cline-no"> </span>
|
|
997
|
+
<span class="cline-any cline-no"> </span>
|
|
998
|
+
<span class="cline-any cline-neutral"> </span>
|
|
999
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1000
|
+
<span class="cline-any cline-no"> </span>
|
|
1001
|
+
<span class="cline-any cline-no"> </span>
|
|
1002
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1013
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1014
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1015
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1016
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1017
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1018
|
+
<span class="cline-any cline-no"> </span>
|
|
1019
|
+
<span class="cline-any cline-no"> </span>
|
|
1020
|
+
<span class="cline-any cline-no"> </span>
|
|
1021
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1022
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1023
|
+
<span class="cline-any cline-no"> </span>
|
|
1024
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1025
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1026
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1027
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1028
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1029
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1030
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1031
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1032
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1033
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1034
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1035
|
+
<span class="cline-any cline-no"> </span>
|
|
1036
|
+
<span class="cline-any cline-no"> </span>
|
|
1037
|
+
<span class="cline-any cline-no"> </span>
|
|
1038
|
+
<span class="cline-any cline-no"> </span>
|
|
1039
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1040
|
+
<span class="cline-any cline-no"> </span>
|
|
1041
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1042
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1043
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-no"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-no"> </span>
|
|
1049
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1050
|
+
<span class="cline-any cline-no"> </span>
|
|
1051
|
+
<span class="cline-any cline-no"> </span>
|
|
1052
|
+
<span class="cline-any cline-no"> </span>
|
|
1053
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1054
|
+
<span class="cline-any cline-no"> </span>
|
|
1055
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1056
|
+
<span class="cline-any cline-no"> </span>
|
|
1057
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1058
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1059
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1060
|
+
<span class="cline-any cline-no"> </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-neutral"> </span>
|
|
1067
|
+
<span class="cline-any cline-no"> </span>
|
|
1068
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1074
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1075
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
|
1092
|
+
<span class="cline-any cline-no"> </span>
|
|
1093
|
+
<span class="cline-any cline-no"> </span>
|
|
1094
|
+
<span class="cline-any cline-no"> </span>
|
|
1095
|
+
<span class="cline-any cline-no"> </span>
|
|
1096
|
+
<span class="cline-any cline-no"> </span>
|
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1105
|
+
<span class="cline-any cline-no"> </span>
|
|
1106
|
+
<span class="cline-any cline-no"> </span>
|
|
1107
|
+
<span class="cline-any cline-no"> </span>
|
|
1108
|
+
<span class="cline-any cline-no"> </span>
|
|
1109
|
+
<span class="cline-any cline-no"> </span>
|
|
1110
|
+
<span class="cline-any cline-no"> </span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1113
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1114
|
+
<span class="cline-any cline-no"> </span>
|
|
1115
|
+
<span class="cline-any cline-no"> </span>
|
|
1116
|
+
<span class="cline-any cline-no"> </span>
|
|
1117
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1118
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1119
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1132
|
+
<span class="cline-any cline-no"> </span>
|
|
1133
|
+
<span class="cline-any cline-no"> </span>
|
|
1134
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1135
|
+
<span class="cline-any cline-no"> </span>
|
|
1136
|
+
<span class="cline-any cline-no"> </span>
|
|
1137
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1138
|
+
<span class="cline-any cline-no"> </span>
|
|
1139
|
+
<span class="cline-any cline-no"> </span>
|
|
1140
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1141
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1146
|
+
<span class="cline-any cline-no"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </span>
|
|
1148
|
+
<span class="cline-any cline-no"> </span>
|
|
1149
|
+
<span class="cline-any cline-no"> </span>
|
|
1150
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1151
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1152
|
+
<span class="cline-any cline-no"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-no"> </span>
|
|
1156
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1157
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1158
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1168
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1173
|
+
<span class="cline-any cline-no"> </span>
|
|
1174
|
+
<span class="cline-any cline-no"> </span>
|
|
1175
|
+
<span class="cline-any cline-no"> </span>
|
|
1176
|
+
<span class="cline-any cline-no"> </span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-no"> </span>
|
|
1192
|
+
<span class="cline-any cline-no"> </span>
|
|
1193
|
+
<span class="cline-any cline-no"> </span>
|
|
1194
|
+
<span class="cline-any cline-no"> </span>
|
|
1195
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1196
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1197
|
+
<span class="cline-any cline-no"> </span>
|
|
1198
|
+
<span class="cline-any cline-no"> </span>
|
|
1199
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1200
|
+
<span class="cline-any cline-no"> </span>
|
|
1201
|
+
<span class="cline-any cline-no"> </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-no"> </span>
|
|
1206
|
+
<span class="cline-any cline-no"> </span>
|
|
1207
|
+
<span class="cline-any cline-no"> </span>
|
|
1208
|
+
<span class="cline-any cline-no"> </span>
|
|
1209
|
+
<span class="cline-any cline-no"> </span>
|
|
1210
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1211
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1212
|
+
<span class="cline-any cline-no"> </span>
|
|
1213
|
+
<span class="cline-any cline-no"> </span>
|
|
1214
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1215
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1216
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1217
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1218
|
+
<span class="cline-any cline-no"> </span>
|
|
1219
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1220
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1221
|
+
<span class="cline-any cline-no"> </span>
|
|
1222
|
+
<span class="cline-any cline-no"> </span>
|
|
1223
|
+
<span class="cline-any cline-no"> </span>
|
|
1224
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1225
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1226
|
+
<span class="cline-any cline-no"> </span>
|
|
1227
|
+
<span class="cline-any cline-no"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1233
|
+
<span class="cline-any cline-no"> </span>
|
|
1234
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1235
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1236
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1237
|
+
<span class="cline-any cline-no"> </span>
|
|
1238
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1239
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1240
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1241
|
+
<span class="cline-any cline-no"> </span>
|
|
1242
|
+
<span class="cline-any cline-no"> </span>
|
|
1243
|
+
<span class="cline-any cline-no"> </span>
|
|
1244
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-no"> </span>
|
|
1249
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1250
|
+
<span class="cline-any cline-no"> </span>
|
|
1251
|
+
<span class="cline-any cline-no"> </span>
|
|
1252
|
+
<span class="cline-any cline-no"> </span>
|
|
1253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1254
|
+
<span class="cline-any cline-no"> </span>
|
|
1255
|
+
<span class="cline-any cline-no"> </span>
|
|
1256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1257
|
+
<span class="cline-any cline-no"> </span>
|
|
1258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1259
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1260
|
+
<span class="cline-any cline-no"> </span>
|
|
1261
|
+
<span class="cline-any cline-no"> </span>
|
|
1262
|
+
<span class="cline-any cline-no"> </span>
|
|
1263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1264
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1265
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1266
|
+
<span class="cline-any cline-no"> </span>
|
|
1267
|
+
<span class="cline-any cline-no"> </span>
|
|
1268
|
+
<span class="cline-any cline-no"> </span>
|
|
1269
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1272
|
+
<span class="cline-any cline-no"> </span>
|
|
1273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1274
|
+
<span class="cline-any cline-no"> </span>
|
|
1275
|
+
<span class="cline-any cline-no"> </span>
|
|
1276
|
+
<span class="cline-any cline-no"> </span>
|
|
1277
|
+
<span class="cline-any cline-no"> </span>
|
|
1278
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1279
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1280
|
+
<span class="cline-any cline-no"> </span>
|
|
1281
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1282
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1283
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1284
|
+
<span class="cline-any cline-no"> </span>
|
|
1285
|
+
<span class="cline-any cline-no"> </span>
|
|
1286
|
+
<span class="cline-any cline-no"> </span>
|
|
1287
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1288
|
+
<span class="cline-any cline-no"> </span>
|
|
1289
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1290
|
+
<span class="cline-any cline-no"> </span>
|
|
1291
|
+
<span class="cline-any cline-no"> </span>
|
|
1292
|
+
<span class="cline-any cline-no"> </span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-no"> </span>
|
|
1296
|
+
<span class="cline-any cline-no"> </span>
|
|
1297
|
+
<span class="cline-any cline-no"> </span>
|
|
1298
|
+
<span class="cline-any cline-no"> </span>
|
|
1299
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1300
|
+
<span class="cline-any cline-no"> </span>
|
|
1301
|
+
<span class="cline-any cline-no"> </span>
|
|
1302
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1303
|
+
<span class="cline-any cline-no"> </span>
|
|
1304
|
+
<span class="cline-any cline-no"> </span>
|
|
1305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1307
|
+
<span class="cline-any cline-no"> </span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1310
|
+
<span class="cline-any cline-no"> </span>
|
|
1311
|
+
<span class="cline-any cline-no"> </span>
|
|
1312
|
+
<span class="cline-any cline-no"> </span>
|
|
1313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1317
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1318
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1319
|
+
<span class="cline-any cline-no"> </span>
|
|
1320
|
+
<span class="cline-any cline-no"> </span>
|
|
1321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-no"> </span>
|
|
1324
|
+
<span class="cline-any cline-no"> </span>
|
|
1325
|
+
<span class="cline-any cline-no"> </span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-no"> </span>
|
|
1328
|
+
<span class="cline-any cline-no"> </span>
|
|
1329
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1330
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1331
|
+
<span class="cline-any cline-no"> </span>
|
|
1332
|
+
<span class="cline-any cline-no"> </span>
|
|
1333
|
+
<span class="cline-any cline-no"> </span>
|
|
1334
|
+
<span class="cline-any cline-no"> </span>
|
|
1335
|
+
<span class="cline-any cline-no"> </span>
|
|
1336
|
+
<span class="cline-any cline-no"> </span>
|
|
1337
|
+
<span class="cline-any cline-no"> </span>
|
|
1338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1339
|
+
<span class="cline-any cline-no"> </span>
|
|
1340
|
+
<span class="cline-any cline-no"> </span>
|
|
1341
|
+
<span class="cline-any cline-no"> </span>
|
|
1342
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1344
|
+
<span class="cline-any cline-no"> </span>
|
|
1345
|
+
<span class="cline-any cline-no"> </span>
|
|
1346
|
+
<span class="cline-any cline-no"> </span>
|
|
1347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1348
|
+
<span class="cline-any cline-no"> </span>
|
|
1349
|
+
<span class="cline-any cline-no"> </span>
|
|
1350
|
+
<span class="cline-any cline-no"> </span>
|
|
1351
|
+
<span class="cline-any cline-no"> </span>
|
|
1352
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1353
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1354
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1356
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1357
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1358
|
+
<span class="cline-any cline-no"> </span>
|
|
1359
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1360
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1361
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1362
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1363
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1364
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1365
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1366
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1367
|
+
<span class="cline-any cline-no"> </span>
|
|
1368
|
+
<span class="cline-any cline-no"> </span>
|
|
1369
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1370
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1371
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1373
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1374
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1375
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1376
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1377
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1378
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1379
|
+
<span class="cline-any cline-no"> </span>
|
|
1380
|
+
<span class="cline-any cline-no"> </span>
|
|
1381
|
+
<span class="cline-any cline-no"> </span>
|
|
1382
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1383
|
+
<span class="cline-any cline-no"> </span>
|
|
1384
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1385
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1386
|
+
<span class="cline-any cline-no"> </span>
|
|
1387
|
+
<span class="cline-any cline-no"> </span>
|
|
1388
|
+
<span class="cline-any cline-no"> </span>
|
|
1389
|
+
<span class="cline-any cline-no"> </span>
|
|
1390
|
+
<span class="cline-any cline-no"> </span>
|
|
1391
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1392
|
+
<span class="cline-any cline-no"> </span>
|
|
1393
|
+
<span class="cline-any cline-no"> </span>
|
|
1394
|
+
<span class="cline-any cline-no"> </span>
|
|
1395
|
+
<span class="cline-any cline-no"> </span>
|
|
1396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1398
|
+
<span class="cline-any cline-no"> </span>
|
|
1399
|
+
<span class="cline-any cline-no"> </span>
|
|
1400
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1401
|
+
<span class="cline-any cline-no"> </span>
|
|
1402
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1403
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1404
|
+
<span class="cline-any cline-no"> </span>
|
|
1405
|
+
<span class="cline-any cline-no"> </span>
|
|
1406
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1407
|
+
<span class="cline-any cline-no"> </span>
|
|
1408
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1410
|
+
<span class="cline-any cline-no"> </span>
|
|
1411
|
+
<span class="cline-any cline-no"> </span>
|
|
1412
|
+
<span class="cline-any cline-no"> </span>
|
|
1413
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1414
|
+
<span class="cline-any cline-no"> </span>
|
|
1415
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1416
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1417
|
+
<span class="cline-any cline-no"> </span>
|
|
1418
|
+
<span class="cline-any cline-no"> </span>
|
|
1419
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1420
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1421
|
+
<span class="cline-any cline-no"> </span>
|
|
1422
|
+
<span class="cline-any cline-no"> </span>
|
|
1423
|
+
<span class="cline-any cline-no"> </span>
|
|
1424
|
+
<span class="cline-any cline-no"> </span>
|
|
1425
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1426
|
+
<span class="cline-any cline-no"> </span>
|
|
1427
|
+
<span class="cline-any cline-no"> </span>
|
|
1428
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1429
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1430
|
+
<span class="cline-any cline-no"> </span>
|
|
1431
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1432
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1433
|
+
<span class="cline-any cline-no"> </span>
|
|
1434
|
+
<span class="cline-any cline-no"> </span>
|
|
1435
|
+
<span class="cline-any cline-no"> </span>
|
|
1436
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1437
|
+
<span class="cline-any cline-no"> </span>
|
|
1438
|
+
<span class="cline-any cline-no"> </span>
|
|
1439
|
+
<span class="cline-any cline-no"> </span>
|
|
1440
|
+
<span class="cline-any cline-no"> </span>
|
|
1441
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1442
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1443
|
+
<span class="cline-any cline-no"> </span>
|
|
1444
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1445
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1446
|
+
<span class="cline-any cline-no"> </span>
|
|
1447
|
+
<span class="cline-any cline-no"> </span>
|
|
1448
|
+
<span class="cline-any cline-no"> </span>
|
|
1449
|
+
<span class="cline-any cline-no"> </span>
|
|
1450
|
+
<span class="cline-any cline-no"> </span>
|
|
1451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1453
|
+
<span class="cline-any cline-no"> </span>
|
|
1454
|
+
<span class="cline-any cline-no"> </span>
|
|
1455
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1456
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1457
|
+
<span class="cline-any cline-no"> </span>
|
|
1458
|
+
<span class="cline-any cline-no"> </span>
|
|
1459
|
+
<span class="cline-any cline-no"> </span>
|
|
1460
|
+
<span class="cline-any cline-no"> </span>
|
|
1461
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1462
|
+
<span class="cline-any cline-no"> </span>
|
|
1463
|
+
<span class="cline-any cline-no"> </span>
|
|
1464
|
+
<span class="cline-any cline-no"> </span>
|
|
1465
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1466
|
+
<span class="cline-any cline-no"> </span>
|
|
1467
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1468
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1469
|
+
<span class="cline-any cline-no"> </span>
|
|
1470
|
+
<span class="cline-any cline-no"> </span>
|
|
1471
|
+
<span class="cline-any cline-no"> </span>
|
|
1472
|
+
<span class="cline-any cline-no"> </span>
|
|
1473
|
+
<span class="cline-any cline-no"> </span>
|
|
1474
|
+
<span class="cline-any cline-no"> </span>
|
|
1475
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1477
|
+
<span class="cline-any cline-no"> </span>
|
|
1478
|
+
<span class="cline-any cline-no"> </span>
|
|
1479
|
+
<span class="cline-any cline-no"> </span>
|
|
1480
|
+
<span class="cline-any cline-no"> </span>
|
|
1481
|
+
<span class="cline-any cline-no"> </span>
|
|
1482
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1483
|
+
<span class="cline-any cline-no"> </span>
|
|
1484
|
+
<span class="cline-any cline-no"> </span>
|
|
1485
|
+
<span class="cline-any cline-no"> </span>
|
|
1486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1487
|
+
<span class="cline-any cline-no"> </span>
|
|
1488
|
+
<span class="cline-any cline-no"> </span>
|
|
1489
|
+
<span class="cline-any cline-no"> </span>
|
|
1490
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1491
|
+
<span class="cline-any cline-no"> </span>
|
|
1492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1493
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1494
|
+
<span class="cline-any cline-no"> </span>
|
|
1495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1496
|
+
<span class="cline-any cline-no"> </span>
|
|
1497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1498
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1499
|
+
<span class="cline-any cline-no"> </span>
|
|
1500
|
+
<span class="cline-any cline-no"> </span>
|
|
1501
|
+
<span class="cline-any cline-no"> </span>
|
|
1502
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1503
|
+
<span class="cline-any cline-no"> </span>
|
|
1504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1505
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1506
|
+
<span class="cline-any cline-no"> </span>
|
|
1507
|
+
<span class="cline-any cline-no"> </span>
|
|
1508
|
+
<span class="cline-any cline-no"> </span>
|
|
1509
|
+
<span class="cline-any cline-no"> </span>
|
|
1510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1511
|
+
<span class="cline-any cline-no"> </span>
|
|
1512
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1513
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1514
|
+
<span class="cline-any cline-no"> </span>
|
|
1515
|
+
<span class="cline-any cline-no"> </span>
|
|
1516
|
+
<span class="cline-any cline-no"> </span>
|
|
1517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1518
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1519
|
+
<span class="cline-any cline-no"> </span>
|
|
1520
|
+
<span class="cline-any cline-no"> </span>
|
|
1521
|
+
<span class="cline-any cline-no"> </span>
|
|
1522
|
+
<span class="cline-any cline-no"> </span>
|
|
1523
|
+
<span class="cline-any cline-no"> </span>
|
|
1524
|
+
<span class="cline-any cline-no"> </span>
|
|
1525
|
+
<span class="cline-any cline-no"> </span>
|
|
1526
|
+
<span class="cline-any cline-no"> </span>
|
|
1527
|
+
<span class="cline-any cline-no"> </span>
|
|
1528
|
+
<span class="cline-any cline-no"> </span>
|
|
1529
|
+
<span class="cline-any cline-no"> </span>
|
|
1530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1531
|
+
<span class="cline-any cline-no"> </span>
|
|
1532
|
+
<span class="cline-any cline-no"> </span>
|
|
1533
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1534
|
+
<span class="cline-any cline-no"> </span>
|
|
1535
|
+
<span class="cline-any cline-no"> </span>
|
|
1536
|
+
<span class="cline-any cline-no"> </span>
|
|
1537
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1538
|
+
<span class="cline-any cline-no"> </span>
|
|
1539
|
+
<span class="cline-any cline-no"> </span>
|
|
1540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1541
|
+
<span class="cline-any cline-no"> </span>
|
|
1542
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1544
|
+
<span class="cline-any cline-no"> </span>
|
|
1545
|
+
<span class="cline-any cline-no"> </span>
|
|
1546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1547
|
+
<span class="cline-any cline-no"> </span>
|
|
1548
|
+
<span class="cline-any cline-no"> </span>
|
|
1549
|
+
<span class="cline-any cline-no"> </span>
|
|
1550
|
+
<span class="cline-any cline-no"> </span>
|
|
1551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1556
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1561
|
+
<span class="cline-any cline-no"> </span>
|
|
1562
|
+
<span class="cline-any cline-no"> </span>
|
|
1563
|
+
<span class="cline-any cline-no"> </span>
|
|
1564
|
+
<span class="cline-any cline-no"> </span>
|
|
1565
|
+
<span class="cline-any cline-no"> </span>
|
|
1566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1568
|
+
<span class="cline-any cline-no"> </span>
|
|
1569
|
+
<span class="cline-any cline-no"> </span>
|
|
1570
|
+
<span class="cline-any cline-no"> </span>
|
|
1571
|
+
<span class="cline-any cline-no"> </span>
|
|
1572
|
+
<span class="cline-any cline-no"> </span>
|
|
1573
|
+
<span class="cline-any cline-no"> </span>
|
|
1574
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1575
|
+
<span class="cline-any cline-no"> </span>
|
|
1576
|
+
<span class="cline-any cline-no"> </span>
|
|
1577
|
+
<span class="cline-any cline-no"> </span>
|
|
1578
|
+
<span class="cline-any cline-no"> </span>
|
|
1579
|
+
<span class="cline-any cline-no"> </span>
|
|
1580
|
+
<span class="cline-any cline-no"> </span>
|
|
1581
|
+
<span class="cline-any cline-no"> </span>
|
|
1582
|
+
<span class="cline-any cline-no"> </span>
|
|
1583
|
+
<span class="cline-any cline-no"> </span>
|
|
1584
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1585
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1586
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1587
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1588
|
+
<span class="cline-any cline-no"> </span>
|
|
1589
|
+
<span class="cline-any cline-no"> </span>
|
|
1590
|
+
<span class="cline-any cline-no"> </span>
|
|
1591
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1592
|
+
<span class="cline-any cline-no"> </span>
|
|
1593
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1594
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1595
|
+
<span class="cline-any cline-no"> </span>
|
|
1596
|
+
<span class="cline-any cline-no"> </span>
|
|
1597
|
+
<span class="cline-any cline-no"> </span>
|
|
1598
|
+
<span class="cline-any cline-no"> </span>
|
|
1599
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1600
|
+
<span class="cline-any cline-no"> </span>
|
|
1601
|
+
<span class="cline-any cline-no"> </span>
|
|
1602
|
+
<span class="cline-any cline-no"> </span>
|
|
1603
|
+
<span class="cline-any cline-no"> </span>
|
|
1604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1605
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1606
|
+
<span class="cline-any cline-no"> </span>
|
|
1607
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1609
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1610
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1611
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1613
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1614
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1618
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1620
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1622
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1624
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1625
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1627
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1628
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1629
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1630
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1635
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1636
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1643
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1644
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1645
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1647
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1648
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1650
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1652
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1655
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1658
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1659
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1660
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1661
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1662
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1663
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1664
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1666
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1667
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1668
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1669
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1670
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1671
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1672
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1673
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1674
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1675
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1676
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1678
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1680
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1681
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1683
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1685
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1689
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1690
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1691
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1692
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1693
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1694
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1697
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1698
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1700
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1703
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1704
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1706
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1709
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1712
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1713
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1715
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1716
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1717
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1718
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1719
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1720
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1721
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1722
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1723
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1724
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1725
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1727
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1730
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1731
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1732
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1733
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1735
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1737
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1738
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1740
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1741
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1742
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1744
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1745
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1746
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1749
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1750
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1751
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1755
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1756
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1757
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1760
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1761
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1762
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1764
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1766
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1770
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1771
|
+
<span class="cline-any cline-neutral"> </span>
|
|
1772
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// duckdb dialect: concrete builder for duckdb
|
|
1773
|
+
import { BaseQueryBuilder } from '@epm-query-builder/base/BaseQueryBuilder';
|
|
1774
|
+
import {
|
|
1775
|
+
SuperFilterChild,
|
|
1776
|
+
RowColumnConfig,
|
|
1777
|
+
RankingConfig,
|
|
1778
|
+
EpmQueryBuilderOptions,
|
|
1779
|
+
} from '@epm-query-builder/types/query-builder-types';
|
|
1780
|
+
import { BaseUtilities } from '@epm-query-builder/base/BaseUtilities';
|
|
1781
|
+
import { DuckDbSuperFilterBuilder } from './DuckDbSuperFilterBuilder';
|
|
1782
|
+
import { DuckDbMeasureBuilder } from './DuckDbMeasureBuilder';
|
|
1783
|
+
import { DuckDbRollupBuilder } from './DuckDbRollupBuilder';
|
|
1784
|
+
import { DuckDbPaginationBuilder } from './DuckDbPaginationBuilder';
|
|
1785
|
+
import { DuckDbOrderBuilder } from './DuckDbOrderBuilder';
|
|
1786
|
+
import { BaseCountQueryBuilder } from '@epm-query-builder/base/BaseCountQueryBuilder';
|
|
1787
|
+
import { QueryOptionsValidator } from '@epm-query-builder/validation/QueryOptionsValidator';
|
|
1788
|
+
impo<span class="fstat-no" title="function not covered" >rt</span> { SqlQueryValidator } from '@epm-query-builder/validation/SqlQueryValidator';
|
|
1789
|
+
import {<span class="cstat-no" title="statement not covered" > QueryGeneration</span>Error } from '@epm-query-builder/errors/QueryBuilderErrors';
|
|
1790
|
+
import { IDatabaseQueryBuilder } from '@epm-query-builder/interfaces';
|
|
1791
|
+
import {<span class="cstat-no" title="statement not covered" > resolveJoinPlan } from '@epm-query-builder/base/RelationshipReso</span>lver';
|
|
1792
|
+
import {<span class="cstat-no" title="statement not covered" > DuckDbJoinBuilder } from './DuckDbJoinBuilder';</span>
|
|
1793
|
+
import {<span class="cstat-no" title="statement not covered" > SOURCE_TYPES } from '@epm-query-builder/constants/Sour</span>ce';
|
|
1794
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1795
|
+
export c<span class="cstat-no" title="statement not covered" >lass DuckDbQueryBuilder extends BaseQueryBuilder impl</span>ements IDatabaseQueryBuilder {
|
|
1796
|
+
privat<span class="cstat-no" title="statement not covered" >e superFilterBuilder: DuckDbSuperFilterBuilder;</span>
|
|
1797
|
+
private measureBuilder: DuckDbMeasureBuilder;
|
|
1798
|
+
private rollupBuilder: DuckDbRollupBuilder;
|
|
1799
|
+
pr<span class="fstat-no" title="function not covered" >iv</span>ate paginationBuilder: DuckDbPaginationBuilder;
|
|
1800
|
+
privat<span class="cstat-no" title="statement not covered" >e orderBuilder: DuckDbOrderBuilder;</span>
|
|
1801
|
+
private co<span class="cstat-no" title="statement not covered" >untQueryBuilder: BaseCountQueryBuilder;</span>
|
|
1802
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1803
|
+
constructor(options: EpmQueryBuilderO<span class="cstat-no" title="statement not covered" >ptions) {</span>
|
|
1804
|
+
super(options);
|
|
1805
|
+
// order<span class="cstat-no" title="statement not covered" > matters: these builders are used throughout generation</span>
|
|
1806
|
+
this.superFilterBuilder = new DuckDb<span class="cstat-no" title="statement not covered" >SuperFilterBuilder(options);</span>
|
|
1807
|
+
this.measure<span class="cstat-no" title="statement not covered" >Builder = new DuckDbMeasureBuilder(options);</span>
|
|
1808
|
+
this.rollupB<span class="cstat-no" title="statement not covered" >uilder = new DuckDbRollu</span>pBuilder(options);
|
|
1809
|
+
this.paginationBuilder = new DuckDbPaginationBuilder(options);
|
|
1810
|
+
this.orderBuilder = new DuckDbOrderBuilder(options);
|
|
1811
|
+
this.cou<span class="cstat-no" title="statement not covered" >ntQueryBuilder = new BaseCountQueryBuilder(options);</span>
|
|
1812
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1813
|
+
|
|
1814
|
+
// orchestrates decision between analytical and simple queries
|
|
1815
|
+
generateQuery(<span class="cstat-no" title="statement not covered" >): string {</span>
|
|
1816
|
+
try {
|
|
1817
|
+
QueryO<span class="cstat-no" title="statement not covered" >ptionsValidator.validateBasicConfigurati</span>on(this.options);
|
|
1818
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1819
|
+
const hasMultipleTables = this.containsDifferentTables();
|
|
1820
|
+
const hasMeasureInValues = this.hasMeasureInValues();
|
|
1821
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1822
|
+
// multi-t<span class="cstat-no" title="statement not covered" >able without </span>measures uses ctes path
|
|
1823
|
+
if (hasMultipleTables && !hasMeasureInValues) {
|
|
1824
|
+
cons<span class="cstat-no" title="statement not covered" >t multiTableQuery = this.generateMultiTableQuery();</span>
|
|
1825
|
+
SqlQueryValidator.validateQuery(multiTableQuery);
|
|
1826
|
+
return multiTableQuery;
|
|
1827
|
+
}
|
|
1828
|
+
|
|
1829
|
+
let query: string;
|
|
1830
|
+
if (this.shouldGenerateAnalyticalQuery()) {
|
|
1831
|
+
query = this.generateAnalyticalQuery();
|
|
1832
|
+
<span class="fstat-no" title="function not covered" ></span> } else {
|
|
1833
|
+
query = this.gener<span class="cstat-no" title="statement not covered" >ateSimpleQuery();</span>
|
|
1834
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1835
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1836
|
+
Sq<span class="cstat-no" title="statement not covered" >lQueryValidator.val</span>idateQuery(query);
|
|
1837
|
+
return query;
|
|
1838
|
+
} catch (error) {
|
|
1839
|
+
<span class="fstat-no" title="function not covered" ></span> if (error instanceof Error && error.name.includes('Error')) {
|
|
1840
|
+
throw error;<span class="cstat-no" title="statement not covered" ></span>
|
|
1841
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1842
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1843
|
+
throw new QueryGe<span class="cstat-no" title="statement not covered" >nerationError(`Failed to generate quer</span>y: ${error}`, {
|
|
1844
|
+
originalError: <span class="cstat-no" title="statement not covered" >error,</span>
|
|
1845
|
+
hasRows: Boolean(thi<span class="cstat-no" title="statement not covered" >s.o</span>ptions.rows?.length),
|
|
1846
|
+
<span class="cstat-no" title="statement not covered" > hasColumns: Boolean(this.options.columns?.length),</span>
|
|
1847
|
+
hasV<span class="cstat-no" title="statement not covered" >alues: Boolean(this.options.values?.length),</span>
|
|
1848
|
+
});<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
|
|
1849
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1850
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1851
|
+
|
|
1852
|
+
generateCountQuery(): string {
|
|
1853
|
+
const ma<span class="cstat-no" title="statement not covered" >inQuery = this.generateQuery();</span>
|
|
1854
|
+
const countQ<span class="cstat-no" title="statement not covered" >uery = this.countQueryBuilder<span class="fstat-no" title="function not covered" >.g</span>enerateCountQuery(mainQuery);</span>
|
|
1855
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1856
|
+
SqlQueryValidato<span class="cstat-no" title="statement not covered" >r.validateCountQuery(countQuery);</span>
|
|
1857
|
+
return countQuery;
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1860
|
+
// bui<span class="cstat-no" title="statement not covered" >lds query for multi-table scenarios using ctes</span>
|
|
1861
|
+
private generateMultiTableQuery()<span class="cstat-no" title="statement not covered" >: string {</span>
|
|
1862
|
+
const di<span class="cstat-no" title="statement not covered" >mensions = BaseUtilities.extractDimen</span>sionsFromOptions(this.options);
|
|
1863
|
+
const measures = this.extractMeasures();
|
|
1864
|
+
const cteQueries = this<span class="cstat-no" title="statement not covered" >.buildCTEs();</span>
|
|
1865
|
+
const source = BaseUtilities<span class="cstat-no" title="statement not covered" >.getSource(this.options);</span>
|
|
1866
|
+
const isXmla = source === SOURCE_TYPES.XMLA;
|
|
1867
|
+
|
|
1868
|
+
const selectParts: string[] = [];
|
|
1869
|
+
|
|
1870
|
+
if (dimensions.length > 0) {
|
|
1871
|
+
if (this.options.rows?<span class="cstat-no" title="statement not covered" >.length) {</span>
|
|
1872
|
+
this.options.rows.forE<span class="cstat-no" title="statement not covered" >ach((row) => {</span>
|
|
1873
|
+
const column = Base<span class="cstat-no" title="statement not covered" >Utilities.formatColumnReferenceForDb(row, this.options);</span>
|
|
1874
|
+
selectParts.push(`${column} AS "${row.id}"`);
|
|
1875
|
+
});
|
|
1876
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1877
|
+
if (this.options.columns?.length) {
|
|
1878
|
+
this.options.columns.forEach((col) => {
|
|
1879
|
+
const column = BaseUtilities.formatColumnReferenceForDb(col, this.options);
|
|
1880
|
+
selectParts.push(`${column} AS "${col.id}"`);
|
|
1881
|
+
});
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
|
|
1885
|
+
if (measures.length > 0) {
|
|
1886
|
+
const measureSelects = this.measureBuilder.buildMeasureSelects();
|
|
1887
|
+
<span class="fstat-no" title="function not covered" ></span> selectParts.push(...measureSelects);
|
|
1888
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1889
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1890
|
+
cons<span class="cstat-no" title="statement not covered" >t fromClause = this.buildFromWithJoins();</span>
|
|
1891
|
+
const wh<span class="cstat-no" title="statement not covered" >ereConditions = [</span>
|
|
1892
|
+
this.superFilterBuilder.buildWhereClause(),
|
|
1893
|
+
th<span class="cstat-no" title="statement not covered" >is.superFilterBuil</span>der.buildOrGroupExistsClause?.()
|
|
1894
|
+
? this.superFilterBuilder.buildOrGroupExistsClause()
|
|
1895
|
+
: '',
|
|
1896
|
+
<span class="fstat-no" title="function not covered" > ].</span>filter(Boolean);
|
|
1897
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1898
|
+
const hasMeasures = mea<span class="cstat-no" title="statement not covered" >sures.length > 0;</span>
|
|
1899
|
+
const shouldGroupBy = di<span class="cstat-no" title="statement not covered" >mensions.length > 0 && (!isXmla || hasMeasu</span>res);
|
|
1900
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1901
|
+
const se<span class="cstat-no" title="statement not covered" >lectClause =</span>
|
|
1902
|
+
isXmla && !hasMeasures
|
|
1903
|
+
<span class="cstat-no" title="statement not covered" > ? `SELECT DISTINCT ${selectParts.join(', ')}`</span>
|
|
1904
|
+
: th<span class="cstat-no" title="statement not covered" >is.buildSelectClause(selectParts);</span>
|
|
1905
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1906
|
+
return this.buildCompleteQuery({
|
|
1907
|
+
cte: c<span class="cstat-no" title="statement not covered" >teQueries,</span>
|
|
1908
|
+
select: selectClause,
|
|
1909
|
+
fr<span class="cstat-no" title="statement not covered" >om: fromClause,</span>
|
|
1910
|
+
where: this.buildWhereClause(whereConditions),
|
|
1911
|
+
groupBy: shouldGroupBy ? this.buildGroupByClause(dimensions) : undefined,
|
|
1912
|
+
<span class="fstat-no" title="function not covered" ></span> orderBy: this.orderBuilder.buildOrderByClause(),
|
|
1913
|
+
limit: this.pag<span class="cstat-no" title="statement not covered" >ina</span>tionBuilder.buildLimitClause(),
|
|
1914
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
1915
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1916
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1917
|
+
// analytical <span class="cstat-no" title="statement not covered" >path: generates ctes t</span>hen main
|
|
1918
|
+
private generateAnalyticalQuery(): string {
|
|
1919
|
+
const cteQueries = this.buildCTEs();
|
|
1920
|
+
const mainQuery = this.buildMa<span class="cstat-no" title="statement not covered" >inQuery();</span>
|
|
1921
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1922
|
+
if (cteQ<span class="cstat-no" title="statement not covered" >ueries) {</span>
|
|
1923
|
+
return `${cteQueries}\n${mainQuery}`;
|
|
1924
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1925
|
+
retu<span class="cstat-no" title="statement not covered" >rn mainQuery;</span>
|
|
1926
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1927
|
+
|
|
1928
|
+
// sim<span class="cstat-no" title="statement not covered" >ple path: handles select all, distinct, or aggregate</span>
|
|
1929
|
+
private generateSimpleQuery(): string {
|
|
1930
|
+
const tableName = this.getDefaultTableName();
|
|
1931
|
+
<span class="fstat-no" title="function not covered" > co</span>nst dimensions = BaseUtilities.extractDimensionsFromOptions(this.options);
|
|
1932
|
+
const whereClause = this<span class="cstat-no" title="statement not covered" >.superFilterBuilder.buil</span>dWhereClause();
|
|
1933
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1934
|
+
if (this.isSelectAllRequested() && !this.hasMeasures() && !this.hasRankingFilters()) {
|
|
1935
|
+
return this.buildSelectAllQuery(tableName, whereClause);
|
|
1936
|
+
}
|
|
1937
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1938
|
+
if (!this.hasMeasures()) {<span class="cstat-no" title="statement not covered" ></span>
|
|
1939
|
+
if (this.hasRankingFi<span class="cstat-no" title="statement not covered" >lters()) {</span>
|
|
1940
|
+
<span class="cstat-no" title="statement not covered" > return this.buildTopNRankingQuery(tableName, dimensions);</span>
|
|
1941
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1942
|
+
return<span class="cstat-no" title="statement not covered" > this.buildDistinctQuery(tableName, dimensions,</span> whereClause);
|
|
1943
|
+
}
|
|
1944
|
+
return this.buildSimpleA<span class="cstat-no" title="statement not covered" >ggregateQuery(tableName, dimensions, wh</span>ereClause);
|
|
1945
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1946
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1947
|
+
// col<span class="cstat-no" title="statement not covered" >lects ctes for filters and pre-processing</span>
|
|
1948
|
+
private buildCTEs(): string {<span class="cstat-no" title="statement not covered" ></span>
|
|
1949
|
+
const ctes: string[] = [];<span class="cstat-no" title="statement not covered" ></span>
|
|
1950
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1951
|
+
if (this<span class="cstat-no" title="statement not covered" >.hasComplexFilters()) {</span>
|
|
1952
|
+
const filt<span class="cstat-no" title="statement not covered" >erCTE = this.superFilterBuilder.buildFilterCTE();</span>
|
|
1953
|
+
if (filterCTE) {
|
|
1954
|
+
ctes.push(filterCTE);
|
|
1955
|
+
}
|
|
1956
|
+
}
|
|
1957
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1958
|
+
const me<span class="cstat-no" title="statement not covered" >asureFilterCTEs = this.measureBuilder.buildMeasureFilterCTE();</span>
|
|
1959
|
+
if (measureFilterCTEs) {<span class="cstat-no" title="statement not covered" ></span>
|
|
1960
|
+
ctes.push(<span class="cstat-no" title="statement not covered" >measureFilterCTEs);</span>
|
|
1961
|
+
}<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>
|
|
1962
|
+
<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>
|
|
1963
|
+
const rankingCTE = this.buildRankingKeysCTE(<span class="cstat-no" title="statement not covered" >);</span>
|
|
1964
|
+
if (rankingCTE) <span class="cstat-no" title="statement not covered" >{</span>
|
|
1965
|
+
ctes.push(rankingCTE);
|
|
1966
|
+
}
|
|
1967
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1968
|
+
return c<span class="cstat-no" title="statement not covered" >tes.length > 0 ? `WITH ${ctes.join(',\n')}` : '';</span>
|
|
1969
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1970
|
+
|
|
1971
|
+
// assembles main query parts respecting ranking overrides
|
|
1972
|
+
privat<span class="cstat-no" title="statement not covered" >e buildMainQuery(): string {</span>
|
|
1973
|
+
const selectItems = this.buildSelectItems();
|
|
1974
|
+
const whereConditions = [
|
|
1975
|
+
this.superFilterBuilder.buildWhereClause(),
|
|
1976
|
+
this.measureBuilder.buildMeasureFilterWhereClause(),
|
|
1977
|
+
].filter(Boolean);
|
|
1978
|
+
const groupByColumns = this.buildGroupByColumns();
|
|
1979
|
+
const havingConditions = [this.measureBuilder.buildHavingClause()].filter(Boolean);
|
|
1980
|
+
|
|
1981
|
+
const hasRanking = Boolean(this.options.isRankingFilterIncluded) || this.hasRankingFilters();
|
|
1982
|
+
|
|
1983
|
+
<span class="fstat-no" title="function not covered" > if</span> (this.shouldGenerateRollup() && hasRanking) {
|
|
1984
|
+
const nullFilterCondit<span class="cstat-no" title="statement not covered" >ion</span>s = this.rollupBuilder.buildNullFilterConditions();
|
|
1985
|
+
wh<span class="cstat-no" title="statement not covered" >ereConditions.push(...nullFilterConditions);</span>
|
|
1986
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
1987
|
+
|
|
1988
|
+
let <span class="cstat-no" title="statement not covered" >orderByClause = this.orderBuilder.buildOrderByClause();</span>
|
|
1989
|
+
let limi<span class="cstat-no" title="statement not covered" >tClause = this.paginationBuilder.buildLimitClause();</span>
|
|
1990
|
+
|
|
1991
|
+
cons<span class="cstat-no" title="statement not covered" >t ranking = this.findFirstRankingConfig(this.options.superFilters?.children || []);</span>
|
|
1992
|
+
if (rank<span class="cstat-no" title="statement not covered" >ing) {</span>
|
|
1993
|
+
const rankingOrder = this.buildRankingOrderClause(ranking);
|
|
1994
|
+
co<span class="cstat-no" title="statement not covered" >nst dimsForHaving = </span>BaseUtilities.extractDimensionsFromOptions(this.options);
|
|
1995
|
+
const hasRollup = this.shouldGenerateRollup();
|
|
1996
|
+
|
|
1997
|
+
<span class="fstat-no" title="function not covered" ></span> if (rankingOrder) {
|
|
1998
|
+
orderByClause = has<span class="cstat-no" title="statement not covered" >Rol</span>lup
|
|
1999
|
+
<span class="cstat-no" title="statement not covered" > ? `ORDER BY "[IsRowGrandTotal]" DESC NULLS LAST, ${rankingOrder}`</span>
|
|
2000
|
+
: <span class="cstat-no" title="statement not covered" >`ORDER BY ${rankingOrder}`<span class="fstat-no" title="function not covered" >;</span></span>
|
|
2001
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2002
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2003
|
+
// do not LIMIT the main result for ranking; restrict row keys via CTE join instead
|
|
2004
|
+
limitClause = '';
|
|
2005
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2006
|
+
if (di<span class="cstat-no" title="statement not covered" >msForHaving.length > 0) {<span class="fstat-no" title="function not covered" ></span></span>
|
|
2007
|
+
const rowDims = BaseUti<span class="cstat-no" title="statement not covered" >lities.buildDimensionReference(this.options.rows, this.optio</span>ns);
|
|
2008
|
+
if (rowD<span class="cstat-no" title="statement not covered" >ims.length > 0) {</span>
|
|
2009
|
+
const isLeafAllDims = dimsForHaving.map((d) => `GROUPING(${d}) = 0`).join(' AND ');
|
|
2010
|
+
const isRowGrand = rowDims.map((d) => `GROUPING(${d}) = 1`).join(' AND ');
|
|
2011
|
+
<span class="cstat-no" title="statement not covered" > const allowLeafOr</span>RowGrand = `(${isLeafAllDims}) OR (${isRowGrand})`;
|
|
2012
|
+
havingConditions.push(allowLeafOrRowGrand);
|
|
2013
|
+
}
|
|
2014
|
+
<span class="fstat-no" title="function not covered" ></span> }
|
|
2015
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2016
|
+
const <span class="cstat-no" title="statement not covered" >rankingWher</span>e = this.buildRankingKeysWhereClause();
|
|
2017
|
+
if (rankingWhere) {
|
|
2018
|
+
<span class="cstat-no" title="statement not covered" > whereConditions.push(rankingWhere);</span>
|
|
2019
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2020
|
+
}
|
|
2021
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2022
|
+
return this.buildCompleteQuery({
|
|
2023
|
+
select: this.buildSelectClause(selectItems),
|
|
2024
|
+
<span class="fstat-no" title="function not covered" ></span> from: this.buildFromWithJoins(),
|
|
2025
|
+
where: this.build<span class="cstat-no" title="statement not covered" >WhereClaus</span>e(
|
|
2026
|
+
[this.paginationBuilder.build<span class="cstat-no" title="statement not covered" >Additional</span>Where(), ...whereConditions].filter(Boolean),
|
|
2027
|
+
),<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
|
|
2028
|
+
groupB<span class="cstat-no" title="statement not covered" >y: groupByColumns.length > 0 ? this.buildGroupByClause(groupByColumns) : undefined,</span>
|
|
2029
|
+
having: th<span class="cstat-no" title="statement not covered" >is.build</span>HavingClause(havingConditions),
|
|
2030
|
+
orderBy: orderByClause,<span class="cstat-no" title="statement not covered" ></span>
|
|
2031
|
+
limit: limitClause,<span class="cstat-no" title="statement not covered" ></span>
|
|
2032
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
2033
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2034
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2035
|
+
// builds sele<span class="cstat-no" title="statement not covered" >ct items based on dims, rollup, and measures</span>
|
|
2036
|
+
private buildSelec<span class="cstat-no" title="statement not covered" >tItems(): string[] {</span>
|
|
2037
|
+
const selectItems: string[] = [];
|
|
2038
|
+
|
|
2039
|
+
if (this.hasDimensions()) {
|
|
2040
|
+
se<span class="cstat-no" title="statement not covered" >lectItems.push(...this.buildDimensio<span class="fstat-no" title="function not covered" >nS</span>elects());</span>
|
|
2041
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2042
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2043
|
+
if (this.shouldGenerateRollup())<span class="cstat-no" title="statement not covered" > {</span>
|
|
2044
|
+
selectItems.push(...this.rollupB<span class="cstat-no" title="statement not covered" >uilder.buildRollupSelects());</span>
|
|
2045
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2046
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2047
|
+
if (this.has<span class="cstat-no" title="statement not covered" >Measures()) {</span>
|
|
2048
|
+
selectItems.push(...this.measureBuilder.buildMeasureSelects());
|
|
2049
|
+
}
|
|
2050
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2051
|
+
return s<span class="cstat-no" title="statement not covered" >electItems;</span>
|
|
2052
|
+
}
|
|
2053
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2054
|
+
// pre<span class="cstat-no" title="statement not covered" >pares dimension projections respect</span>ing dot-notation mode
|
|
2055
|
+
private buildDimensionSelects(): string[] {
|
|
2056
|
+
const dimensions: string[] = [];
|
|
2057
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
2058
|
+
if (<span class="cstat-no" title="statement not covered" >this.options.rows<span class="fstat-no" title="function not covered" >?.</span>length) {</span>
|
|
2059
|
+
this.o<span class="cstat-no" title="statement not covered" >ptions.rows.forEach((row) => {</span>
|
|
2060
|
+
const co<span class="cstat-no" title="statement not covered" >lumn = BaseUtilities.formatColumn<span class="fstat-no" title="function not covered" >Re</span>ferenceForDb(row, this.options);</span>
|
|
2061
|
+
dimensions.p<span class="cstat-no" title="statement not covered" >ush(`${column} AS "${row.id}"`);</span>
|
|
2062
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
2063
|
+
}
|
|
2064
|
+
|
|
2065
|
+
if (this<span class="cstat-no" title="statement not covered" >.options.columns?.length) {</span>
|
|
2066
|
+
this.optio<span class="cstat-no" title="statement not covered" >ns.columns.forEach((col) => {</span>
|
|
2067
|
+
const column = BaseUtilities.formatColumnReferenceForDb(col, this.options);
|
|
2068
|
+
dimensions.push(`${column} AS "${col.id}"`);
|
|
2069
|
+
});
|
|
2070
|
+
<span class="fstat-no" title="function not covered" > }</span>
|
|
2071
|
+
<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>
|
|
2072
|
+
return dimensions;
|
|
2073
|
+
}<span class="fstat-no" title="function not covered" ></span>
|
|
2074
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2075
|
+
// decides<span class="cstat-no" title="statement not covered" > group by list</span> based on rollup and measures
|
|
2076
|
+
privat<span class="cstat-no" title="statement not covered" >e buildGroupByColumns(): string[] {</span>
|
|
2077
|
+
if (!this.hasMeasures() && !this.shouldGenerateRollup()) {
|
|
2078
|
+
<span class="fstat-no" title="function not covered" ></span> return [];
|
|
2079
|
+
}<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
|
|
2080
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2081
|
+
if (this.sho<span class="cstat-no" title="statement not covered" >uldGenerateRo</span>llup()) {
|
|
2082
|
+
return this.rollupBuilder.buildGroupByClause().replace('GROUP BY ', '').split(', ');
|
|
2083
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2084
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2085
|
+
return BaseUtilities.extractDimensionsFromOptions(this.options);
|
|
2086
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2087
|
+
|
|
2088
|
+
// checks if dims, cols, filters span multiple tables
|
|
2089
|
+
pr<span class="fstat-no" title="function not covered" >iv</span>ate containsDifferentTables(): boolean {
|
|
2090
|
+
cons<span class="cstat-no" title="statement not covered" >t tables = new Set<string>();<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
|
|
2091
|
+
const originalParentTables = new Set<string>();
|
|
2092
|
+
|
|
2093
|
+
<span class="fstat-no" title="function not covered" > [.</span>..(this.options.rows || []), ...(this.options.columns || [])].forEach((item) => {
|
|
2094
|
+
if (!item) return;<span class="cstat-no" title="statement not covered" ></span>
|
|
2095
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2096
|
+
const <span class="cstat-no" title="statement not covered" >directTableName = item.tableName;</span>
|
|
2097
|
+
const inferredTableName =
|
|
2098
|
+
!directTableName &&<span class="cstat-no" title="statement not covered" > item.id ? BaseUtilities.getT</span>ableNameFromId(item.id) : null;
|
|
2099
|
+
const effectiv<span class="cstat-no" title="statement not covered" >eTableName = directTableName || inferredTableName;</span>
|
|
2100
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2101
|
+
if (ef<span class="cstat-no" title="statement not covered" >fectiveTableName) {</span>
|
|
2102
|
+
tables.add(effectiveTableName);
|
|
2103
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2104
|
+
<span class="cstat-no" title="statement not covered" > if (item.type === 'Resolved' && item.orderByRef) {</span>
|
|
2105
|
+
or<span class="cstat-no" title="statement not covered" >iginalParentTables.add(item.or</span>derByRef);
|
|
2106
|
+
}
|
|
2107
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2108
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
2109
|
+
|
|
2110
|
+
(thi<span class="cstat-no" title="statement not covered" >s.options.valu</span>es || []).forEach((measure) => {
|
|
2111
|
+
if (!measure) return;
|
|
2112
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
2113
|
+
co<span class="cstat-no" title="statement not covered" >nst directTableName = measure.tableName;</span>
|
|
2114
|
+
const <span class="cstat-no" title="statement not covered" >inferredTableN</span>ame =
|
|
2115
|
+
<span class="cstat-no" title="statement not covered" > !directTableName && measure.id ? BaseUtilities.getTableNameFromId(measure.id) : n</span>ull;
|
|
2116
|
+
const effectiveTableName = directTableName || inferredTableName;
|
|
2117
|
+
|
|
2118
|
+
<span class="fstat-no" title="function not covered" ></span> if (effectiveTableName) {
|
|
2119
|
+
<span class="cstat-no" title="statement not covered" > tables.add(effectiveTableName);</span>
|
|
2120
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2121
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
2122
|
+
|
|
2123
|
+
if (this.options.superFilters?.children) {
|
|
2124
|
+
this.extractFilterTables(this.options.superFilters.children, tables);
|
|
2125
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2126
|
+
|
|
2127
|
+
const to<span class="cstat-no" title="statement not covered" >talUniqueTables = new Set([...tables, ...originalParentTables]);</span>
|
|
2128
|
+
return totalUniqueTables.s<span class="cstat-no" title="statement not covered" >ize > 1;</span>
|
|
2129
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2130
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2131
|
+
// traverses filter tree collecting table names
|
|
2132
|
+
private extractFilterTables(children: SuperFilterChild[], tables: Set<string>): void {
|
|
2133
|
+
chil<span class="cstat-no" title="statement not covered" >dren.forEach(</span>(child) => {
|
|
2134
|
+
if (child.filters?.tableNames) {
|
|
2135
|
+
child.filters.tableNames.forEach((tableName: string) => {
|
|
2136
|
+
<span class="fstat-no" title="function not covered" ></span> if (tableName) tables.add(tableName);
|
|
2137
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
2138
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2139
|
+
if (ch<span class="cstat-no" title="statement not covered" >ild.children) {</span>
|
|
2140
|
+
this.extractFilterTables(child.children, tables);
|
|
2141
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2142
|
+
});
|
|
2143
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2144
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2145
|
+
private hasMeasureInValues()<span class="cstat-no" title="statement not covered" >: boolean {</span>
|
|
2146
|
+
return (this.options.valu<span class="cstat-no" title="statement not covered" >es || []).some((measure) => measure.type?.toUpperCase() === 'MEASURE');</span>
|
|
2147
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2148
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2149
|
+
private hasFiltersForTable(tabl<span class="cstat-no" title="statement not covered" >eName: string): boolean {</span>
|
|
2150
|
+
if (!this.options.superFil<span class="cstat-no" title="statement not covered" >ters?.childre</span>n) return false;
|
|
2151
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2152
|
+
return this.checkFiltersForTable(this.options.superFilters.children, tableName);
|
|
2153
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2154
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2155
|
+
private checkFiltersForTable(children: SuperFilterChild[], tableName: string): boolean {
|
|
2156
|
+
return childr<span class="cstat-no" title="statement not covered" >en.some((child) => {</span>
|
|
2157
|
+
if (child.<span class="cstat-no" title="statement not covered" >filters?.tableNames?.incl</span>udes(tableName)) {
|
|
2158
|
+
return true;
|
|
2159
|
+
}
|
|
2160
|
+
if (child.children) {<span class="cstat-no" title="statement not covered" ></span>
|
|
2161
|
+
return t<span class="cstat-no" title="statement not covered" >his.checkFiltersForTable(child.children, table</span>Name);
|
|
2162
|
+
}
|
|
2163
|
+
return<span class="cstat-no" title="statement not covered" > false;</span>
|
|
2164
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
2165
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2166
|
+
|
|
2167
|
+
private hasMeasuresForTable(tableName: string): boolean {
|
|
2168
|
+
return (this.options.values || []).some((measure) => measure.tableName === tableName);
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2171
|
+
// builds distinct projection for dims path
|
|
2172
|
+
private buildDistinctQue<span class="cstat-no" title="statement not covered" >ry(tableName: string, dimensions: </span>string[], whereClause: string): string {
|
|
2173
|
+
const fr<span class="cstat-no" title="statement not covered" >omClause = this.buildFromWithJoins();</span>
|
|
2174
|
+
|
|
2175
|
+
if (dimensions.length =<span class="cstat-no" title="statement not covered" >== 0) {</span>
|
|
2176
|
+
return `SELECT COUNT(*) <span class="cstat-no" title="statement not covered" >${fromClause}`;</span>
|
|
2177
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2178
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
|
|
2179
|
+
const selectDims = t<span class="cstat-no" title="statement not covered" >his.buildDimensionSelects();</span>
|
|
2180
|
+
let query = `SELECT DIST<span class="cstat-no" title="statement not covered" >INCT ${selectDims.join(', ')} ${fromClause}`;</span>
|
|
2181
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2182
|
+
if (whereClause) {
|
|
2183
|
+
query += ` WHERE ${whereClause}`;
|
|
2184
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2185
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2186
|
+
const orderByClause = this.ord<span class="cstat-no" title="statement not covered" >erBuilder.bui</span>ldOrderByClause();
|
|
2187
|
+
if (orderByClause) {<span class="cstat-no" title="statement not covered" ></span>
|
|
2188
|
+
query += ` ${orderByClause}`;<span class="cstat-no" title="statement not covered" ></span>
|
|
2189
|
+
} else if (d<span class="cstat-no" title="statement not covered" >imensions.length > 0</span>) {
|
|
2190
|
+
query += `<span class="cstat-no" title="statement not covered" > ORDER BY ${dimensions[0]} ASC`;</span>
|
|
2191
|
+
}
|
|
2192
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2193
|
+
return query<span class="cstat-no" title="statement not covered" >;</span>
|
|
2194
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2195
|
+
|
|
2196
|
+
private hasRankingFilters(): boolean {
|
|
2197
|
+
if (!this.options.superFilter<span class="cstat-no" title="statement not covered" >s?.children) return false;</span>
|
|
2198
|
+
return this.<span class="cstat-no" title="statement not covered" >findFirstRankingConfig(this.options.superFilte</span>rs.children) !== null;
|
|
2199
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2200
|
+
|
|
2201
|
+
// finds t<span class="cstat-no" title="statement not covered" >he first ranking config to override order and limit</span>
|
|
2202
|
+
private findFirstRankingCon<span class="cstat-no" title="statement not covered" >fig(children: SuperF</span>ilterChild[]): RankingConfig | null {
|
|
2203
|
+
for (const child of children<span class="cstat-no" title="statement not covered" >) {</span>
|
|
2204
|
+
const filt<span class="cstat-no" title="statement not covered" >ers = child.filters as unknown as {</span>
|
|
2205
|
+
rankingFilter?: RankingConfig[];
|
|
2206
|
+
filterType?: string;
|
|
2207
|
+
};
|
|
2208
|
+
if (
|
|
2209
|
+
filters &&
|
|
2210
|
+
filters.filterType === 'RANKING' &&
|
|
2211
|
+
Array.is<span class="cstat-no" title="statement not covered" >Array(filters.rankingFilter) &&</span>
|
|
2212
|
+
filters.rankingFilter.length > 0
|
|
2213
|
+
) {
|
|
2214
|
+
return filters.rankingFilter[0];
|
|
2215
|
+
}
|
|
2216
|
+
if (child.children) {
|
|
2217
|
+
const found = this.findFirstRankingConfig(child.children);
|
|
2218
|
+
if (found) return found;
|
|
2219
|
+
}
|
|
2220
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2221
|
+
return null;<span class="cstat-no" title="statement not covered" ></span>
|
|
2222
|
+
}
|
|
2223
|
+
|
|
2224
|
+
// generates union/intersect queries for top/bottom selection across rules
|
|
2225
|
+
private buildTopNRankingQuery(tableName: string, dimensions: string[]): string {
|
|
2226
|
+
const rankings = this.findAllRankingConfigs(this.options.superFilters?.children || []);
|
|
2227
|
+
if (rankings.length === 0) {
|
|
2228
|
+
return this.buildDistinctQuery(tableName, dimensions, '');
|
|
2229
|
+
}
|
|
2230
|
+
|
|
2231
|
+
const formattedTableName = BaseUtilities.formatTableNameForDb(
|
|
2232
|
+
tableName,<span class="cstat-no" title="statement not covered" ></span>
|
|
2233
|
+
th<span class="cstat-no" title="statement not covered" >is.options.databaseDetails?.databaseType as string,</span>
|
|
2234
|
+
);<span class="cstat-no" title="statement not covered" ></span>
|
|
2235
|
+
// if no dimensions, rank rows by the measure column value directly
|
|
2236
|
+
if (<span class="cstat-no" title="statement not covered" >dimensions.length === 0) {</span>
|
|
2237
|
+
const rk = rankings[0];
|
|
2238
|
+
<span class="fstat-no" title="function not covered" ></span> const direction = rk.type === 'BOTTOM' ? 'ASC' : 'DESC';
|
|
2239
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2240
|
+
const actualId<span class="cstat-no" title="statement not covered" > = BaseUtilities.extractColumnIdFromHierarchy(</span>
|
|
2241
|
+
rk.rankByColumnI<span class="cstat-no" title="statement not covered" >d || `${rk.rankByTableName || ''}[${rk.rankByColumnName || ''</span>}]`,
|
|
2242
|
+
);<span class="cstat-no" title="statement not covered" ></span>
|
|
2243
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2244
|
+
const isBlend = BaseUtilities.getSource(this.options) === SOURCE_TYPES.BLEND;
|
|
2245
|
+
const tableNameForRef = tab<span class="cstat-no" title="statement not covered" >leName;</span>
|
|
2246
|
+
const aggTypeUpper = (rk<span class="cstat-no" title="statement not covered" >.rankByAggreg</span>ationType || 'SUM').toUpperCase();
|
|
2247
|
+
const aggPrefix = aggTyp<span class="cstat-no" title="statement not covered" >eUpper;</span>
|
|
2248
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2249
|
+
const blendMeasureRef = BaseUtilities.formatTableColumnReference(
|
|
2250
|
+
tableNameForRef,
|
|
2251
|
+
<span class="cstat-no" title="statement not covered" > `${aggPrefix}__${actualId}`,</span>
|
|
2252
|
+
);<span class="cstat-no" title="statement not covered" ></span>
|
|
2253
|
+
|
|
2254
|
+
let rk<span class="cstat-no" title="statement not covered" >Ref: string;</span>
|
|
2255
|
+
if (isBlend) {
|
|
2256
|
+
rkRef = blendMeasureRef;
|
|
2257
|
+
} else if (this.options<span class="cstat-no" title="statement not covered" >.databaseDetails?.databaseType === 'duckdb') {</span>
|
|
2258
|
+
rkRe<span class="cstat-no" title="statement not covered" >f = `"${actualId}"`;</span>
|
|
2259
|
+
} else {
|
|
2260
|
+
<span class="cstat-no" title="statement not covered" > const tableRef = rk.rankByTableName || BaseUt</span>ilities.getDefaultTableName(this.options);
|
|
2261
|
+
rkRef = `${tableRef}.${rk.rankByColumnName}`;
|
|
2262
|
+
<span class="fstat-no" title="function not covered" ></span> }
|
|
2263
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2264
|
+
if<span class="cstat-no" title="statement not covered" > (rk.isPercentage) {</span>
|
|
2265
|
+
cons<span class="cstat-no" title="statement not covered" >t percentile = Math.max(0, Math.min(100, rk.value)) / 100;</span>
|
|
2266
|
+
return [
|
|
2267
|
+
<span class="cstat-no" title="statement not covered" > 'SELECT * FROM (',</span>
|
|
2268
|
+
`SELECT *, PERCENT_RANK() OVER (ORDER BY ${rkRef} ${direction}) AS __pr`,
|
|
2269
|
+
<span class="fstat-no" title="function not covered" ></span> `FROM ${formattedTableName}`,
|
|
2270
|
+
`) __ranked<span class="cstat-no" title="statement not covered" > WHERE __pr <= ${percentile}`,</span>
|
|
2271
|
+
<span class="cstat-no" title="statement not covered" > ].join('\n');</span>
|
|
2272
|
+
}
|
|
2273
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
2274
|
+
const limit = Mat<span class="cstat-no" title="statement not covered" >h.m</span>ax(1, Math.floor(rk.value));
|
|
2275
|
+
re<span class="cstat-no" title="statement not covered" >turn `SELECT * FROM ${formattedTableName} ORDER BY ${rkRef} ${direction} LIMIT ${limit}`;</span>
|
|
2276
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2277
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2278
|
+
const fromClause = `FROM ${formattedTableName}`;
|
|
2279
|
+
const gr<span class="cstat-no" title="statement not covered" >oupByClause = `GROUP BY ${dimensions.join(', ')}`;</span>
|
|
2280
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2281
|
+
const subqueries: string[] = [];
|
|
2282
|
+
rankings.forEach((rk) => {
|
|
2283
|
+
co<span class="cstat-no" title="statement not covered" >nst agg = BaseU</span>tilities.mapAggregationType(rk.rankByAggregationType || 'SUM');
|
|
2284
|
+
const isBlend = BaseUtilities.getSource(this.options) === SOURCE_TYPES.BLEND;
|
|
2285
|
+
<span class="fstat-no" title="function not covered" ></span> const actualId = BaseUtilities.extractColumnIdFromHierarchy(
|
|
2286
|
+
<span class="cstat-no" title="statement not covered" > rk.rankByColumnId || `${rk.rankByTableName || ''}[${rk.rankByColumnName || ''}]`,</span>
|
|
2287
|
+
);<span class="cstat-no" title="statement not covered" ></span>
|
|
2288
|
+
let rkRef:<span class="cstat-no" title="statement not covered" > string;</span>
|
|
2289
|
+
let selectClause: string;
|
|
2290
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2291
|
+
if (isBlend) {<span class="cstat-no" title="statement not covered" ></span>
|
|
2292
|
+
const ag<span class="cstat-no" title="statement not covered" >gTypeUpper = (rk.rankByAggregationType || 'SUM').toUpperCase();</span>
|
|
2293
|
+
const aggPre<span class="cstat-no" title="statement not covered" >fix = aggT</span>ypeUpper; // For BLEND, alias prefix must match input aggregation type
|
|
2294
|
+
const measureAlias = `${aggPrefix}__${actualId}`;
|
|
2295
|
+
const measureRef = BaseUtilities.formatTableColumnReference(tableName, measureAlias);
|
|
2296
|
+
<span class="cstat-no" title="statement not covered" > rkRef = measureR</span>ef;
|
|
2297
|
+
selectClause = `SELECT ${dimensions.join(', ')}, ${agg}("${measureAlias}") AS "${measureAlias}", COUNT(*) OVER () AS "[TotalRowsCountForResult]"`;
|
|
2298
|
+
<span class="fstat-no" title="function not covered" ></span> } else if (this.options.databaseDetails?.databaseType === 'duckdb') {
|
|
2299
|
+
rkRef = `"${actua<span class="cstat-no" title="statement not covered" >lId}"`;</span>
|
|
2300
|
+
selectClause = `SELE<span class="cstat-no" title="statement not covered" >CT ${dimensions.join(', ')}, ${agg</span>}(${rkRef}), COUNT(*) OVER () AS "[TotalRowsCountForResult]"`;
|
|
2301
|
+
} <span class="cstat-no" title="statement not covered" >else {<span class="fstat-no" title="function not covered" ></span></span>
|
|
2302
|
+
cons<span class="cstat-no" title="statement not covered" >t tableRef = rk.rankByTableName || BaseUtilities.getDefaultTableName(this.options);</span>
|
|
2303
|
+
rkRef = <span class="cstat-no" title="statement not covered" >`${tableRef}.${rk.rankByColumnName}`;</span>
|
|
2304
|
+
selectClause = `SELECT ${dimensions.join(', ')}, ${agg}(${rkRef}), COUNT(*) OVER () AS "[TotalRowsCountForResult]"`;
|
|
2305
|
+
}
|
|
2306
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2307
|
+
if (rk.typ<span class="cstat-no" title="statement not covered" >e === 'BOTH') {</span>
|
|
2308
|
+
const topN = Math.ceil(rk.value);
|
|
2309
|
+
const bottomN = Math.floor(rk.value);
|
|
2310
|
+
subqueries.push(<span class="cstat-no" title="statement not covered" ></span>
|
|
2311
|
+
[<span class="cstat-no" title="statement not covered" ></span>
|
|
2312
|
+
<span class="cstat-no" title="statement not covered" > selectClause,</span>
|
|
2313
|
+
<span class="cstat-no" title="statement not covered" > fromClause,</span>
|
|
2314
|
+
groupByClause,
|
|
2315
|
+
<span class="cstat-no" title="statement not covered" > `ORDER BY ${agg}(${rkRef}) DESC`,</span>
|
|
2316
|
+
<span class="cstat-no" title="statement not covered" > `LIMIT ${topN}`,</span>
|
|
2317
|
+
].<span class="cstat-no" title="statement not covered" >join('\n'),<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
|
|
2318
|
+
);
|
|
2319
|
+
<span class="cstat-no" title="statement not covered" > subqueries.pus</span>h(
|
|
2320
|
+
[
|
|
2321
|
+
<span class="fstat-no" title="function not covered" ></span> selectClause,
|
|
2322
|
+
fromCla<span class="cstat-no" title="statement not covered" >use,</span>
|
|
2323
|
+
<span class="cstat-no" title="statement not covered" > groupByClause,<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span></span>
|
|
2324
|
+
<span class="cstat-no" title="statement not covered" > `ORDER BY ${a</span>gg}(${rkRef}) ASC`,
|
|
2325
|
+
<span class="cstat-no" title="statement not covered" > `LIMIT ${bottomN}`,</span>
|
|
2326
|
+
].<span class="cstat-no" title="statement not covered" >join('\n'),</span>
|
|
2327
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2328
|
+
} else {
|
|
2329
|
+
<span class="fstat-no" title="function not covered" ></span> const dir = rk.type === 'TOP' ? 'DESC' : 'ASC';
|
|
2330
|
+
subqueries.push(<span class="cstat-no" title="statement not covered" ></span>
|
|
2331
|
+
[<span class="cstat-no" title="statement not covered" ></span>
|
|
2332
|
+
selectCl<span class="cstat-no" title="statement not covered" >ause,</span>
|
|
2333
|
+
<span class="cstat-no" title="statement not covered" > fromClause,</span>
|
|
2334
|
+
<span class="cstat-no" title="statement not covered" > groupByClause,</span>
|
|
2335
|
+
isBlend
|
|
2336
|
+
? `ORDER BY "${(<span class="cstat-no" title="statement not covered" >rk.rankByAggregationType || 'SUM').toUp</span>perCase()}__${actualId}" ${dir}`
|
|
2337
|
+
<span class="cstat-no" title="statement not covered" > : `ORDER BY ${agg}(${rkRef}) ${dir}`,</span>
|
|
2338
|
+
<span class="cstat-no" title="statement not covered" > `LIMIT ${rk.value}`,</span>
|
|
2339
|
+
].join('\n'),
|
|
2340
|
+
);<span class="cstat-no" title="statement not covered" ></span>
|
|
2341
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2342
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
2343
|
+
|
|
2344
|
+
cons<span class="cstat-no" title="statement not covered" >t logicalOp = </span>this.extractRankingLogicalOperator(this.options.superFilters?.children || []);
|
|
2345
|
+
if (logicalOp === 'INTERSECT') {
|
|
2346
|
+
<span class="fstat-no" title="function not covered" ></span> return subqueries.join(' INTERSECT ');
|
|
2347
|
+
}<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>
|
|
2348
|
+
return subqueries.join(' UNION ');
|
|
2349
|
+
}<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ></span></span>
|
|
2350
|
+
|
|
2351
|
+
pr<span class="fstat-no" title="function not covered" >iv</span>ate buildRankingOrderClause(ranking: RankingConfig): string {
|
|
2352
|
+
cons<span class="cstat-no" title="statement not covered" >t direction = ranking.type === 'BOTTOM' ? 'ASC' : 'DESC';</span>
|
|
2353
|
+
const agg = BaseUtilities.mapAg<span class="cstat-no" title="statement not covered" >gregationType(ranking.rankByAggregationType || 'SUM');</span>
|
|
2354
|
+
const is<span class="cstat-no" title="statement not covered" >Blend = BaseUtilities.getSourc</span>e(this.options) === SOURCE_TYPES.BLEND;
|
|
2355
|
+
|
|
2356
|
+
if (<span class="cstat-no" title="statement not covered" >isBlend) {</span>
|
|
2357
|
+
const actualId = BaseUtilities.extractColumnIdFromHierarchy(
|
|
2358
|
+
<span class="fstat-no" title="function not covered" ></span> ranking.rankByColumnId ||
|
|
2359
|
+
`${ranking.rankByTableNam<span class="cstat-no" title="statement not covered" >e || ''}[${ranking.rankByColumnName || ''}]`,</span>
|
|
2360
|
+
);<span class="cstat-no" title="statement not covered" ></span>
|
|
2361
|
+
co<span class="cstat-no" title="statement not covered" >nst aggTypeUpper = (ranking.rankByAggregationType || 'SUM').toUpperCase();</span>
|
|
2362
|
+
const <span class="cstat-no" title="statement not covered" >aggPrefix = aggTypeUpper; // For BLEN</span>D, alias prefix must match input aggregation type
|
|
2363
|
+
const aliasName = `${aggPrefix}__${actualId}`;
|
|
2364
|
+
re<span class="cstat-no" title="statement not covered" >turn `"${aliasName}</span>" ${direction}`;
|
|
2365
|
+
}
|
|
2366
|
+
<span class="fstat-no" title="function not covered" ></span>
|
|
2367
|
+
let measureRef: s<span class="cstat-no" title="statement not covered" >tring;</span>
|
|
2368
|
+
if (this.options.d<span class="cstat-no" title="statement not covered" >atabaseDetails?.databaseType === 'duckdb') {</span>
|
|
2369
|
+
co<span class="cstat-no" title="statement not covered" >nst actualId = BaseUtilities.extractColumnIdFromHierarchy(</span>
|
|
2370
|
+
ranking.rankByColumnId ||
|
|
2371
|
+
<span class="fstat-no" title="function not covered" ></span> `${ranking.rankByTableName || ''}[${ranking.rankByColumnName || ''}]`,
|
|
2372
|
+
);<span class="cstat-no" title="statement not covered" ></span>
|
|
2373
|
+
me<span class="cstat-no" title="statement not covered" >asureRef = `"${actualId}"`;</span>
|
|
2374
|
+
} else {<span class="cstat-no" title="statement not covered" ></span>
|
|
2375
|
+
const tableRef = rank<span class="cstat-no" title="statement not covered" >ing.rankByTableName || BaseUtiliti</span>es.getDefaultTableName(this.options);
|
|
2376
|
+
me<span class="cstat-no" title="statement not covered" >asureRef = `${tableRef}.${ranking.rankByColumnName}`;</span>
|
|
2377
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2378
|
+
return `${agg}(${mea<span class="cstat-no" title="statement not covered" >sureRef}) ${direction}`;</span>
|
|
2379
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2380
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2381
|
+
private calculateRanking<span class="cstat-no" title="statement not covered" >Limit(ranking: RankingConfig): number {</span>
|
|
2382
|
+
const distinctCo<span class="cstat-no" title="statement not covered" >unt = ranking.isPercentage ? this.estimateDistinctCountForRanking() : 0;</span>
|
|
2383
|
+
if (ranking.isPercentage && distinctCount > 0) {
|
|
2384
|
+
re<span class="cstat-no" title="statement not covered" >turn Math.max(1, Math.floor((ranking.value * distinctCount) / 100));</span>
|
|
2385
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2386
|
+
return ranking.value;
|
|
2387
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2388
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2389
|
+
private es<span class="cstat-no" title="statement not covered" >timateDistinctCountForRanking(): number </span>{
|
|
2390
|
+
const dims = BaseUtilities.extractDimensionsFromOptions(this.options);
|
|
2391
|
+
return Ma<span class="cstat-no" title="statement not covered" >th.max(0, dims.length > 0 ? 1000000 : 0);</span>
|
|
2392
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2393
|
+
|
|
2394
|
+
private fi<span class="cstat-no" title="statement not covered" >ndAllRankingConfigs(children: SuperFilt</span>erChild[]): RankingConfig[] {
|
|
2395
|
+
const result: RankingConfig[] = [];
|
|
2396
|
+
for (const child of children) {
|
|
2397
|
+
if (child.filters?.rank<span class="cstat-no" title="statement not covered" >ingFilter && Array.isArray(child.filters.rankingFilter)) {</span>
|
|
2398
|
+
resu<span class="cstat-no" title="statement not covered" >lt.push(...child.filters.rankingFilter);</span>
|
|
2399
|
+
}
|
|
2400
|
+
if (child.children) {<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>
|
|
2401
|
+
result.push(...this<span class="cstat-no" title="statement not covered" >.findAllRanking<span class="fstat-no" title="function not covered" >Co</span>nfigs(chil<span class="cstat-no" title="statement not covered" >d.children));</span></span>
|
|
2402
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2403
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2404
|
+
return result;
|
|
2405
|
+
}
|
|
2406
|
+
|
|
2407
|
+
private extractRankingLogicalOperator(children: SuperFilterChild[]): string {
|
|
2408
|
+
for (const child of children) {
|
|
2409
|
+
if (child.filters?.logicalOperator) {
|
|
2410
|
+
return child.filters.logicalOperator.toUpperCase();
|
|
2411
|
+
}
|
|
2412
|
+
if (child.children) {
|
|
2413
|
+
<span class="fstat-no" title="function not covered" ></span> const v = this.extractRankingLogicalOperator(child.children);
|
|
2414
|
+
if (v) return v;<span class="cstat-no" title="statement not covered" ></span>
|
|
2415
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2416
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2417
|
+
return 'UNION';<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>
|
|
2418
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2419
|
+
|
|
2420
|
+
pr<span class="fstat-no" title="function not covered" >iv</span>ate buildSimpleAggregateQuery(
|
|
2421
|
+
tableName: strin<span class="cstat-no" title="statement not covered" >g,</span>
|
|
2422
|
+
dime<span class="cstat-no" title="statement not covered" >nsions: string[],</span>
|
|
2423
|
+
whereClause: string,<span class="cstat-no" title="statement not covered" ></span>
|
|
2424
|
+
): string <span class="cstat-no" title="statement not covered" >{</span>
|
|
2425
|
+
const measur<span class="cstat-no" title="statement not covered" >es = this.extrac</span>tMeasures();
|
|
2426
|
+
const se<span class="cstat-no" title="statement not covered" >lectParts = [...this.buildDimensionSelects()];</span>
|
|
2427
|
+
|
|
2428
|
+
measures.forEach(<span class="cstat-no" title="statement not covered" >(me</span>asure) => {
|
|
2429
|
+
if (measure.type?.toLower<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >Ca</span>se() === 'measure') {</span>
|
|
2430
|
+
selectParts.push(`"<span class="cstat-no" title="statement not covered" >${measure.id}" AS "${measure.la<span class="fstat-no" title="function not covered" >be</span>l}"`)<span class="cstat-no" title="statement not covered" >;</span></span>
|
|
2431
|
+
} else<span class="cstat-no" title="statement not covered" > {</span>
|
|
2432
|
+
const ag<span class="cstat-no" title="statement not covered" >gregationType =</span> BaseUtilities.mapAggregationType(measure.aggregationType || 'SUM');
|
|
2433
|
+
selectParts.push(`$<span class="cstat-no" title="statement not covered" >{aggregationType}("${measure.id}")<span class="fstat-no" title="function not covered" > A</span>S "${<span class="cstat-no" title="statement not covered" >measure.labe</span>l</span>}"`);
|
|
2434
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2435
|
+
});<span class="cstat-no" title="statement not covered" ></span>
|
|
2436
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2437
|
+
const fromClause = this.buildFromWithJoins();
|
|
2438
|
+
let query = `SELECT ${selectParts.join(', ')} ${fromClause}`;
|
|
2439
|
+
|
|
2440
|
+
if (whereClause) {
|
|
2441
|
+
qu<span class="cstat-no" title="statement not covered" >ery += ` WHE<span class="fstat-no" title="function not covered" >RE</span> ${whereClause}`;</span>
|
|
2442
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2443
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2444
|
+
if (dimensions.length > 0) {
|
|
2445
|
+
qu<span class="cstat-no" title="statement not covered" >ery += ` GROU</span>P BY ${dimensions.join(', ')}`;
|
|
2446
|
+
query += ` ORDER BY ${dimensions.map((_, index) => `${index + 1}`).join(', ')}`;
|
|
2447
|
+
<span class="fstat-no" title="function not covered" > }</span>
|
|
2448
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2449
|
+
return query;<span class="cstat-no" title="statement not covered" ></span>
|
|
2450
|
+
}<span class="cstat-no" title="statement not covered" ></span>
|
|
2451
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2452
|
+
private isSelectAllRequested(): boolean {
|
|
2453
|
+
const sc<span class="cstat-no" title="statement not covered" > = this.options.selectedColumns || [];</span>
|
|
2454
|
+
if (Array.isArray(sc) && s<span class="cstat-no" title="statement not covered" >c.some((c) => c === '*')) return true;</span>
|
|
2455
|
+
if (this.opt<span class="cstat-no" title="statement not covered" >ions.rows?.length === 1 && this.options.rows[0].columnName === '*') return true;</span>
|
|
2456
|
+
return false;<span class="cstat-no" title="statement not covered" ></span>
|
|
2457
|
+
}
|
|
2458
|
+
|
|
2459
|
+
privat<span class="cstat-no" title="statement not covered" >e buildSele</span>ctAllQuery(tableName: string, whereClause: string): string {
|
|
2460
|
+
const fromClause = this.buildFromWithJoins();
|
|
2461
|
+
|
|
2462
|
+
const selectKeyword = this.options.distinct ? 'SELECT DISTINCT' : 'SELECT';
|
|
2463
|
+
let query = `${selectKeyword} * ${fromClause}`;
|
|
2464
|
+
if (whereClause) {
|
|
2465
|
+
query += ` WHERE ${whereClause}`;
|
|
2466
|
+
}
|
|
2467
|
+
|
|
2468
|
+
const orderByClause = this.orderBuilder.buildOrderByClause();
|
|
2469
|
+
if (orderByClause) {
|
|
2470
|
+
query += ` ${orderByClause}`;
|
|
2471
|
+
}
|
|
2472
|
+
|
|
2473
|
+
const limitClause = this.paginationBuilder.buildLimitClause();
|
|
2474
|
+
if (limitClause) {
|
|
2475
|
+
query += ` ${limitClause}`;
|
|
2476
|
+
}
|
|
2477
|
+
|
|
2478
|
+
return query;
|
|
2479
|
+
}
|
|
2480
|
+
|
|
2481
|
+
private hasMeasureFilters(): boolean {
|
|
2482
|
+
return Boolean(
|
|
2483
|
+
this.options.superFilters?.children?.some(
|
|
2484
|
+
(child) =>
|
|
2485
|
+
child.filters &&
|
|
2486
|
+
(child.filters.filterType === 'MEASURE' ||
|
|
2487
|
+
child.filters.columnType?.some((type) => type?.toUpperCase() === 'MEASURE')),
|
|
2488
|
+
),
|
|
2489
|
+
);
|
|
2490
|
+
}
|
|
2491
|
+
|
|
2492
|
+
protected formatColumnReference(config: RowColumnConfig): string {
|
|
2493
|
+
if (this.options.databaseDetails?.databaseType === 'duckdb') {
|
|
2494
|
+
const actualColumnId = BaseUtilities.extractColumnIdFromHierarchy(config.id);
|
|
2495
|
+
return `"${actualColumnId}"`;
|
|
2496
|
+
}
|
|
2497
|
+
return super.formatColumnReference(config);
|
|
2498
|
+
}
|
|
2499
|
+
|
|
2500
|
+
protected buildFromClause(tableName: string, joins?: string[]): string {
|
|
2501
|
+
const formattedTableName = BaseUtilities.formatTableNameForDb(
|
|
2502
|
+
tableName,
|
|
2503
|
+
this.options.databaseDetails?.databaseType as string,
|
|
2504
|
+
);
|
|
2505
|
+
let fromClause = `FROM ${formattedTableName}`;
|
|
2506
|
+
|
|
2507
|
+
if (joins?.length) {
|
|
2508
|
+
fromClause += ` ${joins.join(' ')}`;
|
|
2509
|
+
}
|
|
2510
|
+
|
|
2511
|
+
return fromClause;
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
private buildFromWithJoins(): string {
|
|
2515
|
+
const plan = resolveJoinPlan(this.options);
|
|
2516
|
+
const joins = DuckDbJoinBuilder.buildJoinClauses(
|
|
2517
|
+
plan,
|
|
2518
|
+
this.options.databaseDetails?.databaseType as string,
|
|
2519
|
+
this.options,
|
|
2520
|
+
);
|
|
2521
|
+
return this.buildFromClause(plan.baseTable || this.getDefaultTableName(), joins);
|
|
2522
|
+
}
|
|
2523
|
+
|
|
2524
|
+
private buildRankingKeysCTE(): string {
|
|
2525
|
+
const ranking = this.findFirstRankingConfig(this.options.superFilters?.children || []);
|
|
2526
|
+
if (!ranking) return '';
|
|
2527
|
+
const targetDims = this.getRankingTargetDimensions();
|
|
2528
|
+
if (targetDims.length === 0) return '';
|
|
2529
|
+
|
|
2530
|
+
const isBlend = BaseUtilities.getSource(this.options) === SOURCE_TYPES.BLEND;
|
|
2531
|
+
const tableName = this.getDefaultTableName();
|
|
2532
|
+
const formattedTableName = BaseUtilities.formatTableNameForDb(
|
|
2533
|
+
tableName,
|
|
2534
|
+
this.options.databaseDetails?.databaseType as string,
|
|
2535
|
+
);
|
|
2536
|
+
const direction = ranking.type === 'BOTTOM' ? 'ASC' : 'DESC';
|
|
2537
|
+
const agg = BaseUtilities.mapAggregationType(ranking.rankByAggregationType || 'SUM');
|
|
2538
|
+
|
|
2539
|
+
let measureExpr: string;
|
|
2540
|
+
if (isBlend) {
|
|
2541
|
+
const actualId = BaseUtilities.extractColumnIdFromHierarchy(
|
|
2542
|
+
ranking.rankByColumnId ||
|
|
2543
|
+
`${ranking.rankByTableName || ''}[${ranking.rankByColumnName || ''}]`,
|
|
2544
|
+
);
|
|
2545
|
+
const aggTypeUpper = (ranking.rankByAggregationType || 'SUM').toUpperCase();
|
|
2546
|
+
const aliasName = `${aggTypeUpper}__${actualId}`;
|
|
2547
|
+
measureExpr = `${agg}("${aliasName}")`;
|
|
2548
|
+
} else if (this.options.databaseDetails?.databaseType === 'duckdb') {
|
|
2549
|
+
const actualId = BaseUtilities.extractColumnIdFromHierarchy(
|
|
2550
|
+
ranking.rankByColumnId ||
|
|
2551
|
+
`${ranking.rankByTableName || ''}[${ranking.rankByColumnName || ''}]`,
|
|
2552
|
+
);
|
|
2553
|
+
measureExpr = `${agg}("${actualId}")`;
|
|
2554
|
+
} else {
|
|
2555
|
+
const tableRef = ranking.rankByTableName || BaseUtilities.getDefaultTableName(this.options);
|
|
2556
|
+
measureExpr = `${agg}(${tableRef}.${ranking.rankByColumnName})`;
|
|
2557
|
+
}
|
|
2558
|
+
|
|
2559
|
+
const dimAliases = targetDims.map((_, idx) => `__rk_dim${idx + 1}`);
|
|
2560
|
+
const selectDims = targetDims.map((d, idx) => `${d} AS ${dimAliases[idx]}`).join(', ');
|
|
2561
|
+
const groupByDims = targetDims.join(', ');
|
|
2562
|
+
|
|
2563
|
+
return [
|
|
2564
|
+
`__ranking_keys AS (`,
|
|
2565
|
+
` SELECT ${selectDims}, ${measureExpr} AS __rk_value`,
|
|
2566
|
+
` FROM ${formattedTableName}`,
|
|
2567
|
+
` GROUP BY ${groupByDims}`,
|
|
2568
|
+
` ORDER BY __rk_value ${direction}`,
|
|
2569
|
+
` LIMIT ${this.calculateRankingLimit(ranking)}`,
|
|
2570
|
+
`)`,
|
|
2571
|
+
].join('\n');
|
|
2572
|
+
}
|
|
2573
|
+
|
|
2574
|
+
private buildRankingKeysWhereClause(): string {
|
|
2575
|
+
const targetDims = this.getRankingTargetDimensions();
|
|
2576
|
+
if (targetDims.length === 0) return '';
|
|
2577
|
+
const comparisons = targetDims.map((d, idx) => `${d} = rk.__rk_dim${idx + 1}`).join(' AND ');
|
|
2578
|
+
return `EXISTS (SELECT 1 FROM __ranking_keys rk WHERE ${comparisons})`;
|
|
2579
|
+
}
|
|
2580
|
+
|
|
2581
|
+
private getRankingTargetDimensions(): string[] {
|
|
2582
|
+
const ids = this.findFirstRankingTargetColumnIds(this.options.superFilters?.children || []);
|
|
2583
|
+
if (ids.length === 0) {
|
|
2584
|
+
const rowDims = BaseUtilities.buildDimensionReference(this.options.rows, this.options);
|
|
2585
|
+
if (rowDims.length > 0) return rowDims;
|
|
2586
|
+
return BaseUtilities.buildDimensionReference(this.options.columns, this.options);
|
|
2587
|
+
}
|
|
2588
|
+
|
|
2589
|
+
const refs: string[] = [];
|
|
2590
|
+
const findConfigById = (id: string) => {
|
|
2591
|
+
const inRows = (this.options.rows || []).find((r) => r.id === id);
|
|
2592
|
+
if (inRows) return inRows;
|
|
2593
|
+
const inCols = (this.options.columns || []).find((c) => c.id === id);
|
|
2594
|
+
if (inCols) return inCols;
|
|
2595
|
+
return {
|
|
2596
|
+
id,
|
|
2597
|
+
tableName: BaseUtilities.getDefaultTableNameFromOptions(this.options),
|
|
2598
|
+
} as unknown as RowColumnConfig;
|
|
2599
|
+
};
|
|
2600
|
+
ids.forEach((id) => {
|
|
2601
|
+
const cfg = findConfigById(id);
|
|
2602
|
+
refs.push(BaseUtilities.formatColumnReferenceForDb(cfg, this.options));
|
|
2603
|
+
});
|
|
2604
|
+
return refs;
|
|
2605
|
+
}
|
|
2606
|
+
|
|
2607
|
+
private findFirstRankingTargetColumnIds(children: SuperFilterChild[]): string[] {
|
|
2608
|
+
for (const child of children) {
|
|
2609
|
+
const filters = child.filters as unknown as {
|
|
2610
|
+
filterType?: string;
|
|
2611
|
+
columnIds?: string[];
|
|
2612
|
+
rankingFilter?: RankingConfig[];
|
|
2613
|
+
};
|
|
2614
|
+
if (filters && filters.filterType === 'RANKING' && Array.isArray(filters.rankingFilter)) {
|
|
2615
|
+
return (filters.columnIds || []).filter(Boolean) as string[];
|
|
2616
|
+
}
|
|
2617
|
+
if (child.children) {
|
|
2618
|
+
const found = this.findFirstRankingTargetColumnIds(child.children);
|
|
2619
|
+
if (found.length > 0) return found;
|
|
2620
|
+
}
|
|
2621
|
+
}
|
|
2622
|
+
return [];
|
|
2623
|
+
}
|
|
2624
|
+
}
|
|
2625
|
+
</pre></td></tr></table></pre>
|
|
2626
|
+
|
|
2627
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
2628
|
+
</div><!-- /wrapper -->
|
|
2629
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
2630
|
+
Code coverage generated by
|
|
2631
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2632
|
+
at 2025-12-03T07:39:44.024Z
|
|
2633
|
+
</div>
|
|
2634
|
+
<script src="../../../../prettify.js"></script>
|
|
2635
|
+
<script>
|
|
2636
|
+
window.onload = function () {
|
|
2637
|
+
prettyPrint();
|
|
2638
|
+
};
|
|
2639
|
+
</script>
|
|
2640
|
+
<script src="../../../../sorter.js"></script>
|
|
2641
|
+
<script src="../../../../block-navigation.js"></script>
|
|
2642
|
+
</body>
|
|
2643
|
+
</html>
|
|
2644
|
+
|