io.parrots
Version:
Parrots.io App
527 lines (526 loc) • 57.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Headers, RequestOptions } from '@angular/http';
import { DataField } from 'com.phloxui';
import { ParrotsDataSchema } from '../../share/model/ParrotsDataSchema';
import { ClassesResource } from '../../share/resource/ClassesResource';
export class ParrotsDataService {
/**
* @param {?} className
* @param {?} connectionMgr
*/
constructor(className, connectionMgr) {
this.connectionMgr = connectionMgr;
this.className = className;
this.classesResource = connectionMgr.createResource(ClassesResource);
}
/**
* @return {?}
*/
loadDataSchema() {
return new Promise((resolve, reject) => {
try {
this.classesResource.getSchemaInfo(this.className).then((response) => {
try {
// response should by in json if not reject in catch
let /** @type {?} */ responseObj = response;
let /** @type {?} */ dataFields = [];
let /** @type {?} */ jsonSchema = responseObj;
for (let /** @type {?} */ key in jsonSchema.properties) {
let /** @type {?} */ selfJsonSchema = jsonSchema.properties[key];
if (selfJsonSchema === null || selfJsonSchema === undefined) {
continue;
}
let /** @type {?} */ dataField = new DataField(key, key, selfJsonSchema.type, selfJsonSchema, null);
dataFields.push(dataField);
}
let /** @type {?} */ resultSchema = new ParrotsDataSchema(responseObj.id, responseObj.id, dataFields, jsonSchema);
resolve(resultSchema);
}
catch (/** @type {?} */ error) {
reject(error);
}
}).catch(error => {
reject(error);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
}
/**
* @return {?}
*/
loadData() {
return new Promise((resolve, reject) => {
try {
this.classesResource.query(this.className).then((response) => {
try {
let /** @type {?} */ result = [];
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined &&
responseObj.items !== null && responseObj.items !== undefined) {
result = responseObj.items;
}
resolve(result);
}
catch (/** @type {?} */ err) {
reject(err);
}
}, (error) => {
reject(error);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
}
/**
* @param {?} data
* @return {?}
*/
createData(data) {
return new Promise((resolve, reject) => {
this.classesResource.create(data, this.className).then((response) => {
try {
let /** @type {?} */ result = {};
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, (error) => {
reject(error);
});
});
}
/**
* @param {?} data
* @return {?}
*/
_updateData(data) {
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise((resolve, reject) => {
this.classesResource.update(data._uuid, this.className, data).then((response) => {
try {
let /** @type {?} */ result = {};
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, (error) => {
reject(error);
});
});
}
/**
* @param {?} data
* @return {?}
*/
updateData(data) {
return new Promise((resolve, reject) => {
try {
let /** @type {?} */ promArray = [];
let /** @type {?} */ isDataArray = Array.isArray(data);
if (isDataArray) {
for (let /** @type {?} */ d of data) {
promArray.push(this._updateData(d));
}
}
else {
promArray.push(this._updateData(data));
}
// wait for all
Promise.all(promArray).then((values) => {
if (isDataArray) {
resolve(values);
}
else {
resolve(values[0]);
}
}, (erros) => {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
}
/**
* @param {?} data
* @return {?}
*/
_deleteData(data) {
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise((resolve, reject) => {
this.classesResource.delete(data._uuid, this.className).then((response) => {
try {
let /** @type {?} */ result = {};
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, (error) => {
reject(error);
});
});
}
/**
* @param {?} data
* @return {?}
*/
deleteData(data) {
return new Promise((resolve, reject) => {
try {
let /** @type {?} */ promArray = [];
let /** @type {?} */ isDataArray = Array.isArray(data);
if (isDataArray) {
for (let /** @type {?} */ d of data) {
promArray.push(this._deleteData(d));
}
}
else {
promArray.push(this._deleteData(data));
}
// wait for all
Promise.all(promArray).then((values) => {
if (isDataArray) {
resolve(values);
}
else {
resolve(values[0]);
}
}, (erros) => {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
}
/**
* @param {?} data
* @return {?}
*/
_destroyData(data) {
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise((resolve, reject) => {
this.classesResource.delete(data._uuid, this.className, true).then((response) => {
try {
let /** @type {?} */ result = {};
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, (error) => {
reject(error);
});
});
}
/**
* @param {?} data
* @return {?}
*/
destroyData(data) {
return new Promise((resolve, reject) => {
try {
let /** @type {?} */ promArray = [];
let /** @type {?} */ isDataArray = Array.isArray(data);
if (isDataArray) {
for (let /** @type {?} */ d of data) {
promArray.push(this._destroyData(d));
}
}
else {
promArray.push(this._destroyData(data));
}
// wait for all
Promise.all(promArray).then((values) => {
if (isDataArray) {
resolve(values);
}
else {
resolve(values[0]);
}
}, (erros) => {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
}
/**
* @param {?} data
* @param {?=} fetchFields
* @return {?}
*/
fetchData(data, fetchFields) {
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise((resolve, reject) => {
try {
let /** @type {?} */ requestOptions = new RequestOptions();
if (fetchFields !== null && fetchFields !== undefined && fetchFields !== '') {
let /** @type {?} */ headers = new Headers();
headers.append("Fetch-Fields", fetchFields);
requestOptions.headers = headers;
}
this.classesResource.find(data._uuid, this.className, undefined, undefined, requestOptions).then((response) => {
try {
let /** @type {?} */ result = {};
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
// try to fetch obj
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ err) {
reject(err);
}
}, (error) => {
reject(error);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
}
/**
* @param {?} data
* @return {?}
*/
findData(data) {
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise((resolve, reject) => {
this.classesResource.find(data._uuid, this.className).then((response) => {
try {
let /** @type {?} */ result = {};
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, (error) => {
reject(error);
});
});
}
/**
* @param {?} filterData
* @return {?}
*/
queryData(filterData) {
return new Promise((resolve, reject) => {
let /** @type {?} */ queryFilterDTO = {};
if (filterData !== null && filterData !== undefined) {
if (filterData.filter !== null && filterData.filter !== undefined) {
}
if (filterData.sorting !== null && filterData.sorting !== undefined && filterData.sorting !== '') {
let /** @type {?} */ sorting = filterData.sorting;
let /** @type {?} */ sortStmt = "";
let /** @type {?} */ split = sorting.split(",");
for (let /** @type {?} */ i = 0; i < split.length; i++) {
sortStmt += split[i] + " and ";
}
if (sortStmt !== '') {
sortStmt = sortStmt.slice(0, sortStmt.length - 5);
}
console.log("sortStmt: " + sortStmt);
queryFilterDTO["ordering"] = sortStmt;
}
}
this.classesResource.queryWithFilter(this.className, queryFilterDTO).then((response) => {
try {
let /** @type {?} */ result = {};
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined &&
responseObj.items !== null && responseObj.items !== undefined) {
result = responseObj.items;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, (error) => {
reject(error);
});
});
}
/**
* @param {?} data
* @return {?}
*/
_recycleData(data) {
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise((resolve, reject) => {
this.classesResource.recycle(data._uuid, this.className).then((response) => {
try {
let /** @type {?} */ result = {};
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, (error) => {
reject(error);
});
});
}
/**
* @param {?} data
* @return {?}
*/
recycleData(data) {
return new Promise((resolve, reject) => {
try {
let /** @type {?} */ promArray = [];
let /** @type {?} */ isDataArray = Array.isArray(data);
if (isDataArray) {
for (let /** @type {?} */ d of data) {
promArray.push(this._recycleData(d));
}
}
else {
promArray.push(this._recycleData(data));
}
// wait for all
Promise.all(promArray).then((values) => {
if (isDataArray) {
resolve(values);
}
else {
resolve(values[0]);
}
}, (erros) => {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
}
/**
* @param {?} data
* @return {?}
*/
_promoteData(data) {
if (data !== null && data !== undefined && data !== '') {
if (data._version === null || data._version === undefined || data._version == '') {
return Promise.reject("No Version to promote.");
}
}
else {
return Promise.reject("Data's uuid was missing.");
}
return new Promise((resolve, reject) => {
this.classesResource.promoteVersion(data._version, data._uuid, this.className).then((response) => {
try {
let /** @type {?} */ result = {};
let /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, (error) => {
reject(error);
});
});
}
/**
* @param {?} data
* @return {?}
*/
promoteData(data) {
return new Promise((resolve, reject) => {
try {
let /** @type {?} */ promArray = [];
let /** @type {?} */ isDataArray = Array.isArray(data);
if (isDataArray) {
for (let /** @type {?} */ d of data) {
promArray.push(this._promoteData(d));
}
}
else {
promArray.push(this._promoteData(data));
}
// wait for all
Promise.all(promArray).then((values) => {
if (isDataArray) {
resolve(values);
}
else {
resolve(values[0]);
}
}, (erros) => {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
}
}
function ParrotsDataService_tsickle_Closure_declarations() {
/** @type {?} */
ParrotsDataService.prototype.connectionMgr;
/** @type {?} */
ParrotsDataService.prototype.className;
/** @type {?} */
ParrotsDataService.prototype.classesResource;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFycm90c0RhdGFTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaW8ucGFycm90cy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZWRpdG9yL1BhcnJvdHNEYXRhU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUFrQixPQUFPLEVBQUUsY0FBYyxFQUFzQixNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQWMsU0FBUyxFQUFjLE1BQU0sYUFBYSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV2RSxNQUFNOzs7OztJQU1KLFlBQVksU0FBaUIsRUFBRSxhQUF3QztRQUNyRSxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDdEU7Ozs7SUFFTSxjQUFjO1FBRW5CLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUVuRSxJQUFJLENBQUM7O3dCQUVILHFCQUFJLFdBQVcsR0FBRyxRQUFRLENBQUE7d0JBQzFCLHFCQUFJLFVBQVUsR0FBZ0IsRUFBRSxDQUFDO3dCQUNqQyxxQkFBSSxVQUFVLEdBQWUsV0FBVyxDQUFDO3dCQUV6QyxHQUFHLENBQUMsQ0FBQyxxQkFBSSxHQUFHLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7NEJBQ3RDLHFCQUFJ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Qzt3QkFDTixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3BCO2lCQUNGLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDWCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ2YsQ0FBQyxDQUFDO2FBRUo7WUFBQyxLQUFLLENBQUMsQ0FBQyxpQkFBQSxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDZjtTQUNGLENBQUMsQ0FBQzs7Q0FHTiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHAsIFJlc3BvbnNlLCBIZWFkZXJzLCBSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnNBcmdzIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhRmllbGQsIEpzb25TY2hlbWEgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBJUGFycm90c0RhdGFTZXJ2aWNlLCB9IGZyb20gJy4vSVBhcnJvdHNEYXRhU2VydmljZSc7XG5pbXBvcnQgeyBQYXJyb3RzRGF0YVNjaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlL21vZGVsL1BhcnJvdHNEYXRhU2NoZW1hJztcbmltcG9ydCB7IEluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL0luc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDbGFzc2VzUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9zaGFyZS9yZXNvdXJjZS9DbGFzc2VzUmVzb3VyY2UnO1xuXG5leHBvcnQgY2xhc3MgUGFycm90c0RhdGFTZXJ2aWNlIGltcGxlbWVudHMgSVBhcnJvdHNEYXRhU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBjb25uZWN0aW9uTWdyOiBJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyO1xuICBwcml2YXRlIGNsYXNzTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGNsYXNzZXNSZXNvdXJjZTogQ2xhc3Nlc1Jlc291cmNlO1xuXG4gIGNvbnN0cnVjdG9yKGNsYXNzTmFtZTogc3RyaW5nLCBjb25uZWN0aW9uTWdyOiBJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uTWdyID0gY29ubmVjdGlvbk1ncjtcbiAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICB0aGlzLmNsYXNzZXNSZXNvdXJjZSA9IGNvbm5lY3Rpb25NZ3IuY3JlYXRlUmVzb3VyY2UoQ2xhc3Nlc1Jlc291cmNlKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkRGF0YVNjaGVtYSgpOiBQcm9taXNlPFBhcnJvdHNEYXRhU2NoZW1hPiB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5jbGFzc2VzUmVzb3VyY2UuZ2V0U2NoZW1hSW5mbyh0aGlzLmNsYXNzTmFtZSkudGhlbigocmVzcG9uc2UpID0+IHtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyByZXNwb25zZSBzaG91bGQgYnkgaW4ganNvbiBpZiBub3QgcmVqZWN0IGluIGNhdGNoXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VPYmogPSByZXNwb25zZVxuICAgICAgICAgICAgbGV0IGRhdGFGaWVsZHM6IERhdGFGaWVsZFtdID0gW107XG4gICAgICAgICAgICBsZXQganNvblNjaGVtYTogSnNvblNjaGVtYSA9IHJlc3BvbnNlT2JqO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4ganNvblNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIGxldCBzZWxmSnNvblNjaGVtYTogSnNvblNjaGVtYSA9IGpzb25TY2hlbWEucHJvcGVydGllc1trZXldO1xuXG4gICAgICAgICAgICAgIGlmIChzZWxmSnNvblNjaGVtYSA9PT0gbnVsbCB8fCBzZWxmSnNvblNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgZGF0YUZpZWxkOiBEYXRhRmllbGQgPSBuZXcgRGF0YUZpZWxkKGtleSwga2V5LCBzZWxmSnNvblNjaGVtYS50eXBlLCBzZWxmSnNvblNjaGVtYSwgbnVsbCk7XG4gICAgICAgICAgICAgIGRhdGFGaWVsZHMucHVzaChkYXRhRmllbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVzdWx0U2NoZW1hOiBQYXJyb3RzRGF0YVNjaGVtYSA9IG5ldyBQYXJyb3RzRGF0YVNjaGVtYShyZXNwb25zZU9iai5pZCwgcmVzcG9uc2VPYmouaWQsIGRhdGFGaWVsZHMsIGpzb25TY2hlbWEpO1xuXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdFNjaGVtYSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbG9hZERhdGEoKTogUHJvbWlzZTxhbnk+IHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuXG4gICAgICAgIHRoaXMuY2xhc3Nlc1Jlc291cmNlLnF1ZXJ5KHRoaXMuY2xhc3NOYW1lKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VPYmogPSByZXNwb25zZVxuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VPYmogIT09IG51bGwgJiYgcmVzcG9uc2VPYmogIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICByZXNwb25zZU9iai5pdGVtcyAhPT0gbnVsbCAmJiByZXNwb25zZU9iai5pdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlT2JqLml0ZW1zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRoaXMuY2xhc3Nlc1Jlc291cmNlLmNyZWF0ZShkYXRhLCB0aGlzLmNsYXNzTmFtZSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdHJ5IHtcblxuICAgICAgICAgIGxldCByZXN1bHQ6IGFueSA9IHt9O1xuXG4gICAgICAgICAgbGV0IHJlc3BvbnNlT2JqID0gcmVzcG9uc2VcblxuICAgICAgICAgIGlmIChyZXNwb25zZU9iaiAhPT0gbnVsbCAmJiByZXNwb25zZU9iaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXNwb25zZU9iajtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIF91cGRhdGVEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG5cbiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkRhdGEncyB1dWlkIHdhcyBtaXNzaW5nLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICB0aGlzLmNsYXNzZXNSZXNvdXJjZS51cGRhdGUoZGF0YS5fdXVpZCwgdGhpcy5jbGFzc05hbWUsIGRhdGEpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7fTtcblxuICAgICAgICAgIGxldCByZXNwb25zZU9iaiA9IHJlc3BvbnNlXG5cbiAgICAgICAgICBpZiAocmVzcG9uc2VPYmogIT09IG51bGwgJiYgcmVzcG9uc2VPYmogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2VPYmo7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHByb21BcnJheTogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgbGV0IGlzRGF0YUFycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICAgICAgaWYgKGlzRGF0YUFycmF5KSB7XG4gICAgICAgICAgZm9yIChsZXQgZCBvZiBkYXRhKSB7XG4gICAgICAgICAgICBwcm9tQXJyYXkucHVzaCh0aGlzLl91cGRhdGVEYXRhKGQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbUFycmF5LnB1c2godGhpcy5fdXBkYXRlRGF0YShkYXRhKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3YWl0IGZvciBhbGxcbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbUFycmF5KS50aGVuKCh2YWx1ZXMpID0+IHtcbiAgICAgICAgICBpZiAoaXNEYXRhQXJyYXkpIHtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZXNbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgKGVycm9zKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9kZWxldGVEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG5cbiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkRhdGEncyB1dWlkIHdhcyBtaXNzaW5nLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICB0aGlzLmNsYXNzZXNSZXNvdXJjZS5kZWxldGUoZGF0YS5fdXVpZCwgdGhpcy5jbGFzc05hbWUpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge307XG5cbiAgICAgICAgICBsZXQgcmVzcG9uc2VPYmogPSByZXNwb25zZVxuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlT2JqICE9PSBudWxsICYmIHJlc3BvbnNlT2JqICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlT2JqO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgcHJvbUFycmF5OiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBsZXQgaXNEYXRhQXJyYXkgPSBBcnJheS5pc0FycmF5KGRhdGEpO1xuICAgICAgICBpZiAoaXNEYXRhQXJyYXkpIHtcbiAgICAgICAgICBmb3IgKGxldCBkIG9mIGRhdGEpIHtcbiAgICAgICAgICAgIHByb21BcnJheS5wdXNoKHRoaXMuX2RlbGV0ZURhdGEoZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9tQXJyYXkucHVzaCh0aGlzLl9kZWxldGVEYXRhKGRhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdhaXQgZm9yIGFsbFxuICAgICAgICBQcm9taXNlLmFsbChwcm9tQXJyYXkpLnRoZW4oKHZhbHVlcykgPT4ge1xuICAgICAgICAgIGlmIChpc0RhdGFBcnJheSkge1xuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlc1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAoZXJyb3MpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3MpO1xuICAgICAgICB9KTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBfZGVzdHJveURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcblxuICAgIGlmIChkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSAnJykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFwiRGF0YSdzIHV1aWQgd2FzIG1pc3NpbmcuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRoaXMuY2xhc3Nlc1Jlc291cmNlLmRlbGV0ZShkYXRhLl91dWlkLCB0aGlzLmNsYXNzTmFtZSwgdHJ1ZSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdHJ5IHtcblxuICAgICAgICAgIGxldCByZXN1bHQ6IGFueSA9IHt9O1xuXG4gICAgICAgICAgbGV0IHJlc3BvbnNlT2JqID0gcmVzcG9uc2VcblxuICAgICAgICAgIGlmIChyZXNwb25zZU9iaiAhPT0gbnVsbCAmJiByZXNwb25zZU9iaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXNwb25zZU9iajtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95RGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBwcm9tQXJyYXk6IFByb21pc2U8YW55PltdID0gW107XG4gICAgICAgIGxldCBpc0RhdGFBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgICAgIGlmIChpc0RhdGFBcnJheSkge1xuICAgICAgICAgIGZvciAobGV0IGQgb2YgZGF0YSkge1xuICAgICAgICAgICAgcHJvbUFycmF5LnB1c2godGhpcy5fZGVzdHJveURhdGEoZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9tQXJyYXkucHVzaCh0aGlzLl9kZXN0cm95RGF0YShkYXRhKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3YWl0IGZvciBhbGxcbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbUFycmF5KS50aGVuKCh2YWx1ZXMpID0+IHtcbiAgICAgICAgICBpZiAoaXNEYXRhQXJyYXkpIHtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZXNbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgKGVycm9zKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyAjIyMgUSAmIEEgZmV0Y2ggb3Igbm8gZmV0Y2ggd2hlbiBubyBmZXRjaEZpZWxkc1xuICBwdWJsaWMgZmV0Y2hEYXRhKGRhdGE6IGFueSwgZmV0Y2hGaWVsZHM/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuXG4gICAgaWYgKGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGRhdGEgPT09ICcnKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJEYXRhJ3MgdXVpZCB3YXMgbWlzc2luZy5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG5cbiAgICAgICAgbGV0IHJlcXVlc3RPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucygpO1xuXG4gICAgICAgIGlmIChmZXRjaEZpZWxkcyAhPT0gbnVsbCAmJiBmZXRjaEZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIGZldGNoRmllbGRzICE9PSAnJykge1xuICAgICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgICAgICBoZWFkZXJzLmFwcGVuZChcIkZldGNoLUZpZWxkc1wiLCBmZXRjaEZpZWxkcyk7XG4gICAgICAgICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsYXNzZXNSZXNvdXJjZS5maW5kKGRhdGEuX3V1aWQsIHRoaXMuY2xhc3NOYW1lLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdE9wdGlvbnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ6IGFueSA9IHt9O1xuXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VPYmogPSByZXNwb25zZVxuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VPYmogIT09IG51bGwgJiYgcmVzcG9uc2VPYmogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyB0cnkgdG8gZmV0Y2ggb2JqXG4gICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlT2JqO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgI