relution-sdk
Version:
Relution Software Development Kit for TypeScript and JavaScript
279 lines • 32.5 kB
JavaScript
/*
* @file model/ModelContainer.ts
* Relution SDK
*
* Created by Thomas Beckmann on 25.01.2016
* Copyright 2016 M-Way Solutions GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @module model
*/
/** */
"use strict";
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var _ = require('lodash');
var diag_1 = require('../core/diag');
/**
* implementation details of ArrayLookup.
*/
var ArrayLookupImpl = (function (_super) {
__extends(ArrayLookupImpl, _super);
function ArrayLookupImpl() {
_super.apply(this, arguments);
}
/**
* turns a given array into an ArrayLookup and indexes it by lookup property.
*
* <p>
* This must be used instead of the new operator.
* </p>
*
* @param array data.
* @param lookup property.
*/
ArrayLookupImpl.create = function (array, lookup) {
var self = array;
Object.defineProperty(array, 'index', {
value: _.keyBy(array, lookup),
enumerable: false
});
self.has = ArrayLookupImpl.prototype.has;
self.get = ArrayLookupImpl.prototype.get;
return self;
};
ArrayLookupImpl.prototype.has = function (key) {
return key in this.index;
};
ArrayLookupImpl.prototype.get = function (key) {
var _this = this;
diag_1.debug.assert(function () { return _this.has(key); }, key);
return this.index[key];
};
return ArrayLookupImpl;
}(Array));
/**
* mirrors ModelContainer of Relution server.
*/
var ModelContainer = (function () {
function ModelContainer(other) {
if (other) {
this.fromJSON(other);
}
}
Object.defineProperty(ModelContainer.prototype, "factory", {
get: function () {
return ModelFactory.factoryOf(this);
},
enumerable: true,
configurable: true
});
ModelContainer.prototype.fromJSON = function (json) {
var _this = this;
this.uuid = json.uuid;
this.version = json.version;
this.bundle = json.bundle;
this.application = json.application;
this.aclEntries = json.aclEntries || [];
this.effectivePermissions = json.effectivePermissions;
this.createdUser = json.createdUser;
this.createdDate = json.createdDate && new Date((json.createdDate));
this.modifiedUser = json.modifiedUser;
this.modifiedDate = json.modifiedDate && new Date((json.modifiedDate));
this.name = json.name;
this.description = json.description || this.name;
var array = (_.values(json.models) || []);
array = array.map(function (jsonModel) {
var model = new _this.factory.MetaModel(jsonModel);
model.containerUuid = _this.uuid;
return model;
});
this.models = ArrayLookupImpl.create(array, 'name');
return this;
};
return ModelContainer;
}());
exports.ModelContainer = ModelContainer;
/**
* mirrors MetaModel of Relution server.
*/
var MetaModel = (function () {
function MetaModel(other) {
if (other) {
this.fromJSON(other);
}
}
Object.defineProperty(MetaModel.prototype, "factory", {
get: function () {
return ModelFactory.factoryOf(this);
},
enumerable: true,
configurable: true
});
MetaModel.prototype.fromJSON = function (json) {
var _this = this;
this.uuid = json.uuid;
this.version = json.version;
this.bundle = json.bundle;
this.aclEntries = json.aclEntries || [];
this.effectivePermissions = json.effectivePermissions;
this.containerUuid = json.containerUuid;
this.name = json.name;
this.label = json.label || this.name;
this.description = json.description || this.label;
this.parents = json.parents || [];
this.abstrakt = json.abstrakt || false;
this.icon = json.icon;
var array = (json.fieldDefinitions || []);
array = array.map(function (jsonField) { return new _this.factory.FieldDefinition(jsonField); });
this.fieldDefinitions = ArrayLookupImpl.create(array, 'name');
this.propertyMap = json.propertyMap || {};
return this;
};
return MetaModel;
}());
exports.MetaModel = MetaModel;
/**
* mirrors FieldDefinition of Relution server.
*/
var FieldDefinition = (function () {
function FieldDefinition(other) {
if (other) {
this.fromJSON(other);
}
}
Object.defineProperty(FieldDefinition.prototype, "factory", {
get: function () {
return ModelFactory.factoryOf(this);
},
enumerable: true,
configurable: true
});
Object.defineProperty(FieldDefinition.prototype, "dataTypeNormalized", {
get: function () {
var dataType = this.dataType;
if (dataType) {
// normalizes raw java types
dataType = dataType.replace(/^\[L(.+);$/, '$1[]');
}
else if (this.propertyMap) {
// normalizes nested models
dataType = this.propertyMap['arrayOfComplexType'];
if (dataType) {
dataType = dataType + '[]';
}
else {
dataType = this.propertyMap['complexType'];
}
}
return dataType;
},
enumerable: true,
configurable: true
});
FieldDefinition.prototype.fromJSON = function (json) {
this.name = json.name || '';
this.label = json.label || this.name;
this.description = json.description || this.label;
this.group = json.group || null;
this.tooltip = json.tooltip || this.description;
this.dataType = json.dataType;
this.defaultValue = json.defaultValue;
this.enumDefinition = json.enumDefinition &&
new this.factory.EnumDefinition(json.enumDefinition);
this.keyField = json.keyField || false;
this.index = json.index || false;
this.mandatory = json.mandatory || false;
this.minSize = json.minSize;
this.maxSize = json.maxSize;
this.regexp = json.regexp;
this.propertyMap = json.propertyMap || {};
return this;
};
return FieldDefinition;
}());
exports.FieldDefinition = FieldDefinition;
/**
* mirrors EnumDefinition of Relution server.
*/
var EnumDefinition = (function () {
function EnumDefinition(other) {
if (other) {
this.fromJSON(other);
}
}
Object.defineProperty(EnumDefinition.prototype, "factory", {
get: function () {
return ModelFactory.factoryOf(this);
},
enumerable: true,
configurable: true
});
EnumDefinition.prototype.fromJSON = function (json) {
var array = json.items || [];
this.items = ArrayLookupImpl.create(array, 'value');
this.enumerable = json.enumerable;
this.strict = json.strict || false;
return this;
};
return EnumDefinition;
}());
exports.EnumDefinition = EnumDefinition;
/**
* construction from JSON literal data.
*
* @example Use the following for creation of a subclasses hierarchy:
* export class SomeModelContainer extends ModelContainer {
* public static factory: SomeModelFactory;
* }
* export class SomeMetaModel extends MetaModel {
* public static factory: SomeModelFactory;
* }
* export class SomeFieldDefinition extends FieldDefinition {
* public static factory: SomeModelFactory;
* }
* export class SomeEnumDefinition extends EnumDefinition {
* public static factory: SomeModelFactory;
* }
* export class SomeModelFactory extends ModelFactory {
* public static instance = new SomeModelFactory(SomeModelContainer, SomeMetaModel,
* SomeFieldDefinition, SomeEnumDefinition);
* }
*/
var ModelFactory = (function () {
function ModelFactory(ModelContainer, MetaModel, FieldDefinition, EnumDefinition) {
this.ModelContainer = ModelContainer;
this.MetaModel = MetaModel;
this.FieldDefinition = FieldDefinition;
this.EnumDefinition = EnumDefinition;
this.ModelContainer.factory = this;
this.MetaModel.factory = this;
this.FieldDefinition.factory = this;
this.EnumDefinition.factory = this;
}
ModelFactory.factoryOf = function (obj) {
return (obj.constructor).factory;
};
ModelFactory.prototype.fromJSON = function (json) {
return new this.ModelContainer().fromJSON(typeof json === 'string' ? JSON.parse(json) : json);
};
ModelFactory.instance = new ModelFactory(ModelContainer, MetaModel, FieldDefinition, EnumDefinition);
return ModelFactory;
}());
exports.ModelFactory = ModelFactory;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWxDb250YWluZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwvTW9kZWxDb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNIOztHQUVHO0FBQ0gsTUFBTTs7Ozs7OztBQUVOLElBQVksQ0FBQyxXQUFNLFFBQVEsQ0FBQyxDQUFBO0FBRTVCLHFCQUFvQixjQUFjLENBQUMsQ0FBQTtBQXFDbkM7O0dBRUc7QUFDSDtJQUFpQyxtQ0FBUTtJQUF6QztRQUFpQyw4QkFBUTtJQWdDekMsQ0FBQztJQTdCQzs7Ozs7Ozs7O1NBU0s7SUFDRSxzQkFBTSxHQUFiLFVBQWlCLEtBQVUsRUFBRSxNQUFjO1FBQ3pDLElBQU0sSUFBSSxHQUFRLEtBQUssQ0FBQztRQUN4QixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDcEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztZQUM3QixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsR0FBRyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxHQUFHLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSw2QkFBRyxHQUFWLFVBQVcsR0FBVztRQUNwQixNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVNLDZCQUFHLEdBQVYsVUFBVyxHQUFXO1FBQXRCLGlCQUdDO1FBRkMsWUFBSyxDQUFDLE1BQU0sQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBYixDQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkMs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SSxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFFYSxzQkFBUyxHQUF2QixVQUEyQixHQUFNO1FBQy9CLE1BQU0sQ0FBdUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFFLENBQUMsT0FBTyxDQUFDO0lBQzFELENBQUM7SUFJTSwrQkFBUSxHQUFmLFVBQWdCLElBQVM7UUFDdkIsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBdkJhLHFCQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFDakUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBdUJyQyxtQkFBQztBQUFELENBQUMsQUF6QkQsSUF5QkM7QUF6Qlksb0JBQVksZUF5QnhCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQGZpbGUgbW9kZWwvTW9kZWxDb250YWluZXIudHNcbiAqIFJlbHV0aW9uIFNES1xuICpcbiAqIENyZWF0ZWQgYnkgVGhvbWFzIEJlY2ttYW5uIG9uIDI1LjAxLjIwMTZcbiAqIENvcHlyaWdodCAyMDE2IE0tV2F5IFNvbHV0aW9ucyBHbWJIXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQG1vZHVsZSBtb2RlbFxuICovXG4vKiogKi9cblxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQge2RlYnVnfSBmcm9tICcuLi9jb3JlL2RpYWcnO1xuXG4vKipcbiAqIGN1c3RvbSBBcnJheSB0eXBlIHN1cHBvcnRpbmcgYW4gaW5kZXggbG9va3VwLlxuICpcbiAqIEJld2FyZSwgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGF0YSBjb250YWluZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJyYXlMb29rdXA8VD4gZXh0ZW5kcyBBcnJheTxUPiB7XG4gIC8qKlxuICAgKiBlbGVtZW50cyBrZXllZCBieSBsb29rdXAgcHJvcGVydHkuXG4gICAqL1xuICBpbmRleDogXy5EaWN0aW9uYXJ5PFQ+O1xuXG4gIC8qKlxuICAgKiB3aGV0aGVyIGFuIGVsZW1lbnQgb2Yga2V5IGV4aXN0cy5cbiAgICpcbiAgICogQHBhcmFtIGtleSB0byBjaGVjay5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gZXhpc3RhbmNlIGluZGljYXRpb24uXG4gICAqXG4gICAqIEBzZWUgZ2V0XG4gICAqL1xuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBhY2Nlc3NlcyBhbiBlbGVtZW50IGJ5IGtleS5cbiAgICpcbiAgICogVXNlIHRoaXMgbWV0aG9kIGluIGNhc2UgaXQgaXMga25vd24gdGhhdCB0aGUga2V5IGlzIHZhbGlkLlxuICAgKiBBbiBhc3NlcnRpb24gd2lsbCBmaXJlIGlmIGl0IGlzIG5vdC5cbiAgICpcbiAgICogQHBhcmFtIGtleSBsb29rdXAgcHJvcGVydHkgdmFsdWUuXG4gICAqIEByZXR1cm4ge1R9IGVsZW1lbnQgb2Yga2V5LlxuICAgKlxuICAgKiBAc2VlIGhhc1xuICAgKi9cbiAgZ2V0KGtleTogc3RyaW5nKTogVDtcbn1cblxuLyoqXG4gKiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIEFycmF5TG9va3VwLlxuICovXG5jbGFzcyBBcnJheUxvb2t1cEltcGw8VD4gZXh0ZW5kcyBBcnJheTxUPiBpbXBsZW1lbnRzIEFycmF5TG9va3VwPFQ+IHtcbiAgcHVibGljIGluZGV4OiBfLkRpY3Rpb25hcnk8VD47XG5cbiAgLyoqXG4gICAqIHR1cm5zIGEgZ2l2ZW4gYXJyYXkgaW50byBhbiBBcnJheUxvb2t1cCBhbmQgaW5kZXhlcyBpdCBieSBsb29rdXAgcHJvcGVydHkuXG4gICAqXG4gICAqIDxwPlxuICAgKiBUaGlzIG11c3QgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBuZXcgb3BlcmF0b3IuXG4gICAqIDwvcD5cbiAgICpcbiAgICogQHBhcmFtIGFycmF5IGRhdGEuXG4gICAqIEBwYXJhbSBsb29rdXAgcHJvcGVydHkuXG4gICAgICovXG4gIHN0YXRpYyBjcmVhdGU8VD4oYXJyYXk6IFRbXSwgbG9va3VwOiBzdHJpbmcpOiBBcnJheUxvb2t1cDxUPiB7XG4gICAgY29uc3Qgc2VsZjogYW55ID0gYXJyYXk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFycmF5LCAnaW5kZXgnLCB7XG4gICAgICB2YWx1ZTogXy5rZXlCeShhcnJheSwgbG9va3VwKSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgc2VsZi5oYXMgPSBBcnJheUxvb2t1cEltcGwucHJvdG90eXBlLmhhcztcbiAgICBzZWxmLmdldCA9IEFycmF5TG9va3VwSW1wbC5wcm90b3R5cGUuZ2V0O1xuICAgIHJldHVybiBzZWxmO1xuICB9XG5cbiAgcHVibGljIGhhcyhrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBrZXkgaW4gdGhpcy5pbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpIHtcbiAgICBkZWJ1Zy5hc3NlcnQoKCkgPT4gdGhpcy5oYXMoa2V5KSwga2V5KTtcbiAgICByZXR1cm4gdGhpcy5pbmRleFtrZXldO1xuICB9XG59XG5cbi8qKlxuICogbWlycm9ycyBNb2RlbENvbnRhaW5lciBvZiBSZWx1dGlvbiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbENvbnRhaW5lciB7XG4gIHB1YmxpYyBzdGF0aWMgZmFjdG9yeTogTW9kZWxGYWN0b3J5O1xuICBwdWJsaWMgZ2V0IGZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIE1vZGVsRmFjdG9yeS5mYWN0b3J5T2YodGhpcyk7XG4gIH1cblxuICB1dWlkOiBzdHJpbmc7XG5cbiAgdmVyc2lvbjogbnVtYmVyO1xuICBidW5kbGU6IHN0cmluZztcbiAgYXBwbGljYXRpb246IHN0cmluZztcbiAgYWNsRW50cmllczogc3RyaW5nW107XG4gIGVmZmVjdGl2ZVBlcm1pc3Npb25zOiBzdHJpbmc7XG5cbiAgY3JlYXRlZFVzZXI6IHN0cmluZztcbiAgY3JlYXRlZERhdGU6IERhdGU7XG4gIG1vZGlmaWVkVXNlcjogc3RyaW5nO1xuICBtb2RpZmllZERhdGU6IERhdGU7XG5cbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIG1vZGVsczogQXJyYXlMb29rdXA8TWV0YU1vZGVsPjtcblxuICBjb25zdHJ1Y3RvcihvdGhlcj86IE1vZGVsQ29udGFpbmVyKSB7XG4gICAgaWYgKG90aGVyKSB7XG4gICAgICB0aGlzLmZyb21KU09OKG90aGVyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZnJvbUpTT04oanNvbjogTW9kZWxDb250YWluZXIpIHtcbiAgICB0aGlzLnV1aWQgPSBqc29uLnV1aWQ7XG5cbiAgICB0aGlzLnZlcnNpb24gPSBqc29uLnZlcnNpb247XG4gICAgdGhpcy5idW5kbGUgPSBqc29uLmJ1bmRsZTtcbiAgICB0aGlzLmFwcGxpY2F0aW9uID0ganNvbi5hcHBsaWNhdGlvbjtcbiAgICB0aGlzLmFjbEVudHJpZXMgPSBqc29uLmFjbEVudHJpZXMgfHwgW107XG4gICAgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9ucyA9IGpzb24uZWZmZWN0aXZlUGVybWlzc2lvbnM7XG5cbiAgICB0aGlzLmNyZWF0ZWRVc2VyID0ganNvbi5jcmVhdGVkVXNlcjtcbiAgICB0aGlzLmNyZWF0ZWREYXRlID0ganNvbi5jcmVhdGVkRGF0ZSAmJiBuZXcgRGF0ZSg8YW55Pihqc29uLmNyZWF0ZWREYXRlKSk7XG4gICAgdGhpcy5tb2RpZmllZFVzZXIgPSBqc29uLm1vZGlmaWVkVXNlcjtcbiAgICB0aGlzLm1vZGlmaWVkRGF0ZSA9IGpzb24ubW9kaWZpZWREYXRlICYmIG5ldyBEYXRlKDxhbnk+KGpzb24ubW9kaWZpZWREYXRlKSk7XG5cbiAgICB0aGlzLm5hbWUgPSBqc29uLm5hbWU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGpzb24uZGVzY3JpcHRpb24gfHwgdGhpcy5uYW1lO1xuXG4gICAgdmFyIGFycmF5ID0gPE1ldGFNb2RlbFtdPihfLnZhbHVlcyhqc29uLm1vZGVscykgfHwgW10pO1xuICAgIGFycmF5ID0gYXJyYXkubWFwKChqc29uTW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gbmV3IHRoaXMuZmFjdG9yeS5NZXRhTW9kZWwoanNvbk1vZGVsKTtcbiAgICAgIG1vZGVsLmNvbnRhaW5lclV1aWQgPSB0aGlzLnV1aWQ7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSk7XG4gICAgdGhpcy5tb2RlbHMgPSBBcnJheUxvb2t1cEltcGwuY3JlYXRlKGFycmF5LCAnbmFtZScpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuLyoqXG4gKiBtaXJyb3JzIE1ldGFNb2RlbCBvZiBSZWx1dGlvbiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRhTW9kZWwge1xuICBwdWJsaWMgc3RhdGljIGZhY3Rvcnk6IE1vZGVsRmFjdG9yeTtcbiAgcHVibGljIGdldCBmYWN0b3J5KCkge1xuICAgIHJldHVybiBNb2RlbEZhY3RvcnkuZmFjdG9yeU9mKHRoaXMpO1xuICB9XG5cbiAgdXVpZDogc3RyaW5nO1xuXG4gIHZlcnNpb246IG51bWJlcjtcbiAgYnVuZGxlOiBzdHJpbmc7XG4gIGFjbEVudHJpZXM6IHN0cmluZ1tdO1xuICBlZmZlY3RpdmVQZXJtaXNzaW9uczogc3RyaW5nO1xuXG4gIGNvbnRhaW5lclV1aWQ6IHN0cmluZztcblxuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgcGFyZW50czogc3RyaW5nW107XG4gIGFic3RyYWt0OiBib29sZWFuO1xuICBpY29uOiBhbnk7XG5cbiAgZmllbGREZWZpbml0aW9uczogQXJyYXlMb29rdXA8RmllbGREZWZpbml0aW9uPjtcblxuICBwcm9wZXJ0eU1hcDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKG90aGVyPzogTWV0YU1vZGVsKSB7XG4gICAgaWYgKG90aGVyKSB7XG4gICAgICB0aGlzLmZyb21KU09OKG90aGVyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZnJvbUpTT04oanNvbjogTWV0YU1vZGVsKSB7XG4gICAgdGhpcy51dWlkID0ganNvbi51dWlkO1xuXG4gICAgdGhpcy52ZXJzaW9uID0ganNvbi52ZXJzaW9uO1xuICAgIHRoaXMuYnVuZGxlID0ganNvbi5idW5kbGU7XG4gICAgdGhpcy5hY2xFbnRyaWVzID0ganNvbi5hY2xFbnRyaWVzIHx8IFtdO1xuICAgIHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvbnMgPSBqc29uLmVmZmVjdGl2ZVBlcm1pc3Npb25zO1xuXG4gICAgdGhpcy5jb250YWluZXJVdWlkID0ganNvbi5jb250YWluZXJVdWlkO1xuXG4gICAgdGhpcy5uYW1lID0ganNvbi5uYW1lO1xuICAgIHRoaXMubGFiZWwgPSBqc29uLmxhYmVsIHx8IHRoaXMubmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0ganNvbi5kZXNjcmlwdGlvbiB8fCB0aGlzLmxhYmVsO1xuXG4gICAgdGhpcy5wYXJlbnRzID0ganNvbi5wYXJlbnRzIHx8IFtdO1xuICAgIHRoaXMuYWJzdHJha3QgPSBqc29uLmFic3RyYWt0IHx8IGZhbHNlO1xuICAgIHRoaXMuaWNvbiA9IGpzb24uaWNvbjtcblxuICAgIHZhciBhcnJheSA9IDxGaWVsZERlZmluaXRpb25bXT4oanNvbi5maWVsZERlZmluaXRpb25zIHx8IFtdKTtcbiAgICBhcnJheSA9IGFycmF5Lm1hcCgoanNvbkZpZWxkKSA9PiBuZXcgdGhpcy5mYWN0b3J5LkZpZWxkRGVmaW5pdGlvbihqc29uRmllbGQpKTtcbiAgICB0aGlzLmZpZWxkRGVmaW5pdGlvbnMgPSBBcnJheUxvb2t1cEltcGwuY3JlYXRlKGFycmF5LCAnbmFtZScpO1xuXG4gICAgdGhpcy5wcm9wZXJ0eU1hcCA9IGpzb24ucHJvcGVydHlNYXAgfHwge307XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIG1pcnJvcnMgRmllbGREZWZpbml0aW9uIG9mIFJlbHV0aW9uIHNlcnZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEZpZWxkRGVmaW5pdGlvbiB7XG4gIHB1YmxpYyBzdGF0aWMgZmFjdG9yeTogTW9kZWxGYWN0b3J5O1xuICBwdWJsaWMgZ2V0IGZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIE1vZGVsRmFjdG9yeS5mYWN0b3J5T2YodGhpcyk7XG4gIH1cblxuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGdyb3VwOiBzdHJpbmc7XG4gIHRvb2x0aXA6IHN0cmluZztcblxuICBkYXRhVHlwZTogc3RyaW5nO1xuICBkZWZhdWx0VmFsdWU6IHN0cmluZztcbiAgZW51bURlZmluaXRpb246IEVudW1EZWZpbml0aW9uO1xuXG4gIGtleUZpZWxkOiBib29sZWFuO1xuICBpbmRleDogYm9vbGVhbjtcbiAgbWFuZGF0b3J5OiBib29sZWFuO1xuXG4gIG1pblNpemU6IG51bWJlcjtcbiAgbWF4U2l6ZTogbnVtYmVyO1xuICByZWdleHA6IHN0cmluZztcblxuICBwcm9wZXJ0eU1hcDogYW55O1xuXG4gIGdldCBkYXRhVHlwZU5vcm1hbGl6ZWQoKTogc3RyaW5nIHtcbiAgICB2YXIgZGF0YVR5cGUgPSB0aGlzLmRhdGFUeXBlO1xuICAgIGlmIChkYXRhVHlwZSkge1xuICAgICAgLy8gbm9ybWFsaXplcyByYXcgamF2YSB0eXBlc1xuICAgICAgZGF0YVR5cGUgPSBkYXRhVHlwZS5yZXBsYWNlKC9eXFxbTCguKyk7JC8sICckMVtdJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BlcnR5TWFwKSB7XG4gICAgICAvLyBub3JtYWxpemVzIG5lc3RlZCBtb2RlbHNcbiAgICAgIGRhdGFUeXBlID0gdGhpcy5wcm9wZXJ0eU1hcFsnYXJyYXlPZkNvbXBsZXhUeXBlJ107XG4gICAgICBpZiAoZGF0YVR5cGUpIHtcbiAgICAgICAgZGF0YVR5cGUgPSBkYXRhVHlwZSArICdbXSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhVHlwZSA9IHRoaXMucHJvcGVydHlNYXBbJ2NvbXBsZXhUeXBlJ107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhVHlwZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKG90aGVyPzogRmllbGREZWZpbml0aW9uKSB7XG4gICAgaWYgKG90aGVyKSB7XG4gICAgICB0aGlzLmZyb21KU09OKG90aGVyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZnJvbUpTT04oanNvbjogRmllbGREZWZpbml0aW9uKSB7XG4gICAgdGhpcy5uYW1lID0ganNvbi5uYW1lIHx8ICcnO1xuICAgIHRoaXMubGFiZWwgPSBqc29uLmxhYmVsIHx8IHRoaXMubmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0ganNvbi5kZXNjcmlwdGlvbiB8fCB0aGlzLmxhYmVsO1xuICAgIHRoaXMuZ3JvdXAgPSBqc29uLmdyb3VwIHx8IG51bGw7XG4gICAgdGhpcy50b29sdGlwID0ganNvbi50b29sdGlwIHx8IHRoaXMuZGVzY3JpcHRpb247XG5cbiAgICB0aGlzLmRhdGFUeXBlID0ganNvbi5kYXRhVHlwZTtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGpzb24uZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMuZW51bURlZmluaXRpb24gPSBqc29uLmVudW1EZWZpbml0aW9uICYmXG4gICAgICBuZXcgdGhpcy5mYWN0b3J5LkVudW1EZWZpbml0aW9uKGpzb24uZW51bURlZmluaXRpb24pO1xuXG4gICAgdGhpcy5rZXlGaWVsZCA9IGpzb24ua2V5RmllbGQgfHwgZmFsc2U7XG4gICAgdGhpcy5pbmRleCA9IGpzb24uaW5kZXggfHwgZmFsc2U7XG4gICAgdGhpcy5tYW5kYXRvcnkgPSBqc29uLm1hbmRhdG9yeSB8fCBmYWxzZTtcblxuICAgIHRoaXMubWluU2l6ZSA9IGpzb24ubWluU2l6ZTtcbiAgICB0aGlzLm1heFNpemUgPSBqc29uLm1heFNpemU7XG4gICAgdGhpcy5yZWdleHAgPSBqc29uLnJlZ2V4cDtcblxuICAgIHRoaXMucHJvcGVydHlNYXAgPSBqc29uLnByb3BlcnR5TWFwIHx8IHt9O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuLyoqXG4gKiBtaXJyb3JzIEVudW1EZWZpbml0aW9uIG9mIFJlbHV0aW9uIHNlcnZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudW1EZWZpbml0aW9uIHtcbiAgcHVibGljIHN0YXRpYyBmYWN0b3J5OiBNb2RlbEZhY3Rvcnk7XG4gIHB1YmxpYyBnZXQgZmFjdG9yeSgpIHtcbiAgICByZXR1cm4gTW9kZWxGYWN0b3J5LmZhY3RvcnlPZih0aGlzKTtcbiAgfVxuXG4gIGl0ZW1zOiBBcnJheUxvb2t1cDxJdGVtPjtcbiAgZW51bWVyYWJsZTogc3RyaW5nO1xuICBzdHJpY3Q6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Iob3RoZXI/OiBFbnVtRGVmaW5pdGlvbikge1xuICAgIGlmIChvdGhlcikge1xuICAgICAgdGhpcy5mcm9tSlNPTihvdGhlcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZyb21KU09OKGpzb246IEVudW1EZWZpbml0aW9uKSB7XG4gICAgY29uc3QgYXJyYXkgPSBqc29uLml0ZW1zIHx8IDxJdGVtW10+W107XG4gICAgdGhpcy5pdGVtcyA9IEFycmF5TG9va3VwSW1wbC5jcmVhdGUoYXJyYXksICd2YWx1ZScpO1xuXG4gICAgdGhpcy5lbnVtZXJhYmxlID0ganNvbi5lbnVtZXJhYmxlO1xuICAgIHRoaXMuc3RyaWN0ID0ganNvbi5zdHJpY3QgfHwgZmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIHJlcHJlc2VudHMgYSBwcmVkZWZpbmVkIGNob2ljZSBvZiBhbiBFbnVtRGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtIHtcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcblxuICB1cmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogY29uc3RydWN0b3JzIG9mIG1vZGVsIHR5cGVzIG11c3QgYWRoZXJlIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsRmFjdG9yeUN0b3I8VD4ge1xuICAvKipcbiAgICogbmV3LWFibGUgZnJvbSBKU09OIGxpdGVyYWwgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIGpzb24gbGl0ZXJhbCBkYXRhLlxuICAgKi9cbiAgbmV3KG90aGVyPzogVCk6IFQ7XG5cbiAgLyoqXG4gICAqIHN0YXRpYyBhc3NvY2lhdGlvbiB0byBmYWN0b3J5LlxuICAgKi9cbiAgZmFjdG9yeTogTW9kZWxGYWN0b3J5O1xufVxuXG4vKipcbiAqIGNvbnN0cnVjdGlvbiBmcm9tIEpTT04gbGl0ZXJhbCBkYXRhLlxuICpcbiAqIEBleGFtcGxlIFVzZSB0aGUgZm9sbG93aW5nIGZvciBjcmVhdGlvbiBvZiBhIHN1YmNsYXNzZXMgaGllcmFyY2h5OlxuICogIGV4cG9ydCBjbGFzcyBTb21lTW9kZWxDb250YWluZXIgZXh0ZW5kcyBNb2RlbENvbnRhaW5lciB7XG4gKiAgICBwdWJsaWMgc3RhdGljIGZhY3Rvcnk6IFNvbWVNb2RlbEZhY3Rvcnk7XG4gKiAgfVxuICogIGV4cG9ydCBjbGFzcyBTb21lTWV0YU1vZGVsIGV4dGVuZHMgTWV0YU1vZGVsIHtcbiAqICAgIHB1YmxpYyBzdGF0aWMgZmFjdG9yeTogU29tZU1vZGVsRmFjdG9yeTtcbiAqICB9XG4gKiAgZXhwb3J0IGNsYXNzIFNvbWVGaWVsZERlZmluaXRpb24gZXh0ZW5kcyBGaWVsZERlZmluaXRpb24ge1xuICogICAgcHVibGljIHN0YXRpYyBmYWN0b3J5OiBTb21lTW9kZWxGYWN0b3J5O1xuICogIH1cbiAqICBleHBvcnQgY2xhc3MgU29tZUVudW1EZWZpbml0aW9uIGV4dGVuZHMgRW51bURlZmluaXRpb24ge1xuICogICAgcHVibGljIHN0YXRpYyBmYWN0b3J5OiBTb21lTW9kZWxGYWN0b3J5O1xuICogIH1cbiAqICBleHBvcnQgY2xhc3MgU29tZU1vZGVsRmFjdG9yeSBleHRlbmRzIE1vZGVsRmFjdG9yeSB7XG4gKiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlID0gbmV3IFNvbWVNb2RlbEZhY3RvcnkoU29tZU1vZGVsQ29udGFpbmVyLCBTb21lTWV0YU1vZGVsLFxuICogICAgICBTb21lRmllbGREZWZpbml0aW9uLCBTb21lRW51bURlZmluaXRpb24pO1xuICogIH1cbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsRmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2UgPSBuZXcgTW9kZWxGYWN0b3J5KE1vZGVsQ29udGFpbmVyLCBNZXRhTW9kZWwsXG4gICAgRmllbGREZWZpbml0aW9uLCBFbnVtRGVmaW5pdGlvbik7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIE1vZGVsQ29udGFpbmVyOiBNb2RlbEZhY3RvcnlDdG9yPE1vZGVsQ29udGFpbmVyPixcbiAgICBwdWJsaWMgTWV0YU1vZGVsOiBNb2RlbEZhY3RvcnlDdG9yPE1ldGFNb2RlbD4sXG4gICAgcHVibGljIEZpZWxkRGVmaW5pdGlvbjogTW9kZWxGYWN0b3J5Q3RvcjxGaWVsZERlZmluaXRpb24+LFxuICAgIHB1YmxpYyBFbnVtRGVmaW5pdGlvbjogTW9kZWxGYWN0b3J5Q3RvcjxFbnVtRGVmaW5pdGlvbj5cbiAgKSB7XG4gICAgdGhpcy5Nb2RlbENvbnRhaW5lci5mYWN0b3J5ID0gdGhpcztcbiAgICB0aGlzLk1ldGFNb2RlbC5mYWN0b3J5ID0gdGhpcztcbiAgICB0aGlzLkZpZWxkRGVmaW5pdGlvbi5mYWN0b3J5ID0gdGhpcztcbiAgICB0aGlzLkVudW1EZWZpbml0aW9uLmZhY3RvcnkgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmYWN0b3J5T2Y8VD4ob2JqOiBUKTogTW9kZWxGYWN0b3J5IHtcbiAgICByZXR1cm4gKDxNb2RlbEZhY3RvcnlDdG9yPFQ+PihvYmouY29uc3RydWN0b3IpKS5mYWN0b3J5O1xuICB9XG5cbiAgcHVibGljIGZyb21KU09OKGpzb246IHN0cmluZyk6IE1vZGVsQ29udGFpbmVyO1xuICBwdWJsaWMgZnJvbUpTT04oanNvbjogYW55KTogTW9kZWxDb250YWluZXI7XG4gIHB1YmxpYyBmcm9tSlNPTihqc29uOiBhbnkpOiBNb2RlbENvbnRhaW5lciB7XG4gICAgcmV0dXJuIG5ldyB0aGlzLk1vZGVsQ29udGFpbmVyKCkuZnJvbUpTT04odHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb24pO1xuICB9XG59XG4iXX0=