├── packages
└── meteor-postgres
│ ├── minisql
│ ├── minisql_tests.js
│ ├── minisql.js
│ └── alasql.js.map
│ ├── collection
│ ├── collection_tests.js
│ └── collection.js
│ ├── README.md
│ ├── package.js
│ └── postgres
│ ├── sqlserver_tests.js
│ └── serversql.js
├── .gitignore
├── LICENSE
├── simple-todos.html
├── README.md
├── simple-todos.css
└── simple-todos.js
/packages/meteor-postgres/minisql/minisql_tests.js:
--------------------------------------------------------------------------------
1 | var MiniSqlStub = function(name) {
2 | var stub = miniSQL();
3 | stub.table = name;
4 | stub.conString = 'postgres://postgres:1234@localhost/postgres';
5 | stub.wrapSave = Meteor.wrapAsync(stub.save.bind(stub));
6 | stub.wrapFetch = Meteor.wrapAsync(stub.fetch.bind(stub));
7 | return stub;
8 | };
9 |
10 | Tinytest.add('miniSQL - test - basic', function(test) {
11 | //TODO
12 | });
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.*~
2 | *.swp
3 | *.swo
4 | .build*
5 | .npm
6 | settings.json
7 | .DS_Store
8 | /.meteor
9 | *~
10 | /dev_bundle
11 | /dev_bundle*.tar.gz
12 | /android_bundle
13 | /android_bundle*.tar.gz
14 | /node_*.tar.gz
15 | /mongo_*.tar.gz
16 | /dist
17 | \#*\#
18 | .\#*
19 | .idea
20 | *.iml
21 | *.sublime-project
22 | *.sublime-workspace
23 | TAGS
24 | *.log
25 | *.out
26 | npm-debug.log
27 | universe
28 | .floo
29 | .flooignore
30 | .gitconfig
31 | 'postgres://meteor:Meteor1234@191.238.146.165/meteor'
--------------------------------------------------------------------------------
/packages/meteor-postgres/collection/collection_tests.js:
--------------------------------------------------------------------------------
1 | Tinytest.add(
2 | 'SQL.collection - SQL.Collection instantiation',
3 | function (test) {
4 | test.throws(
5 | function () {
6 | SQL.Collection(null, null);
7 | },
8 | /Use new to construct a SQLCollection/
9 | );
10 |
11 | test.throws(
12 | function() {
13 | var test1 = new SQL.Collection();
14 | },
15 | /First argument to new SQLCollection must exist/
16 | );
17 |
18 | test.throws(
19 | function() {
20 | var test2 = new SQL.Collection(1234);
21 | },
22 | /First argument to new SQLCollection must be a string or null/
23 | );
24 |
25 | test.throws(
26 | function() {
27 | var test3 = new SQL.Collection('test');
28 | },
29 | /connection Error/
30 | );
31 | }
32 | );
33 |
34 | Tinytest.add('Livedata - server method - tests', function (test) {
35 | // var testCollection = new SQL.Collection('test');
36 | //no event name error handle
37 | });
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 meteor-postgres
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/simple-todos.html:
--------------------------------------------------------------------------------
1 |
2 | Todo List
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | Todo List
11 |
16 |
26 |
27 |
28 |
29 | {{#each tasks}}
30 | {{> task}}
31 | {{/each}}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | {{text}} - {{name}}
44 |
45 |
46 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # [Meteor-Postgres](http://www.meteorpostgres.com/)
2 |
3 |
4 | 
5 |
6 | ### Installation
7 |
8 | Run the following from a command line.
9 |
10 | meteor add meteorsteam:meteor-postgres
11 |
12 | If you had previously downloaded the unstable pre-release, please remove and re-add the package.
13 |
14 | ### Usage
15 |
16 | * [Getting Started](https://github.com/meteor-stream/meteor-postgres/wiki/Getting-Started)
17 | * [Full List of Database Methods](https://github.com/meteor-stream/meteor-postgres/wiki/Database-Methods)
18 | * [Demo Todo App](http://todopostgres.meteor.com/)
19 | * [Refactor from Mongo to PostgreSQL](https://www.youtube.com/watch?v=JwHfxJnD0Yc)
20 |
21 | ### Implementation
22 |
23 | We used [Node-Postgres](https://github.com/brianc/node-postgres) on the server and [AlaSQL](https://github.com/agershun/alasql) on the client.
24 |
25 | ### Contribution Guidelines
26 |
27 | Coming soon.
28 |
29 | If you want to make modifications to our package for your project, clone this repo and include the /packages/meteor-postgres folder in your /packages. You will need to add the package to your packages file in .meteor.
30 |
31 | ### License
32 |
33 | Released under the MIT license. See the LICENSE file for more info.
34 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/README.md:
--------------------------------------------------------------------------------
1 | # [Meteor-Postgres](http://www.meteorpostgres.com/)
2 |
3 |
4 | 
5 |
6 | ### Installation
7 |
8 | Run the following from a command line.
9 |
10 | meteor add meteorsteam:meteor-postgres
11 |
12 | If you had previously downloaded the unstable pre-release, please remove and re-add the package.
13 |
14 | ### Usage
15 |
16 | * [Getting Started](https://github.com/meteor-stream/meteor-postgres/wiki/Getting-Started)
17 | * [Full List of Database Methods](https://github.com/meteor-stream/meteor-postgres/wiki/Database-Methods)
18 | * [Demo Todo App](http://todopostgres.meteor.com/)
19 | * [Refactor from Mongo to PostgreSQL](https://www.youtube.com/watch?v=JwHfxJnD0Yc)
20 |
21 | ### Implementation
22 |
23 | We used [Node-Postgres](https://github.com/brianc/node-postgres) on the server and [AlaSQL](https://github.com/agershun/alasql) on the client.
24 |
25 | ### Contribution Guidelines
26 |
27 | Coming soon.
28 |
29 | If you want to make modifications to our package for your project, clone this repo and include the /packages/meteor-postgres folder in your /packages. You will need to add the package to your packages file in .meteor.
30 |
31 | ### License
32 |
33 | Released under the MIT license. See the LICENSE file for more info.
34 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/package.js:
--------------------------------------------------------------------------------
1 | Package.describe({
2 | name: 'meteorsteam:meteor-postgres',
3 | version: '0.1.0',
4 | // Brief, one-line summary of the package.
5 | summary: 'PostgreSQL support for Meteor',
6 | // URL to the Git repository containing the source code for this package.
7 | git: 'https://github.com/meteor-stream/meteor-postgres',
8 | // By default, Meteor will default to using README.md for documentation.
9 | // To avoid submitting documentation, set this field to null.
10 | documentation: 'README.md'
11 | });
12 |
13 | Npm.depends({
14 | 'pg': '4.3.0'
15 | });
16 |
17 | Package.onUse(function (api) {
18 | // The order these files are imported is very important
19 | api.versionsFrom('1.1.0.1');
20 | api.use('underscore');
21 | api.use('tracker');
22 | api.use('ddp');
23 |
24 | // minisql
25 | api.addFiles(['minisql/alasql.js', 'minisql/alasql.js.map', 'minisql/minisql.js'], 'client');
26 | api.export('miniSQL', 'client');
27 |
28 | api.addFiles('postgres/serversql.js', 'server');
29 | api.export('ActiveRecord', 'server');
30 |
31 | api.addFiles('collection/collection.js');
32 | api.export('SQL');
33 |
34 | });
35 |
36 | Package.onTest(function (api) {
37 | api.versionsFrom('1.1');
38 | api.use(['spacebars', 'tinytest', 'test-helpers', 'underscore', 'tracker', 'ddp']);
39 | api.addFiles('postgres/serversql.js', 'server');
40 | api.export('ActiveRecord', 'server');
41 | api.addFiles('collection/collection.js', ['server', 'client']);
42 | api.export('SQL', ['server', 'client']);
43 | api.addFiles('collection/collection_tests.js');
44 | api.addFiles('postgres/sqlserver_tests.js', 'server');
45 | });
46 |
47 |
--------------------------------------------------------------------------------
/simple-todos.css:
--------------------------------------------------------------------------------
1 | /* CSS declarations go here */
2 | body {
3 | font-family: sans-serif;
4 | background-color: #315481;
5 | background-image: linear-gradient(to bottom, #315481, #918e82 100%);
6 | background-attachment: fixed;
7 |
8 | position: absolute;
9 | top: 0;
10 | bottom: 0;
11 | left: 0;
12 | right: 0;
13 |
14 | padding: 0;
15 | margin: 0;
16 |
17 | font-size: 14px;
18 | }
19 |
20 | .container {
21 | max-width: 600px;
22 | margin: 0 auto;
23 | min-height: 100%;
24 | background: white;
25 | }
26 |
27 | header {
28 | background: #d2edf4;
29 | background-image: linear-gradient(to bottom, #d0edf5, #e1e5f0 100%);
30 | padding: 20px 15px 15px 15px;
31 | position: relative;
32 | }
33 |
34 | #login-buttons {
35 | display: block;
36 | }
37 |
38 | h1 {
39 | font-size: 1.5em;
40 | margin: 0;
41 | margin-bottom: 10px;
42 | display: inline-block;
43 | margin-right: 1em;
44 | }
45 |
46 | form {
47 | margin-top: 10px;
48 | margin-bottom: -10px;
49 | position: relative;
50 | }
51 |
52 | .new-user input {
53 | box-sizing: border-box;
54 | padding: 10px 0;
55 | background: transparent;
56 | border: none;
57 | width: 100%;
58 | padding-right: 80px;
59 | font-size: 1em;
60 | }
61 |
62 | .new-user input:focus{
63 | outline: 0;
64 | }
65 |
66 | .new-task input {
67 | box-sizing: border-box;
68 | padding: 10px 0;
69 | background: transparent;
70 | border: none;
71 | width: 100%;
72 | padding-right: 80px;
73 | font-size: 1em;
74 | }
75 |
76 | .new-task input:focus{
77 | outline: 0;
78 | }
79 |
80 | ul {
81 | margin: 0;
82 | padding: 0;
83 | background: white;
84 | }
85 |
86 | .delete {
87 | float: right;
88 | font-weight: bold;
89 | background: none;
90 | font-size: 1em;
91 | border: none;
92 | position: relative;
93 | }
94 |
95 | li {
96 | position: relative;
97 | list-style: none;
98 | padding: 15px;
99 | border-bottom: #eee solid 1px;
100 | }
101 |
102 | li .text {
103 | margin-left: 10px;
104 | }
105 |
106 | li.checked {
107 | color: #888;
108 | }
109 |
110 | li.checked .text {
111 | text-decoration: line-through;
112 | }
113 |
114 | li.private {
115 | background: #eee;
116 | border-color: #ddd;
117 | }
118 |
119 | header .hide-completed {
120 | float: right;
121 | }
122 |
123 | .toggle-private {
124 | margin-left: 5px;
125 | }
126 |
127 | @media (max-width: 600px) {
128 | li {
129 | padding: 12px 15px;
130 | }
131 |
132 | .search {
133 | width: 150px;
134 | clear: both;
135 | }
136 |
137 | .new-task input {
138 | padding-bottom: 5px;
139 | }
140 | }
--------------------------------------------------------------------------------
/simple-todos.js:
--------------------------------------------------------------------------------
1 | // Defining 2 SQL collections. The additional paramater is the postgres connection string which will only run on the server
2 | tasks = new SQL.Collection('tasks');
3 | username = new SQL.Collection('username');
4 |
5 | if (Meteor.isClient) {
6 | var newUser = 'all';
7 | var taskTable = {
8 | id: ['$number'],
9 | text: ['$string', '$notnull'],
10 | checked: ['$bool'],
11 | usernameid: ['$number']
12 | };
13 |
14 | tasks.createTable(taskTable);
15 |
16 | var usersTable = {
17 | id: ['$number'],
18 | name: ['$string', '$notnull']
19 | };
20 | username.createTable(usersTable);
21 |
22 |
23 | Template.body.helpers({
24 | usernames: function () {
25 | return username.select()
26 | .fetch();
27 | },
28 | tasks: function () {
29 | if (newUser === 'all'){
30 | return tasks.select('tasks.id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.name')
31 | .join(['OUTER JOIN'], ['usernameid'], [['username', ['id']]])
32 | .fetch();
33 | }
34 | else {
35 | return tasks.select('tasks.id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.name')
36 | .join(['OUTER JOIN'], ['usernameid'], [['username', ['id']]])
37 | .where("name = ?", newUser)
38 | .fetch();
39 | }
40 | }
41 | });
42 |
43 |
44 | Template.body.events({
45 | "submit .new-task": function (event) {
46 | if (event.target.category.value){
47 | var user = username.select('id')
48 | .where("name = ?", event.target.category.value)
49 | .fetch();
50 | user = user[0].id;
51 | var text = event.target.text.value;
52 | tasks.insert({
53 | text:text,
54 | checked:false,
55 | usernameid: user
56 | }).save();
57 | event.target.text.value = "";
58 | } else{
59 | alert("please add a user first");
60 | }
61 | return false;
62 | },
63 | "submit .new-user": function (event) {
64 | var text = event.target.text.value;
65 | username.insert({
66 | name:text
67 | }).save();
68 | event.target.text.value = "";
69 |
70 | return false;
71 | },
72 | "click .toggle-checked": function () {
73 | tasks.update({id: this.id, "checked": !this.checked})
74 | .where("id = ?", this.id)
75 | .save();
76 | },
77 | "click .delete": function () {
78 | tasks.remove()
79 | .where("id = ?", this.id)
80 | .save();
81 | },
82 | "change .catselect": function(event){
83 | newUser = event.target.value;
84 | tasks.reactiveData.changed();
85 | }
86 | });
87 | }
88 |
89 | if (Meteor.isServer) {
90 | //tasks.createTable({text: ['$string'], checked: ["$bool", {$default: false}]}).save();
91 | //username.createTable({name: ['$string', '$unique']}).save();
92 | //tasks.createRelationship('username', '$onetomany').save();
93 |
94 |
95 | username.insert({name:'all'}).save();
96 | // Publishing the collections
97 | tasks.publish('tasks', function(){
98 | return tasks.select('tasks.id as id', 'tasks.text', 'tasks.checked', 'tasks.createdat', 'username.id as usernameid', 'username.name')
99 | .join(['INNER JOIN'], ["usernameid"], [["username", 'id']])
100 | .order('createdat DESC')
101 | .limit(100);
102 | });
103 |
104 | username.publish('username', function(){
105 | return username.select('id', 'name')
106 | .order('createdat DESC')
107 | .limit(100);
108 | });
109 | }
110 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/collection/collection.js:
--------------------------------------------------------------------------------
1 |
2 | var buffer = [];
3 | /**
4 | * @summary Namespace for SQL-related items
5 | * @namespace
6 | */
7 | SQL = {};
8 |
9 | SQL.Collection = function(connection) {
10 | var self = this;
11 | this.unvalidated = false;
12 | this.reactiveData = new Tracker.Dependency;
13 | this.tableName = connection;
14 | this.saveMethod = this.tableName + 'save';
15 | this.fetchMethod = this.tableName + 'fetch';
16 |
17 | if (!(self instanceof SQL.Collection)) {
18 | throw new Error('Use new to construct a SQLCollection');
19 | }
20 |
21 | // boolean to keep track of whether the local DB has an unvalidated entry
22 | self._events = [];
23 |
24 | if (!this.tableName) {
25 | throw new Error('First argument to new SQLCollection must exist');
26 | }
27 |
28 | if (this.tableName !== null && typeof this.tableName !== "string") {
29 | throw new Error('First argument to new SQLCollection must be a string or null');
30 | }
31 |
32 | if (Meteor.isClient) {
33 | // Sets certain properties used for miniSQL
34 | miniSQL(this);
35 | }
36 |
37 | if (Meteor.isServer){
38 | // Sets certain properties used for ActiveRecord
39 | ActiveRecord(this);
40 | }
41 |
42 | // initialize class
43 | this.table = connection;
44 |
45 | if (Meteor.isClient) {
46 | // Added will only be triggered on the initial population of the database client side.
47 | // Data added to any client while the page is already loaded will trigger a 'changed event'
48 | this.addEventListener('added', function(index, msg, name) {
49 | this.remove().save('client');
50 | for (var x = msg.results.length - 1; x >= 0; x--) {
51 | this.insert(msg.results[x]).save('client');
52 | }
53 | // Triggering Meteor's reactive data to allow for full stack reactivity
54 | });
55 | // Changed will be triggered whenever the server database changed while the client has the page open.
56 | // This could happen from an addition, an update, or a removal, from that specific client, or another client
57 | this.addEventListener('changed', function(index, msg, name) {
58 | // Checking to see if event is a removal from the DB
59 | if (msg.removed) {
60 | var tableId = msg.tableId;
61 | // For the client that triggered the removal event, the data will have
62 | // already been removed and this is redundant, but it would be inefficient to fix.
63 | this.remove().where("id = ?", tableId).save('client');
64 | }
65 | // Checking to see if event is a modification of the DB
66 | else if (msg.modified) {
67 | // For the client that triggered the removal event, the data will have
68 | // already been removed and this is redundant.
69 | this.update(msg.results).where("id = ?", msg.results.id).save('client');
70 | }
71 | else {
72 | // The message is a new insertion of a message
73 | // If the message was submitted by this client then the insert message triggered
74 | // by the server should be an update rather than an insert
75 | // We use the unvalidated boolean variabe to keep track of this
76 | if (this.unvalidated) {
77 | this.update(msg.results).where("id = ?", -1).save('client');
78 | this.unvalidated = false;
79 | }
80 | else {
81 | // The data was added by another client so just a regular insert
82 | this.insert(msg.results).save('client');
83 | }
84 | }
85 | });
86 | }
87 | // setting up the connection between server and client
88 | var selfConnection;
89 | var subscribeArgs;
90 | if (typeof connection === 'string') {
91 | // Using default connection
92 | subscribeArgs = Array.prototype.slice.call(arguments, 0);
93 | name = connection;
94 | if (Meteor.isClient) {
95 | connection = Meteor.connection;
96 | } else if (Meteor.isServer) {
97 | if (!selfConnection) {
98 | selfConnection = DDP.connect(Meteor.absoluteUrl());
99 | }
100 | connection = selfConnection;
101 | }
102 | } else {
103 | // SQLCollection arguments does not use the first argument (the connection)
104 | subscribeArgs = Array.prototype.slice.call(arguments, 1);
105 | }
106 |
107 | var subsBefore = _.keys(connection._subscriptions);
108 | _.extend(self, connection.subscribe.apply(connection, subscribeArgs));
109 | var subsNew = _.difference(_.keys(connection._subscriptions), subsBefore);
110 | if (subsNew.length !== 1) throw new Error('Subscription failed!');
111 | self.subscriptionId = subsNew[0];
112 |
113 | buffer.push({
114 | connection: connection,
115 | name: name,
116 | subscriptionId: self.subscriptionId,
117 | instance: self
118 | });
119 |
120 | // If first store for this subscription name, register it!
121 | if (_.filter(buffer, function(sub) {
122 | return sub.name === name && sub.connection === connection;
123 | }).length === 1) {
124 | registerStore(connection, name);
125 | }
126 | };
127 |
128 |
129 | var registerStore = function(connection, name) {
130 | connection.registerStore(name, {
131 | beginUpdate: function(batchSize, reset) {
132 | },
133 | update: function(msg) {
134 | var idSplit = msg.id.split(':');
135 | var sub = _.filter(buffer, function(sub) {
136 | return sub.subscriptionId === idSplit[0];
137 | })[0].instance;
138 | if (idSplit.length === 1 && msg.msg === 'added' &&
139 | msg.fields && msg.fields.reset === true) {
140 | // This message indicates a reset of a result set
141 | sub.dispatchEvent('reset', msg);
142 | sub.splice(0, sub.length);
143 | } else {
144 | var index = parseInt(idSplit[1], 10);
145 | var oldRow;
146 | sub.dispatchEvent('update', index, msg);
147 | switch (msg.msg) {
148 | case 'added':
149 | sub.splice(index, 0, msg.fields);
150 | sub.dispatchEvent(msg.msg, index, msg.fields, msg.collection);
151 | break;
152 | case 'changed':
153 | sub.splice(index, 0, msg.fields);
154 | sub.dispatchEvent(msg.msg, index, msg.fields, msg.collection);
155 | break;
156 | }
157 | }
158 | sub.changed();
159 | },
160 | endUpdate: function() {
161 | },
162 | saveOriginals: function() {
163 | },
164 | retrieveOriginals: function() {
165 | }
166 | });
167 | };
168 |
169 | // Inherit from Array and Tracker.Dependency
170 | SQL.Collection.prototype = new Array;
171 | _.extend(SQL.Collection.prototype, Tracker.Dependency.prototype);
172 | if (Meteor.isClient) {
173 | // extends the proto with miniSQL Methods
174 | _.extend(SQL.Collection.prototype, miniSQL.prototype);
175 | }
176 |
177 | if (Meteor.isServer){
178 | // extends the proto with ActiveRecord Methods
179 | _.extend(SQL.Collection.prototype, ActiveRecord.prototype);
180 | }
181 |
182 | SQL.Collection.prototype.publish = function(collname, pubFunc) {
183 | var methodObj = {};
184 | var context = this;
185 | methodObj[this.saveMethod] = function(input, dataArray) {
186 | context.save(input, dataArray);
187 | }
188 | methodObj[this.fetchMethod] = function(input, dataArray) {
189 | context.fetch(input, dataArray);
190 | }
191 | Meteor.methods(methodObj);
192 | Meteor.publish(collname, function () {
193 | // For this implementation to work you must call getCursor and provide a callback with the select
194 | // statement that needs to be reactive. The 'caboose' on the chain of calls must be autoSelect
195 | // and it must be passed the param 'sub' which is defining in the anon function.
196 | // This is a limitation of our implementation and will be fixed in later versions
197 | return {
198 | _publishCursor: function(sub){
199 | return pubFunc().autoSelect(sub);
200 | }
201 | }
202 | });
203 | };
204 |
205 | SQL.Collection.prototype._eventRoot = function(eventName) {
206 | return eventName.split('.')[0];
207 | };
208 |
209 | SQL.Collection.prototype._selectEvents = function(eventName, invert) {
210 | var self = this;
211 | var eventRoot, testKey, testVal;
212 | if (!(eventName instanceof RegExp)) {
213 | eventRoot = self._eventRoot(eventName);
214 | if (eventName === eventRoot) {
215 | testKey = 'root';
216 | testVal = eventRoot;
217 | } else {
218 | testKey = 'name';
219 | testVal = eventName;
220 | }
221 | }
222 | return _.filter(self._events, function(event) {
223 | var pass;
224 | if (eventName instanceof RegExp) {
225 | pass = event.name.match(eventName);
226 | } else {
227 | pass = event[testKey] === testVal;
228 | }
229 | return invert ? !pass : pass;
230 | });
231 | };
232 |
233 | SQL.Collection.prototype.addEventListener = function(eventName, listener) {
234 | var self = this;
235 | if (typeof listener !== 'function')
236 | throw new Error('invalid-listener');
237 | self._events.push({
238 | name: eventName,
239 | root: self._eventRoot(eventName),
240 | listener: listener
241 | });
242 | };
243 |
244 | SQL.Collection.prototype.initialValue = function(eventName, listener) {
245 | return Postgres.select(this.tableName);
246 | };
247 |
248 | // @param {string} eventName - Remove events of this name, pass without suffix
249 | // to remove all events matching root.
250 | SQL.Collection.prototype.removeEventListener = function(eventName) {
251 | var self = this;
252 | self._events = self._selectEvents(eventName, true);
253 | };
254 |
255 | SQL.Collection.prototype.dispatchEvent = function(eventName /* arguments */) {
256 | var self = this;
257 | var listenerArgs = Array.prototype.slice.call(arguments, 1);
258 | var listeners = self._selectEvents(eventName);
259 | // Newest to oldest
260 | for (var i = listeners.length - 1; i >= 0; i--) {
261 | // Return false to stop further handling
262 | if (listeners[i].listener.apply(self, listenerArgs) === false) return false;
263 | }
264 | return true;
265 | };
266 |
267 | SQL.Collection.prototype.reactive = function() {
268 | var self = this;
269 | self.depend();
270 | return self;
271 | };
272 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/postgres/sqlserver_tests.js:
--------------------------------------------------------------------------------
1 | // Currently all the tests based on ActiveRecord are running synchronously
2 | // Making test Stub using decorator
3 | var ActiveRecordStub = function(name) {
4 | var stub = ActiveRecord();
5 | stub.table = name;
6 | stub.conString = 'postgres://postgres:1234@localhost/postgres';
7 | stub.wrapSave = Meteor.wrapAsync(stub.save.bind(stub));
8 | stub.wrapFetch = Meteor.wrapAsync(stub.fetch.bind(stub));
9 | return stub;
10 | };
11 |
12 | /**
13 | * Simple table test
14 | */
15 | var testTasksTable = {
16 | text: ['$string', '$notnull']
17 | };
18 |
19 | var testUserTable = {
20 | username: ['$string', '$notnull'],
21 | age: ['$number']
22 | };
23 |
24 | if (Meteor.isServer) {
25 | var testTasks = ActiveRecordStub('testTasks');
26 | testTasks.dropTable().wrapSave(null, null);
27 | testTasks.createTable(testTasksTable).wrapSave(null, null);
28 | testTasks.insert({ text: 'testing1' }).wrapSave(null, null);
29 | testTasks.insert({ text: 'testing2' }).wrapSave(null, null);
30 | testTasks.insert({ text: 'testing3' }).wrapSave(null, null);
31 | for ( var i = 0; i < 5; i++) {
32 | testTasks.insert({ text: 'testing1' }).wrapSave(null, null);
33 | }
34 |
35 | var testUser = ActiveRecordStub('testUser');
36 | testUser.dropTable().wrapSave(null, null);
37 | testUser.createTable(testUserTable).wrapSave(null, null);
38 | for (var i = 0; i < 3; i++) {
39 | testUser.insert({ username: 'eddie' + i, age: 2 * i }).wrapSave(null, null);
40 | testUser.insert({ username: 'paulo', age: 27}).wrapSave(null, null);
41 | }
42 |
43 | //Should test the operation defined in the ActiveRecord and return result successfully
44 | Tinytest.addAsync('activerecord - basic - success', function(test, onComplete) {
45 | var findOneResult1 = testTasks.findOne().wrapFetch(null, null);
46 | var findOneResult2 = testTasks.findOne(1).wrapFetch(null, null);
47 | test.equal(typeof findOneResult1.rows[0], 'object');
48 | test.equal(findOneResult1.rows.length, 1);
49 | test.equal(findOneResult1.rows[0].text, 'testing1');
50 | test.equal(typeof findOneResult2.rows[0], 'object');
51 | test.equal(findOneResult2.rows.length, 1);
52 | test.equal(findOneResult2.rows[0].text, 'testing1');
53 |
54 | //select
55 | var result = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null);
56 | //select + limit
57 | var result2 = testTasks.select().where('text = ?', 'testing1').limit(3).wrapFetch(null, null);
58 | //select + limit + offset
59 | var result3 = testTasks.select().where('text = ?', 'testing1').limit(3).offset(2).wrapFetch(null, null);
60 | //select + offset
61 | var result4 = testTasks.select().where('text = ?', 'testing1').offset(2).wrapFetch(null, null);
62 | var result5 = testTasks.select().where('text = ?', 'testing1').offset(6).wrapFetch(null, null);
63 | var result6 = testTasks.select().where('text = ?', 'testing1').offset(8).wrapFetch(null, null);
64 | //order default and DESC/ASC
65 | var result7 = testTasks.select().order('text').wrapFetch(null, null);
66 | var result8 = testTasks.select().order('text ASC').wrapFetch(null, null);
67 | var result9 = testTasks.select().order('text DESC').wrapFetch(null, null);
68 | //chaining order
69 | var result10 = testTasks.select().where('text = ?', 'testing1').order('id DESC').offset(2).limit(3).wrapFetch(null, null);
70 | var result11 = testTasks.select().where('text = ?', 'testing1').offset(2).order('id DESC').limit(3).wrapFetch(null, null);
71 |
72 | test.equal(typeof result.rows, 'object');
73 | test.equal(result.rows.length, 6);
74 | _.each(result.rows, function(item) {
75 | test.equal(item.text, 'testing1');
76 | });
77 | test.equal(result2.rows.length, 3);
78 | _.each(result2.rows, function(item) {
79 | test.equal(item.text, 'testing1');
80 | });
81 | test.equal(result3.rows.length, 3);
82 | _.each(result3.rows, function(item) {
83 | test.equal(item.text, 'testing1');
84 | });
85 | test.equal(result4.rows.length, 4);
86 | _.each(result4.rows, function(item) {
87 | test.equal(item.text, 'testing1');
88 | });
89 | test.equal(result5.rows.length, 0);
90 | test.equal(result6.rows.length, 0);
91 | test.equal(result7.rows, result8.rows);
92 | test.equal(result7.rows[7], result9.rows[0]);
93 | test.equal(result10.rows, result11.rows);
94 |
95 | // Non-overreiden first, last, take
96 | var result1 = testTasks.select().offset(2).where('text = ?', 'testing1').order('id DESC').limit(3).first().wrapFetch(null, null);
97 | var result2 = testTasks.select().first(2).wrapFetch(null, null);
98 | var result3 = testTasks.select().last(4).wrapFetch(null, null);
99 | var result4 = testTasks.select().offset(2).where('text = ?', 'testing1').order('id DESC').limit(3).last().wrapFetch(null, null);
100 | var result5 = testTasks.select().offset(2).order('id DESC').limit(3).take().wrapFetch(null, null);
101 | var result6 = testTasks.select().take().wrapSave(null, null);
102 | //should consider chainging order for first, last, take?
103 | test.equal(result1.rows[0], result2.rows[0]);
104 | test.equal(result3.rows[0], result4.rows[0]);
105 | test.equal(result3.rows[1].id, 7);
106 | test.equal(result5.rows, result6.rows);
107 |
108 | //update and remove
109 | // update coverage should take another args, currently just 1 arg
110 | // should better add the rule that forbid changes in id?
111 | var origin = testTasks.select().where('text = ?', 'testing1').wrapSave(null, null);
112 | testTasks.update({ text: 'testing1' }).where('text = ?', 'testing2').wrapSave(null, null);
113 | var result1 = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null);
114 | test.equal(origin.rows.length + 1, result1.rows.length);
115 | testTasks.update( {text: 'testing3'} ).wrapSave(null, null);
116 | var result2 = testTasks.select().where('text = ?', 'testing1').wrapFetch(null, null);
117 | var result3 = testTasks.select().where('text = ?', 'testing3').wrapFetch(null, null);
118 | test.equal(result2.rows.length, 0);
119 | test.equal(result3.rows.length, 8);
120 |
121 | testTasks.where('id = ?', '2').remove().wrapSave(null, null);
122 | var result1 = testTasks.select().wrapFetch(null, null);
123 | test.equal(result1.rows.length, 7);
124 | testTasks.remove().wrapSave(null, null);
125 | var result2 = testTasks.select().wrapFetch(null, null);
126 | test.equal(result2.rows.length, 0);
127 |
128 | // branch coverage TODO
129 | // select args not empty branch
130 | // not empty and no distinct
131 | // var result1 = testUser.select('testUser.username', 'testUser.age').
132 | // not empty and has distinct
133 |
134 | // update args > 1 branch
135 | testUser.update({username: 'PaulOS', age: 100}).where('username = ?', 'notexist').wrapSave(null, null);
136 | var result1 = testUser.select().where('username = ?', 'PaulOS').wrapFetch(null, null);
137 | test.equal(result1.rows.length, 0);
138 |
139 | testUser.update({username: 'PaulOS', age: 100}).where('username = ?', 'paulo').wrapSave(null, null);
140 | var result2 = testUser.select().where('username = ?', 'PaulOS').wrapFetch(null, null);
141 | test.equal(result2.rows.length, 3);
142 | _.each(result2.rows, function(item) {
143 | test.equal(item.username, 'PaulOS');
144 | test.equal(item.age, 100);
145 | });
146 |
147 | onComplete();
148 | });
149 |
150 | //Should throw error for the test failed case
151 | Tinytest.addAsync('activerecord - basic - failure', function(test, onComplete) {
152 | // create already existed throw error
153 | test.throws(function() {
154 | testTasks.createTable(testTasks).wrapSave(null, null);
155 | });
156 | // throw error is schema different
157 | test.throws(function() {
158 | testTasks.insert({ text: 'failure', username: 'eric'}).wrapSave(null, null);
159 | });
160 | //update error
161 | test.throws(function() {
162 | testTasks.update( {username: 'kate'} ).where('text = ?', 'testing3').wrapSave(null, null);
163 | });
164 |
165 | // How should update behavior for non-existed where?
166 | // test.throws(function() {
167 | // testTasks.update( {text: 'testing2'} ).where('text = ?', 'testing2').wrapSave(null, null);
168 | // });
169 | // Should not throw error if drop an unexisted table
170 |
171 | try {
172 | var expectedError;
173 | testTasks.dropTable('notExistedTable').wrapSave(null, null);
174 | } catch(error) {
175 | expectedError = error;
176 | }
177 | test.isTrue(!expectedError);
178 | //findOne can only find id
179 | test.throws(function() {
180 | testTasks.findOne('testing1').wrapFetch(null, null);
181 | });
182 |
183 | //Clear the table after use
184 | testTasks.dropTable().wrapSave(null, null);
185 | testUser.dropTable().wrapSave(null, null);
186 | onComplete();
187 | });
188 |
189 | //Complex table
190 | // Todo: createRelationShip
191 | // Join table test
192 | var testTree = ActiveRecordStub('testTree');
193 | var testLocation = ActiveRecordStub('testLocation');
194 | var testSpecies = ActiveRecordStub('testSpecies');
195 |
196 | var testTreeTable = {
197 | id: ['$number', '$notnull'],
198 | treename: ['$string', '$notnull'],
199 | locationid: ['$number', '$notnull'],
200 | speciesid: ['$number', '$notnull']
201 | };
202 |
203 | var testLocationTable = {
204 | id: ['$number', '$notnull'],
205 | longitude: ['$float', '$notnull'],
206 | latitude: ['$float', '$notnull']
207 | };
208 |
209 | var testSpeciesTable = {
210 | id: ['$number', '$notnull'],
211 | species: ['$string', '$notnull']
212 | };
213 |
214 | testTree.dropTable().wrapSave(null, null);
215 | testLocation.dropTable().wrapSave(null, null);
216 | testSpecies.dropTable().wrapSave(null, null);
217 |
218 | var testTree = ActiveRecordStub('testTree');
219 | var testLocation = ActiveRecordStub('testLocationTable');
220 | var testSpecies = ActiveRecordStub('testSpeciesTable');
221 |
222 | Tinytest.addAsync('activerecord - advanced - success', function(test, onComplete) {
223 | testTree.dropTable().wrapSave(null, null);
224 | testLocation.dropTable().wrapSave(null, null);
225 | testSpecies.dropTable().wrapSave(null, null);
226 | onComplete();
227 | });
228 | }
229 |
230 | // Connection test, should be added after the default connect string removed
231 | Meteor.isServer && Tinytest.add('activerecord - connection failure',
232 | function(test) {
233 |
234 | }
235 | );
236 |
237 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/minisql/minisql.js:
--------------------------------------------------------------------------------
1 | miniSQL = function(Collection){
2 |
3 | Collection = Collection || Object.create(miniSQL.prototype);
4 | Collection.table = Collection.tableName;
5 |
6 | // inputString used by queries, overrides other strings
7 | // includes: create table, create relationship, drop table, insert
8 | Collection.inputString = '';
9 | Collection.inputString2 = '';
10 | Collection.autoSelectData = '';
11 | Collection.autoSelectInput = '';
12 | Collection.tableElements = {};
13 |
14 | // statement starters
15 | Collection.selectString = '';
16 | Collection.updateString = '';
17 | Collection.deleteString = '';
18 |
19 | // chaining statements
20 | Collection.joinString = '';
21 | Collection.whereString = '';
22 | Collection.clientWhereString = '';
23 | Collection.serverWhereString = '';
24 |
25 | // caboose statements
26 | Collection.orderString = '';
27 | Collection.limitString = '';
28 | Collection.offsetString = '';
29 | Collection.groupString = '';
30 | Collection.havingString = '';
31 |
32 | Collection.dataArray = [];
33 | Collection.dataArray2 = [];
34 | Collection.server = null;
35 |
36 | // error logging
37 | Collection.prevFunc = '';
38 | return Collection;
39 | };
40 |
41 | miniSQL.prototype.createTable = function(tableObj) {
42 | var _DataTypes = {
43 | $number: 'integer',
44 | $string: 'varchar(255)',
45 | $json: 'json',
46 | $datetime: 'date',
47 | $float: 'decimal',
48 | $seq: 'serial',
49 | $bool: 'boolean'
50 | };
51 |
52 | var _TableConstraints = {
53 | $unique: 'unique',
54 | $check: 'check ', // value
55 | $exclude: 'exclude',
56 | $notnull: 'not null',
57 | $default: 'default ', // value
58 | $primary: 'primary key'
59 | };
60 |
61 | alasql.fn.Date = Date;
62 |
63 | var startString = 'CREATE TABLE ' + this.table + ' (';
64 | var item, subKey, valOperator, inputString = '';
65 |
66 | for (var key in tableObj) {
67 | this.tableElements[key] = key;
68 | inputString += key + ' ';
69 | inputString += _DataTypes[tableObj[key][0]];
70 | if (Array.isArray(tableObj[key]) && tableObj[key].length > 1) {
71 | for (var i = 1, count = tableObj[key].length; i < count; i++) {
72 | item = tableObj[key][i];
73 | if (typeof item === 'object') {
74 | subKey = Object.keys(item);
75 | valOperator = _TableConstraints[subKey];
76 | inputString += ' ' + valOperator + item[subKey];
77 | } else {
78 | inputString += ' ' + _TableConstraints[item];
79 | }
80 | }
81 | }
82 | inputString += ', ';
83 | }
84 | // check to see if id already provided
85 | if (inputString.indexOf('id') === -1) {
86 | startString += 'id serial primary key,';
87 | }
88 |
89 | this.inputString = startString + inputString + " createdat Date); ";
90 | this.prevFunc = 'CREATE TABLE';
91 | alasql(this.inputString);
92 | this.clearAll();
93 | return this;
94 | };
95 |
96 | miniSQL.prototype.dropTable = function() {
97 | this.inputString = 'DROP TABLE IF EXISTS ' + this.table + ' CASCADE;';
98 | this.prevFunc = 'DROP TABLE';
99 | return this;
100 | };
101 |
102 | miniSQL.prototype.insert = function(serverInserts, clientInserts) {
103 | // server
104 | if(serverInserts['id'] === undefined){
105 | serverInserts['id'] = -1;
106 | }
107 | // client
108 | this.dataArray2 = [];
109 | var insertString2 = 'INSERT INTO ' + this.table + ' (';
110 | var valueString2 = ') VALUES (';
111 | for (var key2 in clientInserts) {
112 | insertString2 += key2 + ', ';
113 | this.dataArray2.push(clientInserts[key2]);
114 | valueString2 += '?, ';
115 | }
116 | for (var key3 in serverInserts) {
117 | insertString2 += key3 + ', ';
118 | this.dataArray2.push(serverInserts[key3]);
119 | valueString2 += '?, ';
120 | }
121 | this.server = true;
122 | this.inputString2 = insertString2.substring(0, insertString2.length - 2) + valueString2.substring(0, valueString2.length - 2) + ');';
123 |
124 |
125 | this.dataArray = [];
126 | if (serverInserts['id'] === -1){
127 | delete serverInserts['id'];
128 | }
129 | var insertString = 'INSERT INTO ' + this.table + ' (';
130 | var valueString = ') VALUES (', j = 1;
131 | for (var key in serverInserts) {
132 | insertString += key + ', '; // field
133 | this.dataArray.push(serverInserts[key]); // data
134 | valueString += '$' + j++ + ', '; // $1, $2, etc
135 | }
136 |
137 | this.inputString = insertString.substring(0, insertString.length - 2) + valueString.substring(0, valueString.length - 2) + ');';
138 |
139 |
140 |
141 | this.prevFunc = 'INSERT';
142 | return this;
143 | };
144 |
145 | miniSQL.prototype.update = function(updates) {
146 | this.updateString = 'UPDATE ' + this.table + ' SET ';
147 | for (var key in updates) {
148 | if (typeof updates[key] === 'number' && !isNaN(updates[key]) || typeof(updates[key]) === "boolean"){
149 | this.updateString += key + ' = ' + updates[key] + ', ';
150 | }
151 | else {
152 | this.updateString += key + ' = "' + updates[key] + '", ';
153 | }
154 | }
155 | this.updateString = this.updateString.substring(0,this.updateString.length-2);
156 | this.prevFunc = 'UPDATE';
157 | return this;
158 | };
159 |
160 | miniSQL.prototype.remove = function() {
161 | this.deleteString = 'DELETE FROM ' + this.table;
162 | this.prevFunc = 'DELETE';
163 | return this;
164 | };
165 |
166 | miniSQL.prototype.select = function(/*arguments*/) {
167 | var args = '';
168 | if (arguments.length >= 1) {
169 | for (var i = 0; i < arguments.length; i++) {
170 | if (arguments[i] === 'distinct') {
171 | args += 'DISTINCT ';
172 | } else {
173 | args += arguments[i] + ', ';
174 | }
175 | }
176 | args = args.substring(0, args.length - 2);
177 | } else {
178 | args += '*';
179 | }
180 | this.selectString = 'SELECT ' + args + ' FROM ' + this.table + " ";
181 | this.prevFunc = 'SELECT';
182 | return this;
183 | };
184 |
185 | miniSQL.prototype.findOne = function(/*arguments*/) {
186 | if (arguments.length === 2) {
187 | this.inputString = 'SELECT * FROM ' + this.table + ' WHERE ' + this.table + '.id = ' + args + ' LIMIT 1;';
188 | } else {
189 | this.inputString = 'SELECT * FROM ' + this.table + ' LIMIT 1';
190 | }
191 | this.prevFunc = 'FIND ONE';
192 | return this;
193 | };
194 |
195 | miniSQL.prototype.join = function(joinType, fields, joinTable) {
196 | if (Array.isArray(joinType)) {
197 | for (var x = 0, count = fields.length; x < count; x++) {
198 | this.joinString = " " + joinType[x] + " " + joinTable[x][0] + " ON " + this.table + "." + fields[x] + " = " + joinTable[x][0] + "." + joinTable[x][1];
199 | }
200 | } else {
201 | this.joinString = " " + joinType + " " + joinTable + " ON " + this.table + "." + fields + " = " + joinTable + "." + joinTable;
202 | }
203 | this.prevFunc = "JOIN";
204 | return this;
205 | };
206 |
207 | miniSQL.prototype.where = function(/*Arguments*/) {
208 |
209 | this.dataArray = [];
210 | this.dataArray2 = [];
211 | var where = '', redux, substring1, substring2;
212 |
213 | where += arguments[0];
214 | // replace ? with rest of array
215 | for (var i = 1, count = arguments.length; i < count; i++) {
216 | if (Array.isArray(arguments[i])) {
217 | if (arguments[i].length === 0) {
218 | throw new Error('Invalid input: array is empty');
219 | }
220 | redux = where.indexOf('?');
221 | substring1 = where.substring(0, redux);
222 | substring2 = where.substring(redux + 1, where.length);
223 | where = substring1 + 'ANY($' + i + ')'+ substring2;
224 | this.dataArray.push(arguments[i]);
225 | } else {
226 | redux = where.indexOf('?');
227 | substring1 = where.substring(0, redux);
228 | substring2 = where.substring(redux + 1, where.length);
229 | where = substring1 + '$' + i + substring2;
230 | this.dataArray.push(arguments[i]);
231 | }
232 | }
233 | this.serverWhereString = ' WHERE ' + where;
234 |
235 | where = '';
236 | where += arguments[0];
237 | for (var i = 1, count = arguments.length; i < count; i++) {
238 | if (Array.isArray(arguments[i])) {
239 | redux = where.indexOf('?');
240 | substring1 = where.substring(0, redux);
241 | substring2 = where.substring(redux + 1, where.length);
242 | where = substring1 + 'IN (' + arguments[i].join(',') + ')' + substring2;
243 | } else {
244 | this.dataArray2.push(arguments[i]);
245 | }
246 | }
247 | this.clientWhereString = ' WHERE ' + where;
248 |
249 | return this;
250 | };
251 |
252 | miniSQL.prototype.order = function(/*arguments*/) {
253 |
254 | var args = '';
255 | if (arguments.length > 1) {
256 | for (var i = 0; i < arguments.length; i++) {
257 | args += arguments[i] + ', ';
258 | }
259 | args = args.substring(0, args.length - 2);
260 | } else {
261 | args = arguments[0];
262 | }
263 | this.orderString = ' ORDER BY ' + args;
264 | return this;
265 | };
266 |
267 | miniSQL.prototype.limit = function(limit) {
268 | this.limitString = ' LIMIT ' + limit;
269 | return this;
270 | };
271 |
272 | miniSQL.prototype.offset = function(offset) {
273 | this.offsetString = ' OFFSET ' + offset;
274 | return this;
275 | };
276 |
277 | miniSQL.prototype.group = function(group) {
278 | this.groupString = 'GROUP BY ' + group;
279 | return this;
280 | };
281 |
282 | miniSQL.prototype.first = function(limit) {
283 | limit = limit || 1;
284 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id ASC LIMIT ' + limit + ';';
285 | this.prevFunc = 'FIRST';
286 | return this;
287 | };
288 |
289 | miniSQL.prototype.last = function(limit) {
290 | limit = limit || 1;
291 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id DESC LIMIT ' + limit + ';';
292 | this.prevFunc = 'LAST';
293 | return this;
294 | };
295 |
296 | miniSQL.prototype.take = function(limit) {
297 | limit = limit || 1;
298 | this.inputString += 'SELECT * FROM ' + this.table + ' LIMIT ' + limit + ';';
299 | this.prevFunc = 'TAKE';
300 | return this;
301 | };
302 |
303 | miniSQL.prototype.clearAll = function() {
304 | this.inputString = '';
305 | this.inputString2 = '';
306 | this.autoSelectData = '';
307 | this.autoSelectInput = '';
308 |
309 | // statement starters
310 | this.selectString = '';
311 | this.updateString = '';
312 | this.deleteString = '';
313 |
314 | // chaining statements
315 | this.joinString = '';
316 | this.whereString = '';
317 | this.clientWhereString = '';
318 | this.serverWhereString = '';
319 |
320 | // caboose statements
321 | this.orderString = '';
322 | this.limitString = '';
323 | this.offsetString = '';
324 | this.groupString = '';
325 | this.havingString = '';
326 |
327 | this.dataArray = [];
328 | this.dataArray2 = [];
329 | this.server = null;
330 |
331 | // error logging
332 | this.prevFunc = '';
333 | };
334 |
335 | miniSQL.prototype.fetch = function(server) {
336 |
337 | this.reactiveData.depend();
338 |
339 | var dataArray = this.dataArray;
340 | var starter = this.updateString || this.deleteString || this.selectString;
341 |
342 | var input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.clientWhereString + this.orderString + this.limitString +
343 | this.offsetString + this.groupString + this.havingString + ';';
344 |
345 |
346 | var result = alasql(input, dataArray);
347 |
348 | var name = this.table + 'fetch';
349 | if (server === "server") {
350 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.serverWhereString + this.orderString + this.limitString +
351 | this.offsetString + this.groupString + this.havingString + ';';
352 | Meteor.call(this.fetchMethod, input, dataArray);
353 | }
354 | this.clearAll();
355 | return result;
356 | };
357 |
358 | miniSQL.prototype.save = function(client) {
359 |
360 | var dataArray = this.dataArray;
361 | var dataArray2 = this.dataArray2;
362 | var starter = this.updateString || this.deleteString || this.selectString;
363 | var input = this.inputString2.length > 0 ? this.inputString2 : starter + this.joinString + this.clientWhereString + ';';
364 |
365 | var result = alasql(input, dataArray2);
366 | // postgres
367 | var name = this.table + 'save';
368 | if (client !== "client") {
369 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.serverWhereString + ';';
370 | this.unvalidated = true;
371 | Meteor.call(this.saveMethod, input, dataArray);
372 | }
373 | this.reactiveData.changed();
374 |
375 | this.clearAll();
376 | return result;
377 | };
--------------------------------------------------------------------------------
/packages/meteor-postgres/postgres/serversql.js:
--------------------------------------------------------------------------------
1 | pg = Npm.require('pg'); // Node-Postgres
2 | var clientHolder = {};
3 |
4 | ActiveRecord = function (Collection) {
5 |
6 | Collection = Collection || Object.create(ActiveRecord.prototype);
7 | // initialize class
8 | Collection.table = Collection.tableName;
9 |
10 | // inputString used by queries, overrides other strings
11 | // includes: create table, create relationship, drop table, insert
12 | Collection.inputString = '';
13 | Collection.autoSelectData = '';
14 | Collection.autoSelectInput = '';
15 |
16 | // statement starters
17 | Collection.selectString = '';
18 | Collection.updateString = '';
19 | Collection.deleteString = '';
20 |
21 | // chaining statements
22 | Collection.joinString = '';
23 | Collection.whereString = '';
24 |
25 | // caboose statements
26 | Collection.orderString = '';
27 | Collection.limitString = '';
28 | Collection.offsetString = '';
29 | Collection.groupString = '';
30 | Collection.havingString = '';
31 |
32 | Collection.dataArray = [];
33 |
34 | // error logging
35 | Collection.prevFunc = '';
36 | return Collection;
37 | };
38 |
39 | ActiveRecord.prototype._DataTypes = {
40 | $number: 'integer',
41 | $string: 'varchar(255)',
42 | $json: 'json',
43 | $datetime: 'date',
44 | $float: 'decimal',
45 | $seq: 'serial',
46 | $bool: 'boolean'
47 | };
48 |
49 | ActiveRecord.prototype._TableConstraints = {
50 | $unique: 'unique',
51 | $check: 'check ', // value
52 | $exclude: 'exclude',
53 | $notnull: 'not null',
54 | $default: 'default ', // value
55 | $primary: 'primary key'
56 | };
57 |
58 | // Parameters: tableObj (req)
59 | // SQL: CREATE TABLE field data type constraint
60 | // Special: Function is required for all SQL collections
61 | // QUERY/INPUT STRING/MUST USE PRESCRIBED DATA TYPES & TABLE CONSTRAINTS
62 | ActiveRecord.prototype.createTable = function (tableObj) {
63 |
64 | var startString = 'CREATE TABLE ' + this.table + ' (';
65 | var item, subKey, valOperator, inputString = '';
66 |
67 | for (var key in tableObj) {
68 | inputString += key + ' ';
69 | inputString += this._DataTypes[tableObj[key][0]];
70 | if (Array.isArray(tableObj[key]) && tableObj[key].length > 1) {
71 | for (var i = 1, count = tableObj[key].length; i < count; i++) {
72 | item = tableObj[key][i];
73 | if (typeof item === 'object') {
74 | subKey = Object.keys(item);
75 | valOperator = this._TableConstraints[subKey];
76 | inputString += ' ' + valOperator + item[subKey];
77 | } else {
78 | inputString += ' ' + this._TableConstraints[item];
79 | }
80 | }
81 | }
82 | inputString += ', ';
83 | }
84 | // check to see if id already provided
85 | if (inputString.indexOf('id') === -1) {
86 | startString += 'id serial primary key,';
87 | }
88 |
89 | this.inputString = startString + inputString + " createdat TIMESTAMP default now()); " +
90 | "CREATE OR REPLACE FUNCTION notify_trigger_" + this.table + "() RETURNS trigger AS $$" +
91 | "BEGIN" +
92 | " IF (TG_OP = 'DELETE') THEN " +
93 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || OLD.id || '}, { operation: " +
94 | "\"' || TG_OP || '\"}]');" +
95 | "RETURN old;" +
96 | "ELSIF (TG_OP = 'INSERT') THEN " +
97 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || NEW.id || '}, { operation: " +
98 | "\"' || TG_OP || '\"}]');" +
99 | "RETURN new; " +
100 | "ELSIF (TG_OP = 'UPDATE') THEN " +
101 | "PERFORM pg_notify('notify_trigger_" + this.table + "', '[{' || TG_TABLE_NAME || ':' || NEW.id || '}, { operation: " +
102 | "\"' || TG_OP || '\"}]');" +
103 | "RETURN new; " +
104 | "END IF; " +
105 | "END; " +
106 | "$$ LANGUAGE plpgsql; " +
107 | "CREATE TRIGGER watched_table_trigger AFTER INSERT OR DELETE OR UPDATE ON " + this.table +
108 | " FOR EACH ROW EXECUTE PROCEDURE notify_trigger_" + this.table + "();";
109 |
110 | this.prevFunc = 'CREATE TABLE';
111 | return this;
112 | };
113 |
114 | // Parameters: none
115 | // SQL: DROP TABLE table
116 | // Special: Deletes cascade
117 | // QUERY/INPUT STRING
118 | ActiveRecord.prototype.dropTable = function () {
119 | this.inputString = 'DROP TABLE IF EXISTS ' + this.table + ' CASCADE; DROP FUNCTION IF EXISTS notify_trigger_' + this.table + '() CASCADE;';
120 | this.prevFunc = 'DROP TABLE';
121 | return this;
122 | };
123 |
124 | // Parameters: inserts object (req)
125 | // SQL: INSERT INTO table (fields) VALUES (values)
126 | // Special:
127 | // QUERY/INPUT STRING & DATA ARRAY
128 | ActiveRecord.prototype.insert = function (inserts) {
129 | var valueString = ') VALUES (', keys = Object.keys(inserts);
130 | var insertString = 'INSERT INTO ' + this.table + ' (';
131 | this.dataArray = [];
132 | // iterate through array arguments to populate input string parts
133 | for (var i = 0, count = keys.length; i < count;) {
134 | insertString += keys[i] + ', ';
135 | this.dataArray.push(inserts[keys[i]]);
136 | valueString += '$' + (++i) + ', ';
137 | }
138 | this.inputString = insertString.substring(0, insertString.length - 2) + valueString.substring(0, valueString.length - 2) + ');';
139 | this.prevFunc = 'INSERT';
140 | return this;
141 | };
142 |
143 | // Parameters: updates object (req)
144 | // SQL: UPDATE table SET (fields) = (values)
145 | // Special:
146 | // STATEMENT STARTER/UPDATE STRING
147 | ActiveRecord.prototype.update = function (updates) {
148 | var updateField = '(', updateValue = '(', keys = Object.keys(updates);
149 | if (keys.length > 1) {
150 | for (var i = 0, count = keys.length - 1; i < count; i++) {
151 | updateField += keys[i] + ', ';
152 | updateValue += "'" + updates[keys[i]] + "', ";
153 | }
154 | updateField += keys[keys.length - 1];
155 | updateValue += "'" + updates[keys[keys.length - 1]] + "'";
156 | } else {
157 | updateField += keys[0];
158 | updateValue += "'" + updates[keys[0]] + "'";
159 | }
160 | this.updateString = 'UPDATE ' + this.table + ' SET ' + updateField + ') = ' + updateValue + ')';
161 | this.prevFunc = 'UPDATE';
162 | return this;
163 | };
164 |
165 | // Parameters: none
166 | // SQL: DELETE FROM table
167 | // Special: May be chained with where, otherwise will remove all rows from table
168 | // STATEMENT STARTER/DELETE STRING
169 | ActiveRecord.prototype.remove = function () {
170 | this.deleteString = 'DELETE FROM ' + this.table;
171 | this.prevFunc = 'DELETE';
172 | return this;
173 | };
174 |
175 | // Parameters: fields (arguments, optional)
176 | // SQL: SELECT fields FROM table, SELECT * FROM table
177 | // Special: May pass table, distinct, field to obtain a single record per unique value
178 | // STATEMENT STARTER/SELECT STRING
179 | ActiveRecord.prototype.select = function (/*arguments*/) {
180 | var args = '';
181 | if (arguments.length >= 1) {
182 | for (var i = 0; i < arguments.length; i++) {
183 | if (arguments[i] === 'distinct') {
184 | args += 'DISTINCT ';
185 | } else {
186 | args += arguments[i] + ', ';
187 | }
188 | }
189 | args = args.substring(0, args.length - 2);
190 | } else {
191 | args += '*';
192 | }
193 | this.selectString = 'SELECT ' + args + ' FROM ' + this.table + " ";
194 | this.prevFunc = 'SELECT';
195 | return this;
196 | };
197 |
198 | // Parameters: id (optional)
199 | // SQL: SELECT * FROM table WHERE table.id = id LIMIT 1; SELECT * FROM table LIMIT 1;
200 | // Special: If no id is passed will return random
201 | // QUERY/INPUT STRING
202 | ActiveRecord.prototype.findOne = function (/*arguments*/) {
203 | if (arguments.length === 1) {
204 | var args = arguments[0];
205 | this.inputString = 'SELECT * FROM ' + this.table + ' WHERE ' + this.table + '.id = ' + args + ' LIMIT 1;';
206 | } else {
207 | this.inputString = 'SELECT * FROM ' + this.table + ' LIMIT 1';
208 | }
209 | this.prevFunc = 'FIND ONE';
210 | return this;
211 | };
212 |
213 | // Parameters: join type, fields, join table (all strings or all arrays)
214 | // SQL: JOIN joinTable ON field = field
215 | // Special:
216 | // STATEMENT/JOIN STRING
217 | ActiveRecord.prototype.join = function (joinType, fields, joinTable) {
218 | if (Array.isArray(joinType)) {
219 | for (var x = 0, count = fields.length; x < count; x++){
220 | this.joinString = " " + joinType[x] + " " + joinTable[x][0] + " ON " + this.table + "." + fields[x] + " = " + joinTable[x][0] + "." + joinTable[x][1];
221 | }
222 | } else {
223 | this.joinString = " " + joinType + " " + joinTable + " ON " + this.table + "." + fields + " = " + joinTable + "." + joinTable;
224 | }
225 | this.prevFunc = "JOIN";
226 | return this;
227 | };
228 |
229 | // Parameters: string with ?'s followed by an argument for each of the ?'s
230 | // SQL: WHERE field operator comparator, WHERE field1 operator1 comparator1 AND/OR field2 operator2 comparator2
231 | // Special:
232 | // db.select('students').where('age = ? and class = ? or name = ?','18','senior','kate').fetch();
233 | // STATEMENT/WHERE STRING & DATA ARRAY
234 | ActiveRecord.prototype.where = function (/*Arguments*/) {
235 | this.dataArray = [];
236 | var where = '', redux, substring1, substring2;
237 | where += arguments[0];
238 | for (var i = 1, count = arguments.length; i < count; i++) {
239 | if (Array.isArray(arguments[i])) {
240 | if (arguments[i].length === 0) {
241 | throw new Error('Invalid input: array is empty');
242 | }
243 | redux = where.indexOf('?');
244 | substring1 = where.substring(0, redux);
245 | substring2 = where.substring(redux + 1, where.length);
246 | where = substring1 + 'ANY($' + i + ')'+ substring2;
247 | this.dataArray.push(arguments[i]);
248 | } else {
249 | redux = where.indexOf('?');
250 | substring1 = where.substring(0, redux);
251 | substring2 = where.substring(redux + 1, where.length);
252 | where = substring1 + '$' + i + substring2;
253 | this.dataArray.push(arguments[i]);
254 | }
255 | }
256 | this.whereString = ' WHERE ' + where;
257 | return this;
258 | };
259 |
260 | // Parameters: order fields (req)
261 | // SQL: ORDER BY fields
262 | // Special: ASC is default
263 | // CABOOSE/ORDER STRING
264 | ActiveRecord.prototype.order = function (/*arguments*/) {
265 | var args = '';
266 | if (arguments.length > 1) {
267 | for (var i = 0; i < arguments.length; i++) {
268 | args += arguments[i] + ', ';
269 | }
270 | args = args.substring(0, args.length - 2);
271 | } else {
272 | args = arguments[0];
273 | }
274 | this.orderString = ' ORDER BY ' + args;
275 | return this;
276 | };
277 |
278 | // Parameters: limit integer
279 | // SQL: LIMIT number
280 | // CABOOSE / LIMIT STRING
281 | ActiveRecord.prototype.limit = function (limit) {
282 | this.limitString = ' LIMIT ' + limit;
283 | return this;
284 | };
285 |
286 | // Parameters: offset integer
287 | // SQL: OFFSET number
288 | // CABOOSE/OFFSET STRING
289 | ActiveRecord.prototype.offset = function (offset) {
290 | this.offsetString = ' OFFSET ' + offset;
291 | return this;
292 | };
293 |
294 | // Parameters: group field
295 | // SQL: GROUP BY field
296 | // Special:
297 | // CABOOSE/GROUP BY STRING
298 | ActiveRecord.prototype.group = function (group) {
299 | this.groupString = 'GROUP BY ' + group;
300 | return this;
301 | };
302 |
303 | // TODO: HAVING
304 |
305 | // Parameters: limit (optional, defaults to 1)
306 | // SQL: SELECT * FROM table ORDER BY table.id ASC LIMIT 1, SELECT * FROM table ORDER BY table.id ASC LIMIT limit
307 | // Special: Retrieves first item, overrides all other chainable functions
308 | // QUERY/INPUT STRING
309 | ActiveRecord.prototype.first = function (limit) {
310 | limit = limit || 1;
311 | this.clearAll();
312 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id ASC LIMIT ' + limit + ';';
313 | this.prevFunc = 'FIRST';
314 | return this;
315 | };
316 |
317 | // Parameters: limit (optional, defaults to 1)
318 | // SQL: SELECT * FROM table ORDER BY table.id DESC LIMIT 1, SELECT * FROM table ORDER BY table.id DESC LIMIT limit
319 | // Special: Retrieves first item, overrides all other chainable functions
320 | // QUERY/INPUT STRING
321 | ActiveRecord.prototype.last = function (limit) {
322 | limit = limit || 1;
323 | this.clearAll();
324 | this.inputString += 'SELECT * FROM ' + this.table + ' ORDER BY ' + this.table + '.id DESC LIMIT ' + limit + ';';
325 | this.prevFunc = 'LAST';
326 | return this;
327 | };
328 |
329 | // Parameters: limit (optional, defaults to 1)
330 | // SQL: SELECT * FROM table LIMIT 1, SELECT * FROM table LIMIT limit
331 | // Special: Retrieves a record without ordering, overrides all other chainable functions
332 | // QUERY/INPUT STRING
333 | ActiveRecord.prototype.take = function (limit) {
334 | limit = limit || 1;
335 | this.clearAll();
336 | this.inputString += 'SELECT * FROM ' + this.table + ' LIMIT ' + limit + ';';
337 | this.prevFunc = 'TAKE';
338 | return this;
339 | };
340 |
341 | // Data function that retrieves data from database
342 | ActiveRecord.prototype.fetch = function (input, data, cb) {
343 | var table = this.table;
344 | var dataArray = data || this.dataArray;
345 | var prevFunc = this.prevFunc;
346 |
347 | var starter = this.updateString || this.deleteString || this.selectString;
348 |
349 | if (!input) {
350 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + this.orderString + this.limitString +
351 | this.offsetString + this.groupString + this.havingString + ';';
352 | }
353 |
354 | //cb = cb || function(prevFunc, table, results) {return console.log("results in " + prevFunc + ' ' + table, results.rows)};
355 | // console.log('FETCH:', input, dataArray);
356 | pg.connect(process.env.POSTGRES, function (err, client, done) {
357 | if (err) {
358 | console.log(err, "in " + prevFunc + ' ' + table);
359 | }
360 | client.query(input, dataArray, function (error, results) {
361 | if (cb) { cb(error, results); }
362 | done();
363 | });
364 | });
365 | this.clearAll();
366 | };
367 |
368 | // Data function that saves information to database
369 | ActiveRecord.prototype.save = function (input, data, cb) {
370 |
371 | var table = this.table;
372 | var dataArray = data || this.dataArray;
373 | var prevFunc = this.prevFunc;
374 |
375 | var starter = this.updateString || this.deleteString || this.selectString;
376 |
377 | if (!input) {
378 | input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + ';';
379 | }
380 |
381 | // console.log('SAVE:', input, dataArray);
382 | pg.connect(process.env.POSTGRES, function (err, client, done) {
383 | if (err) {
384 | console.log(err, "in " + prevFunc + ' ' + table);
385 | }
386 | client.query(input, dataArray, function (error, results) {
387 | if (cb) { cb(error, results); }
388 | });
389 | done();
390 | });
391 | this.clearAll();
392 | };
393 |
394 | // Data function that clears all strings after a fetch or save
395 | ActiveRecord.prototype.clearAll = function() {
396 | this.inputString = '';
397 | this.autoSelectData = '';
398 | this.autoSelectInput = '';
399 |
400 | // statement starters
401 | this.selectString = '';
402 | this.updateString = '';
403 | this.deleteString = '';
404 |
405 | // chaining statements
406 | this.joinString = '';
407 | this.whereString = '';
408 |
409 | // caboose statements
410 | this.orderString = '';
411 | this.limitString = '';
412 | this.offsetString = '';
413 | this.groupString = '';
414 | this.havingString = '';
415 |
416 | this.dataArray = [];
417 |
418 | // error logging
419 | this.prevFunc = '';
420 | };
421 |
422 | // Parameters: table (req), relationship type (req)
423 | // SQL:
424 | // QUERY/INPUT STATEMENT
425 | ActiveRecord.prototype.createRelationship = function(relTable, relationship){
426 | if (relationship === "$onetomany"){
427 | this.inputString = "ALTER TABLE " + this.table + " ADD " + relTable +
428 | "id INTEGER references " + relTable + "(id) ON DELETE CASCADE;";
429 | }
430 | else {
431 | this.inputString = "CREATE TABLE IF NOT EXISTS" +
432 | this.table + relTable + " (" + this.table + "id integer references " + this.table + "(id) ON DELETE CASCADE, " +
433 | relTable + "id integer references " + relTable + "(id) ON DELETE CASCADE, " +
434 | "PRIMARY KEY(" + this.table + "id, " + relTable + "id)); ";
435 | }
436 | return this;
437 | };
438 |
439 | ActiveRecord.prototype.returnSql = function(){
440 | var table = this.table;
441 | var dataArray = this.dataArray;
442 | var prevFunc = this.prevFunc;
443 |
444 | var starter = this.updateString || this.deleteString || this.selectString;
445 |
446 | var input = this.inputString.length > 0 ? this.inputString : starter + this.joinString + this.whereString + this.orderString + this.limitString +
447 | this.offsetString + this.groupString + this.havingString + ';';
448 |
449 | return input;
450 | };
451 |
452 | ActiveRecord.prototype.autoSelect = function(sub) {
453 |
454 | // We need a dedicated client to watch for changes on each table. We store these clients in
455 | // our clientHolder and only create a new one if one does not already exist
456 | var conString = process.env.POSTGRES;
457 | var table = this.table;
458 | var prevFunc = this.prevFunc;
459 | var newWhere = this.whereString;
460 | var newSelect = newSelect || this.selectString;
461 | var newJoin = newJoin || this.joinString;
462 |
463 | this.autoSelectInput = this.autoSelectInput !== "" ? this.autoSelectInput : this.selectString + this.joinString + newWhere + this.orderString + this.limitString + ';';
464 | this.autoSelectData = this.autoSelectData !== "" ? this.autoSelectData : this.dataArray;
465 | var value = this.autoSelectInput;
466 | this.clearAll();
467 |
468 |
469 | var loadAutoSelectClient = function(name, cb){
470 | // Function to load a new client, store it, and then send it to the function to add the watcher
471 | var context = this;
472 | var client = new pg.Client(process.env.POSTGRES);
473 | client.connect();
474 | cb(client);
475 | };
476 |
477 | var autoSelectHelper = function(client1){
478 | // Selecting all from the table
479 | client1.query(value, function(error, results) {
480 | if (error) {
481 | console.log(error, "in autoSelect top")
482 | } else {
483 | sub._session.send({
484 | msg: 'added',
485 | collection: sub._name,
486 | id: sub._subscriptionId,
487 | fields: {
488 | reset: false,
489 | results: results.rows
490 | }
491 | });
492 | }
493 | });
494 | // Adding notification triggers
495 | var query = client1.query("LISTEN notify_trigger_" + table);
496 | client1.on('notification', function(msg) {
497 | var returnMsg = eval("(" + msg.payload + ")");
498 | var k = sub._name;
499 | if (returnMsg[1].operation === "DELETE") {
500 | var tableId = parseInt(returnMsg[0][k]);
501 | sub._session.send({
502 | msg: 'changed',
503 | collection: sub._name,
504 | id: sub._subscriptionId,
505 | index: tableId,
506 | fields: {
507 | removed: true,
508 | reset: false,
509 | tableId:tableId
510 | }
511 | });
512 | }
513 | else if (returnMsg[1].operation === "UPDATE") {
514 | var selectString = newSelect + newJoin + " WHERE " + table + ".id = " + returnMsg[0][table];
515 | pg.connect(process.env.POSTGRES, function (err, client, done) {
516 | if (err) {
517 | console.log(err, "in " + prevFunc + ' ' + table);
518 | }
519 | client.query(selectString, this.autoSelectData, function(error, results) {
520 | if (error) {
521 | console.log(error, "in autoSelect update");
522 | } else {
523 | done();
524 | sub._session.send({
525 | msg: 'changed',
526 | collection: sub._name,
527 | id: sub._subscriptionId,
528 | index: tableId,
529 | fields: {
530 | modified: true,
531 | removed: false,
532 | reset: false,
533 | results: results.rows[0]
534 | }
535 | });
536 | }
537 | });
538 | });
539 | }
540 | else if (returnMsg[1].operation === "INSERT") {
541 | var selectString = newSelect + newJoin + " WHERE " + table + ".id = " + returnMsg[0][table];
542 | pg.connect(process.env.POSTGRES, function (err, client, done) {
543 | if (err) {
544 | console.log(err, "in " + prevFunc + ' ' + table);
545 | }
546 | client.query(selectString, this.autoSelectData, function(error, results) {
547 | if (error) {
548 | console.log(selectString);
549 | console.log(error, "in autoSelect insert")
550 | } else {
551 | done();
552 | sub._session.send({
553 | msg: 'changed',
554 | collection: sub._name,
555 | id: sub._subscriptionId,
556 | fields: {
557 | removed: false,
558 | reset: false,
559 | results: results.rows[0]
560 | }
561 | });
562 | }
563 | });
564 | });
565 | }
566 | });
567 | };
568 |
569 | // Checking to see if this table already has a dedicated client before adding the listener
570 | if(clientHolder[table]){
571 | autoSelectHelper(clientHolder[table]);
572 | } else{
573 | loadAutoSelectClient(table, autoSelectHelper);
574 | }
575 |
576 | };
577 |
--------------------------------------------------------------------------------
/packages/meteor-postgres/minisql/alasql.js.map:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "file": "alasql.js",
4 | "sources": [
5 | "src/10start.js",
6 | "src/alasqlparser.js",
7 | "src/12pretty.js",
8 | "src/15utility.js",
9 | "src/16comments.js",
10 | "src/17alasql.js",
11 | "src/20database.js",
12 | "src/21transaction.js",
13 | "src/23table.js",
14 | "src/24view.js",
15 | "src/25queryclass.js",
16 | "src/28yy.js",
17 | "src/30statements.js",
18 | "src/38query.js",
19 | "src/39dojoin.js",
20 | "src/40select.js",
21 | "src/41exists.js",
22 | "src/420from.js",
23 | "src/421join.js",
24 | "src/422where.js",
25 | "src/423groupby.js",
26 | "src/424select.js",
27 | "src/425having.js",
28 | "src/426orderby.js",
29 | "src/43rollup.js",
30 | "src/44defcols.js",
31 | "src/45union.js",
32 | "src/46apply.js",
33 | "src/47over.js",
34 | "src/50expression.js",
35 | "src/52linq.js",
36 | "src/55functions.js",
37 | "src/56datetime.js",
38 | "src/57case.js",
39 | "src/58json.js",
40 | "src/59convert.js",
41 | "src/60createtable.js",
42 | "src/61date.js",
43 | "src/62droptable.js",
44 | "src/64altertable.js",
45 | "src/65createindex.js",
46 | "src/66dropindex.js",
47 | "src/67withselect.js",
48 | "src/68if.js",
49 | "src/69while.js",
50 | "src/70insert.js",
51 | "src/72delete.js",
52 | "src/74update.js",
53 | "src/75merge.js",
54 | "src/76usedatabase.js",
55 | "src/77declare.js",
56 | "src/78show.js",
57 | "src/79set.js",
58 | "src/80console.js",
59 | "src/81commit.js",
60 | "src/83into.js",
61 | "src/84from.js",
62 | "src/85help.js",
63 | "src/86print.js",
64 | "src/87source.js",
65 | "src/88require.js",
66 | "src/89assert.js",
67 | "src/90websql.js",
68 | "src/91indexeddb.js",
69 | "src/92localstorage.js",
70 | "src/93sqlite.js",
71 | "src/94filestorage.js",
72 | "src/97saveas.js",
73 | "src/FileSaver.js",
74 | "src/98finish.js",
75 | "src/99worker.js"
76 | ],
77 | "names": [],
78 | "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1sBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5pBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpSA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"
79 | }
--------------------------------------------------------------------------------