j2s
Version:
JSON to SQL, build RESTful API server on the fly, which accespts JSON describing SQL query statements, support (almost) full SQL functionality, with configurable access control & pluggable middlewares
83 lines (80 loc) • 18.6 kB
JavaScript
'use strict';
function J2SError(code, message, status) {
this.success = false;
this.code = code;
this.message = message;
if (status) {
this.status = status;
}
}
J2SError.prototype = Object.create(Error.prototype);
J2SError.prototype.name = "J2SError";
J2SError.prototype.success = false;
J2SError.prototype.code = -1;
J2SError.prototype.message = "";
J2SError.prototype.status = 500;
J2SError.prototype.constructor = J2SError;
module.exports = {
J2SError: J2SError,
ErrBetweenSuffixValueShouldBeList: new J2SError(100101, "value for query clause with 'between' suffix must be list"),
ErrBetweenSuffixValueShouldBeLengthTwo: new J2SError(100102, "value for query clause with 'between' suffix must be list of length 2"),
ErrNotBetweenSuffixShouldBeList: new J2SError(100103, "value for query clause with 'not_between' suffix must be list"),
ErrNotBetweenSuffixShouldBeLengthTwo: new J2SError(100104, "value for query clause with 'not_between' suffix must be list of length 2"),
ErrInSuffixShouldBeList: new J2SError(100105, "value for query clause with 'in' suffix must be list"),
ErrNotInSuffixShouldBeList: new J2SError(100106, "value for query clause with 'not_in' suffix must be list"),
ErrNullSuffixShouldBeBoolean: new J2SError(100107, "value for query clause with 'null' suffix must be boolean"),
FnErrSuffixNotImplemented: function FnErrSuffixNotImplemented(suffix) {
return new J2SError(100108, "suffix '".concat(suffix, "' is not implemented"));
},
ErrJoinShouldBeJSONObject: new J2SError(100108, "value of 'join' should be JSON object"),
ErrOrderByShouldBeList: new J2SError(100109, "value of 'order_by' should be list"),
ErrOrderByLengthShouldBeTwo: new J2SError(100110, "value of 'order_by' could only be of length 1 or 2"),
FnErrKeywordNotImplemented: function FnErrKeywordNotImplemented(keyword) {
return new J2SError(100111, "keyword '".concat(keyword, "' is not implemented"));
},
FnErrUnknowRuleType: function FnErrUnknowRuleType(rule) {
return new J2SError(100112, "unknown rule type: ".concat(rule));
},
ErrOperationNotAuthorized: new J2SError(100113, "operation not authorized"),
ErrQueryShouldBeJsonObject: new J2SError(100115, "value of 'query' must be JSON object"),
ErrDataShouldBeJsonObject: new J2SError(100117, "value of 'data' must be JSON object"),
ErrPopulateShouldBeList: new J2SError(100118, "value of 'populate' must be JSON array"),
ErrPopulateObjectShouldHaveExactlyOneKey: new J2SError(100119, "value of element in 'populate' with object type should have exactly one key"),
ErrPopulateElementShouldBeStringOrObject: new J2SError(100120, "value of element in 'populate' should be either JSON object or string"),
ErrExistsObjectShouldHaveExactlyOneKey: new J2SError(100121, "value of 'exists' or 'not_exists' should be JSON object that contains exactly one key"),
ErrAddClauseShouldBeList: new J2SError(100122, "value of 'add_clause' should be JSON Array"),
FnErrKeyForbidden: function FnErrKeyForbidden(keyword) {
return new J2SError(100123, "keyword '".concat(keyword, "' is forbidden"));
},
ErrAddClauseElementShouldBeStringOrObject: new J2SError(100124, "value of element in 'add_clause' should be either JSON object or string"),
ErrLikeShouldBeStringOrList: new J2SError(100125, "value of 'like' should be either JSON array or string"),
ErrDeletionNotAllowed: new J2SError(100126, "deletion for more than one instance is not allowed"),
ErrResourceNotFound: new J2SError(100127, "resource not found"),
FnErrDatabaseOperationError: function FnErrDatabaseOperationError(msg) {
return new J2SError(100128, "DB operation error: ".concat(msg));
},
FnErrClauseNotExists: function FnErrClauseNotExists(clause) {
return new J2SError(100129, "clause '".concat(clause, "' is not defined on the model"));
},
FnErrClauseObjectShouldHaveExactlyOneKey: function FnErrClauseObjectShouldHaveExactlyOneKey(keys) {
return new J2SError(100130, "clause should have exactly one key, but got [".concat(keys, "]"));
},
ErrWhereKeywordWhenGetWithIdForbidden: new J2SError(100131, "the 'where' keyword is not allowed when get objects with id"),
FnErrValueShouldBeObject: function FnErrValueShouldBeObject(key) {
return new J2SError(100132, "the value of key '".concat(key, "' should be object"));
},
FnErrValueShouldBeArray: function FnErrValueShouldBeArray(key) {
return new J2SError(100133, "the value of key '".concat(key, "' should be array"));
},
ErrRelationKeyConflicts: new J2SError(100134, "'replace' conflicts with 'add', 'remove' or 'create'"),
FnErrUnknownRelationType: function FnErrUnknownRelationType(type) {
return new J2SError(100135, "relation type '".concat(type, "' is not implemented"));
},
ErrNoQueryOrWhereSupplied: new J2SError(100136, "no 'query' or 'where' supplied in body when updating data"),
ErrWhereKeywordWhenPutWithIdForbidden: new J2SError(100137, "the 'where' keyword is not allowed when put objects with id"),
ErrWhereKeywordWhenDeleteWithIdForbidden: new J2SError(100138, "the 'where' keyword is not allowed when delete objects with id"),
FnErrValueShouldBeNumberOrObject: function FnErrValueShouldBeNumberOrObject(key) {
return new J2SError(100139, "the value of key '".concat(key, "' should be number or object"));
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lcnJvcnMuanMiXSwibmFtZXMiOlsiSjJTRXJyb3IiLCJjb2RlIiwibWVzc2FnZSIsInN0YXR1cyIsInN1Y2Nlc3MiLCJwcm90b3R5cGUiLCJPYmplY3QiLCJjcmVhdGUiLCJFcnJvciIsIm5hbWUiLCJjb25zdHJ1Y3RvciIsIm1vZHVsZSIsImV4cG9ydHMiLCJFcnJCZXR3ZWVuU3VmZml4VmFsdWVTaG91bGRCZUxpc3QiLCJFcnJCZXR3ZWVuU3VmZml4VmFsdWVTaG91bGRCZUxlbmd0aFR3byIsIkVyck5vdEJldHdlZW5TdWZmaXhTaG91bGRCZUxpc3QiLCJFcnJOb3RCZXR3ZWVuU3VmZml4U2hvdWxkQmVMZW5ndGhUd28iLCJFcnJJblN1ZmZpeFNob3VsZEJlTGlzdCIsIkVyck5vdEluU3VmZml4U2hvdWxkQmVMaXN0IiwiRXJyTnVsbFN1ZmZpeFNob3VsZEJlQm9vbGVhbiIsIkZuRXJyU3VmZml4Tm90SW1wbGVtZW50ZWQiLCJzdWZmaXgiLCJFcnJKb2luU2hvdWxkQmVKU09OT2JqZWN0IiwiRXJyT3JkZXJCeVNob3VsZEJlTGlzdCIsIkVyck9yZGVyQnlMZW5ndGhTaG91bGRCZVR3byIsIkZuRXJyS2V5d29yZE5vdEltcGxlbWVudGVkIiwia2V5d29yZCIsIkZuRXJyVW5rbm93UnVsZVR5cGUiLCJydWxlIiwiRXJyT3BlcmF0aW9uTm90QXV0aG9yaXplZCIsIkVyclF1ZXJ5U2hvdWxkQmVKc29uT2JqZWN0IiwiRXJyRGF0YVNob3VsZEJlSnNvbk9iamVjdCIsIkVyclBvcHVsYXRlU2hvdWxkQmVMaXN0IiwiRXJyUG9wdWxhdGVPYmplY3RTaG91bGRIYXZlRXhhY3RseU9uZUtleSIsIkVyclBvcHVsYXRlRWxlbWVudFNob3VsZEJlU3RyaW5nT3JPYmplY3QiLCJFcnJFeGlzdHNPYmplY3RTaG91bGRIYXZlRXhhY3RseU9uZUtleSIsIkVyckFkZENsYXVzZVNob3VsZEJlTGlzdCIsIkZuRXJyS2V5Rm9yYmlkZGVuIiwiRXJyQWRkQ2xhdXNlRWxlbWVudFNob3VsZEJlU3RyaW5nT3JPYmplY3QiLCJFcnJMaWtlU2hvdWxkQmVTdHJpbmdPckxpc3QiLCJFcnJEZWxldGlvbk5vdEFsbG93ZWQiLCJFcnJSZXNvdXJjZU5vdEZvdW5kIiwiRm5FcnJEYXRhYmFzZU9wZXJhdGlvbkVycm9yIiwibXNnIiwiRm5FcnJDbGF1c2VOb3RFeGlzdHMiLCJjbGF1c2UiLCJGbkVyckNsYXVzZU9iamVjdFNob3VsZEhhdmVFeGFjdGx5T25lS2V5Iiwia2V5cyIsIkVycldoZXJlS2V5d29yZFdoZW5HZXRXaXRoSWRGb3JiaWRkZW4iLCJGbkVyclZhbHVlU2hvdWxkQmVPYmplY3QiLCJrZXkiLCJGbkVyclZhbHVlU2hvdWxkQmVBcnJheSIsIkVyclJlbGF0aW9uS2V5Q29uZmxpY3RzIiwiRm5FcnJVbmtub3duUmVsYXRpb25UeXBlIiwidHlwZSIsIkVyck5vUXVlcnlPcldoZXJlU3VwcGxpZWQiLCJFcnJXaGVyZUtleXdvcmRXaGVuUHV0V2l0aElkRm9yYmlkZGVuIiwiRXJyV2hlcmVLZXl3b3JkV2hlbkRlbGV0ZVdpdGhJZEZvcmJpZGRlbiIsIkZuRXJyVmFsdWVTaG91bGRCZU51bWJlck9yT2JqZWN0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxTQUFTQSxRQUFULENBQWtCQyxJQUFsQixFQUF3QkMsT0FBeEIsRUFBaUNDLE1BQWpDLEVBQXlDO0FBQ3JDLE9BQUtDLE9BQUwsR0FBZSxLQUFmO0FBQ0EsT0FBS0gsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsT0FBS0MsT0FBTCxHQUFlQSxPQUFmOztBQUNBLE1BQUlDLE1BQUosRUFBWTtBQUNSLFNBQUtBLE1BQUwsR0FBY0EsTUFBZDtBQUNIO0FBQ0g7O0FBRUZILFFBQVEsQ0FBQ0ssU0FBVCxHQUFxQkMsTUFBTSxDQUFDQyxNQUFQLENBQWNDLEtBQUssQ0FBQ0gsU0FBcEIsQ0FBckI7QUFDQUwsUUFBUSxDQUFDSyxTQUFULENBQW1CSSxJQUFuQixHQUEwQixVQUExQjtBQUNBVCxRQUFRLENBQUNLLFNBQVQsQ0FBbUJE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eURid0QsRUFBQUEscUNBQXFDLEVBQUUsSUFBSXhELFFBQUosQ0FBYSxNQUFiLGdFQXpEMUI7QUEwRGJ5RCxFQUFBQSx3Q0FBd0MsRUFBRSxJQUFJekQsUUFBSixDQUFhLE1BQWIsbUVBMUQ3QjtBQTJEYjBELEVBQUFBLGdDQUFnQyxFQUFFLDBDQUFTUixHQUFULEVBQWM7QUFDNUMsV0FBTyxJQUFJbEQsUUFBSixDQUFhLE1BQWIsOEJBQTBDa0QsR0FBMUMsa0NBQVA7QUFDSDtBQTdEWSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gSjJTRXJyb3IoY29kZSwgbWVzc2FnZSwgc3RhdHVzKSB7XG4gICAgdGhpcy5zdWNjZXNzID0gZmFsc2U7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuIH1cblxuSjJTRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuSjJTRXJyb3IucHJvdG90eXBlLm5hbWUgPSBcIkoyU0Vycm9yXCI7XG5KMlNFcnJvci5wcm90b3R5cGUuc3VjY2VzcyA9IGZhbHNlO1xuSjJTRXJyb3IucHJvdG90eXBlLmNvZGUgPSAtMTtcbkoyU0Vycm9yLnByb3RvdHlwZS5tZXNzYWdlID0gXCJcIjtcbkoyU0Vycm9yLnByb3RvdHlwZS5zdGF0dXMgPSA1MDA7XG5KMlNFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBKMlNFcnJvcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgSjJTRXJyb3I6IEoyU0Vycm9yLFxuICAgIEVyckJldHdlZW5TdWZmaXhWYWx1ZVNob3VsZEJlTGlzdDogbmV3IEoyU0Vycm9yKDEwMDEwMSwgYHZhbHVlIGZvciBxdWVyeSBjbGF1c2Ugd2l0aCAnYmV0d2Vlbicgc3VmZml4IG11c3QgYmUgbGlzdGApLFxuICAgIEVyckJldHdlZW5TdWZmaXhWYWx1ZVNob3VsZEJlTGVuZ3RoVHdvOiBuZXcgSjJTRXJyb3IoMTAwMTAyLCBgdmFsdWUgZm9yIHF1ZXJ5IGNsYXVzZSB3aXRoICdiZXR3ZWVuJyBzdWZmaXggbXVzdCBiZSBsaXN0IG9mIGxlbmd0aCAyYCksXG4gICAgRXJyTm90QmV0d2VlblN1ZmZpeFNob3VsZEJlTGlzdDogbmV3IEoyU0Vycm9yKDEwMDEwMywgYHZhbHVlIGZvciBxdWVyeSBjbGF1c2Ugd2l0aCAnbm90X2JldHdlZW4nIHN1ZmZpeCBtdXN0IGJlIGxpc3RgKSxcbiAgICBFcnJOb3RCZXR3ZWVuU3VmZml4U2hvdWxkQmVMZW5ndGhUd286IG5ldyBKMlNFcnJvcigxMDAxMDQsIGB2YWx1ZSBmb3IgcXVlcnkgY2xhdXNlIHdpdGggJ25vdF9iZXR3ZWVuJyBzdWZmaXggbXVzdCBiZSBsaXN0IG9mIGxlbmd0aCAyYCksXG4gICAgRXJySW5TdWZmaXhTaG91bGRCZUxpc3Q6IG5ldyBKMlNFcnJvcigxMDAxMDUsIGB2YWx1ZSBmb3IgcXVlcnkgY2xhdXNlIHdpdGggJ2luJyBzdWZmaXggbXVzdCBiZSBsaXN0YCksXG4gICAgRXJyTm90SW5TdWZmaXhTaG91bGRCZUxpc3Q6IG5ldyBKMlNFcnJvcigxMDAxMDYsIGB2YWx1ZSBmb3IgcXVlcnkgY2xhdXNlIHdpdGggJ25vdF9pbicgc3VmZml4IG11c3QgYmUgbGlzdGApLFxuICAgIEVyck51bGxTdWZmaXhTaG91bGRCZUJvb2xlYW46IG5ldyBKMlNFcnJvcigxMDAxMDcsIGB2YWx1ZSBmb3IgcXVlcnkgY2xhdXNlIHdpdGggJ251bGwnIHN1ZmZpeCBtdXN0IGJlIGJvb2xlYW5gKSxcbiAgICBGbkVyclN1ZmZpeE5vdEltcGxlbWVudGVkOiBmdW5jdGlvbihzdWZmaXgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKMlNFcnJvcigxMDAxMDgsIGBzdWZmaXggJyR7c3VmZml4fScgaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgfSxcbiAgICBFcnJKb2luU2hvdWxkQmVKU09OT2JqZWN0OiBuZXcgSjJTRXJyb3IoMTAwMTA4LCBgdmFsdWUgb2YgJ2pvaW4nIHNob3VsZCBiZSBKU09OIG9iamVjdGApLFxuICAgIEVyck9yZGVyQnlTaG91bGRCZUxpc3Q6IG5ldyBKMlNFcnJvcigxMDAxMDksIGB2YWx1ZSBvZiAnb3JkZXJfYnknIHNob3VsZCBiZSBsaXN0YCksXG4gICAgRXJyT3JkZXJCeUxlbmd0aFNob3VsZEJlVHdvOiBuZXcgSjJTRXJyb3IoMTAwMTEwLCBgdmFsdWUgb2YgJ29yZGVyX2J5JyBjb3VsZCBvbmx5IGJlIG9mIGxlbmd0aCAxIG9yIDJgKSxcbiAgICBGbkVycktleXdvcmROb3RJbXBsZW1lbnRlZDogZnVuY3Rpb24oa2V5d29yZCkge1xuICAgICAgICByZXR1cm4gbmV3IEoyU0Vycm9yKDEwMDExMSwgYGtleXdvcmQgJyR7a2V5d29yZH0nIGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgIH0sXG4gICAgRm5FcnJVbmtub3dSdWxlVHlwZTogZnVuY3Rpb24ocnVsZSkge1xuICAgICAgICByZXR1cm4gbmV3IEoyU0Vycm9yKDEwMDExMiwgYHVua25vd24gcnVsZSB0eXBlOiAke3J1bGV9YCk7XG4gICAgfSxcbiAgICBFcnJPcGVyYXRpb25Ob3RBdXRob3JpemVkOiBuZXcgSjJTRXJyb3IoMTAwMTEzLCBgb3BlcmF0aW9uIG5vdCBhdXRob3JpemVkYCksXG4gICAgRXJyUXVlcnlTaG91bGRCZUpzb25PYmplY3Q6IG5ldyBKMlNFcnJvcigxMDAxMTUsIGB2YWx1ZSBvZiAncXVlcnknIG11c3QgYmUgSlNPTiBvYmplY3RgKSxcbiAgICBFcnJEYXRhU2hvdWxkQmVKc29uT2JqZWN0OiBuZXcgSjJTRXJyb3IoMTAwMTE3LCBgdmFsdWUgb2YgJ2RhdGEnIG11c3QgYmUgSlNPTiBvYmplY3RgKSxcbiAgICBFcnJQb3B1bGF0ZVNob3VsZEJlTGlzdDogbmV3IEoyU0Vycm9yKDEwMDExOCwgYHZhbHVlIG9mICdwb3B1bGF0ZScgbXVzdCBiZSBKU09OIGFycmF5YCksXG4gICAgRXJyUG9wdWxhdGVPYmplY3RTaG91bGRIYXZlRXhhY3RseU9uZUtleTogbmV3IEoyU0Vycm9yKDEwMDExOSwgYHZhbHVlIG9mIGVsZW1lbnQgaW4gJ3BvcHVsYXRlJyB3aXRoIG9iamVjdCB0eXBlIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGtleWApLFxuICAgIEVyclBvcHVsYXRlRWxlbWVudFNob3VsZEJlU3RyaW5nT3JPYmplY3Q6IG5ldyBKMlNFcnJvcigxMDAxMjAsIGB2YWx1ZSBvZiBlbGVtZW50IGluICdwb3B1bGF0ZScgc2hvdWxkIGJlIGVpdGhlciBKU09OIG9iamVjdCBvciBzdHJpbmdgKSxcbiAgICBFcnJFeGlzdHNPYmplY3RTaG91bGRIYXZlRXhhY3RseU9uZUtleTogbmV3IEoyU0Vycm9yKDEwMDEyMSwgYHZhbHVlIG9mICdleGlzdHMnIG9yICdub3RfZXhpc3RzJyBzaG91bGQgYmUgSlNPTiBvYmplY3QgdGhhdCBjb250YWlucyBleGFjdGx5IG9uZSBrZXlgKSxcbiAgICBFcnJBZGRDbGF1c2VTaG91bGRCZUxpc3Q6IG5ldyBKMlNFcnJvcigxMDAxMjIsIGB2YWx1ZSBvZiAnYWRkX2NsYXVzZScgc2hvdWxkIGJlIEpTT04gQXJyYXlgKSxcbiAgICBGbkVycktleUZvcmJpZGRlbjogZnVuY3Rpb24oa2V5d29yZCkge1xuICAgICAgICByZXR1cm4gbmV3IEoyU0Vycm9yKDEwMDEyMywgYGtleXdvcmQgJyR7a2V5d29yZH0nIGlzIGZvcmJpZGRlbmApO1xuICAgIH0sXG4gICAgRXJyQWRkQ2xhdXNlRWxlbWVudFNob3VsZEJlU3RyaW5nT3JPYmplY3Q6IG5ldyBKMlNFcnJvcigxMDAxMjQsIGB2YWx1ZSBvZiBlbGVtZW50IGluICdhZGRfY2xhdXNlJyBzaG91bGQgYmUgZWl0aGVyIEpTT04gb2JqZWN0IG9yIHN0cmluZ2ApLFxuICAgIEVyckxpa2VTaG91bGRCZVN0cmluZ09yTGlzdDogbmV3IEoyU0Vycm9yKDEwMDEyNSwgYHZhbHVlIG9mICdsaWtlJyBzaG91bGQgYmUgZWl0aGVyIEpTT04gYXJyYXkgb3Igc3RyaW5nYCksXG4gICAgRXJyRGVsZXRpb25Ob3RBbGxvd2VkOiBuZXcgSjJTRXJyb3IoMTAwMTI2LCBgZGVsZXRpb24gZm9yIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgaXMgbm90IGFsbG93ZWRgKSxcbiAgICBFcnJSZXNvdXJjZU5vdEZvdW5kOiBuZXcgSjJTRXJyb3IoMTAwMTI3LCBgcmVzb3VyY2Ugbm90IGZvdW5kYCksXG4gICAgRm5FcnJEYXRhYmFzZU9wZXJhdGlvbkVycm9yOiBmdW5jdGlvbihtc2cpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKMlNFcnJvcigxMDAxMjgsIGBEQiBvcGVyYXRpb24gZXJyb3I6ICR7bXNnfWApO1xuICAgIH0sXG4gICAgRm5FcnJDbGF1c2VOb3RFeGlzdHM6IGZ1bmN0aW9uKGNsYXVzZSkge1xuICAgICAgICByZXR1cm4gbmV3IEoyU0Vycm9yKDEwMDEyOSwgYGNsYXVzZSAnJHtjbGF1c2V9JyBpcyBub3QgZGVmaW5lZCBvbiB0aGUgbW9kZWxgKTtcbiAgICB9LFxuICAgIEZuRXJyQ2xhdXNlT2JqZWN0U2hvdWxkSGF2ZUV4YWN0bHlPbmVLZXk6IGZ1bmN0aW9uKGtleXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKMlNFcnJvcigxMDAxMzAsIGBjbGF1c2Ugc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUga2V5LCBidXQgZ290IFske2tleXN9XWApO1xuICAgIH0sXG4gICAgRXJyV2hlcmVLZXl3b3JkV2hlbkdldFdpdGhJZEZvcmJpZGRlbjogbmV3IEoyU0Vycm9yKDEwMDEzMSwgYHRoZSAnd2hlcmUnIGtleXdvcmQgaXMgbm90IGFsbG93ZWQgd2hlbiBnZXQgb2JqZWN0cyB3aXRoIGlkYCksXG4gICAgRm5FcnJWYWx1ZVNob3VsZEJlT2JqZWN0OiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKMlNFcnJvcigxMDAxMzIsIGB0aGUgdmFsdWUgb2Yga2V5ICcke2tleX0nIHNob3VsZCBiZSBvYmplY3RgKTtcbiAgICB9LFxuICAgIEZuRXJyVmFsdWVTaG91bGRCZUFycmF5OiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKMlNFcnJvcigxMDAxMzMsIGB0aGUgdmFsdWUgb2Yga2V5ICcke2tleX0nIHNob3VsZCBiZSBhcnJheWApO1xuICAgIH0sXG4gICAgRXJyUmVsYXRpb25LZXlDb25mbGljdHM6IG5ldyBKMlNFcnJvcigxMDAxMzQsIGAncmVwbGFjZScgY29uZmxpY3RzIHdpdGggJ2FkZCcsICdyZW1vdmUnIG9yICdjcmVhdGUnYCksXG4gICAgRm5FcnJVbmtub3duUmVsYXRpb25UeXBlOiBmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSjJTRXJyb3IoMTAwMTM1LCBgcmVsYXRpb24gdHlwZSAnJHt0eXBlfScgaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgfSxcbiAgICBFcnJOb1F1ZXJ5T3JXaGVyZVN1cHBsaWVkOiBuZXcgSjJTRXJyb3IoMTAwMTM2LCBgbm8gJ3F1ZXJ5JyBvciAnd2hlcmUnIHN1cHBsaWVkIGluIGJvZHkgd2hlbiB1cGRhdGluZyBkYXRhYCksXG4gICAgRXJyV2hlcmVLZXl3b3JkV2hlblB1dFdpdGhJZEZvcmJpZGRlbjogbmV3IEoyU0Vycm9yKDEwMDEzNywgYHRoZSAnd2hlcmUnIGtleXdvcmQgaXMgbm90IGFsbG93ZWQgd2hlbiBwdXQgb2JqZWN0cyB3aXRoIGlkYCksXG4gICAgRXJyV2hlcmVLZXl3b3JkV2hlbkRlbGV0ZVdpdGhJZEZvcmJpZGRlbjogbmV3IEoyU0Vycm9yKDEwMDEzOCwgYHRoZSAnd2hlcmUnIGtleXdvcmQgaXMgbm90IGFsbG93ZWQgd2hlbiBkZWxldGUgb2JqZWN0cyB3aXRoIGlkYCksXG4gICAgRm5FcnJWYWx1ZVNob3VsZEJlTnVtYmVyT3JPYmplY3Q6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gbmV3IEoyU0Vycm9yKDEwMDEzOSwgYHRoZSB2YWx1ZSBvZiBrZXkgJyR7a2V5fScgc2hvdWxkIGJlIG51bWJlciBvciBvYmplY3RgKTtcbiAgICB9LFxufVxuIl19