baqend
Version:
Baqend JavaScript SDK
380 lines • 23.8 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Entity = void 0;
var Managed_1 = require("./Managed");
var partialupdate_1 = require("../partialupdate");
var enumerable_1 = require("../util/enumerable");
var error_1 = require("../error");
var Enhancer_1 = require("./Enhancer");
var Entity = /** @class */ (function (_super) {
__extends(Entity, _super);
function Entity() {
return _super !== null && _super.apply(this, arguments) || this;
}
Object.defineProperty(Entity.prototype, "id", {
/**
* The unique id of this object
*
* Sets the unique id of this object, if the id is not formatted as an valid id,
* it will be used as the key component of the id has the same affect as setting the key
*
* @type string
*/
get: function () {
return this._metadata.id;
},
set: function (value) {
if (this._metadata.id) {
throw new Error("The id can't be set twice: ".concat(value));
}
var val = "".concat(value);
if (val.indexOf("/db/".concat(this._metadata.bucket, "/")) === 0) {
this._metadata.id = value;
}
else {
this.key = value;
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(Entity.prototype, "key", {
/**
* The unique key part of the id
* When the key of the unique id is set an error will be thrown if an id is already set.
* @type string
*/
get: function () {
return this._metadata.key;
},
set: function (value) {
this._metadata.key = value;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Entity.prototype, "version", {
/**
* The version of this object
* @type number
* @readonly
*/
get: function () {
return this._metadata.version;
},
enumerable: false,
configurable: true
});
Object.defineProperty(Entity.prototype, "acl", {
/**
* The object read/write permissions
* @type Acl
* @readonly
*/
get: function () {
this._metadata.throwUnloadedPropertyAccess('acl');
return this._metadata.acl;
},
enumerable: false,
configurable: true
});
/**
* Attach this object to the given db
* @param db The db which will be used for future crud operations
* @return
*/
Entity.prototype.attach = function (db) {
db.attach(this);
};
Entity.prototype.ready = function (doneCallback) {
var _this = this;
return this._metadata.ready().then(function () { return _this; }).then(doneCallback);
};
/**
* Saves the object. Inserts the object if it doesn't exists and updates the object if the object exist.
* @param [options] The save options
* @param [options.force=false] Force the save operation, the version will not be validated.
* @param [options.depth=0] The object depth which will be saved. Depth 0 save this object only,
* <code>true</code> saves the objects by reachability.
* @param [options.refresh=false] Refresh the local object state from remote.
* @param doneCallback Called when the operation succeed.
* @param failCallback Called when the operation failed.
* @return A Promise that will be fulfilled when the asynchronous operation completes.
*/
Entity.prototype.save = function (options, doneCallback, failCallback) {
if (typeof options === 'function') {
return this.save({}, options, doneCallback);
}
return this._metadata.db.save(this, options).then(doneCallback, failCallback);
};
/**
* Inserts a new object. Inserts the object if it doesn't exists and raise an error if the object already exist.
* @param [options] The insertion options
* @param [options.depth=0] The object depth which will be inserted. Depth 0 insert this object only,
* <code>true</code> inserts objects by reachability.
* @param [options.refresh=false] Refresh the local object state from remote.
* @param doneCallback Called when the operation succeed.
* @param failCallback Called when the operation failed.
* @return A Promise that will be fulfilled when the asynchronous operation completes.
* @method
*/
Entity.prototype.insert = function (options, doneCallback, failCallback) {
if (typeof options === 'function') {
return this.insert({}, options, doneCallback);
}
return this._metadata.db.insert(this, options).then(doneCallback, failCallback);
};
/**
* Updates an existing object
*
* Updates the object if it exists and raise an error if the object doesn't exist.
*
* @param [options] The update options
* @param [options.force=false] Force the update operation,
* the version will not be validated, only existence will be checked.
* @param [options.depth=0] The object depth which will be updated. Depth 0 updates this object only,
* <code>true</code> updates objects by reachability.
* @param [options.refresh=false] Refresh the local object state from remote.
* @param doneCallback Called when the operation succeed.
* @param failCallback Called when the operation failed.
* @return A Promise that will be fulfilled when the asynchronous operation completes.
* @method
*/
Entity.prototype.update = function (options, doneCallback, failCallback) {
if (typeof options === 'function') {
return this.update({}, options, doneCallback);
}
return this._metadata.db.update(this, options).then(doneCallback, failCallback);
};
/**
* Resolves the referenced object in the specified depth
*
* Only unresolved objects will be loaded unless the refresh option is specified.
*
* Removed objects will be marked as removed.
* @param [options] The load options
* @param [options.depth=0] The object depth which will be loaded. Depth set to <code>true</code>
* loads objects by reachability.
* @param [options.refresh=false] Refresh the local object state from remote.
* @param doneCallback Called when the operation succeed.
* @param failCallback Called when the operation failed.
* @return A Promise that will be fulfilled when the asynchronous operation completes.
* @method
*/
Entity.prototype.load = function (options, doneCallback, failCallback) {
if (typeof options === 'function') {
return this.load({}, options, doneCallback);
}
var opt = __assign({ local: true }, options);
if (this.id === null) {
throw new error_1.PersistentError("This object can't be loaded, it does have an id.");
}
return this._metadata.db.load(this.id, undefined, opt).then(doneCallback, failCallback);
};
/**
* Deletes an existing object
*
* @param [options] The remove options
* @param [options.force=false] Force the remove operation, the version will not be validated.
* @param [options.depth=0] The object depth which will be removed. Depth 0 removes this object only,
* <code>true</code> removes objects by reachability.
* @param doneCallback Called when the operation succeed.
* @param failCallback Called when the operation failed.
* @return A Promise that will be fulfilled when the asynchronous operation completes.
* @method
*/
Entity.prototype.delete = function (options, doneCallback, failCallback) {
if (typeof options === 'function') {
return this.delete({}, options, doneCallback);
}
return this._metadata.db.delete(this, options).then(doneCallback, failCallback);
};
/**
* Saves the object and repeats the operation if the object is out of date
*
* In each pass the callback will be called. Ths first parameter of the callback is the entity and the second one
* is a function to abort the process.
*
* @param cb Will be called in each pass
* @param doneCallback Called when the operation succeed.
* @param failCallback Called when the operation failed.
* @return A Promise that will be fulfilled when the asynchronous operation completes.
* @method
*/
Entity.prototype.optimisticSave = function (cb, doneCallback, failCallback) {
return this._metadata.db.optimisticSave(this, cb).then(doneCallback, failCallback);
};
Entity.prototype.attr = function () {
throw new Error('Attr is not yet implemented.');
};
/**
* Validates the entity by using the validation code of the entity type
*
* @return Contains the result of the Validation
* @method
*/
Entity.prototype.validate = function () {
return this._metadata.db.validate(this);
};
/**
* Starts a partial update on this entity
*
* @param operations initial operations which should be executed
* @return
*/
Entity.prototype.partialUpdate = function (operations) {
return new partialupdate_1.EntityPartialUpdateBuilder(this, operations);
};
/**
* Get all objects which refer to this object
*
* @param [options] Some options to pass
* @param [options.classes] An array of class names to filter for, null for no filter
* @return A promise resolving with an array of all referencing objects
* @method
*/
Entity.prototype.getReferencing = function (options) {
var _this = this;
var db = this._metadata.db;
var references = this._metadata.type.getReferencing(db, options);
// Query all possibly referencing objects
var allResults = Array.from(references).map(function (_a) {
var ref = _a[0], attrs = _a[1];
// Create query for given entity
var qb = db.createQueryBuilder(ref.typeConstructor);
// Add term for each attribute
var terms = [];
attrs.forEach(function (attr) {
terms.push(qb.equal(attr, _this));
});
// If more than one term, put everything in a disjunction
var query = terms.length === 1 ? terms[0] : qb.or(terms);
return query.resultList();
});
return Promise.all(allResults).then(function (results) { return (
// Filter out all objects which did not match
results.filter(function (result) { return !!result.length; })); }).then(function (results) { return (
// Flat the array of results
Array.prototype.concat.apply([], results)); });
};
/**
* Returns this object identifier or the baqend type of this object
* @return the object id or type whatever is available
*/
Entity.prototype.toString = function () {
var type = Enhancer_1.Enhancer.getBaqendType(this.constructor);
return this.id || type.ref;
};
/**
* Converts the object to an JSON-Object
* @param [options=false] to json options by default excludes the metadata
* @param [options.excludeMetadata=false] Excludes the metadata form the serialized json
* @param [options.depth=0] Includes up to depth referenced objects into the serialized json
* @return JSON-Object
* @method
*/
Entity.prototype.toJSON = function (options) {
// JSON.stringify calls toJSON with the parent key as the first argument.
// Therefore ignore all unknown option types.
var opt = options;
if (typeof opt === 'boolean') {
opt = {
excludeMetadata: opt,
};
}
if (typeof opt !== 'object') {
opt = {};
}
var state = this._metadata;
return state.type.toJsonValue(state, this, opt);
};
__decorate([
(0, enumerable_1.enumerable)(true)
], Entity.prototype, "id", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "key", null);
__decorate([
(0, enumerable_1.enumerable)(true)
], Entity.prototype, "version", null);
__decorate([
(0, enumerable_1.enumerable)(true)
], Entity.prototype, "acl", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "attach", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "ready", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "save", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "insert", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "update", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "load", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "delete", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "optimisticSave", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "attr", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "validate", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "partialUpdate", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "getReferencing", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "toString", null);
__decorate([
(0, enumerable_1.enumerable)(false)
], Entity.prototype, "toJSON", null);
return Entity;
}(Managed_1.Managed));
exports.Entity = Entity;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2JpbmRpbmcvRW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscUNBQW9DO0FBQ3BDLGtEQUE4RDtBQUM5RCxpREFBZ0Q7QUFDaEQsa0NBQTJDO0FBSzNDLHVDQUFzQztBQVF0QztJQUE0QiwwQkFBTztJQUFuQzs7SUFnV0EsQ0FBQztJQXBVQyxzQkFBSSxzQkFBRTtRQVROOzs7Ozs7O1dBT0c7YUFFSDtZQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUVELFVBQU8sS0FBb0I7WUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRTtnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBOEIsS0FBSyxDQUFFLENBQUMsQ0FBQzthQUN4RDtZQUVELElBQU0sR0FBRyxHQUFHLFVBQUcsS0FBSyxDQUFFLENBQUM7WUFDdkIsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLE1BQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO2FBQzNCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO2FBQ2xCO1FBQ0gsQ0FBQzs7O09BYkE7SUFxQkQsc0JBQUksdUJBQUc7UUFOUDs7OztXQUlHO2FBRUg7WUFDRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQzVCLENBQUM7YUFFRCxVQUFRLEtBQUs7WUFDWCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDN0IsQ0FBQzs7O09BSkE7SUFZRCxzQkFBSSwyQkFBTztRQU5YOzs7O1dBSUc7YUFFSDtZQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDaEMsQ0FBQzs7O09BQUE7SUFRRCxzQkFBSSx1QkFBRztRQU5QOzs7O1dBSUc7YUFFSDtZQUNFLElBQUksQ0FBQyxTQUFTLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUM1QixDQUFDOzs7T0FBQTtJQUVEOzs7O09BSUc7SUFFSCx1QkFBTSxHQUFOLFVBQU8sRUFBaUI7UUFDdEIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBb0JELHNCQUFLLEdBQUwsVUFBUyxZQUFrQztRQUQzQyxpQkFHQztRQURDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBTSxPQUFBLEtBQUksRUFBSixDQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFFSCxxQkFBSSxHQUFKLFVBQUssT0FBMEUsRUFBRSxZQUFrQixFQUNqRyxZQUFrQjtRQUNsQixJQUFJLE9BQU8sT0FBTyxLQUFLLFVBQVUsRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztTQUM3QztRQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBRUgsdUJBQU0sR0FBTixVQUFPLE9BQXlELEVBQUUsWUFBa0IsRUFDbEYsWUFBa0I7UUFDbEIsSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDL0M7UUFFRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBRUgsdUJBQU0sR0FBTixVQUFPLE9BQTBFLEVBQUUsWUFBa0IsRUFDbkcsWUFBa0I7UUFDbEIsSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDL0M7UUFFRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFFSCxxQkFBSSxHQUFKLFVBQUssT0FBeUQsRUFBRSxZQUFrQixFQUNoRixZQUFrQjtRQUNsQixJQUFJLE9BQU8sT0FBTyxLQUFLLFVBQVUsRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztTQUM3QztRQUVELElBQU0sR0FBRyxjQUFLLEtBQUssRUFBRSxJQUFJLElBQUssT0FBTyxDQUFFLENBQUM7UUFFeEMsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNwQixNQUFNLElBQUksdUJBQWUsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1NBQy9FO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFFSCx1QkFBTSxHQUFOLFVBQU8sT0FBdUQsRUFBRSxZQUFrQixFQUNoRixZQUFrQjtRQUNsQixJQUFJLE9BQU8sT0FBTyxLQUFLLFVBQVUsRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztTQUMvQztRQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUVILCtCQUFjLEdBQWQsVUFBZSxFQUE0QyxFQUFFLFlBQWtCLEVBQUUsWUFBa0I7UUFDakcsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUdELHFCQUFJLEdBQUo7UUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBRUgseUJBQVEsR0FBUjtRQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUVILDhCQUFhLEdBQWIsVUFBYyxVQUFpQjtRQUM3QixPQUFPLElBQUksMENBQTBCLENBQUMsSUFBSSxFQUFFLFVBQXFCLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUVILCtCQUFjLEdBQWQsVUFBZSxPQUErQjtRQUQ5QyxpQkE2QkM7UUEzQlMsSUFBQSxFQUFFLEdBQUssSUFBSSxDQUFDLFNBQVMsR0FBbkIsQ0FBb0I7UUFDOUIsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVuRSx5Q0FBeUM7UUFDekMsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxFQUFZO2dCQUFYLEdBQUcsUUFBQSxFQUFFLEtBQUssUUFBQTtZQUN4RCxnQ0FBZ0M7WUFDaEMsSUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFTLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUU5RCw4QkFBOEI7WUFDOUIsSUFBTSxLQUFLLEdBQXFCLEVBQUUsQ0FBQztZQUNuQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUMsSUFBSTtnQkFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1lBRUgseURBQXlEO1lBQ3pELElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFM0QsT0FBTyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsT0FBTyxJQUFLLE9BQUE7UUFDL0MsNkNBQTZDO1FBQzdDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQyxNQUFNLElBQUssT0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBZixDQUFlLENBQUMsQ0FDNUMsRUFIZ0QsQ0FHaEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLE9BQU8sSUFBSyxPQUFBO1FBQ25CLDRCQUE0QjtRQUM1QixLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBYyxFQUFFLE9BQU8sQ0FBQyxDQUN0RCxFQUhvQixDQUdwQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBRUgseUJBQVEsR0FBUjtRQUNFLElBQU0sSUFBSSxHQUFHLG1CQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSyxDQUFDLEdBQUcsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUVILHVCQUFNLEdBQU4sVUFBTyxPQUEyRTtRQUNoRix5RUFBeUU7UUFDekUsNkNBQTZDO1FBQzdDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNsQixJQUFJLE9BQU8sR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUM1QixHQUFHLEdBQUc7Z0JBQ0osZUFBZSxFQUFFLEdBQUc7YUFDckIsQ0FBQztTQUNIO1FBRUQsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsR0FBRyxHQUFHLEVBQUUsQ0FBQztTQUNWO1FBRUQsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM3QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQW5VRDtRQURDLElBQUEsdUJBQVUsRUFBQyxJQUFJLENBQUM7b0NBR2hCO0lBcUJEO1FBREMsSUFBQSx1QkFBVSxFQUFDLEtBQUssQ0FBQztxQ0FHakI7SUFZRDtRQURDLElBQUEsdUJBQVUsRUFBQyxJQUFJLENBQUM7eUNBR2hCO0lBUUQ7UUFEQyxJQUFBLHVCQUFVLEVBQUMsSUFBSSxDQUFDO3FDQUloQjtJQVFEO1FBREMsSUFBQSx1QkFBVSxFQUFDLEtBQUssQ0FBQzt3Q0FHakI7SUFvQkQ7UUFEQyxJQUFBLHVCQUFVLEVBQUMsS0FBSyxDQUFDO3VDQUdqQjtJQWNEO1FBREMsSUFBQSx1QkFBVSxFQUFDLEtBQUssQ0FBQztzQ0FRakI7SUFjRDtRQURDLElBQUEsdUJBQVUsRUFBQyxLQUFLLENBQUM7d0NBUWpCO0lBbUJEO1FBREMsSUFBQSx1QkFBVSxFQUFDLEtBQUssQ0FBQzt3Q0FRakI7SUFrQkQ7UUFEQyxJQUFBLHVCQUFVLEVBQUMsS0FBSyxDQUFDO3NDQWNqQjtJQWVEO1FBREMsSUFBQSx1QkFBVSxFQUFDLEtBQUssQ0FBQzt3Q0FRakI7SUFlRDtRQURDLElBQUEsdUJBQVUsRUFBQyxLQUFLLENBQUM7Z0RBR2pCO0lBR0Q7UUFEQyxJQUFBLHVCQUFVLEVBQUMsS0FBSyxDQUFDO3NDQUdqQjtJQVNEO1FBREMsSUFBQSx1QkFBVSxFQUFDLEtBQUssQ0FBQzswQ0FHakI7SUFTRDtRQURDLElBQUEsdUJBQVUsRUFBQyxLQUFLLENBQUM7K0NBR2pCO0lBV0Q7UUFEQyxJQUFBLHVCQUFVLEVBQUMsS0FBSyxDQUFDO2dEQTZCakI7SUFPRDtRQURDLElBQUEsdUJBQVUsRUFBQyxLQUFLLENBQUM7MENBSWpCO0lBV0Q7UUFEQyxJQUFBLHVCQUFVLEVBQUMsS0FBSyxDQUFDO3dDQWlCakI7SUFDSCxhQUFDO0NBQUEsQUFoV0QsQ0FBNEIsaUJBQU8sR0FnV2xDO0FBaFdZLHdCQUFNIn0=