From eba674a7c50843bc5742a720d7af15b2e10b0cdc Mon Sep 17 00:00:00 2001 From: eastolfi Date: Tue, 14 Jun 2016 14:49:50 +0000 Subject: [PATCH] feat(aggregation): Add aggregation stages: match, sort --- lib/Aggregation.js | 44 +- lib/Collection.js | 7 +- lib/Cursor.js | 113 +++- lib/Selector.js | 10 +- src/Aggregation.js | 42 +- src/Collection.js | 5 +- src/Cursor.js | 106 +++- src/Selector.js | 8 +- test/3_Cursor.js | 6 +- test/5_Aggregation.js | 1194 +++++------------------------------------ 10 files changed, 407 insertions(+), 1128 deletions(-) diff --git a/lib/Aggregation.js b/lib/Aggregation.js index 8adcce9..927839b 100644 --- a/lib/Aggregation.js +++ b/lib/Aggregation.js @@ -16,20 +16,22 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope */ var _ = require("lodash"), - Logger = require("jsw-logger"); + Logger = require("jsw-logger"), + Cursor = require("./Cursor"), + Selector = require("./Selector"); var logger = null; var stages = { '$project': false, - '$match': false, + '$match': true, '$redact': false, '$limit': false, '$skip': false, '$unwind': false, '$group': true, '$sample': false, - '$sort': false, + '$sort': true, '$geoNear': false, '$lookup': false, '$out': false, @@ -163,11 +165,29 @@ var do_single_group = function do_single_group(group_id, group_stage, documents) var do_complex_group = function do_complex_group() {}; +var do_sort = function do_sort(documents, sort_stage) { + return documents.sort(new Selector(sort_stage, Selector.SORT_SELECTOR)); +}; + +var do_match = function do_match(documents, match_stage) { + var cursor = new Cursor(documents, match_stage); + + return cursor.fetch(); +}; + var do_group = function do_group(documents, group_stage) { if (!_.hasIn(group_stage, '_id')) logger.throw('The field "_id" is required in the "$group" stage'); var new_id = group_stage['_id']; + if (!_.isNull(new_id)) { + if (new_id.substr(0, 1) !== '$') { + logger.throw("Field names references in a right side assignement must be preceded by '$'"); + } else { + new_id = new_id.substr(1, new_id.length); + } + } + if (_.isPlainObject(new_id)) { // complex_id // do_complex_group(); @@ -189,16 +209,30 @@ var Aggregation = function () { _createClass(Aggregation, [{ key: "aggregate", value: function aggregate(collection) { + var docs = collection.docs; + for (var i = 0; i < this.pipeline.length; i++) { var stage = this.pipeline[i]; for (var key in stage) { switch (key) { + case '$match': + docs = do_match(docs, stage[key]); + + break; case '$group': - return do_group(collection.docs, stage[key]); + docs = do_group(docs, stage[key]); + + break; + case '$sort': + docs = do_sort(docs, stage[key]); + + break; } } } + + return docs; // move to cursor } }, { key: "validStage", @@ -215,4 +249,4 @@ var Aggregation = function () { }(); module.exports = Aggregation; -//# sourceMappingURL=data:application/json;base64,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QUEvQixRQUFQOztBQUU3QixnQkFBSSxPQUFPLEtBQVAsTUFBa0IsS0FBdEIsRUFBNkIsT0FBTyxPQUFPLEtBQVAsMEJBQW1DLEtBQW5DLFFBQVA7O0FBRTdCLG1CQUFPLElBQVA7QUFDSDs7Ozs7O0FBSUwsT0FBTyxPQUFQLEdBQWlCLFdBQWpCIiwiZmlsZSI6IkFnZ3JlZ2F0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBDdXJzb3IuanMgLSBiYXNlZCBvbiBNb25nbG8jQ3Vyc29yICh7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL01vbmdsb30pIGJ5IENocmlzdGlhbiBTdWxsaXZhbiA8Y3NAZXVmb3JpYy5jbz4gfCBDb3B5cmlnaHQgKGMpIDIwMTJcbiAqIEB2ZXJzaW9uIDEuMC4wXG4gKiBcbiAqIEBhdXRob3IgRWR1YXJkbyBBc3RvbGZpIDxlZHVhcmRvLmFzdG9sZmk5MUBnbWFpbC5jb20+XG4gKiBAY29weXJpZ2h0IDIwMTYgRWR1YXJkbyBBc3RvbGZpIDxlZHVhcmRvLmFzdG9sZmk5MUBnbWFpbC5jb20+XG4gKiBAbGljZW5zZSBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIiksXG4gICAgTG9nZ2VyID0gcmVxdWlyZShcImpzdy1sb2dnZXJcIik7XG4gICAgXG52YXIgbG9nZ2VyID0gbnVsbDtcblxudmFyIHN0YWdlcyA9IHtcbiAgICAnJHByb2plY3QnOiBmYWxzZSxcbiAgICAnJG1hdGNoJzogZmFsc2UsXG4gICAgJyRyZWRhY3QnOiBmYWxzZSxcbiAgICAnJGxpbWl0JzogZmFsc2UsXG4gICAgJyRza2lwJzogZmFsc2UsXG4gICAgJyR1bndpbmQnOiBmYWxzZSxcbiAgICAnJGdyb3VwJzogdHJ1ZSxcbiAgICAnJHNhbXBsZSc6IGZhbHNlLFxuICAgICckc29ydCc6IGZhbHNlLFxuICAgICckZ2VvTmVhcic6IGZhbHNlLFxuICAgICckbG9va3VwJzogZmFsc2UsXG4gICAgJyRvdXQnOiBmYWxzZSxcbiAgICAnJGluZGV4U3RhdHMnOiBmYWxzZVxufTtcblxudmFyIGdyb3VwX29wZXJhdG9ycyA9IHtcbiAgICAkc3VtOiBmdW5jdGlvbihkb2N1bWVudHMsIG5ld19pZCwgbmV3X2ZpZWxkLCB2YWx1ZSwgaXNDb3VudCkge1xuICAgICAgICB2YXIgbmV3X2RvY3MgPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZG9jdW1lbnRzW2ldO1xuICAgICAgICAgICAgbGV0IHZhbCA9IHZhbHVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIWlzQ291bnQpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBkb2NbdmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCldIHx8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChfLmhhc0luKGRvYywgbmV3X2lkKSkge1xuICAgICAgICAgICAgICAgIGxldCBfaWQgPSBkb2NbbmV3X2lkXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIV8uaGFzSW4obmV3X2RvY3MsIF9pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3X2RvY3NbX2lkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9pZDogX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgW25ld19maWVsZF06IF8udG9OdW1iZXIodmFsKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld19kb2NzW19pZF1bbmV3X2ZpZWxkXSArPSBfLnRvTnVtYmVyKHZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbmV3X2RvY3M7XG4gICAgfSxcbiAgICBcbiAgICAkYXZnOiBmdW5jdGlvbihkb2N1bWVudHMsIG5ld19pZCwgbmV3X2ZpZWxkLCB2YWx1ZSwgaXNDb3VudCkge1xuICAgICAgICB2YXIgbmV3X2RvY3MgPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZG9jdW1lbnRzW2ldO1xuICAgICAgICAgICAgbGV0IHZhbCA9IHZhbHVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoIWlzQ291bnQpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBkb2NbdmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCldIHx8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChfLmhhc0luKGRvYywgbmV3X2lkKSB8fCBfLmlzTnVsbChuZXdfaWQpKSB7XG4gICAgICAgICAgICAgICAgbGV0IF9pZCA9IGRvY1tuZXdfaWRdIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKCFfLmhhc0luKG5ld19kb2NzLCBfaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld19kb2NzW19pZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfaWQ6IF9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZXdfZmllbGRdOiBfLnRvTnVtYmVyKHZhbCksXG4gICAgICAgICAgICAgICAgICAgICAgICBfX0NPVU5UX186IDFcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdfZG9jc1tfaWRdW25ld19maWVsZF0gKz0gXy50b051bWJlcih2YWwpO1xuICAgICAgICAgICAgICAgICAgICBuZXdfZG9jc1tfaWRdLl9fQ09VTlRfXysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIG5ld19kb2NzKSB7XG4gICAgICAgICAgICBuZXdfZG9jc1trZXldW25ld19maWVsZF0gPSBuZXdfZG9jc1trZXldW25ld19maWVsZF0gLyBuZXdfZG9jc1trZXldLl9fQ09VTlRfXztcbiAgICAgICAgICAgIGRlbGV0ZSBuZXdfZG9jc1trZXldLl9fQ09VTlRfXztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG5ld19kb2NzO1xuICAgIH0gXG59O1xuXG52YXIgZG9fc2luZ2xlX2dyb3VwID0gZnVuY3Rpb24oZ3JvdXBfaWQsIGdyb3VwX3N0YWdlLCBkb2N1bWVudHMpIHtcbiAgICAvLyB2YXIgb3BlcmF0b3JzID0ge307XG4gICAgXG4gICAgbGV0IGRvY3MgPSB7fTtcbiAgICBcbiAgICBmb3IgKGxldCBmaWVsZCBpbiBncm91cF9zdGFnZSkge1xuICAgICAgICBpZiAoZmllbGQgIT09ICdfaWQnKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgZ3JvdXAgZmllbGRcbiAgICAgICAgICAgIC8vIGxldCBncm91cF9rZXkgPSBrZXk7XG4gICAgICAgICAgICBsZXQgZ3JvdXBfZmllbGQgPSBncm91cF9zdGFnZVtmaWVsZF07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBncm91cF9maWVsZCkge1xuICAgICAgICAgICAgICAgIGlmICghXy5oYXNJbihncm91cF9vcGVyYXRvcnMsIGtleSkpIGxvZ2dlci50aHJvdyhgVW5rbm93biBhY2N1bXVsYXRvciBvcGVyYXRvciBcIiR7a2V5fVwiIGZvciBncm91cCBzdGFnZWApO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBhbGwgZG9jdW1lbnRzXG4gICAgICAgICAgICAgICAgLy8gdmFyIG5ld19kb2NzID0ge307XG4gICAgICAgICAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBkb2N1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgbGV0IGRvYyA9IGRvY3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChfLmhhc0luKGRvYywgZ3JvdXBfaWQpKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBsZXQgX2lkID0gZG9jW2dyb3VwX2lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKCFfLmhhc0luKG5ld19kb2NzLCBfaWQpKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbmV3X2RvY3NbX2lkXSA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgX2lkOiBfaWQsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFtuZXdfZmllbGRdOiB2YWx1ZVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG5ld19kb2NzW19pZF1bbmV3X2ZpZWxkXSArPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBpZiAoIV8uaGFzSW4ob3BlcmF0b3JzLCBrZXkpKSBvcGVyYXRvcnNba2V5XSA9IFtdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yc1trZXldLnB1c2goe1xuICAgICAgICAgICAgICAgIC8vICAgICBuZXdfZmllbGQ6IGZpZWxkLFxuICAgICAgICAgICAgICAgIC8vICAgICB2YWx1ZTogZ3JvdXBfZmllbGRba2V5XVxuICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKF8uaXNTdHJpbmcoZ3JvdXBfZmllbGRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwX2ZpZWxkW2tleV0uc3Vic3RyKDAsIDEpICE9PSAnJCcpIGxvZ2dlci50aHJvdyhcIkZpZWxkIG5hbWVzIHJlZmVyZW5jZXMgaW4gYSByaWdodCBzaWRlIGFzc2lnbmVtZW50IG11c3QgYmUgcHJlY2VkZWQgYnkgJyQnXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfLmlzRmluaXRlKF8udG9OdW1iZXIoZ3JvdXBfZmllbGRba2V5XSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBvcGVyYXRvciA9IGdyb3VwX29wZXJhdG9yc1trZXldO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIF8ubWVyZ2UoZG9jcywgb3BlcmF0b3IoZG9jdW1lbnRzLCBncm91cF9pZCwgZmllbGQsIGdyb3VwX2ZpZWxkW2tleV0sIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIF8udmFsdWVzKGRvY3MpO1xufTtcblxudmFyIGRvX2NvbXBsZXhfZ3JvdXAgPSBmdW5jdGlvbigpIHtcbiAgICBcbn07XG5cbnZhciBkb19ncm91cCA9IGZ1bmN0aW9uKGRvY3VtZW50cywgZ3JvdXBfc3RhZ2UpIHtcbiAgICBpZiAoIV8uaGFzSW4oZ3JvdXBfc3RhZ2UsICdfaWQnKSkgbG9nZ2VyLnRocm93KCdUaGUgZmllbGQgXCJfaWRcIiBpcyByZXF1aXJlZCBpbiB0aGUgXCIkZ3JvdXBcIiBzdGFnZScpO1xuICAgIFxuICAgIGxldCBuZXdfaWQgPSBncm91cF9zdGFnZVsnX2lkJ107XG4gICAgICAgICAgICAgICAgXG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChuZXdfaWQpKSB7XG4gICAgICAgIC8vIGNvbXBsZXhfaWRcbiAgICAgICAgLy8gZG9fY29tcGxleF9ncm91cCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNpbmdsZV9pZFxuICAgICAgICByZXR1cm4gZG9fc2luZ2xlX2dyb3VwKG5ld19pZCwgZ3JvdXBfc3RhZ2UsIGRvY3VtZW50cyk7XG4gICAgfVxufTtcblxuY2xhc3MgQWdncmVnYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHBpcGVsaW5lKSB7XG4gICAgICAgIGxvZ2dlciA9IExvZ2dlci5pbnN0YW5jZTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMucGlwZWxpbmUgPSBwaXBlbGluZTtcbiAgICB9XG4gICAgXG4gICAgYWdncmVnYXRlKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBpcGVsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhZ2UgPSB0aGlzLnBpcGVsaW5lW2ldO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gc3RhZ2UpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICckZ3JvdXAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvX2dyb3VwKGNvbGxlY3Rpb24uZG9jcywgc3RhZ2Vba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhbGlkU3RhZ2Uoc3RhZ2UpIHtcbiAgICAgICAgaWYgKCFfLmhhc0luKHN0YWdlcywgc3RhZ2UpKSByZXR1cm4gbG9nZ2VyLnRocm93KGBVbmtub3duIHN0YWdlIFwiJHtzdGFnZX1cImApO1xuICAgICAgICBcbiAgICAgICAgaWYgKHN0YWdlc1tzdGFnZV0gPT09IGZhbHNlKSByZXR1cm4gbG9nZ2VyLnRocm93KGBVbnN1cHBvcnRlZCBzdGFnZSBcIiR7c3RhZ2V9XCJgKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IEFnZ3JlZ2F0aW9uOyJdfQ== +//# sourceMappingURL=data:application/json;base64,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b250ZW50IjpbIi8qKlxuICogQGZpbGUgQ3Vyc29yLmpzIC0gYmFzZWQgb24gTW9uZ2xvI0N1cnNvciAoe0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb25nbG99KSBieSBDaHJpc3RpYW4gU3VsbGl2YW4gPGNzQGV1Zm9yaWMuY28+IHwgQ29weXJpZ2h0IChjKSAyMDEyXG4gKiBAdmVyc2lvbiAxLjAuMFxuICogXG4gKiBAYXV0aG9yIEVkdWFyZG8gQXN0b2xmaSA8ZWR1YXJkby5hc3RvbGZpOTFAZ21haWwuY29tPlxuICogQGNvcHlyaWdodCAyMDE2IEVkdWFyZG8gQXN0b2xmaSA8ZWR1YXJkby5hc3RvbGZpOTFAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIF8gPSByZXF1aXJlKFwibG9kYXNoXCIpLFxuICAgIExvZ2dlciA9IHJlcXVpcmUoXCJqc3ctbG9nZ2VyXCIpLFxuICAgIEN1cnNvciA9IHJlcXVpcmUoXCIuL0N1cnNvclwiKSxcbiAgICBTZWxlY3RvciA9IHJlcXVpcmUoXCIuL1NlbGVjdG9yXCIpO1xuICAgIFxudmFyIGxvZ2dlciA9IG51bGw7XG5cbnZhciBzdGFnZXMgPSB7XG4gICAgJyRwcm9qZWN0JzogZmFsc2UsXG4gICAgJyRtYXRjaCc6IHRydWUsXG4gICAgJyRyZWRhY3QnOiBmYWxzZSxcbiAgICAnJGxpbWl0JzogZmFsc2UsXG4gICAgJyRza2lwJzogZmFsc2UsXG4gICAgJyR1bndpbmQnOiBmYWxzZSxcbiAgICAnJGdyb3VwJzogdHJ1ZSxcbiAgICAnJHNhbXBsZSc6IGZhbHNlLFxuICAgICckc29ydCc6IHRydWUsXG4gICAgJyRnZW9OZWFyJzogZmFsc2UsXG4gICAgJyRsb29rdXAnOiBmYWxzZSxcbiAgICAnJG91dCc6IGZhbHNlLFxuICAgICckaW5kZXhTdGF0cyc6IGZhbHNlXG59O1xuXG52YXIgZ3JvdXBfb3BlcmF0b3JzID0ge1xuICAgICRzdW06IGZ1bmN0aW9uKGRvY3VtZW50cywgbmV3X2lkLCBuZXdfZmllbGQsIHZhbHVlLCBpc0NvdW50KSB7XG4gICAgICAgIHZhciBuZXdfZG9jcyA9IHt9O1xuICAgICAgICBcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2N1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBkb2MgPSBkb2N1bWVudHNbaV07XG4gICAgICAgICAgICBsZXQgdmFsID0gdmFsdWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghaXNDb3VudCkge1xuICAgICAgICAgICAgICAgIHZhbCA9IGRvY1t2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoKV0gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKF8uaGFzSW4oZG9jLCBuZXdfaWQpKSB7XG4gICAgICAgICAgICAgICAgbGV0IF9pZCA9IGRvY1tuZXdfaWRdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghXy5oYXNJbihuZXdfZG9jcywgX2lkKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdfZG9jc1tfaWRdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2lkOiBfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmV3X2ZpZWxkXTogXy50b051bWJlcih2YWwpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3X2RvY3NbX2lkXVtuZXdfZmllbGRdICs9IF8udG9OdW1iZXIodmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBuZXdfZG9jcztcbiAgICB9LFxuICAgIFxuICAgICRhdmc6IGZ1bmN0aW9uKGRvY3VtZW50cywgbmV3X2lkLCBuZXdfZmllbGQsIHZhbHVlLCBpc0NvdW50KSB7XG4gICAgICAgIHZhciBuZXdfZG9jcyA9IHt9O1xuICAgICAgICBcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2N1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBkb2MgPSBkb2N1bWVudHNbaV07XG4gICAgICAgICAgICBsZXQgdmFsID0gdmFsdWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghaXNDb3VudCkge1xuICAgICAgICAgICAgICAgIHZhbCA9IGRvY1t2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoKV0gfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKF8uaGFzSW4oZG9jLCBuZXdfaWQpIHx8IF8uaXNOdWxsKG5ld19pZCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgX2lkID0gZG9jW25ld19pZF0gfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIV8uaGFzSW4obmV3X2RvY3MsIF9pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3X2RvY3NbX2lkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9pZDogX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgW25ld19maWVsZF06IF8udG9OdW1iZXIodmFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fQ09VTlRfXzogMVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld19kb2NzW19pZF1bbmV3X2ZpZWxkXSArPSBfLnRvTnVtYmVyKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld19kb2NzW19pZF0uX19DT1VOVF9fKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gbmV3X2RvY3MpIHtcbiAgICAgICAgICAgIG5ld19kb2NzW2tleV1bbmV3X2ZpZWxkXSA9IG5ld19kb2NzW2tleV1bbmV3X2ZpZWxkXSAvIG5ld19kb2NzW2tleV0uX19DT1VOVF9fO1xuICAgICAgICAgICAgZGVsZXRlIG5ld19kb2NzW2tleV0uX19DT1VOVF9fO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbmV3X2RvY3M7XG4gICAgfSBcbn07XG5cbnZhciBkb19zaW5nbGVfZ3JvdXAgPSBmdW5jdGlvbihncm91cF9pZCwgZ3JvdXBfc3RhZ2UsIGRvY3VtZW50cykge1xuICAgIC8vIHZhciBvcGVyYXRvcnMgPSB7fTtcbiAgICBcbiAgICBsZXQgZG9jcyA9IHt9O1xuICAgIFxuICAgIGZvciAobGV0IGZpZWxkIGluIGdyb3VwX3N0YWdlKSB7XG4gICAgICAgIGlmIChmaWVsZCAhPT0gJ19pZCcpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBncm91cCBmaWVsZFxuICAgICAgICAgICAgLy8gbGV0IGdyb3VwX2tleSA9IGtleTtcbiAgICAgICAgICAgIGxldCBncm91cF9maWVsZCA9IGdyb3VwX3N0YWdlW2ZpZWxkXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGdyb3VwX2ZpZWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfLmhhc0luKGdyb3VwX29wZXJhdG9ycywga2V5KSkgbG9nZ2VyLnRocm93KGBVbmtub3duIGFjY3VtdWxhdG9yIG9wZXJhdG9yIFwiJHtrZXl9XCIgZm9yIGdyb3VwIHN0YWdlYCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFsbCBkb2N1bWVudHNcbiAgICAgICAgICAgICAgICAvLyB2YXIgbmV3X2RvY3MgPSB7fTtcbiAgICAgICAgICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IGRvY3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgZG9jID0gZG9jdW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKF8uaGFzSW4oZG9jLCBncm91cF9pZCkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGxldCBfaWQgPSBkb2NbZ3JvdXBfaWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoIV8uaGFzSW4obmV3X2RvY3MsIF9pZCkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBuZXdfZG9jc1tfaWRdID0ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBfaWQ6IF9pZCxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgW25ld19maWVsZF06IHZhbHVlXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbmV3X2RvY3NbX2lkXVtuZXdfZmllbGRdICs9IHZhbHVlO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIGlmICghXy5oYXNJbihvcGVyYXRvcnMsIGtleSkpIG9wZXJhdG9yc1trZXldID0gW107XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gb3BlcmF0b3JzW2tleV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgLy8gICAgIG5ld19maWVsZDogZmllbGQsXG4gICAgICAgICAgICAgICAgLy8gICAgIHZhbHVlOiBncm91cF9maWVsZFtrZXldXG4gICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoXy5pc1N0cmluZyhncm91cF9maWVsZFtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBfZmllbGRba2V5XS5zdWJzdHIoMCwgMSkgIT09ICckJykgbG9nZ2VyLnRocm93KFwiRmllbGQgbmFtZXMgcmVmZXJlbmNlcyBpbiBhIHJpZ2h0IHNpZGUgYXNzaWduZW1lbnQgbXVzdCBiZSBwcmVjZWRlZCBieSAnJCdcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIV8uaXNGaW5pdGUoXy50b051bWJlcihncm91cF9maWVsZFtrZXldKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IG9wZXJhdG9yID0gZ3JvdXBfb3BlcmF0b3JzW2tleV07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXy5tZXJnZShkb2NzLCBvcGVyYXRvcihkb2N1bWVudHMsIGdyb3VwX2lkLCBmaWVsZCwgZ3JvdXBfZmllbGRba2V5XSwgY291bnQpKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gXy52YWx1ZXMoZG9jcyk7XG59O1xuXG52YXIgZG9fY29tcGxleF9ncm91cCA9IGZ1bmN0aW9uKCkge1xuICAgIFxufTtcblxudmFyIGRvX3NvcnQgPSBmdW5jdGlvbihkb2N1bWVudHMsIHNvcnRfc3RhZ2UpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRzLnNvcnQobmV3IFNlbGVjdG9yKHNvcnRfc3RhZ2UsIFNlbGVjdG9yLlNPUlRfU0VMRUNUT1IpKTtcbn07XG5cbnZhciBkb19tYXRjaCA9IGZ1bmN0aW9uKGRvY3VtZW50cywgbWF0Y2hfc3RhZ2UpIHtcbiAgICB2YXIgY3Vyc29yID0gbmV3IEN1cnNvcihkb2N1bWVudHMsIG1hdGNoX3N0YWdlKTtcbiAgICBcbiAgICByZXR1cm4gY3Vyc29yLmZldGNoKCk7XG59O1xuXG52YXIgZG9fZ3JvdXAgPSBmdW5jdGlvbihkb2N1bWVudHMsIGdyb3VwX3N0YWdlKSB7XG4gICAgaWYgKCFfLmhhc0luKGdyb3VwX3N0YWdlLCAnX2lkJykpIGxvZ2dlci50aHJvdygnVGhlIGZpZWxkIFwiX2lkXCIgaXMgcmVxdWlyZWQgaW4gdGhlIFwiJGdyb3VwXCIgc3RhZ2UnKTtcbiAgICBcbiAgICBsZXQgbmV3X2lkID0gZ3JvdXBfc3RhZ2VbJ19pZCddO1xuICAgIFxuICAgIGlmICghXy5pc051bGwobmV3X2lkKSkge1xuICAgICAgICBpZiAobmV3X2lkLnN1YnN0cigwLCAxKSAhPT0gJyQnKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3coXCJGaWVsZCBuYW1lcyByZWZlcmVuY2VzIGluIGEgcmlnaHQgc2lkZSBhc3NpZ25lbWVudCBtdXN0IGJlIHByZWNlZGVkIGJ5ICckJ1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld19pZCA9IG5ld19pZC5zdWJzdHIoMSwgbmV3X2lkLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgaWYgKF8uaXNQbGFpbk9iamVjdChuZXdfaWQpKSB7XG4gICAgICAgIC8vIGNvbXBsZXhfaWRcbiAgICAgICAgLy8gZG9fY29tcGxleF9ncm91cCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNpbmdsZV9pZFxuICAgICAgICByZXR1cm4gZG9fc2luZ2xlX2dyb3VwKG5ld19pZCwgZ3JvdXBfc3RhZ2UsIGRvY3VtZW50cyk7XG4gICAgfVxufTtcblxuY2xhc3MgQWdncmVnYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHBpcGVsaW5lKSB7XG4gICAgICAgIGxvZ2dlciA9IExvZ2dlci5pbnN0YW5jZTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMucGlwZWxpbmUgPSBwaXBlbGluZTtcbiAgICB9XG4gICAgXG4gICAgYWdncmVnYXRlKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGRvY3MgPSBjb2xsZWN0aW9uLmRvY3M7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGlwZWxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGFnZSA9IHRoaXMucGlwZWxpbmVbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBzdGFnZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJyRtYXRjaCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2NzID0gZG9fbWF0Y2goZG9jcywgc3RhZ2Vba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICckZ3JvdXAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jcyA9IGRvX2dyb3VwKGRvY3MsIHN0YWdlW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnJHNvcnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jcyA9IGRvX3NvcnQoZG9jcywgc3RhZ2Vba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGRvY3M7ICAgIC8vIG1vdmUgdG8gY3Vyc29yXG4gICAgfVxuICAgIFxuICAgIHZhbGlkU3RhZ2Uoc3RhZ2UpIHtcbiAgICAgICAgaWYgKCFfLmhhc0luKHN0YWdlcywgc3RhZ2UpKSByZXR1cm4gbG9nZ2VyLnRocm93KGBVbmtub3duIHN0YWdlIFwiJHtzdGFnZX1cImApO1xuICAgICAgICBcbiAgICAgICAgaWYgKHN0YWdlc1tzdGFnZV0gPT09IGZhbHNlKSByZXR1cm4gbG9nZ2VyLnRocm93KGBVbnN1cHBvcnRlZCBzdGFnZSBcIiR7c3RhZ2V9XCJgKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IEFnZ3JlZ2F0aW9uOyJdfQ== diff --git a/lib/Collection.js b/lib/Collection.js index 1350921..1d940f0 100644 --- a/lib/Collection.js +++ b/lib/Collection.js @@ -203,8 +203,7 @@ Collection.prototype.find = function (selection, fields, options, callback) { options = params.options; callback = params.callback; - // callback for backward compatibility - var cursor = new Cursor(this.db, this, selection, fields, options); + var cursor = new Cursor(this.docs, selection, fields, options); /** * "find" event. @@ -262,7 +261,7 @@ Collection.prototype.findOne = function (selection, fields, options, callback) { options = params.options; callback = params.callback; - var cursor = new Cursor(this.db, this, selection, fields, options); + var cursor = new Cursor(this.docs, selection, fields, options); /** * "findOne" event. @@ -1254,4 +1253,4 @@ var _ensureFindParams = function _ensureFindParams(params) { return params; }; -//# sourceMappingURL=data:application/json;base64,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QUQsSUFBNkIsQ0FBQyxFQUFFLFVBQUYsQ0FBYSxPQUFPLFFBQXBCLENBQWxDLEVBQWlFO0FBQzdELGVBQU8sS0FBUCxDQUFhLDZCQUFiO0FBQ0g7O0FBRUQsUUFBSSxPQUFPLE9BQVAsQ0FBZSxNQUFuQixFQUEyQjtBQUN2QixZQUFJLEVBQUUsS0FBRixDQUFRLE9BQU8sTUFBZixLQUEwQixPQUFPLE1BQVAsQ0FBYyxNQUFkLEtBQXlCLENBQXZELEVBQTBEO0FBQ3RELG1CQUFPLE1BQVAsR0FBZ0IsT0FBTyxPQUFQLENBQWUsTUFBL0I7QUFDSCxTQUZELE1BRU87QUFDSCxtQkFBTyxJQUFQLENBQVksb0RBQVo7QUFDSDtBQUNKOztBQUVELFdBQU8sTUFBUDtBQUNILENBckREIiwiZmlsZSI6IkNvbGxlY3Rpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIENvbGxlY3Rpb24uanMgLSBiYXNlZCBvbiBNb25nbG8jQ29sbGVjdGlvbiAoe0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb25nbG99KSBieSBDaHJpc3RpYW4gU3VsbGl2YW4gPGNzQGV1Zm9yaWMuY28+IHwgQ29weXJpZ2h0IChjKSAyMDEyXG4gKiBAdmVyc2lvbiAxLjAuMFxuICogXG4gKiBAYXV0aG9yIEVkdWFyZG8gQXN0b2xmaSA8ZWFzdG9sZmk5MUBnbWFpbC5jb20+XG4gKiBAY29weXJpZ2h0IDIwMTYgRWR1YXJkbyBBc3RvbGZpIDxlYXN0b2xmaTkxQGdtYWlsLmNvbT5cbiAqIEBsaWNlbnNlIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBMb2dnZXIgPSByZXF1aXJlKFwianN3LWxvZ2dlclwiKSxcbiAgICBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiLi91dGlscy9FdmVudEVtaXR0ZXJcIiksXG4gICAgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIiksXG4gICAgQWdncmVnYXRpb24gPSByZXF1aXJlKFwiLi9BZ2dyZWdhdGlvblwiKSxcbiAgICBDdXJzb3IgPSByZXF1aXJlKFwiLi9DdXJzb3JcIiksXG4gICAgT2JqZWN0SWQgPSByZXF1aXJlKCcuL09iamVjdElkJyksXG4gICAgU2VsZWN0b3IgPSByZXF1aXJlKFwiLi9TZWxlY3RvclwiKSxcbiAgICBTZWxlY3Rvck1hdGNoZXIgPSByZXF1aXJlKFwiLi9TZWxlY3Rvck1hdGNoZXJcIik7XG4gICAgXG52YXIgbG9nZ2VyID0gbnVsbDtcbiAgICBcbi8qKlxuICogQ29sbGVjdGlvblxuICogXG4gKiBAbW9kdWxlIENvbGxlY3Rpb25cbiAqIEBjb25zdHJ1Y3RvclxuICogQHNpbmNlIDAuMC4xXG4gKiBcbiAqIEBjbGFzc2Rlc2MgQ29sbGVjdGlvbiBjbGFzcyB0aGF0IG1hcHMgYSBNb25nb0RCLWxpa2UgY29sbGVjdGlvblxuICogXG4gKiBAcGFyYW0ge01vbmdvUG9ydGFibGV9IGRiIC0gQWRkaXRpb25hbCBvcHRpb25zXG4gKiBAcGFyYW0ge1N0cmluZ30gY29sbGVjdGlvbk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIERhdGFiYXNlIG9iamVjdFxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucGtGYWN0b3J5PW51bGxdIC0gT2JqZWN0IG92ZXJyaWRpbmcgdGhlIGJhc2ljIFwiT2JqZWN0SWRcIiBwcmltYXJ5IGtleSBnZW5lcmF0aW9uLlxuICogXG4gKi9cbnZhciBkYXRhYmFzZSA9IG51bGw7XG5jbGFzcyBDb2xsZWN0aW9uIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbi8vIHZhciBDb2xsZWN0aW9uID0gZnVuY3Rpb24oZGIsIGNvbGxlY3Rpb25OYW1lLCBvcHRpb25zKSB7XG4gICAgY29uc3RydWN0b3IoZGIsIGNvbGxlY3Rpb25OYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29sbGVjdGlvbikpIHJldHVybiBuZXcgQ29sbGVjdGlvbihkYiwgY29sbGVjdGlvbk5hbWUsIG9wdGlvbnMpO1xuICAgICAgICBcbiAgICAgICAgbG9nZ2VyID0gTG9nZ2VyLmluc3RhbmNlO1xuICAgIFxuICAgICAgICBpZiAoXy5pc05pbChkYikpIGxvZ2dlci50aHJvdyhcImRiIHBhcmFtZXRlciByZXF1aXJlZFwiKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChfLmlzTmlsKGNvbGxlY3Rpb25OYW1lKSkgbG9nZ2VyLnRocm93KFwiY29sbGVjdGlvbk5hbWUgcGFyYW1ldGVyIHJlcXVpcmVkXCIpO1xuICAgICAgICBcbiAgICAgICAgaWYgKF8uaXNOaWwob3B0aW9ucykgfHwgIV8uaXNQbGFpbk9iamVjdChvcHRpb25zKSkgb3B0aW9ucyA9IHt9O1xuICAgICAgICBcbiAgICAgICAgQ29sbGVjdGlvbi5jaGVja0NvbGxlY3Rpb25OYW1lKGNvbGxlY3Rpb25OYW1lKTtcbiAgICBcbiAgICAgICAgLy8gdGhpcy5kYiA9IGRiO1xuICAgICAgICBkYXRhYmFzZSA9IGRiO1xuICAgICAgICB0aGlzLm5hbWUgPSBjb2xsZWN0aW9uTmFtZTtcbiAgICAgICAgdGhpcy5kYXRhYmFzZU5hbWUgPSBkYi5kYXRhYmFzZU5hbWU7XG4gICAgICAgIHRoaXMuZnVsbE5hbWUgPSB0aGlzLmRhdGFiYXNlTmFtZSArICcuJyArIHRoaXMubmFtZTtcbiAgICAgICAgdGhpcy5kb2NzID0gW107XG4gICAgICAgIHRoaXMuZG9jX2luZGV4ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5zbmFwc2hvdHMgPSBbXTtcbiAgICAgICAgdGhpcy5vcHRzID0ge307IC8vIERlZmF1bHQgb3B0aW9uc1xuICAgICAgICBcbiAgICAgICAgXy5tZXJnZSh0aGlzLm9wdHMsIG9wdGlvbnMpO1xuICAgICAgICBcbiAgICAgICAgLy8gdGhpcy5lbWl0ID0gZGIuZW1pdDtcbiAgICB9XG4gICAgXG4gICAgZW1pdChuYW1lLCBhcmdzLCBjYikge1xuICAgICAgICBzdXBlci5lbWl0KG5hbWUsIGFyZ3MsIGNiLCBkYXRhYmFzZS5fc3RvcmVzKTtcbiAgICB9XG59XG5cbi8vIFRPRE8gZW5mb3JjZSBydWxlIHRoYXQgZmllbGQgbmFtZXMgY2FuJ3Qgc3RhcnQgd2l0aCAnJCcgb3IgY29udGFpbiAnLidcbi8vIChyZWFsIG1vbmdvZGIgZG9lcyBpbiBmYWN0IGVuZm9yY2UgdGhpcylcbi8vIFRPRE8gcG9zc2libHkgZW5mb3JjZSB0aGF0ICd1bmRlZmluZWQnIGRvZXMgbm90IGFwcGVhciAod2UgYXNzdW1lXG4vLyB0aGlzIGluIG91ciBoYW5kbGluZyBvZiBudWxsIGFuZCAkZXhpc3RzKVxuLyoqXG4gKiBJbnNlcnRzIGEgZG9jdW1lbnQgaW50byB0aGUgY29sbGVjdGlvblxuICogXG4gKiBAbWV0aG9kIENvbGxlY3Rpb24jaW5zZXJ0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgLSBEb2N1bWVudCB0byBiZSBpbnNlcnRlZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9uc1xuICogXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNoYWluPWZhbHNlXSAtIElmIHNldCB0byBcInRydWVcIiByZXR1cm5zIHRoaXMgaW5zdGFuY2UsIHNvIGl0IGNhbiBiZSBjaGFpbmVkIHdpdGggb3RoZXIgbWV0aG9kc1xuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9bnVsbF0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQgd2l0aCB0aGUgcmVzdWx0c1xuICogXG4gKiBAcmV0dXJucyB7T2JqZWN0fENvbGxlY3Rpb259IElmIFwib3B0aW9ucy5jaGFpblwiIHNldCB0byBcInRydWVcIiByZXR1cm5zIHRoaXMgaW5zdGFuY2UsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBpbnNlcnRlZCBkb2N1bWVudFxuICovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAoZG9jLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGlmIChfLmlzTmlsKGRvYykpIGxvZ2dlci50aHJvdyhcImRvYyBwYXJhbWV0ZXIgcmVxdWlyZWRcIik7XG4gICAgXG4gICAgaWYgKCFfLmlzUGxhaW5PYmplY3QoZG9jKSkgbG9nZ2VyLnRocm93KFwiZG9jIG11c3QgYmUgYW4gb2JqZWN0XCIpO1xuICAgIFxuICAgIGlmIChfLmlzTmlsKG9wdGlvbnMpKSBvcHRpb25zID0ge307XG4gICAgXG4gICAgaWYgKF8uaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFfLmlzTmlsKGNhbGxiYWNrKSAmJiAhXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkgbG9nZ2VyLnRocm93KFwiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgIFxuICAgIC8vIENyZWF0aW5nIGEgc2FmZSBjb3B5IG9mIHRoZSBkb2N1bWVudFxuICAgIHZhciBfZG9jID0gXy5jbG9uZURlZXAoZG9jKTtcblxuICAgIC8vIElmIHRoZSBkb2N1bWVudCBjb21lcyB3aXRoIGEgbnVtYmVyIElELCBwYXJzZSBpdCB0byBTdHJpbmdcbiAgICBpZiAoXy5pc051bWJlcihfZG9jLl9pZCkpIHtcbiAgICAgICAgX2RvYy5faWQgPSBfLnRvU3RyaW5nKF9kb2MuX2lkKTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc05pbChfZG9jLl9pZCkgfHwgKCFfZG9jLl9pZCBpbnN0YW5jZW9mIE9iamVjdElkICYmICghXy5pc1N0cmluZyhfZG9jLl9pZCkgfHwgIV9kb2MuX2lkLmxlbmd0aCkpKSB7XG4gICAgICAgIF9kb2MuX2lkID0gbmV3IE9iamVjdElkKCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG9wdGlvbnMgdG8gbW9yZSBkYXRlc1xuICAgIF9kb2MudGltZXN0YW1wID0gbmV3IE9iamVjdElkKCkuZ2VuZXJhdGlvblRpbWU7XG4gICAgXG4gICAgLy8gUmV2ZXJzZVxuICAgIHRoaXMuZG9jX2luZGV4ZXNbXy50b1N0cmluZyhfZG9jLl9pZCldID0gdGhpcy5kb2NzLmxlbmd0aDtcbiAgICB0aGlzLmRvY3MucHVzaChfZG9jKTtcbiAgICBcbiAgICAvKipcbiAgICAgKiBcImluc2VydFwiIGV2ZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IE1vbmdvUG9ydGFibGV+aW5zZXJ0XG4gICAgICogXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbGxlY3Rpb24gLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZG9jdW1lbnQgaW5zZXJ0ZWRcbiAgICAgKi9cbiAgICB0aGlzLmVtaXQoXG4gICAgICAgICdpbnNlcnQnLFxuICAgICAgICB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgICAgZG9jOiBfZG9jXG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsLCBfZG9jKTtcblxuICAgIGlmIChvcHRpb25zLmNoYWluKSByZXR1cm4gdGhpcztcbiAgICBcbiAgICByZXR1cm4gX2RvYztcbn07XG5cbi8qKlxuICogRmluZHMgYWxsIG1hdGNoaW5nIGRvY3VtZW50c1xuICogXG4gKiBAbWV0aG9kIENvbGxlY3Rpb24jZmluZFxuICogXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IFtzZWxlY3Rpb249e31dIC0gVGhlIHNlbGVjdGlvbiBmb3IgbWF0Y2hpbmcgZG9jdW1lbnRzXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IFtmaWVsZHM9e31dIC0gVGhlIGZpZWxkcyBvZiB0aGUgZG9jdW1lbnQgdG8gc2hvd1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9uc1xuICogXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2tpcF0gLSBOdW1iZXIgb2YgZG9jdW1lbnRzIHRvIGJlIHNraXBwZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5saW1pdF0gLSBNYXggbnVtYmVyIG9mIGRvY3VtZW50cyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IFtvcHRpb25zLmZpZWxkc10gLSBTYW1lIGFzIFwiZmllbGRzXCIgcGFyYW1ldGVyIChpZiBib3RoIHBhc3NlZCwgXCJvcHRpb25zLmZpZWxkc1wiIHdpbGwgYmUgaWdub3JlZClcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZm9yY2VGZXRjaD1mYWxzZV0gLSBJZiBzZXQgdG8nXCJ0cnVlXCIgcmV0dXJucyB0aGUgYXJyYXkgb2YgZG9jdW1lbnRzIGFscmVhZHkgZmV0Y2hlZFxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9bnVsbF0gLSBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgdGhlIGVuZCB3aXRoIHRoZSByZXN1bHRzXG4gKiBcbiAqIEByZXR1cm5zIHtBcnJheXxDdXJzb3J9IElmIFwib3B0aW9ucy5mb3JjZUZldGNoXCIgc2V0IHRvIHRydWUgcmV0dXJucyB0aGUgYXJyYXkgb2YgZG9jdW1lbnRzLCBvdGhlcndpc2UgcmV0dXJucyBhIGN1cnNvclxuICovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKHNlbGVjdGlvbiwgZmllbGRzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGxldCBwYXJhbXMgPSBfZW5zdXJlRmluZFBhcmFtcyh7XG4gICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLCBcbiAgICAgICAgZmllbGRzOiBmaWVsZHMsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsIFxuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICB9KTtcbiAgICBcbiAgICBzZWxlY3Rpb24gPSBwYXJhbXMuc2VsZWN0aW9uO1xuICAgIGZpZWxkcyA9IHBhcmFtcy5maWVsZHM7XG4gICAgb3B0aW9ucyA9IHBhcmFtcy5vcHRpb25zO1xuICAgIGNhbGxiYWNrID0gcGFyYW1zLmNhbGxiYWNrO1xuICAgIFxuICAgIC8vIGNhbGxiYWNrIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgdmFyIGN1cnNvciA9IG5ldyBDdXJzb3IodGhpcy5kYiwgdGhpcywgc2VsZWN0aW9uLCBmaWVsZHMsIG9wdGlvbnMpO1xuXG4gICAgLyoqXG4gICAgICogXCJmaW5kXCIgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgTW9uZ29Qb3J0YWJsZX5maW5kXG4gICAgICogXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IGNvbGxlY3Rpb24gLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sbGVjdGlvblxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzZWxlY3RvciAtIFRoZSBzZWxlY3Rpb24gb2YgdGhlIHF1ZXJ5XG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IGZpZWxkcyAtIFRoZSBmaWVsZHMgc2hvd2VkIGluIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHRoaXMuZW1pdChcbiAgICAgICAgJ2ZpbmQnLFxuICAgICAgICB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdGlvbixcbiAgICAgICAgICAgIGZpZWxkczogZmllbGRzXG4gICAgICAgIH1cbiAgICApO1xuICAgIFxuICAgIC8vIFBhc3MgdGhlIGN1cnNvciBmZXRjaGVkIHRvIHRoZSBjYWxsYmFja1xuICAgIC8vIEFkZCBbb3B0aW9ucy5ub0ZldGNoQ2FsbGJhY2sgPSB0cnVlXVxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sobnVsbCwgY3Vyc29yLmZldGNoKCkpO1xuXG4gICAgaWYgKG9wdGlvbnMuZm9yY2VGZXRjaCkge1xuICAgICAgICByZXR1cm4gY3Vyc29yLmZldGNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvcjtcbiAgICB9XG59O1xuXG4vKipcbiAqIEZpbmRzIHRoZSBmaXJzdCBtYXRjaGluZyBkb2N1bWVudFxuICogXG4gKiBAbWV0aG9kIENvbGxlY3Rpb24jZmluZE9uZVxuICogXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IFtzZWxlY3Rpb249e31dIC0gVGhlIHNlbGVjdGlvbiBmb3IgbWF0Y2hpbmcgZG9jdW1lbnRzXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IFtmaWVsZHM9e31dIC0gVGhlIGZpZWxkcyBvZiB0aGUgZG9jdW1lbnQgdG8gc2hvd1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9uc1xuICogXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2tpcF0gLSBOdW1iZXIgb2YgZG9jdW1lbnRzIHRvIGJlIHNraXBwZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5saW1pdF0gLSBNYXggbnVtYmVyIG9mIGRvY3VtZW50cyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IFtvcHRpb25zLmZpZWxkc10gLSBTYW1lIGFzIFwiZmllbGRzXCIgcGFyYW1ldGVyIChpZiBib3RoIHBhc3NlZCwgXCJvcHRpb25zLmZpZWxkc1wiIHdpbGwgYmUgaWdub3JlZClcbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPW51bGxdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQgd2l0aCB0aGUgcmVzdWx0c1xuICogXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZyBkb2N1bWVudCBvZiB0aGUgY29sbGVjdGlvblxuICovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5maW5kT25lID0gZnVuY3Rpb24gKHNlbGVjdGlvbiwgZmllbGRzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGxldCBwYXJhbXMgPSBfZW5zdXJlRmluZFBhcmFtcyh7XG4gICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLCBcbiAgICAgICAgZmllbGRzOiBmaWVsZHMsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsIFxuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICB9KTtcbiAgICBcbiAgICBzZWxlY3Rpb24gPSBwYXJhbXMuc2VsZWN0aW9uO1xuICAgIGZpZWxkcyA9IHBhcmFtcy5maWVsZHM7XG4gICAgb3B0aW9ucyA9IHBhcmFtcy5vcHRpb25zO1xuICAgIGNhbGxiYWNrID0gcGFyYW1zLmNhbGxiYWNrO1xuICAgIFxuICAgIHZhciBjdXJzb3IgPSBuZXcgQ3Vyc29yKHRoaXMuZGIsIHRoaXMsIHNlbGVjdGlvbiwgZmllbGRzLCBvcHRpb25zKTtcblxuICAgIC8qKlxuICAgICAqIFwiZmluZE9uZVwiIGV2ZW50LlxuICAgICAqXG4gICAgICogQGV2ZW50IE1vbmdvUG9ydGFibGV+ZmluZE9uZVxuICAgICAqIFxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb2xsZWN0aW9uIC0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbGxlY3Rpb25cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0aW9uIG9mIHRoZSBxdWVyeVxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmaWVsZHMgLSBUaGUgZmllbGRzIHNob3dlZCBpbiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICB0aGlzLmVtaXQoXG4gICAgICAgICdmaW5kT25lJyxcbiAgICAgICAge1xuICAgICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3Rpb24sXG4gICAgICAgICAgICBmaWVsZHM6IGZpZWxkc1xuICAgICAgICB9XG4gICAgKTtcbiAgICBcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICBcbiAgICBpZiAoY3Vyc29yLmhhc05leHQoKSkge1xuICAgICAgICByZXMgPSBjdXJzb3IubmV4dCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBQYXNzIHRoZSBjdXJzb3IgZmV0Y2hlZCB0byB0aGUgY2FsbGJhY2tcbiAgICAvLyBBZGQgW29wdGlvbnMubm9GZXRjaENhbGxiYWNrID0gdHJ1ZV1cbiAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKG51bGwsIHJlcyk7XG4gICAgXG4gICAgcmV0dXJuIHJlcztcbn07XG5cblxuLyoqXG4gKiBVcGRhdGVzIG9uZSBvciBtYW55IGRvY3VtZW50c1xuICogXG4gKiBAbWV0aG9kIENvbGxlY3Rpb24jdXBkYXRlXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW3NlbGVjdGlvbj17fV0gLSBUaGUgc2VsZWN0aW9uIGZvciBtYXRjaGluZyBkb2N1bWVudHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbdXBkYXRlPXt9XSAtIFRoZSB1cGRhdGUgb3BlcmF0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zXG4gKiBcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy51cGRhdGVBc01vbmdvPXRydWVdIC0gQnkgZGVmYXVsdDogXG4gKiAgICAgIElmIHRoZSBbdXBkYXRlXSBvYmplY3QgY29udGFpbnMgdXBkYXRlIG9wZXJhdG9yIG1vZGlmaWVycywgc3VjaCBhcyB0aG9zZSB1c2luZyB0aGUgXCIkc2V0XCIgbW9kaWZpZXIsIHRoZW46XG4gKiAgICAgICAgICA8dWw+XG4gKiAgICAgICAgICAgICAgPGxpPlRoZSBbdXBkYXRlXSBvYmplY3QgbXVzdCBjb250YWluIG9ubHkgdXBkYXRlIG9wZXJhdG9yIGV4cHJlc3Npb25zPC9saT5cbiAqICAgICAgICAgICAgICA8bGk+VGhlIENvbGxlY3Rpb24jdXBkYXRlIG1ldGhvZCB1cGRhdGVzIG9ubHkgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBkb2N1bWVudDwvbGk+XG4gKiAgICAgICAgICA8dWw+XG4gKiAgICAgIElmIHRoZSBbdXBkYXRlXSBvYmplY3QgY29udGFpbnMgb25seSBcImZpZWxkOiB2YWx1ZVwiIGV4cHJlc3Npb25zLCB0aGVuOlxuICogICAgICAgICAgPHVsPlxuICogICAgICAgICAgICAgIDxsaT5UaGUgQ29sbGVjdGlvbiN1cGRhdGUgbWV0aG9kIHJlcGxhY2VzIHRoZSBtYXRjaGluZyBkb2N1bWVudCB3aXRoIHRoZSBbdXBkYXRlXSBvYmplY3QuIFRoZSBDb2xsZWN0aW9uI3VwZGF0ZSBtZXRob2QgZG9lcyBub3QgcmVwbGFjZSB0aGUgXCJfaWRcIiB2YWx1ZTwvbGk+XG4gKiAgICAgICAgICAgICAgPGxpPkNvbGxlY3Rpb24jdXBkYXRlIGNhbm5vdCB1cGRhdGUgbXVsdGlwbGUgZG9jdW1lbnRzPC9saT5cbiAqICAgICAgICAgIDx1bD5cbiAqIFxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm92ZXJyaWRlPWZhbHNlXSAtIFJlcGxhY2VzIHRoZSB3aG9sZSBkb2N1bWVudCAob25seSBhcGxsaWVzIHdoZW4gW3VwZGF0ZUFzTW9uZ289ZmFsc2VdKVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnVwc2VydD1mYWxzZV0gLSBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IHdoZW4gbm8gZG9jdW1lbnQgbWF0Y2hlcyB0aGUgcXVlcnkgY3JpdGVyaWFcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tdWx0aT1mYWxzZV0gLSBVcGRhdGVzIG11bHRpcGxlIGRvY3VtZW50cyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMud3JpdGVDb25jZXJuPW51bGxdIC0gQW4gb2JqZWN0IGV4cHJlc3NpbmcgdGhlIHdyaXRlIGNvbmNlcm5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPW51bGxdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQgd2l0aCB0aGUgcmVzdWx0c1xuICogXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3Qgd2l0aCB0aGUgdXBkYXRlL2luc2VydCAoaWYgdXBzZXJ0PXRydWUpIGluZm9ybWF0aW9uXG4gKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChzZWxlY3Rpb24sIHVwZGF0ZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBpZiAoXy5pc05pbChzZWxlY3Rpb24pKSBzZWxlY3Rpb24gPSB7fTtcbiAgICBcbiAgICBpZiAoXy5pc05pbCh1cGRhdGUpKSBsb2dnZXIudGhyb3coXCJZb3UgbXVzdCBzcGVjaWZ5IHRoZSB1cGRhdGUgb3BlcmF0aW9uXCIpO1xuICAgIFxuICAgIGlmIChfLmlzTmlsKG9wdGlvbnMpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBza2lwOiAwLFxuICAgICAgICAgICAgbGltaXQ6IDE1ICAgLy8gZm9yIG5vIGxpbWl0IHBhc3MgW29wdGlvbnMubGltaXQgPSAtMV1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgaWYgKF8uaXNGdW5jdGlvbihzZWxlY3Rpb24pKSBsb2dnZXIudGhyb3coXCJZb3UgbXVzdCBzcGVjaWZ5IHRoZSB1cGRhdGUgb3BlcmF0aW9uXCIpO1xuICAgIFxuICAgIGlmIChfLmlzRnVuY3Rpb24odXBkYXRlKSkgbG9nZ2VyLnRocm93KFwiWW91IG11c3Qgc3BlY2lmeSB0aGUgdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICBcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBzcGVjaWFsIGNhc2Ugd2hlcmUgd2UgYXJlIHVzaW5nIGFuIG9iamVjdElkXG4gICAgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgT2JqZWN0SWQpIHtcbiAgICAgICAgc2VsZWN0aW9uID0ge1xuICAgICAgICAgICAgX2lkOiBzZWxlY3Rpb25cbiAgICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFfLmlzTmlsKGNhbGxiYWNrKSAmJiAhXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkgbG9nZ2VyLnRocm93KFwiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuXG4gICAgdmFyIHJlcyA9IG51bGw7XG5cbiAgICB2YXIgZG9jcyA9IG51bGw7XG4gICAgaWYgKG9wdGlvbnMubXVsdGkpIHtcbiAgICAgICAgZG9jcyA9IHRoaXMuZmluZChzZWxlY3Rpb24sIG51bGwsIHsgZm9yY2VGZXRjaDogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkb2NzID0gdGhpcy5maW5kT25lKHNlbGVjdGlvbik7XG4gICAgfVxuICAgIFxuICAgIGlmIChfLmlzTmlsKGRvY3MpKSB7XG4gICAgICAgIGRvY3MgPSBbXTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFfLmlzQXJyYXkoZG9jcykpIHtcbiAgICAgICAgZG9jcyA9IFtkb2NzXTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGRvY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnVwc2VydCkge1xuICAgICAgICAgICAgdmFyIGluc2VydGVkID0gdGhpcy5pbnNlcnQodXBkYXRlKTtcblxuICAgICAgICAgICAgcmVzID0ge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogMFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5zZXJ0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRzOiBbaW5zZXJ0ZWRdLFxuICAgICAgICAgICAgICAgICAgICBjb3VudDogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBkb2N1bWVudHMgZm91bmRcbiAgICAgICAgICAgIHJlcyA9IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50czogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IDBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluc2VydGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50czogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHVwZGF0ZWREb2NzID0gW107XG4gICAgICAgIFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBkb2MgPSBkb2NzW2ldO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgb3ZlcnJpZGUgPSBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgaGFzTW9kaWZpZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIElFNyBkb2Vzbid0IHN1cHBvcnQgaW5kZXhpbmcgaW50byBzdHJpbmdzIChlZywga2V5WzBdIG9yIGtleS5pbmRleE9mKCckJykgKSwgc28gdXNlIHN1YnN0ci5cbiAgICAgICAgICAgICAgICAvLyBUZXN0aW5nIG92ZXIgdGhlIGZpcnN0IGxldHRlcjpcbiAgICAgICAgICAgICAgICAvLyAgICAgIEJlc3RzIHJlc3VsdCB3aXRoIDFlOCBsb29wcyA9PiBrZXlbMF0ofjNzKSA+IHN1YnN0cih+NXMpID4gcmVnZXhwKH42cykgPiBpbmRleE9mKH4xNnMpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFyIG1vZGlmaWVyID0gKGtleS5zdWJzdHIoMCwgMSkgPT09ICckJyk7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc01vZGlmaWVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudXBkYXRlQXNNb25nbykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIgJiYgIW1vZGlmaWVyKSBsb2dnZXIudGhyb3coXCJBbGwgdXBkYXRlIGZpZWxkcyBtdXN0IGJlIGFuIHVwZGF0ZSBvcGVyYXRvclwiKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzTW9kaWZpZXIgJiYgb3B0aW9ucy5tdWx0aSkgbG9nZ2VyLnRocm93KFwiWW91IGNhbiBub3QgdXBkYXRlIHNldmVyYWwgZG9jdW1lbnRzIHdoZW4gbm8gdXBkYXRlIG9wZXJhdG9ycyBhcmUgaW5jbHVkZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXIpIG92ZXJyaWRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc01vZGlmaWVyKSBvdmVycmlkZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgPSAhIW9wdGlvbnMub3ZlcnJpZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgX2RvY1VwZGF0ZSA9IG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlcyB0aGUgZG9jdW1lbnQgZXhjZXB0IGZvciB0aGUgXCJfaWRcIlxuICAgICAgICAgICAgICAgIF9kb2NVcGRhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIF9pZDogZG9jLl9pZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gTXVzdCBpZ25vcmUgZmllbGRzIHN0YXJ0aW5nIHdpdGggJyQnLCAnLicuLi5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDEpID09PSAnJCcgfHwgL1xcLi9nLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFRoZSBmaWVsZCAke2tleX0gY2FuIG5vdCBiZWdpbiB3aXRoICckJyBvciBjb250YWluICcuJ2ApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2RvY1VwZGF0ZVtrZXldID0gdXBkYXRlW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF9kb2NVcGRhdGUgPSBfLmNsb25lRGVlcChkb2MpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbCA9IHVwZGF0ZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgMSkgPT09ICckJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2RvY1VwZGF0ZSA9IF9hcHBseU1vZGlmaWVyKF9kb2NVcGRhdGUsIGtleSwgdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghXy5pc05pbChfZG9jVXBkYXRlW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gJ19pZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvY1VwZGF0ZVtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiVGhlIGZpZWxkICdfaWQnIGNhbiBub3QgYmUgdXBkYXRlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBUaGUgZG9jdW1lbnQgZG9lcyBub3QgY29udGFpbnMgdGhlIGZpZWxkICR7a2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB1cGRhdGVkRG9jcy5wdXNoKF9kb2NVcGRhdGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgaWR4ID0gdGhpcy5kb2NfaW5kZXhlc1tfZG9jVXBkYXRlLl9pZF07XG4gICAgICAgICAgICB0aGlzLmRvY3NbaWR4XSA9IF9kb2NVcGRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBcInVwZGF0ZVwiIGV2ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgTW9uZ29Qb3J0YWJsZX51cGRhdGVcbiAgICAgICAgICogXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb2xsZWN0aW9uIC0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbGxlY3Rpb25cbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IHNlbGVjdG9yIC0gVGhlIHNlbGVjdGlvbiBvZiB0aGUgcXVlcnlcbiAgICAgICAgICogQHByb3BlcnR5IHtPYmplY3R9IG1vZGlmaWVyIC0gVGhlIG1vZGlmaWVyIHVzZWQgaW4gdGhlIHF1ZXJ5XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkb2NzIC0gVGhlIHVwZGF0ZWQvaW5zZXJ0ZWQgZG9jdW1lbnRzIGluZm9ybWF0aW9uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgICAndXBkYXRlJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgbW9kaWZpZXI6IHVwZGF0ZSxcbiAgICAgICAgICAgICAgICBkb2NzOiB1cGRhdGVkRG9jc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgcmVzID0ge1xuICAgICAgICAgICAgdXBkYXRlZDoge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50czogdXBkYXRlZERvY3MsXG4gICAgICAgICAgICAgICAgY291bnQ6IHVwZGF0ZWREb2NzLmxlbmd0aFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluc2VydGVkOiB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnRzOiBudWxsLFxuICAgICAgICAgICAgICAgIGNvdW50OiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIFxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sobnVsbCwgcmVzKTtcbiAgICBcbiAgICByZXR1cm4gcmVzO1xufTtcblxudmFyIF9hcHBseU1vZGlmaWVyID0gZnVuY3Rpb24oX2RvY1VwZGF0ZSwga2V5LCB2YWwpIHtcbiAgICB2YXIgZG9jID0gXy5jbG9uZURlZXAoX2RvY1VwZGF0ZSk7XG4gICAgLy8gdmFyIG1vZCA9IF9tb2RpZmllcnNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgIGlmICghX21vZGlmaWVyc1trZXldKSB7XG4gICAgICAgIGxvZ2dlci50aHJvdyhgSW52YWxpZCBtb2RpZmllciBzcGVjaWZpZWQ6ICR7a2V5fWApO1xuICAgIH1cbiAgICBcbiAgICBmb3IgKHZhciBrZXlwYXRoIGluIHZhbCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB2YWxba2V5cGF0aF07XG4gICAgICAgIHZhciBrZXlwYXJ0cyA9IGtleXBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgXG4gICAgICAgIF9tb2RpZnkoZG9jLCBrZXlwYXJ0cywgdmFsdWUsIGtleSk7XG4gICAgICAgIFxuICAgICAgICAvLyB2YXIgbm9fY3JlYXRlID0gISFDb2xsZWN0aW9uLl9ub0NyZWF0ZU1vZGlmaWVyc1trZXldO1xuICAgICAgICAvLyB2YXIgZm9yYmlkX2FycmF5ID0gKGtleSA9PT0gXCIkcmVuYW1lXCIpO1xuICAgICAgICAvLyB2YXIgdGFyZ2V0ID0gQ29sbGVjdGlvbi5fZmluZE1vZFRhcmdldChfZG9jVXBkYXRlLCBrZXlwYXJ0cywgbm9fY3JlYXRlLCBmb3JiaWRfYXJyYXkpO1xuICAgICAgICAvLyB2YXIgZmllbGQgPSBrZXlwYXJ0cy5wb3AoKTtcblxuICAgICAgICAvLyBtb2QodGFyZ2V0LCBmaWVsZCwgdmFsdWUsIGtleXBhdGgsIF9kb2NVcGRhdGUpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZG9jO1xufTtcblxudmFyIF9tb2RpZnkgPSBmdW5jdGlvbihkb2N1bWVudCwga2V5cGFydHMsIHZhbHVlLCBrZXksIGxldmVsID0gMCkge1xuICAgIGZvciAobGV0IGkgPSBsZXZlbDsgaSA8IGtleXBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBwYXRoID0ga2V5cGFydHNbaV07XG4gICAgICAgIGxldCBpc051bWVyaWMgPSAvXlswLTldKyQvLnRlc3QocGF0aCk7XG4gICAgICAgIGxldCB0YXJnZXQgPSBkb2N1bWVudFtwYXRoXTtcbiAgICAgICAgXG4gICAgICAgIHZhciBjcmVhdGUgPSBfLmhhc0luKENvbGxlY3Rpb24uX25vQ3JlYXRlTW9kaWZpZXJzLCBrZXkpID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICBpZiAoIWNyZWF0ZSAmJiAoIV8uaXNPYmplY3QoZG9jdW1lbnQpIHx8IF8uaXNOaWwodGFyZ2V0KSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvdyhgVGhlIGVsZW1lbnQgXCIke3BhdGh9XCIgbXVzdCBleGlzdHMgaW4gXCIke0pTT04uc3RyaW5naWZ5KGRvY3VtZW50KX1cImApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoXy5pc0FycmF5KGRvY3VtZW50KSkge1xuICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93ICRyZW5hbWUgb24gYXJyYXlzXG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcIiRyZW5hbWVcIikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE9ubHkgbGV0IHRoZSB1c2Ugb2YgXCJhcnJheWZpZWxkLjxudW1lcmljX2luZGV4Pi5zdWJmaWVsZFwiXG4gICAgICAgICAgICBpZiAoaXNOdW1lcmljKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IF8udG9OdW1iZXIocGF0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvdyhgVGhlIGZpZWxkIFwiJHtwYXRofVwiIGNhbiBub3QgYmUgYXBwZW5kZWQgdG8gYW4gYXJyYXlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRmlsbCB0aGUgYXJyYXkgdG8gdGhlIGRlc2lyZWQgbGVuZ3RoXG4gICAgICAgICAgICB3aGlsZSAoZG9jdW1lbnQubGVuZ3RoIDwgcGF0aCkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnB1c2gobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChpIDwga2V5cGFydHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgaWYgKF8uaXNOaWwodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBhY2Nlc3Npbmcgd2l0aCBcImFycmF5RmllbGQuPG51bWVyaWNfaW5kZXg+XCJcbiAgICAgICAgICAgICAgICBpZiAoXy5pc0Zpbml0ZShfLnRvTnVtYmVyKGtleXBhcnRzW2kgKyAxXSkpKSB7ICAvLyAgfHwga2V5cGFydHNbaSArIDFdID09PSAnJCcgIC8vIFRPRE8gXCJhcnJheUZpZWxkLiRcIlxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGRvY3VtZW50W3BhdGhdID0gX21vZGlmeSh0YXJnZXQsIGtleXBhcnRzLCB2YWx1ZSwga2V5LCBsZXZlbCArIDEpO1xuXG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfbW9kaWZpZXJzW2tleV0oZG9jdW1lbnQsIHBhdGgsIHZhbHVlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmVzIG9uZSBvciBtYW55IGRvY3VtZW50c1xuICogXG4gKiBAbWV0aG9kIENvbGxlY3Rpb24jcmVtb3ZlXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW3NlbGVjdGlvbj17fV0gLSBUaGUgc2VsZWN0aW9uIGZvciBtYXRjaGluZyBkb2N1bWVudHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAqIFxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmp1c3RPbmU9ZmFsc2VdIC0gRGVsZXRlcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc2VsZWN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMud3JpdGVDb25jZXJuPW51bGxdIC0gQW4gb2JqZWN0IGV4cHJlc3NpbmcgdGhlIHdyaXRlIGNvbmNlcm5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPW51bGxdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQgd2l0aCB0aGUgcmVzdWx0c1xuICogXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBPYmplY3Qgd2l0aCB0aGUgZGVsZXRlZCBkb2N1bWVudHNcbiAqL1xuQ29sbGVjdGlvbi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHNlbGVjdGlvbiwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBpZiAoXy5pc05pbChzZWxlY3Rpb24pKSBzZWxlY3Rpb24gPSB7fTtcbiAgICBcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHNlbGVjdGlvbikpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBzZWxlY3Rpb247XG4gICAgICAgIHNlbGVjdGlvbiA9IHt9O1xuICAgIH1cbiAgICBcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBcbiAgICBpZiAoXy5pc05pbChvcHRpb25zKSkgb3B0aW9ucyA9IHsganVzdE9uZTogZmFsc2UgfTtcbiAgICBcbiAgICAvLyBJZiB3ZSBhcmUgbm90IHBhc3NpbmcgYSBzZWxlY3Rpb24gYW5kIHdlIGFyZSBub3QgcmVtb3ZpbmcganVzdCBvbmUsIGlzIHRoZSBzYW1lIGFzIGEgZHJvcFxuICAgIGlmIChPYmplY3Quc2l6ZShzZWxlY3Rpb24pID09PSAwICYmICFvcHRpb25zLmp1c3RPbmUpIHJldHVybiB0aGlzLmRyb3Aob3B0aW9ucywgY2FsbGJhY2spO1xuICAgIFxuICAgIC8vIENoZWNrIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBhcmUgdXNpbmcgYW4gb2JqZWN0SWRcbiAgICBpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBPYmplY3RJZCkge1xuICAgICAgICBzZWxlY3Rpb24gPSB7XG4gICAgICAgICAgICBfaWQ6IHNlbGVjdGlvblxuICAgICAgICB9O1xuICAgIH1cbiAgICBcbiAgICBpZiAoIV8uaXNOaWwoY2FsbGJhY2spICYmICFfLmlzRnVuY3Rpb24oY2FsbGJhY2spKSBsb2dnZXIudGhyb3coXCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgXG4gICAgdmFyIGN1cnNvciA9IHRoaXMuZmluZChzZWxlY3Rpb24pO1xuICAgIFxuICAgIHZhciBkb2NzID0gW107XG4gICAgY3Vyc29yLmZvckVhY2goZG9jID0+IHtcbiAgICAgICAgdmFyIGlkeCA9IHRoaXMuZG9jX2luZGV4ZXNbZG9jLl9pZF07XG4gICAgICAgIFxuICAgICAgICBkZWxldGUgdGhpcy5kb2NfaW5kZXhlc1tkb2MuX2lkXTtcbiAgICAgICAgdGhpcy5kb2NzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBcbiAgICAgICAgZG9jcy5wdXNoKGRvYyk7XG4gICAgfSk7XG4gICAgXG4gICAgLyoqXG4gICAgICogXCJyZW1vdmVcIiBldmVudC5cbiAgICAgKlxuICAgICAqIEBldmVudCBNb25nb1BvcnRhYmxlfnJlbW92ZVxuICAgICAqIFxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb2xsZWN0aW9uIC0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbGxlY3Rpb25cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0aW9uIG9mIHRoZSBxdWVyeVxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkb2NzIC0gVGhlIGRlbGV0ZWQgZG9jdW1lbnRzIGluZm9ybWF0aW9uXG4gICAgICovXG4gICAgdGhpcy5lbWl0KFxuICAgICAgICAncmVtb3ZlJyxcbiAgICAgICAge1xuICAgICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3Rpb24sXG4gICAgICAgICAgICBkb2NzOiBkb2NzXG4gICAgICAgIH1cbiAgICApO1xuICAgIFxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sobnVsbCwgZG9jcyk7XG4gICAgXG4gICAgcmV0dXJuIGRvY3M7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgQ29sbGVjdGlvbiNyZW1vdmV9XG4gKiBcbiAqIEBtZXRob2QgQ29sbGVjdGlvbiNkZWxldGVcbiAqL1xuQ29sbGVjdGlvbi5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHNlbGVjdGlvbiwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmUoc2VsZWN0aW9uLCBvcHRpb25zLCBjYWxsYmFjayk7XG59O1xuIFxuIC8qKlxuICogQWxpYXMgZm9yIHtAbGluayBDb2xsZWN0aW9uI3JlbW92ZX1cbiAqIFxuICogQG1ldGhvZCBDb2xsZWN0aW9uI2Rlc3Ryb3lcbiAqL1xuQ29sbGVjdGlvbi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIChzZWxlY3Rpb24sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlKHNlbGVjdGlvbiwgb3B0aW9ucywgY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBEcm9wcyBhIGNvbGxlY3Rpb25cbiAqIFxuICogQG1ldGhvZCBDb2xsZWN0aW9uI2Ryb3BcbiAqIFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9uc1xuICogXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJvcEluZGV4ZXM9ZmFsc2VdIC0gVHJ1ZSBpZiB3ZSB3YW50IHRvIGRyb3AgdGhlIGluZGV4ZXMgdG9vXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMud3JpdGVDb25jZXJuPW51bGxdIC0gQW4gb2JqZWN0IGV4cHJlc3NpbmcgdGhlIHdyaXRlIGNvbmNlcm5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPW51bGxdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQgd2l0aCB0aGUgcmVzdWx0c1xuICogXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUcnVlIHdoZW4gdGhlIGNvbGxlY3Rpb24gaXMgZHJvcHBlZFxuICovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5kcm9wID0gZnVuY3Rpb24ob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBpZiAoXy5pc05pbChvcHRpb25zKSkgb3B0aW9ucyA9IHt9O1xuICAgIFxuICAgIGlmIChfLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIFxuICAgIGlmICghXy5pc05pbChjYWxsYmFjaykgJiYgIV8uaXNGdW5jdGlvbihjYWxsYmFjaykpIGxvZ2dlci50aHJvdyhcImNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgICBcbiAgICB0aGlzLmRvY19pbmRleGVzID0ge307XG4gICAgdGhpcy5kb2NzID0gW107XG4gICAgXG4gICAgaWYgKG9wdGlvbnMuZHJvcEluZGV4ZXMpIHt9IC8vIFRPRE9cbiAgICBcbiAgICB0aGlzLmVtaXQoXG4gICAgICAgICdkcm9wQ29sbGVjdGlvbicsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBpbmRleGVzOiAhIW9wdGlvbnMuZHJvcEluZGV4ZXNcbiAgICAgICAgfVxuICAgICk7XG4gICAgXG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsLCB0cnVlKTtcbiAgICBcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogSW5zZXJ0IG9yIHVwZGF0ZSBhIGRvY3VtZW50LiBJZiB0aGUgZG9jdW1lbnQgaGFzIGFuIFwiX2lkXCIgaXMgYW4gdXBkYXRlICh3aXRoIHVwc2VydCksIGlmIG5vdCBpcyBhbiBpbnNlcnQuXG4gKiBcbiAqIEBtZXRob2QgQ29sbGVjdGlvbiNzYXZlXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgLSBEb2N1bWVudCB0byBiZSBpbnNlcnRlZC91cGRhdGVkXG4gKiBcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kcm9wSW5kZXhlcz1mYWxzZV0gLSBUcnVlIGlmIHdlIHdhbnQgdG8gZHJvcCB0aGUgaW5kZXhlcyB0b29cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy53cml0ZUNvbmNlcm49bnVsbF0gLSBBbiBvYmplY3QgZXhwcmVzc2luZyB0aGUgd3JpdGUgY29uY2VyblxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9bnVsbF0gLSBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgdGhlIGVuZCB3aXRoIHRoZSByZXN1bHRzXG4gKiBcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRydWUgd2hlbiB0aGUgY29sbGVjdGlvbiBpcyBkcm9wcGVkXG4gKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbihkb2MsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKF8uaXNOaWwoZG9jKSB8fCBfLmlzRnVuY3Rpb24oZG9jKSkgbG9nZ2VyLnRocm93KFwiWW91IG11c3QgcGFzcyBhIGRvY3VtZW50XCIpO1xuICAgIFxuICAgIGlmIChfLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKF8uaGFzSW4oZG9jLCAnX2lkJykpIHtcbiAgICAgICAgb3B0aW9ucy51cHNlcnQgPSB0cnVlO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKFxuICAgICAgICAgICAgeyBfaWQ6IGRvYy5faWQgfSxcbiAgICAgICAgICAgIGRvYyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluc2VydChkb2MsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG59O1xuXG4vKipcbiogQGlnbm9yZVxuKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLmVuc3VyZUluZGV4ID0gZnVuY3Rpb24oKSB7XG4gICAgLy9UT0RPIEltcGxlbWVudCBFbnN1cmVJbmRleFxuICAgIGxvZ2dlci50aHJvdygnQ29sbGVjdGlvbiNlbnN1cmVJbmRleCB1bmltcGxlbWVudGVkIGJ5IGRyaXZlcicpO1xufTtcblxuLy8gVE9ETyBkb2N1bWVudCAoYXQgc29tZSBwb2ludClcbi8vIFRPRE8gdGVzdFxuLy8gVE9ETyBvYnZpb3VzbHkgdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIHdpbGwgbm90IGJlIHZlcnkgZWZmaWNpZW50XG4vKipcbiogQGlnbm9yZVxuKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLmJhY2t1cCA9IGZ1bmN0aW9uIChiYWNrdXBJRCwgY2FsbGJhY2spIHtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGJhY2t1cElEKSkge1xuICAgICAgICBjYWxsYmFjayA9IGJhY2t1cElEO1xuICAgICAgICBiYWNrdXBJRCA9IG5ldyBPYmplY3RJZCgpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIFxuICAgIGlmICghXy5pc05pbChjYWxsYmFjaykgJiYgIV8uaXNGdW5jdGlvbihjYWxsYmFjaykpIGxvZ2dlci50aHJvdyhcImNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcblxuICAgIHRoaXMuc25hcHNob3RzW2JhY2t1cElEXSA9IF8uY2xvbmVEZWVwKHRoaXMuZG9jcyk7XG4gICAgdGhpcy5lbWl0KFxuICAgICAgICAnc25hcHNob3QnLFxuICAgICAgICB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgICAgYmFja3VwSUQ6IGJhY2t1cElELFxuICAgICAgICAgICAgZG9jdW1lbnRzOiB0aGlzLnNuYXBzaG90c1tiYWNrdXBJRF0gXG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgYmFja3VwSUQ6IGJhY2t1cElELFxuICAgICAgICBkb2N1bWVudHM6IHRoaXMuc25hcHNob3RzW2JhY2t1cElEXVxuICAgIH07XG4gICAgXG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIExpc3RzIGF2YWlsYWJsZSBCYWNrdXBzXG4vKipcbiogQGlnbm9yZVxuKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLmJhY2t1cHMgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBpZiAoIV8uaXNOaWwoY2FsbGJhY2spICYmICFfLmlzRnVuY3Rpb24oY2FsbGJhY2spKSBsb2dnZXIudGhyb3coXCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgXG4gICAgdmFyIGJhY2t1cHMgPSBbXTtcblxuICAgIGZvciAobGV0IGlkIGluIHRoaXMuc25hcHNob3RzKSB7XG4gICAgICAgIGJhY2t1cHMucHVzaCh7aWQ6IGlkLCBkb2N1bWVudHM6IHRoaXMuc25hcHNob3RzW2lkXX0pO1xuICAgIH1cblxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sobnVsbCwgYmFja3Vwcyk7XG5cbiAgICByZXR1cm4gYmFja3Vwcztcbn07XG5cbi8vIExpc3RzIGF2YWlsYWJsZSBCYWNrdXBzXG4vKipcbiogQGlnbm9yZVxuKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLnJlbW92ZUJhY2t1cCA9IGZ1bmN0aW9uIChiYWNrdXBJRCwgY2FsbGJhY2spIHtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGJhY2t1cElEKSkge1xuICAgICAgICBjYWxsYmFjayA9IGJhY2t1cElEO1xuICAgICAgICBiYWNrdXBJRCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIGlmICghXy5pc05pbChjYWxsYmFjaykgJiYgIV8uaXNGdW5jdGlvbihjYWxsYmFjaykpIGxvZ2dlci50aHJvdyhcImNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgICBcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgXG4gICAgaWYgKGJhY2t1cElEKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNuYXBzaG90c1tfLnRvU3RyaW5nKGJhY2t1cElEKV07XG4gICAgICAgIFxuICAgICAgICByZXN1bHQgPSBiYWNrdXBJRDtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNuYXBzaG90cyA9IHt9O1xuICAgICAgICBcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLy8gUmVzdG9yZSB0aGUgc25hcHNob3QuIElmIG5vIHNuYXBzaG90IGV4aXN0cywgcmFpc2UgYW4gZXhjZXB0aW9uO1xuLyoqXG4qIEBpZ25vcmVcbiovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24gKGJhY2t1cElELCBjYWxsYmFjaykge1xuICAgIGlmIChfLmlzRnVuY3Rpb24oYmFja3VwSUQpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gYmFja3VwSUQ7XG4gICAgICAgIGJhY2t1cElEID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFfLmlzTmlsKGNhbGxiYWNrKSAmJiAhXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkgbG9nZ2VyLnRocm93KFwiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgIFxuICAgIHZhciBzbmFwc2hvdENvdW50ID0gT2JqZWN0LnNpemUodGhpcy5zbmFwc2hvdHMpO1xuICAgIHZhciBiYWNrdXBEYXRhID0gbnVsbDtcblxuICAgIGlmIChzbmFwc2hvdENvdW50ID09PSAwKSB7XG4gICAgICAgIGxvZ2dlci50aHJvdyhcIlRoZXJlIGlzIG5vIHNuYXBzaG90c1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWJhY2t1cElEKSB7XG4gICAgICAgICAgICBpZiAoc25hcHNob3RDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiTm8gYmFja3VwSUQgcGFzc2VkLiBSZXN0b3JpbmcgdGhlIG9ubHkgc25hcHNob3RcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIG9ubHkgc25hcHNob3RcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5zbmFwc2hvdHMpIGJhY2t1cElEID0ga2V5O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3coXCJUaGUgYXJlIHNldmVyYWwgc25hcHNob3RzLiBQbGVhc2Ugc3BlY2lmeSBvbmUgYmFja3VwSURcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgYmFja3VwRGF0YSA9IHRoaXMuc25hcHNob3RzW2JhY2t1cElEXTtcbiAgICAgICAgICAgIFxuICAgIGlmICghYmFja3VwRGF0YSkge1xuICAgICAgICBsb2dnZXIudGhyb3coYFVua25vd24gQmFja3VwIElEOiAke2JhY2t1cElEfWApO1xuICAgIH1cblxuICAgIHRoaXMuZG9jcyA9IGJhY2t1cERhdGE7XG4gICAgdGhpcy5lbWl0KFxuICAgICAgICAncmVzdG9yZScsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBiYWNrdXBJRDogYmFja3VwSURcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgYWdncmVnYXRlIHZhbHVlcyBmb3IgdGhlIGRhdGEgaW4gYSBjb2xsZWN0aW9uXG4gKiBcbiAqIEBtZXRob2QgQ29sbGVjdGlvbiNhZ2dyZWdhdGVcbiAqIFxuICogQHBhcmFtIHtBcnJheX0gcGlwZWxpbmUgLSBBIHNlcXVlbmNlIG9mIGRhdGEgYWdncmVnYXRpb24gb3BlcmF0aW9ucyBvciBzdGFnZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAqIFxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5mb3JjZUZldGNoPWZhbHNlXSAtIElmIHNldCB0bydcInRydWVcIiByZXR1cm5zIHRoZSBhcnJheSBvZiBkb2N1bWVudHMgYWxyZWFkeSBmZXRjaGVkXG4gKiBcbiAqIEByZXR1cm5zIHtBcnJheXxDdXJzb3J9IElmIFwib3B0aW9ucy5mb3JjZUZldGNoXCIgc2V0IHRvIHRydWUgcmV0dXJucyB0aGUgYXJyYXkgb2YgZG9jdW1lbnRzLCBvdGhlcndpc2UgcmV0dXJucyBhIGN1cnNvclxuICovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5hZ2dyZWdhdGUgPSBmdW5jdGlvbihwaXBlbGluZSwgb3B0aW9ucyA9IHsgZm9yY2VGZXRjaDogZmFsc2UgfSkge1xuICAgIGlmIChfLmlzTmlsKHBpcGVsaW5lKSB8fCAhXy5pc0FycmF5KHBpcGVsaW5lKSkgbG9nZ2VyLnRocm93KCdUaGUgXCJwaXBlbGluZVwiIHBhcmFtIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICBcbiAgICB2YXIgYWdncmVnYXRpb24gPSBuZXcgQWdncmVnYXRpb24ocGlwZWxpbmUpO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGlwZWxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHN0YWdlID0gcGlwZWxpbmVbaV07XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gc3RhZ2UpIHtcbiAgICAgICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDEpICE9PSAnJCcpIGxvZ2dlci50aHJvdyhcIlRoZSBwaXBlbGluZSBzdGFnZXMgbXVzdCBiZWdpbiB3aXRoICckJ1wiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFhZ2dyZWdhdGlvbi52YWxpZFN0YWdlKGtleSkpIGxvZ2dlci50aHJvdyhgSW52YWxpZCBzdGFnZSBcIiR7a2V5fVwiYCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciByZXN1bHQgPSBhZ2dyZWdhdGlvbi5hZ2dyZWdhdGUodGhpcyk7XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdDsgIC8vIGNoYW5nZSB0byBjdXJzb3Jcbn07XG5cbi8qKlxuKiBAaWdub3JlXG4qL1xuQ29sbGVjdGlvbi5fbm9DcmVhdGVNb2RpZmllcnMgPSB7XG4gICAgJHVuc2V0OiB0cnVlLFxuICAgICRwb3A6IHRydWUsXG4gICAgJHJlbmFtZTogdHJ1ZSxcbiAgICAkcHVsbDogdHJ1ZSxcbiAgICAkcHVsbEFsbDogdHJ1ZVxufTtcblxuLyoqXG4qIEBpZ25vcmVcbiovXG52YXIgX21vZGlmaWVycyA9IHtcbiAgICAkaW5jOiBmdW5jdGlvbiAodGFyZ2V0LCBmaWVsZCwgYXJnKSB7XG4gICAgICAgIGlmICghXy5pc051bWJlcihhcmcpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3coXCJNb2RpZmllciAkaW5jIGFsbG93ZWQgZm9yIG51bWJlcnMgb25seVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZCBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghXy5pc051bWJlcih0YXJnZXRbZmllbGRdKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvdyhcIkNhbm5vdCBhcHBseSAkaW5jIG1vZGlmaWVyIHRvIG5vbi1udW1iZXJcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRhcmdldFtmaWVsZF0gKz0gYXJnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W2ZpZWxkXSA9IGFyZztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAkc2V0OiBmdW5jdGlvbiAodGFyZ2V0LCBmaWVsZCwgYXJnKSB7XG4gICAgICAgIHRhcmdldFtmaWVsZF0gPSBfLmNsb25lRGVlcChhcmcpO1xuICAgIH0sXG5cbiAgICAkdW5zZXQ6IGZ1bmN0aW9uICh0YXJnZXQsIGZpZWxkLCBhcmcpIHtcbiAgICAgICAgaWYgKCFfLmlzTmlsKHRhcmdldCkpIHtcbiAgICAgICAgICAgIGlmIChfLmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ZpZWxkXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0W2ZpZWxkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAkcHVzaDogZnVuY3Rpb24gKHRhcmdldCwgZmllbGQsIGFyZykge1xuICAgICAgICB2YXIgeCA9IHRhcmdldFtmaWVsZF07XG5cbiAgICAgICAgaWYgKF8uaXNOaWwoeCkpIHtcbiAgICAgICAgICAgIHRhcmdldFtmaWVsZF0gPSBbYXJnXTtcbiAgICAgICAgfSBlbHNlIGlmICghXy5pc0FycmF5KHgpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3coXCJDYW5ub3QgYXBwbHkgJHB1c2ggbW9kaWZpZXIgdG8gbm9uLWFycmF5XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeC5wdXNoKF8uY2xvbmVEZWVwKGFyZykpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICRwdXNoQWxsOiBmdW5jdGlvbiAodGFyZ2V0LCBmaWVsZCwgYXJnKSB7XG4gICAgICAgIHZhciB4ID0gdGFyZ2V0W2ZpZWxkXTtcblxuICAgICAgICBpZiAoXy5pc05pbCh4KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2ZpZWxkXSA9IGFyZztcbiAgICAgICAgfSBlbHNlIGlmICghXy5pc0FycmF5KHgpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3coXCJNb2RpZmllciAkcHVzaEFsbC9wdWxsQWxsIGFsbG93ZWQgZm9yIGFycmF5cyBvbmx5XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB4LnB1c2goYXJnW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAkYWRkVG9TZXQ6IGZ1bmN0aW9uICh0YXJnZXQsIGZpZWxkLCBhcmcpIHtcbiAgICAgICAgdmFyIHggPSB0YXJnZXRbZmllbGRdO1xuXG4gICAgICAgIGlmIChfLmlzTmlsKHgpKSB7XG4gICAgICAgICAgICB0YXJnZXRbZmllbGRdID0gW2FyZ107XG4gICAgICAgIH0gZWxzZSBpZiAoIV8uaXNBcnJheSh4KSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93KFwiQ2Fubm90IGFwcGx5ICRhZGRUb1NldCBtb2RpZmllciB0byBub24tYXJyYXlcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgaXNFYWNoID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGFyZykpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrIGluIGFyZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoayA9PT0gXCIkZWFjaFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0VhY2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBpc0VhY2ggPyBhcmdbXCIkZWFjaFwiXSA6IFthcmddO1xuICAgICAgICAgICAgXy5mb3JFYWNoKHZhbHVlcywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChTZWxlY3Rvck1hdGNoZXIuZXF1YWwodmFsdWUsIHhbaV0pKSByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICRwb3A6IGZ1bmN0aW9uICh0YXJnZXQsIGZpZWxkLCBhcmcpIHtcbiAgICAgICAgaWYgKF8uaXNOaWwodGFyZ2V0KSB8fCBfLmlzTmlsKHRhcmdldFtmaWVsZF0pKSByZXR1cm47XG5cbiAgICAgICAgdmFyIHggPSB0YXJnZXRbZmllbGRdO1xuXG4gICAgICAgIGlmICghXy5pc0FycmF5KHgpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3coXCJDYW5ub3QgYXBwbHkgJHBvcCBtb2RpZmllciB0byBub24tYXJyYXlcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXy5pc051bWJlcihhcmcpICYmIGFyZyA8IDApIHtcbiAgICAgICAgICAgICAgICB4LnNwbGljZSgwLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeC5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAkcHVsbDogZnVuY3Rpb24gKHRhcmdldCwgZmllbGQsIGFyZykge1xuICAgICAgICBpZiAoXy5pc05pbCh0YXJnZXQpIHx8IF8uaXNOaWwodGFyZ2V0W2ZpZWxkXSkpIHJldHVybjtcblxuICAgICAgICB2YXIgeCA9IHRhcmdldFtmaWVsZF07XG5cbiAgICAgICAgaWYgKCFfLmlzQXJyYXkoeCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvdyhcIkNhbm5vdCBhcHBseSAkcHVsbC9wdWxsQWxsIG1vZGlmaWVyIHRvIG5vbi1hcnJheVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgJiYgIShhcmcgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAvLyBYWFggd291bGQgYmUgbXVjaCBuaWNlciB0byBjb21waWxlIHRoaXMgb25jZSwgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBkb2N1bWVudCB3ZSBtb2RpZnkuLiBidXQgdXN1YWxseSB3ZSdyZSBub3RcbiAgICAgICAgICAgICAgICAvLyBtb2RpZnlpbmcgdGhhdCBtYW55IGRvY3VtZW50cywgc28gd2UnbGwgbGV0IGl0IHNsaWRlIGZvclxuICAgICAgICAgICAgICAgIC8vIG5vd1xuXG4gICAgICAgICAgICAgICAgLy8gWFhYIF9jb21waWxlU2VsZWN0b3IgaXNuJ3QgdXAgZm9yIHRoZSBqb2IsIGJlY2F1c2Ugd2UgbmVlZFxuICAgICAgICAgICAgICAgIC8vIHRvIHBlcm1pdCBzdHVmZiBsaWtlIHskcHVsbDoge2E6IHskZ3Q6IDR9fX0uLiBzb21ldGhpbmdcbiAgICAgICAgICAgICAgICAvLyBsaWtlIHskZ3Q6IDR9IGlzIG5vdCBub3JtYWxseSBhIGNvbXBsZXRlIHNlbGVjdG9yLlxuICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IG5ldyBTZWxlY3Rvcih7XG4gICAgICAgICAgICAgICAgICAgIFwiX19tYXRjaGluZ19fXCI6IGFyZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2RvY18gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX21hdGNoaW5nX186IHhbaV1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaC50ZXN0KF9kb2NfKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goeFtpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVNlbGVjdG9yTWF0Y2hlci5lcXVhbCh4W2ldLCBhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHVzaCh4W2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFyZ2V0W2ZpZWxkXSA9IG91dDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAkcHVsbEFsbDogZnVuY3Rpb24gKHRhcmdldCwgZmllbGQsIGFyZykge1xuICAgICAgICBpZiAoXy5pc05pbCh0YXJnZXQpIHx8IF8uaXNOaWwodGFyZ2V0W2ZpZWxkXSkpIHJldHVybjtcblxuICAgICAgICB2YXIgeCA9IHRhcmdldFtmaWVsZF07XG5cbiAgICAgICAgaWYgKCFfLmlzTmlsKHgpICYmICFfLmlzQXJyYXkoeCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvdyhcIk1vZGlmaWVyICRwdXNoQWxsL3B1bGxBbGwgYWxsb3dlZCBmb3IgYXJyYXlzIG9ubHlcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoIV8uaXNOaWwoeCkpIHtcbiAgICAgICAgICAgIHZhciBvdXQgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGV4Y2x1ZGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXJnLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChTZWxlY3Rvck1hdGNoZXIuZXF1YWwoeFtpXSwgYXJnW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFleGNsdWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKHhbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFyZ2V0W2ZpZWxkXSA9IG91dDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAkcmVuYW1lOiBmdW5jdGlvbiAodGFyZ2V0LCBmaWVsZCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGZpZWxkID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgLy8gbm8gaWRlYSB3aHkgbW9uZ28gaGFzIHRoaXMgcmVzdHJpY3Rpb24uLlxuICAgICAgICAgICAgbG9nZ2VyLnRocm93KFwiVGhlIG5ldyBmaWVsZCBuYW1lIG11c3QgYmUgZGlmZmVyZW50XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFfLmlzU3RyaW5nKHZhbHVlKSB8fCB2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3coXCJUaGUgbmV3IG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRbdmFsdWVdID0gdGFyZ2V0W2ZpZWxkXTtcbiAgICAgICAgZGVsZXRlIHRhcmdldFtmaWVsZF07XG4gICAgfSxcblxuICAgICRiaXQ6IGZ1bmN0aW9uICh0YXJnZXQsIGZpZWxkLCBhcmcpIHtcbiAgICAgICAgLy8gWFhYIG1vbmdvIG9ubHkgc3VwcG9ydHMgJGJpdCBvbiBpbnRlZ2VycywgYW5kIHdlIG9ubHkgc3VwcG9ydFxuICAgICAgICAvLyBuYXRpdmUgamF2YXNjcmlwdCBudW1iZXJzIChkb3VibGVzKSBzbyBmYXIsIHNvIHdlIGNhbid0IHN1cHBvcnQgJGJpdFxuICAgICAgICBsb2dnZXIudGhyb3coXCIkYml0IGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgfVxufTtcblxuLyoqXG4qIEBpZ25vcmVcbiovXG5Db2xsZWN0aW9uLmNoZWNrQ29sbGVjdGlvbk5hbWUgPSBmdW5jdGlvbihjb2xsZWN0aW9uTmFtZSkge1xuICAgIGlmICghXy5pc1N0cmluZyhjb2xsZWN0aW9uTmFtZSkpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93KFwiY29sbGVjdGlvbiBuYW1lIG11c3QgYmUgYSBTdHJpbmdcIik7XG4gICAgfVxuXG4gICAgaWYgKCFjb2xsZWN0aW9uTmFtZSB8fCBjb2xsZWN0aW9uTmFtZS5pbmRleE9mKCcuLicpICE9PSAtMSkge1xuICAgICAgICBsb2dnZXIudGhyb3coXCJjb2xsZWN0aW9uIG5hbWVzIGNhbm5vdCBiZSBlbXB0eVwiKTtcbiAgICB9XG5cbiAgICBpZiAoY29sbGVjdGlvbk5hbWUuaW5kZXhPZignJCcpICE9PSAtMSAmJiBjb2xsZWN0aW9uTmFtZS5tYXRjaCgvKCheXFwkY21kKXwob3Bsb2dcXC5cXCRtYWluKSkvKSA9PT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIudGhyb3coXCJjb2xsZWN0aW9uIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gJyQnXCIpO1xuICAgIH1cblxuICAgIGlmIChjb2xsZWN0aW9uTmFtZS5tYXRjaCgvXnN5c3RlbVxcLi8pICE9PSBudWxsKSB7XG4gICAgICAgIGxvZ2dlci50aHJvdyhcImNvbGxlY3Rpb24gbmFtZXMgbXVzdCBub3Qgc3RhcnQgd2l0aCAnc3lzdGVtLicgKHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UpXCIpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoY29sbGVjdGlvbk5hbWUubWF0Y2goL15cXC58XFwuJC8pICE9PSBudWxsKSB7XG4gICAgICAgIGxvZ2dlci50aHJvdyhcImNvbGxlY3Rpb24gbmFtZXMgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggJy4nXCIpO1xuICAgIH1cbn07XG5cbi8qKlxuKiBAaWdub3JlXG4qL1xuQ29sbGVjdGlvbi5wcm90b3R5cGUucmVuYW1lID0gZnVuY3Rpb24obmV3TmFtZSkge1xuICAgIGlmIChfLmlzU3RyaW5nKG5ld05hbWUpKSB7XG4gICAgICAgIGlmICh0aGlzLm5hbWUgIT09IG5ld05hbWUpIHtcbiAgICAgICAgICAgIENvbGxlY3Rpb24uY2hlY2tDb2xsZWN0aW9uTmFtZShuZXdOYW1lKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGRiTmFtZSA9IHRoaXMubmFtZS5zcGxpdCgnLicpLmxlbmd0aCA+IDEgPyB0aGlzLm5hbWUuc3BsaXQoJy4nKVswXSA6ICcnO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBuZXdOYW1lO1xuICAgICAgICAgICAgdGhpcy5mdWxsTmFtZSA9IGRiTmFtZSArICcuJyArIHRoaXMubmFtZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFcnJvclxuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sbGVjdGlvbjtcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGFuIG9iamVjdC5cbiAqIFxuICogQG1ldGhvZCBPYmplY3Qjc2l6ZVxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gVGhlIG9iamVjdFxuICogXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0XG4gKi9cbk9iamVjdC5zaXplID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIHNpemUgPSAwLCBcbiAgICAgICAga2V5O1xuICAgIFxuICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIHNpemUrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2l6ZTtcbn07XG5cbnZhciBfZW5zdXJlRmluZFBhcmFtcyA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgIC8vIHNlbGVjdGlvbiwgZmllbGRzLCBvcHRpb25zLCBjYWxsYmFja1xuICAgIGlmIChfLmlzTmlsKHBhcmFtcy5zZWxlY3Rpb24pKSBwYXJhbXMuc2VsZWN0aW9uID0ge307XG5cbiAgICBpZiAoXy5pc05pbChwYXJhbXMuc2VsZWN0aW9uKSkgcGFyYW1zLnNlbGVjdGlvbiA9IHt9O1xuXG4gICAgaWYgKF8uaXNOaWwocGFyYW1zLmZpZWxkcykpIHBhcmFtcy5maWVsZHMgPSBbXTtcblxuICAgIGlmIChfLmlzTmlsKHBhcmFtcy5vcHRpb25zKSkge1xuICAgICAgICBwYXJhbXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHNraXA6IDAsXG4gICAgICAgICAgICBsaW1pdDogMTUgLy8gZm9yIG5vIGxpbWl0IHBhc3MgW29wdGlvbnMubGltaXQgPSAtMV1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBjYWxsYmFjayBhcyBmaXJzdCBwYXJhbWV0ZXJcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy5zZWxlY3Rpb24pKSB7XG4gICAgICAgIHBhcmFtcy5jYWxsYmFjayA9IHBhcmFtcy5zZWxlY3Rpb247XG4gICAgICAgIHBhcmFtcy5zZWxlY3Rpb24gPSB7fTtcbiAgICB9XG5cbiAgICAvLyBjYWxsYmFjayBhcyBzZWNvbmQgcGFyYW1ldGVyXG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMuZmllbGRzKSkge1xuICAgICAgICBwYXJhbXMuY2FsbGJhY2sgPSBwYXJhbXMuZmllbGRzO1xuICAgICAgICBwYXJhbXMuZmllbGRzID0gW107XG4gICAgfVxuXG4gICAgLy8gY2FsbGJhY2sgYXMgdGhpcmQgcGFyYW1ldGVyXG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMub3B0aW9ucykpIHtcbiAgICAgICAgcGFyYW1zLmNhbGxiYWNrID0gcGFyYW1zLm9wdGlvbnM7XG4gICAgICAgIHBhcmFtcy5vcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIGFyZSB1c2luZyBhbiBvYmplY3RJZFxuICAgIGlmIChwYXJhbXMuc2VsZWN0aW9uIGluc3RhbmNlb2YgT2JqZWN0SWQpIHtcbiAgICAgICAgcGFyYW1zLnNlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIF9pZDogcGFyYW1zLnNlbGVjdGlvblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuY2FsbGJhY2spICYmICFfLmlzRnVuY3Rpb24ocGFyYW1zLmNhbGxiYWNrKSkge1xuICAgICAgICBsb2dnZXIudGhyb3coXCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5vcHRpb25zLmZpZWxkcykge1xuICAgICAgICBpZiAoXy5pc05pbChwYXJhbXMuZmllbGRzKSB8fCBwYXJhbXMuZmllbGRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcGFyYW1zLmZpZWxkcyA9IHBhcmFtcy5vcHRpb25zLmZpZWxkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiRmllbGRzIGFscmVhZHkgcHJlc2VudC4gSWdub3JpbmcgJ29wdGlvbnMuZmllbGRzJy5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHBhcmFtcztcbn07Il19 +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU0EsSUFBSSxTQUFTLFFBQVEsWUFBUixDQUFiO0lBQ0ksZUFBZSxRQUFRLHNCQUFSLENBRG5CO0lBRUksSUFBSSxRQUFRLFFBQVIsQ0FGUjtJQUdJLGNBQWMsUUFBUSxlQUFSLENBSGxCO0lBSUksU0FBUyxRQUFRLFVBQVIsQ0FKYjtJQUtJLFdBQVcsUUFBUSxZQUFSLENBTGY7SUFNSSxXQUFXLFFBQVEsWUFBUixDQU5mO0lBT0ksa0JBQWtCLFFBQVEsbUJBQVIsQ0FQdEI7O0FBU0EsSUFBSSxTQUFTLElBQWI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxJQUFJLFdBQVcsSUFBZjs7SUFDTSxVOzs7O0FBRUYsd0JBQVksRUFBWixFQUFnQixjQUFoQixFQUFnQyxPQUFoQyxFQUF5QztBQUFBOztBQUFBOztBQUFBOztBQUdyQyxZQUFJLEVBQUUsaUJBQWdCLFVBQWxCLENBQUosRUFBbUMsY0FBTyxJQUFJLFVBQUosQ0FBZSxFQUFmLEVBQW1CLGNBQW5CLEVBQW1DLE9BQW5DLENBQVA7O0FBRW5DLGlCQUFTLE9BQU8sUUFBaEI7O0FBRUEsWUFBSSxFQUFFLEtBQUYsQ0FBUSxFQUFSLENBQUosRUFBaUIsT0FBTyxLQUFQLENBQWEsdUJBQWI7O0FBRWpCLFlBQUksRUFBRSxLQUFGLENBQVEsY0FBUixDQUFKLEVBQTZCLE9BQU8sS0FBUCxDQUFhLG1DQUFiOztBQUU3QixZQUFJLEVBQUUsS0FBRixDQUFRLE9BQVIsS0FBb0IsQ0FBQyxFQUFFLGFBQUYsQ0FBZ0IsT0FBaEIsQ0FBekIsRUFBbUQsVUFBVSxFQUFWOztBQUVuRCxtQkFBVyxtQkFBWCxDQUErQixjQUEvQjs7O0FBR0EsbUJBQVcsRUFBWDtBQUNBLGNBQUssSUFBTCxHQUFZLGNBQVo7QUFDQSxjQUFLLFlBQUwsR0FBb0IsR0FBRyxZQUF2QjtBQUNBLGNBQUssUUFBTCxHQUFnQixNQUFLLFlBQUwsR0FBb0IsR0FBcEIsR0FBMEIsTUFBSyxJQUEvQztBQUNBLGNBQUssSUFBTCxHQUFZLEVBQVo7QUFDQSxjQUFLLFdBQUwsR0FBbUIsRUFBbkI7QUFDQSxjQUFLLFNBQUwsR0FBaUIsRUFBakI7QUFDQSxjQUFLLElBQUwsR0FBWSxFQUFaLEM7O0FBRUEsVUFBRSxLQUFGLENBQVEsTUFBSyxJQUFiLEVBQW1CLE9BQW5COzs7QUF6QnFDO0FBNEJ4Qzs7Ozs2QkFFSSxJLEVBQU0sSSxFQUFNLEUsRUFBSTtBQUNqQix1RkFBVyxJQUFYLEVBQWlCLElBQWpCLEVBQXVCLEVBQXZCLEVBQTJCLFNBQVMsT0FBcEM7QUFDSDs7OztFQWxDb0IsWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVEekIsV0FBVyxTQUFYLENBQXFCLE1BQXJCLEdBQThCLFVBQVUsR0FBVixFQUFlLE9BQWYsRUFBd0IsUUFBeEIsRUFBa0M7QUFDNUQsUUFBSSxFQUFFLEtBQUYsQ0FBUSxHQUFSLENBQUosRUFBa0IsT0FBTyxLQUFQLENBQWEsd0JBQWI7O0FBRWxCLFFBQUksQ0FBQyxFQUFFLGFBQUYsQ0FBZ0IsR0FBaEIsQ0FBTCxFQUEyQixPQUFPLEtBQVAsQ0FBYSx1QkFBYjs7QUFFM0IsUUFBSSxFQUFFLEtBQUYsQ0FBUSxPQUFSLENBQUosRUFBc0IsVUFBVSxFQUFWOztBQUV0QixRQUFJLEVBQUUsVUFBRixDQUFhLE9BQWIsQ0FBSixFQUEyQjtBQUN2QixtQkFBVyxPQUFYO0FBQ0Esa0JBQVUsRUFBVjtBQUNIOztBQUVELFFBQUksQ0FBQyxFQUFFLEtBQUYsQ0FBUSxRQUFSLENBQUQsSUFBc0IsQ0FBQyxFQUFFLFVBQUYsQ0FBYSxRQUFiLENBQTNCLEVBQW1ELE9BQU8sS0FBUCxDQUFhLDZCQUFiOzs7QUFHbkQsUUFBSSxPQUFPLEVBQUUsU0FBRixDQUFZLEdBQVosQ0FBWDs7O0FBR0EsUUFBSSxFQUFFLFFBQUYsQ0FBVyxLQUFLLEdBQWhCLENBQUosRUFBMEI7QUFDdEIsYUFBSyxHQUFMLEdBQVcsRUFBRSxRQUFGLENBQVcsS0FBSyxHQUFoQixDQUFYO0FBQ0g7O0FBRUQsUUFBSSxFQUFFLEtBQUYsQ0FBUSxLQUFLLEdBQWIsS0FBc0IsQ0FBQyxLQUFLLEdBQU4sWUFBcUIsUUFBckIsS0FBa0MsQ0FBQyxFQUFFLFFBQUYsQ0FBVyxLQUFLLEdBQWhCLENBQUQsSUFBeUIsQ0FBQyxLQUFLLEdBQUwsQ0FBUyxNQUFyRSxDQUExQixFQUF5RztBQUNyRyxhQUFLLEdBQUwsR0FBVyxJQUFJLFFBQUosRUFBWDtBQUNIOzs7QUFHRCxTQUFLLFNBQUwsR0FBaUIsSUFBSSxRQUFKLEdBQWUsY0FBaEM7OztBQUdBLFNBQUssV0FBTCxDQUFpQixFQUFFLFFBQUYsQ0FBVyxLQUFLLEdBQWhCLENBQWpCLElBQXlDLEtBQUssSUFBTCxDQUFVLE1BQW5EO0FBQ0EsU0FBSyxJQUFMLENBQVUsSUFBVixDQUFlLElBQWY7Ozs7Ozs7Ozs7QUFVQSxTQUFLLElBQUwsQ0FDSSxRQURKLEVBRUk7QUFDSSxvQkFBWSxJQURoQjtBQUVJLGFBQUs7QUFGVCxLQUZKOztBQVFBLFFBQUksUUFBSixFQUFjLFNBQVMsSUFBVCxFQUFlLElBQWY7O0FBRWQsUUFBSSxRQUFRLEtBQVosRUFBbUIsT0FBTyxJQUFQOztBQUVuQixXQUFPLElBQVA7QUFDSCxDQXRERDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwRUEsV0FBVyxTQUFYLENBQXFCLElBQXJCLEdBQTRCLFVBQVUsU0FBVixFQUFxQixNQUFyQixFQUE2QixPQUE3QixFQUFzQyxRQUF0QyxFQUFnRDtBQUN4RSxRQUFJLFNBQVMsa0JBQWtCO0FBQzNCLG1CQUFXLFNBRGdCO0FBRTNCLGdCQUFRLE1BRm1CO0FBRzNCLGlCQUFTLE9BSGtCO0FBSTNCLGtCQUFVO0FBSmlCLEtBQWxCLENBQWI7O0FBT0EsZ0JBQVksT0FBTyxTQUFuQjtBQUNBLGFBQVMsT0FBTyxNQUFoQjtBQUNBLGNBQVUsT0FBTyxPQUFqQjtBQUNBLGVBQVcsT0FBTyxRQUFsQjs7QUFFQSxRQUFJLFNBQVMsSUFBSSxNQUFKLENBQVcsS0FBSyxJQUFoQixFQUFzQixTQUF0QixFQUFpQyxNQUFqQyxFQUF5QyxPQUF6QyxDQUFiOzs7Ozs7Ozs7OztBQVdBLFNBQUssSUFBTCxDQUNJLE1BREosRUFFSTtBQUNJLG9CQUFZLElBRGhCO0FBRUksa0JBQVUsU0FGZDtBQUdJLGdCQUFRO0FBSFosS0FGSjs7OztBQVdBLFFBQUksUUFBSixFQUFjLFNBQVMsSUFBVCxFQUFlLE9BQU8sS0FBUCxFQUFmOztBQUVkLFFBQUksUUFBUSxVQUFaLEVBQXdCO0FBQ3BCLGVBQU8sT0FBTyxLQUFQLEVBQVA7QUFDSCxLQUZELE1BRU87QUFDSCxlQUFPLE1BQVA7QUFDSDtBQUNKLENBMUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkRBLFdBQVcsU0FBWCxDQUFxQixPQUFyQixHQUErQixVQUFVLFNBQVYsRUFBcUIsTUFBckIsRUFBNkIsT0FBN0IsRUFBc0MsUUFBdEMsRUFBZ0Q7QUFDM0UsUUFBSSxTQUFTLGtCQUFrQjtBQUMzQixtQkFBVyxTQURnQjtBQUUzQixnQkFBUSxNQUZtQjtBQUczQixpQkFBUyxPQUhrQjtBQUkzQixrQkFBVTtBQUppQixLQUFsQixDQUFiOztBQU9BLGdCQUFZLE9BQU8sU0FBbkI7QUFDQSxhQUFTLE9BQU8sTUFBaEI7QUFDQSxjQUFVLE9BQU8sT0FBakI7QUFDQSxlQUFXLE9BQU8sUUFBbEI7O0FBRUEsUUFBSSxTQUFTLElBQUksTUFBSixDQUFXLEtBQUssSUFBaEIsRUFBc0IsU0FBdEIsRUFBaUMsTUFBakMsRUFBeUMsT0FBekMsQ0FBYjs7Ozs7Ozs7Ozs7QUFXQSxTQUFLLElBQUwsQ0FDSSxTQURKLEVBRUk7QUFDSSxvQkFBWSxJQURoQjtBQUVJLGtCQUFVLFNBRmQ7QUFHSSxnQkFBUTtBQUhaLEtBRko7O0FBU0EsUUFBSSxNQUFNLElBQVY7O0FBRUEsUUFBSSxPQUFPLE9BQVAsRUFBSixFQUFzQjtBQUNsQixjQUFNLE9BQU8sSUFBUCxFQUFOO0FBQ0g7Ozs7QUFJRCxRQUFJLFFBQUosRUFBYyxTQUFTLElBQVQsRUFBZSxHQUFmOztBQUVkLFdBQU8sR0FBUDtBQUNILENBNUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZFQSxXQUFXLFNBQVgsQ0FBcUIsTUFBckIsR0FBOEIsVUFBVSxTQUFWLEVBQXFCLE1BQXJCLEVBQTZCLE9BQTdCLEVBQXNDLFFBQXRDLEVBQWdEO0FBQzFFLFFBQUksRUFBRSxLQUFGLENBQVEsU0FBUixDQUFKLEVBQXdCLFlBQVksRUFBWjs7QUFFeEIsUUFBSSxFQUFFLEtBQUYsQ0FBUSxNQUFSLENBQUosRUFBcUIsT0FBTyxLQUFQLENBQWEsdUNBQWI7O0FBRXJCLFFBQUksRUFBRSxLQUFGLENBQVEsT0FBUixDQUFKLEVBQXNCO0FBQ2xCLGtCQUFVO0FBQ04sa0JBQU0sQ0FEQTtBQUVOLG1CQUFPLEU7QUFGRCxTQUFWO0FBSUg7O0FBRUQsUUFBSSxFQUFFLFVBQUYsQ0FBYSxTQUFiLENBQUosRUFBNkIsT0FBTyxLQUFQLENBQWEsdUNBQWI7O0FBRTdCLFFBQUksRUFBRSxVQUFGLENBQWEsTUFBYixDQUFKLEVBQTBCLE9BQU8sS0FBUCxDQUFhLHVDQUFiOztBQUUxQixRQUFJLEVBQUUsVUFBRixDQUFhLE9BQWIsQ0FBSixFQUEyQjtBQUN2QixtQkFBVyxPQUFYO0FBQ0Esa0JBQVUsRUFBVjtBQUNIOzs7QUFHRCxRQUFHLHFCQUFxQixRQUF4QixFQUFrQztBQUM5QixvQkFBWTtBQUNSLGlCQUFLO0FBREcsU0FBWjtBQUdIOztBQUVELFFBQUksQ0FBQyxFQUFFLEtBQUYsQ0FBUSxRQUFSLENBQUQsSUFBc0IsQ0FBQyxFQUFFLFVBQUYsQ0FBYSxRQUFiLENBQTNCLEVBQW1ELE9BQU8sS0FBUCxDQUFhLDZCQUFiOztBQUVuRCxRQUFJLE1BQU0sSUFBVjs7QUFFQSxRQUFJLE9BQU8sSUFBWDtBQUNBLFFBQUksUUFBUSxLQUFaLEVBQW1CO0FBQ2YsZUFBTyxLQUFLLElBQUwsQ0FBVSxTQUFWLEVBQXFCLElBQXJCLEVBQTJCLEVBQUUsWUFBWSxJQUFkLEVBQTNCLENBQVA7QUFDSCxLQUZELE1BRU87QUFDSCxlQUFPLEtBQUssT0FBTCxDQUFhLFNBQWIsQ0FBUDtBQUNIOztBQUVELFFBQUksRUFBRSxLQUFGLENBQVEsSUFBUixDQUFKLEVBQW1CO0FBQ2YsZUFBTyxFQUFQO0FBQ0g7O0FBRUQsUUFBSSxDQUFDLEVBQUUsT0FBRixDQUFVLElBQVYsQ0FBTCxFQUFzQjtBQUNsQixlQUFPLENBQUMsSUFBRCxDQUFQO0FBQ0g7O0FBRUQsUUFBSSxLQUFLLE1BQUwsS0FBZ0IsQ0FBcEIsRUFBdUI7QUFDbkIsWUFBSSxRQUFRLE1BQVosRUFBb0I7QUFDaEIsZ0JBQUksV0FBVyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQWY7O0FBRUEsa0JBQU07QUFDRix5QkFBUztBQUNMLCtCQUFXLElBRE47QUFFTCwyQkFBTztBQUZGLGlCQURQO0FBS0YsMEJBQVU7QUFDTiwrQkFBVyxDQUFDLFFBQUQsQ0FETDtBQUVOLDJCQUFPO0FBRkQ7QUFMUixhQUFOO0FBVUgsU0FiRCxNQWFPOztBQUVILGtCQUFNO0FBQ0YseUJBQVM7QUFDTCwrQkFBVyxJQUROO0FBRUwsMkJBQU87QUFGRixpQkFEUDtBQUtGLDBCQUFVO0FBQ04sK0JBQVcsSUFETDtBQUVOLDJCQUFPO0FBRkQ7QUFMUixhQUFOO0FBVUg7QUFDSixLQTNCRCxNQTJCTztBQUNILFlBQUksY0FBYyxFQUFsQjs7QUFFQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxNQUF6QixFQUFpQyxHQUFqQyxFQUFzQztBQUNsQyxnQkFBSSxNQUFNLEtBQUssQ0FBTCxDQUFWOztBQUVBLGdCQUFJLFdBQVcsSUFBZjs7QUFFQSxnQkFBSSxjQUFjLEtBQWxCOztBQUVBLGlCQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3Qjs7Ozs7QUFLcEIsb0JBQUksV0FBWSxJQUFJLE1BQUosQ0FBVyxDQUFYLEVBQWMsQ0FBZCxNQUFxQixHQUFyQztBQUNBLG9CQUFJLFFBQUosRUFBYztBQUNWLGtDQUFjLElBQWQ7QUFDSDs7QUFFRCxvQkFBSSxRQUFRLGFBQVosRUFBMkI7QUFDdkIsd0JBQUksZUFBZSxDQUFDLFFBQXBCLEVBQThCLE9BQU8sS0FBUCxDQUFhLDhDQUFiOztBQUU5Qix3QkFBSSxDQUFDLFdBQUQsSUFBZ0IsUUFBUSxLQUE1QixFQUFtQyxPQUFPLEtBQVAsQ0FBYSw0RUFBYjs7QUFFbkMsd0JBQUksV0FBSixFQUFpQixXQUFXLEtBQVg7O0FBRWpCLHdCQUFJLENBQUMsV0FBTCxFQUFrQixXQUFXLElBQVg7QUFDckIsaUJBUkQsTUFRTztBQUNILCtCQUFXLENBQUMsQ0FBQyxRQUFRLFFBQXJCO0FBQ0g7QUFDSjs7QUFFRCxnQkFBSSxhQUFhLElBQWpCOztBQUVBLGdCQUFJLFFBQUosRUFBYzs7QUFFViw2QkFBYTtBQUNULHlCQUFLLElBQUk7QUFEQSxpQkFBYjs7O0FBS0EscUJBQUssSUFBSSxJQUFULElBQWdCLE1BQWhCLEVBQXdCO0FBQ3BCLHdCQUFJLEtBQUksTUFBSixDQUFXLENBQVgsRUFBYyxDQUFkLE1BQXFCLEdBQXJCLElBQTRCLE1BQU0sSUFBTixDQUFXLElBQVgsQ0FBaEMsRUFBaUQ7QUFDN0MsK0JBQU8sSUFBUCxnQkFBeUIsSUFBekI7QUFDSCxxQkFGRCxNQUVPO0FBQ0gsbUNBQVcsSUFBWCxJQUFrQixPQUFPLElBQVAsQ0FBbEI7QUFDSDtBQUNKO0FBQ0osYUFkRCxNQWNPO0FBQ0gsNkJBQWEsRUFBRSxTQUFGLENBQVksR0FBWixDQUFiOztBQUVBLHFCQUFLLElBQUksS0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUNwQix3QkFBSSxNQUFNLE9BQU8sS0FBUCxDQUFWOztBQUVBLHdCQUFJLE1BQUksTUFBSixDQUFXLENBQVgsRUFBYyxDQUFkLE1BQXFCLEdBQXpCLEVBQThCO0FBQzFCLHFDQUFhLGVBQWUsVUFBZixFQUEyQixLQUEzQixFQUFnQyxHQUFoQyxDQUFiO0FBQ0gscUJBRkQsTUFFTztBQUNILDRCQUFJLENBQUMsRUFBRSxLQUFGLENBQVEsV0FBVyxLQUFYLENBQVIsQ0FBTCxFQUErQjtBQUMzQixnQ0FBSSxVQUFRLEtBQVosRUFBbUI7QUFDZiwyQ0FBVyxLQUFYLElBQWtCLEdBQWxCO0FBQ0gsNkJBRkQsTUFFTztBQUNILHVDQUFPLElBQVAsQ0FBWSxvQ0FBWjtBQUNIO0FBQ0oseUJBTkQsTUFNTztBQUNILG1DQUFPLElBQVAsK0NBQXdELEtBQXhEO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7O0FBRUQsd0JBQVksSUFBWixDQUFpQixVQUFqQjs7QUFFQSxnQkFBSSxNQUFNLEtBQUssV0FBTCxDQUFpQixXQUFXLEdBQTVCLENBQVY7QUFDQSxpQkFBSyxJQUFMLENBQVUsR0FBVixJQUFpQixVQUFqQjtBQUNIOzs7Ozs7Ozs7Ozs7QUFZRCxhQUFLLElBQUwsQ0FDSSxRQURKLEVBRUk7QUFDSSx3QkFBWSxJQURoQjtBQUVJLHNCQUFVLFNBRmQ7QUFHSSxzQkFBVSxNQUhkO0FBSUksa0JBQU07QUFKVixTQUZKOztBQVVBLGNBQU07QUFDRixxQkFBUztBQUNMLDJCQUFXLFdBRE47QUFFTCx1QkFBTyxZQUFZO0FBRmQsYUFEUDtBQUtGLHNCQUFVO0FBQ04sMkJBQVcsSUFETDtBQUVOLHVCQUFPO0FBRkQ7QUFMUixTQUFOO0FBVUg7O0FBR0QsUUFBSSxRQUFKLEVBQWMsU0FBUyxJQUFULEVBQWUsR0FBZjs7QUFFZCxXQUFPLEdBQVA7QUFDSCxDQTNMRDs7QUE2TEEsSUFBSSxpQkFBaUIsU0FBakIsY0FBaUIsQ0FBUyxVQUFULEVBQXFCLEdBQXJCLEVBQTBCLEdBQTFCLEVBQStCO0FBQ2hELFFBQUksTUFBTSxFQUFFLFNBQUYsQ0FBWSxVQUFaLENBQVY7OztBQUdBLFFBQUksQ0FBQyxXQUFXLEdBQVgsQ0FBTCxFQUFzQjtBQUNsQixlQUFPLEtBQVAsa0NBQTRDLEdBQTVDO0FBQ0g7O0FBRUQsU0FBSyxJQUFJLE9BQVQsSUFBb0IsR0FBcEIsRUFBeUI7QUFDckIsWUFBSSxRQUFRLElBQUksT0FBSixDQUFaO0FBQ0EsWUFBSSxXQUFXLFFBQVEsS0FBUixDQUFjLEdBQWQsQ0FBZjs7QUFFQSxnQkFBUSxHQUFSLEVBQWEsUUFBYixFQUF1QixLQUF2QixFQUE4QixHQUE5Qjs7Ozs7Ozs7QUFRSDs7QUFFRCxXQUFPLEdBQVA7QUFDSCxDQXZCRDs7QUF5QkEsSUFBSSxVQUFVLFNBQVYsT0FBVSxDQUFTLFFBQVQsRUFBbUIsUUFBbkIsRUFBNkIsS0FBN0IsRUFBb0MsR0FBcEMsRUFBb0Q7QUFBQSxRQUFYLEtBQVcseURBQUgsQ0FBRzs7QUFDOUQsU0FBSyxJQUFJLElBQUksS0FBYixFQUFvQixJQUFJLFNBQVMsTUFBakMsRUFBeUMsR0FBekMsRUFBOEM7QUFDMUMsWUFBSSxPQUFPLFNBQVMsQ0FBVCxDQUFYO0FBQ0EsWUFBSSxZQUFZLFdBQVcsSUFBWCxDQUFnQixJQUFoQixDQUFoQjtBQUNBLFlBQUksU0FBUyxTQUFTLElBQVQsQ0FBYjs7QUFFQSxZQUFJLFNBQVMsRUFBRSxLQUFGLENBQVEsV0FBVyxrQkFBbkIsRUFBdUMsR0FBdkMsSUFBOEMsS0FBOUMsR0FBc0QsSUFBbkU7QUFDQSxZQUFJLENBQUMsTUFBRCxLQUFZLENBQUMsRUFBRSxRQUFGLENBQVcsUUFBWCxDQUFELElBQXlCLEVBQUUsS0FBRixDQUFRLE1BQVIsQ0FBckMsQ0FBSixFQUEyRDtBQUN2RCxtQkFBTyxLQUFQLG9CQUE2QixJQUE3Qiw0QkFBc0QsS0FBSyxTQUFMLENBQWUsUUFBZixDQUF0RDtBQUNIOztBQUVELFlBQUksRUFBRSxPQUFGLENBQVUsUUFBVixDQUFKLEVBQXlCOztBQUVyQixnQkFBSSxRQUFRLFNBQVosRUFBdUIsT0FBTyxJQUFQOzs7QUFHdkIsZ0JBQUksU0FBSixFQUFlO0FBQ1gsdUJBQU8sRUFBRSxRQUFGLENBQVcsSUFBWCxDQUFQO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsdUJBQU8sS0FBUCxrQkFBMkIsSUFBM0I7QUFDSDs7O0FBR0QsbUJBQU8sU0FBUyxNQUFULEdBQWtCLElBQXpCLEVBQStCO0FBQzNCLHlCQUFTLElBQVQsQ0FBYyxJQUFkO0FBQ0g7QUFDSjs7QUFFRCxZQUFJLElBQUksU0FBUyxNQUFULEdBQWtCLENBQTFCLEVBQTZCO0FBQ3pCLGdCQUFJLEVBQUUsS0FBRixDQUFRLE1BQVIsQ0FBSixFQUFxQjs7QUFFakIsb0JBQUksRUFBRSxRQUFGLENBQVcsRUFBRSxRQUFGLENBQVcsU0FBUyxJQUFJLENBQWIsQ0FBWCxDQUFYLENBQUosRUFBNkM7O0FBQ3pDLDZCQUFTLEVBQVQ7QUFDSCxpQkFGRCxNQUVPO0FBQ0gsNkJBQVMsRUFBVDtBQUNIO0FBQ0o7O0FBRUQscUJBQVMsSUFBVCxJQUFpQixRQUFRLE1BQVIsRUFBZ0IsUUFBaEIsRUFBMEIsS0FBMUIsRUFBaUMsR0FBakMsRUFBc0MsUUFBUSxDQUE5QyxDQUFqQjs7QUFFQSxtQkFBTyxRQUFQO0FBQ0gsU0FiRCxNQWFPO0FBQ0gsdUJBQVcsR0FBWCxFQUFnQixRQUFoQixFQUEwQixJQUExQixFQUFnQyxLQUFoQzs7QUFFQSxtQkFBTyxRQUFQO0FBQ0g7QUFDSjtBQUNKLENBL0NEOzs7Ozs7Ozs7Ozs7Ozs7OztBQWdFQSxXQUFXLFNBQVgsQ0FBcUIsTUFBckIsR0FBOEIsVUFBVSxTQUFWLEVBQXFCLE9BQXJCLEVBQThCLFFBQTlCLEVBQXdDO0FBQUE7O0FBQ2xFLFFBQUksRUFBRSxLQUFGLENBQVEsU0FBUixDQUFKLEVBQXdCLFlBQVksRUFBWjs7QUFFeEIsUUFBSSxFQUFFLFVBQUYsQ0FBYSxTQUFiLENBQUosRUFBNkI7QUFDekIsbUJBQVcsU0FBWDtBQUNBLG9CQUFZLEVBQVo7QUFDSDs7QUFFRCxRQUFJLEVBQUUsVUFBRixDQUFhLE9BQWIsQ0FBSixFQUEyQjtBQUN2QixtQkFBVyxPQUFYO0FBQ0Esa0JBQVUsRUFBVjtBQUNIOztBQUVELFFBQUksRUFBRSxLQUFGLENBQVEsT0FBUixDQUFKLEVBQXNCLFVBQVUsRUFBRSxTQUFTLEtBQVgsRUFBVjs7O0FBR3RCLFFBQUksT0FBTyxJQUFQLENBQVksU0FBWixNQUEyQixDQUEzQixJQUFnQyxDQUFDLFFBQVEsT0FBN0MsRUFBc0QsT0FBTyxLQUFLLElBQUwsQ0FBVSxPQUFWLEVBQW1CLFFBQW5CLENBQVA7OztBQUd0RCxRQUFHLHFCQUFxQixRQUF4QixFQUFrQztBQUM5QixvQkFBWTtBQUNSLGlCQUFLO0FBREcsU0FBWjtBQUdIOztBQUVELFFBQUksQ0FBQyxFQUFFLEtBQUYsQ0FBUSxRQUFSLENBQUQsSUFBc0IsQ0FBQyxFQUFFLFVBQUYsQ0FBYSxRQUFiLENBQTNCLEVBQW1ELE9BQU8sS0FBUCxDQUFhLDZCQUFiOztBQUVuRCxRQUFJLFNBQVMsS0FBSyxJQUFMLENBQVUsU0FBVixDQUFiOztBQUVBLFFBQUksT0FBTyxFQUFYO0FBQ0EsV0FBTyxPQUFQLENBQWUsZUFBTztBQUNsQixZQUFJLE1BQU0sT0FBSyxXQUFMLENBQWlCLElBQUksR0FBckIsQ0FBVjs7QUFFQSxlQUFPLE9BQUssV0FBTCxDQUFpQixJQUFJLEdBQXJCLENBQVA7QUFDQSxlQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLEdBQWpCLEVBQXNCLENBQXRCOztBQUVBLGFBQUssSUFBTCxDQUFVLEdBQVY7QUFDSCxLQVBEOzs7Ozs7Ozs7OztBQWtCQSxTQUFLLElBQUwsQ0FDSSxRQURKLEVBRUk7QUFDSSxvQkFBWSxJQURoQjtBQUVJLGtCQUFVLFNBRmQ7QUFHSSxjQUFNO0FBSFYsS0FGSjs7QUFTQSxRQUFJLFFBQUosRUFBYyxTQUFTLElBQVQsRUFBZSxJQUFmOztBQUVkLFdBQU8sSUFBUDtBQUNILENBNUREOzs7Ozs7O0FBbUVBLFdBQVcsU0FBWCxDQUFxQixNQUFyQixHQUE4QixVQUFVLFNBQVYsRUFBcUIsT0FBckIsRUFBOEIsUUFBOUIsRUFBd0M7QUFDbEUsV0FBTyxLQUFLLE1BQUwsQ0FBWSxTQUFaLEVBQXVCLE9BQXZCLEVBQWdDLFFBQWhDLENBQVA7QUFDSCxDQUZEOzs7Ozs7O0FBU0EsV0FBVyxTQUFYLENBQXFCLE9BQXJCLEdBQStCLFVBQVUsU0FBVixFQUFxQixPQUFyQixFQUE4QixRQUE5QixFQUF3QztBQUNuRSxXQUFPLEtBQUssTUFBTCxDQUFZLFNBQVosRUFBdUIsT0FBdkIsRUFBZ0MsUUFBaEMsQ0FBUDtBQUNILENBRkQ7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsV0FBVyxTQUFYLENBQXFCLElBQXJCLEdBQTRCLFVBQVMsT0FBVCxFQUFrQixRQUFsQixFQUE0QjtBQUNwRCxRQUFJLEVBQUUsS0FBRixDQUFRLE9BQVIsQ0FBSixFQUFzQixVQUFVLEVBQVY7O0FBRXRCLFFBQUksRUFBRSxVQUFGLENBQWEsT0FBYixDQUFKLEVBQTJCO0FBQ3ZCLG1CQUFXLE9BQVg7QUFDQSxrQkFBVSxFQUFWO0FBQ0g7O0FBRUQsUUFBSSxDQUFDLEVBQUUsS0FBRixDQUFRLFFBQVIsQ0FBRCxJQUFzQixDQUFDLEVBQUUsVUFBRixDQUFhLFFBQWIsQ0FBM0IsRUFBbUQsT0FBTyxLQUFQLENBQWEsNkJBQWI7O0FBRW5ELFNBQUssV0FBTCxHQUFtQixFQUFuQjtBQUNBLFNBQUssSUFBTCxHQUFZLEVBQVo7O0FBRUEsUUFBSSxRQUFRLFdBQVosRUFBeUIsQ0FBRSxDOztBQUUzQixTQUFLLElBQUwsQ0FDSSxnQkFESixFQUVJO0FBQ0ksb0JBQVksSUFEaEI7QUFFSSxpQkFBUyxDQUFDLENBQUMsUUFBUTtBQUZ2QixLQUZKOztBQVFBLFFBQUksUUFBSixFQUFjLFNBQVMsSUFBVCxFQUFlLElBQWY7O0FBRWQsV0FBTyxJQUFQO0FBQ0gsQ0ExQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQ0EsV0FBVyxTQUFYLENBQXFCLElBQXJCLEdBQTRCLFVBQVMsR0FBVCxFQUFjLE9BQWQsRUFBdUIsUUFBdkIsRUFBaUM7QUFDekQsUUFBSSxFQUFFLEtBQUYsQ0FBUSxHQUFSLEtBQWdCLEVBQUUsVUFBRixDQUFhLEdBQWIsQ0FBcEIsRUFBdUMsT0FBTyxLQUFQLENBQWEsMEJBQWI7O0FBRXZDLFFBQUksRUFBRSxVQUFGLENBQWEsT0FBYixDQUFKLEVBQTJCO0FBQ3ZCLG1CQUFXLE9BQVg7QUFDQSxrQkFBVSxFQUFWO0FBQ0g7O0FBRUQsUUFBSSxFQUFFLEtBQUYsQ0FBUSxHQUFSLEVBQWEsS0FBYixDQUFKLEVBQXlCO0FBQ3JCLGdCQUFRLE1BQVIsR0FBaUIsSUFBakI7O0FBRUEsZUFBTyxLQUFLLE1BQUwsQ0FDSCxFQUFFLEtBQUssSUFBSSxHQUFYLEVBREcsRUFFSCxHQUZHLEVBR0gsT0FIRyxFQUlILFFBSkcsQ0FBUDtBQU1ILEtBVEQsTUFTTztBQUNILGVBQU8sS0FBSyxNQUFMLENBQVksR0FBWixFQUFpQixPQUFqQixFQUEwQixRQUExQixDQUFQO0FBQ0g7QUFDSixDQXBCRDs7Ozs7QUF5QkEsV0FBVyxTQUFYLENBQXFCLFdBQXJCLEdBQW1DLFlBQVc7O0FBRTFDLFdBQU8sS0FBUCxDQUFhLGdEQUFiO0FBQ0gsQ0FIRDs7Ozs7Ozs7QUFXQSxXQUFXLFNBQVgsQ0FBcUIsTUFBckIsR0FBOEIsVUFBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQThCO0FBQ3hELFFBQUksRUFBRSxVQUFGLENBQWEsUUFBYixDQUFKLEVBQTRCO0FBQ3hCLG1CQUFXLFFBQVg7QUFDQSxtQkFBVyxJQUFJLFFBQUosR0FBZSxRQUFmLEVBQVg7QUFDSDs7QUFFRCxRQUFJLENBQUMsRUFBRSxLQUFGLENBQVEsUUFBUixDQUFELElBQXNCLENBQUMsRUFBRSxVQUFGLENBQWEsUUFBYixDQUEzQixFQUFtRCxPQUFPLEtBQVAsQ0FBYSw2QkFBYjs7QUFFbkQsU0FBSyxTQUFMLENBQWUsUUFBZixJQUEyQixFQUFFLFNBQUYsQ0FBWSxLQUFLLElBQWpCLENBQTNCO0FBQ0EsU0FBSyxJQUFMLENBQ0ksVUFESixFQUVJO0FBQ0ksb0JBQVksSUFEaEI7QUFFSSxrQkFBVSxRQUZkO0FBR0ksbUJBQVcsS0FBSyxTQUFMLENBQWUsUUFBZjtBQUhmLEtBRko7O0FBU0EsUUFBSSxTQUFTO0FBQ1Qsa0JBQVUsUUFERDtBQUVULG1CQUFXLEtBQUssU0FBTCxDQUFlLFFBQWY7QUFGRixLQUFiOztBQUtBLFFBQUksUUFBSixFQUFjLFNBQVMsSUFBVCxFQUFlLE1BQWY7O0FBRWQsV0FBTyxNQUFQO0FBQ0gsQ0ExQkQ7Ozs7OztBQWdDQSxXQUFXLFNBQVgsQ0FBcUIsT0FBckIsR0FBK0IsVUFBVSxRQUFWLEVBQW9CO0FBQy9DLFFBQUksQ0FBQyxFQUFFLEtBQUYsQ0FBUSxRQUFSLENBQUQsSUFBc0IsQ0FBQyxFQUFFLFVBQUYsQ0FBYSxRQUFiLENBQTNCLEVBQW1ELE9BQU8sS0FBUCxDQUFhLDZCQUFiOztBQUVuRCxRQUFJLFVBQVUsRUFBZDs7QUFFQSxTQUFLLElBQUksRUFBVCxJQUFlLEtBQUssU0FBcEIsRUFBK0I7QUFDM0IsZ0JBQVEsSUFBUixDQUFhLEVBQUMsSUFBSSxFQUFMLEVBQVMsV0FBVyxLQUFLLFNBQUwsQ0FBZSxFQUFmLENBQXBCLEVBQWI7QUFDSDs7QUFFRCxRQUFJLFFBQUosRUFBYyxTQUFTLElBQVQsRUFBZSxPQUFmOztBQUVkLFdBQU8sT0FBUDtBQUNILENBWkQ7Ozs7OztBQWtCQSxXQUFXLFNBQVgsQ0FBcUIsWUFBckIsR0FBb0MsVUFBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQThCO0FBQzlELFFBQUksRUFBRSxVQUFGLENBQWEsUUFBYixDQUFKLEVBQTRCO0FBQ3hCLG1CQUFXLFFBQVg7QUFDQSxtQkFBVyxJQUFYO0FBQ0g7O0FBRUQsUUFBSSxDQUFDLEVBQUUsS0FBRixDQUFRLFFBQVIsQ0FBRCxJQUFzQixDQUFDLEVBQUUsVUFBRixDQUFhLFFBQWIsQ0FBM0IsRUFBbUQsT0FBTyxLQUFQLENBQWEsNkJBQWI7O0FBRW5ELFFBQUksU0FBUyxLQUFiOztBQUVBLFFBQUksUUFBSixFQUFjO0FBQ1YsZUFBTyxLQUFLLFNBQUwsQ0FBZSxFQUFFLFFBQUYsQ0FBVyxRQUFYLENBQWYsQ0FBUDs7QUFFQSxpQkFBUyxRQUFUO0FBQ0gsS0FKRCxNQUlPO0FBQ0gsYUFBSyxTQUFMLEdBQWlCLEVBQWpCOztBQUVBLGlCQUFTLElBQVQ7QUFDSDs7QUFFRCxRQUFJLFFBQUosRUFBYyxTQUFTLElBQVQsRUFBZSxNQUFmOztBQUVkLFdBQU8sTUFBUDtBQUNILENBdkJEOzs7Ozs7QUE4QkEsV0FBVyxTQUFYLENBQXFCLE9BQXJCLEdBQStCLFVBQVUsUUFBVixFQUFvQixRQUFwQixFQUE4QjtBQUN6RCxRQUFJLEVBQUUsVUFBRixDQUFhLFFBQWIsQ0FBSixFQUE0QjtBQUN4QixtQkFBVyxRQUFYO0FBQ0EsbUJBQVcsSUFBWDtBQUNIOztBQUVELFFBQUksQ0FBQyxFQUFFLEtBQUYsQ0FBUSxRQUFSLENBQUQsSUFBc0IsQ0FBQyxFQUFFLFVBQUYsQ0FBYSxRQUFiLENBQTNCLEVBQW1ELE9BQU8sS0FBUCxDQUFhLDZCQUFiOztBQUVuRCxRQUFJLGdCQUFnQixPQUFPLElBQVAsQ0FBWSxLQUFLLFNBQWpCLENBQXBCO0FBQ0EsUUFBSSxhQUFhLElBQWpCOztBQUVBLFFBQUksa0JBQWtCLENBQXRCLEVBQXlCO0FBQ3JCLGVBQU8sS0FBUCxDQUFhLHVCQUFiO0FBQ0gsS0FGRCxNQUVPO0FBQ0gsWUFBSSxDQUFDLFFBQUwsRUFBZTtBQUNYLGdCQUFJLGtCQUFrQixDQUF0QixFQUF5QjtBQUNyQix1QkFBTyxJQUFQLENBQVksaURBQVo7OztBQUdBLHFCQUFLLElBQUksR0FBVCxJQUFnQixLQUFLLFNBQXJCO0FBQWdDLCtCQUFXLEdBQVg7QUFBaEM7QUFDSCxhQUxELE1BS087QUFDSCx1QkFBTyxLQUFQLENBQWEsd0RBQWI7QUFDSDtBQUNKO0FBQ0o7O0FBRUQsaUJBQWEsS0FBSyxTQUFMLENBQWUsUUFBZixDQUFiOztBQUVBLFFBQUksQ0FBQyxVQUFMLEVBQWlCO0FBQ2IsZUFBTyxLQUFQLHlCQUFtQyxRQUFuQztBQUNIOztBQUVELFNBQUssSUFBTCxHQUFZLFVBQVo7QUFDQSxTQUFLLElBQUwsQ0FDSSxTQURKLEVBRUk7QUFDSSxvQkFBWSxJQURoQjtBQUVJLGtCQUFVO0FBRmQsS0FGSjs7QUFRQSxRQUFJLFFBQUosRUFBYyxTQUFTLElBQVQ7O0FBRWQsV0FBTyxJQUFQO0FBQ0gsQ0E1Q0Q7Ozs7Ozs7Ozs7Ozs7O0FBMERBLFdBQVcsU0FBWCxDQUFxQixTQUFyQixHQUFpQyxVQUFTLFFBQVQsRUFBb0Q7QUFBQSxRQUFqQyxPQUFpQyx5REFBdkIsRUFBRSxZQUFZLEtBQWQsRUFBdUI7O0FBQ2pGLFFBQUksRUFBRSxLQUFGLENBQVEsUUFBUixLQUFxQixDQUFDLEVBQUUsT0FBRixDQUFVLFFBQVYsQ0FBMUIsRUFBK0MsT0FBTyxLQUFQLENBQWEsdUNBQWI7O0FBRS9DLFFBQUksY0FBYyxJQUFJLFdBQUosQ0FBZ0IsUUFBaEIsQ0FBbEI7O0FBRUEsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFNBQVMsTUFBN0IsRUFBcUMsR0FBckMsRUFBMEM7QUFDdEMsWUFBSSxRQUFRLFNBQVMsQ0FBVCxDQUFaOztBQUVBLGFBQUssSUFBSSxHQUFULElBQWdCLEtBQWhCLEVBQXVCO0FBQ25CLGdCQUFJLElBQUksTUFBSixDQUFXLENBQVgsRUFBYyxDQUFkLE1BQXFCLEdBQXpCLEVBQThCLE9BQU8sS0FBUCxDQUFhLHlDQUFiOztBQUU5QixnQkFBSSxDQUFDLFlBQVksVUFBWixDQUF1QixHQUF2QixDQUFMLEVBQWtDLE9BQU8sS0FBUCxzQkFBK0IsR0FBL0I7O0FBRWxDO0FBQ0g7QUFDSjs7QUFFRCxRQUFJLFNBQVMsWUFBWSxTQUFaLENBQXNCLElBQXRCLENBQWI7O0FBRUEsV0FBTyxNQUFQLEM7QUFDSCxDQXBCRDs7Ozs7QUF5QkEsV0FBVyxrQkFBWCxHQUFnQztBQUM1QixZQUFRLElBRG9CO0FBRTVCLFVBQU0sSUFGc0I7QUFHNUIsYUFBUyxJQUhtQjtBQUk1QixXQUFPLElBSnFCO0FBSzVCLGNBQVU7QUFMa0IsQ0FBaEM7Ozs7O0FBV0EsSUFBSSxhQUFhO0FBQ2IsVUFBTSxjQUFVLE1BQVYsRUFBa0IsS0FBbEIsRUFBeUIsR0FBekIsRUFBOEI7QUFDaEMsWUFBSSxDQUFDLEVBQUUsUUFBRixDQUFXLEdBQVgsQ0FBTCxFQUFzQjtBQUNsQixtQkFBTyxLQUFQLENBQWEsd0NBQWI7QUFDSDs7QUFFRCxZQUFJLFNBQVMsTUFBYixFQUFxQjtBQUNqQixnQkFBSSxDQUFDLEVBQUUsUUFBRixDQUFXLE9BQU8sS0FBUCxDQUFYLENBQUwsRUFBZ0M7QUFDNUIsdUJBQU8sS0FBUCxDQUFhLDBDQUFiO0FBQ0g7O0FBRUQsbUJBQU8sS0FBUCxLQUFpQixHQUFqQjtBQUNILFNBTkQsTUFNTztBQUNILG1CQUFPLEtBQVAsSUFBZ0IsR0FBaEI7QUFDSDtBQUNKLEtBZlk7O0FBaUJiLFVBQU0sY0FBVSxNQUFWLEVBQWtCLEtBQWxCLEVBQXlCLEdBQXpCLEVBQThCO0FBQ2hDLGVBQU8sS0FBUCxJQUFnQixFQUFFLFNBQUYsQ0FBWSxHQUFaLENBQWhCO0FBQ0gsS0FuQlk7O0FBcUJiLFlBQVEsZ0JBQVUsTUFBVixFQUFrQixLQUFsQixFQUF5QixHQUF6QixFQUE4QjtBQUNsQyxZQUFJLENBQUMsRUFBRSxLQUFGLENBQVEsTUFBUixDQUFMLEVBQXNCO0FBQ2xCLGdCQUFJLEVBQUUsT0FBRixDQUFVLE1BQVYsQ0FBSixFQUF1QjtBQUNuQixvQkFBSSxTQUFTLE1BQWIsRUFBcUI7QUFDakIsMkJBQU8sS0FBUCxJQUFnQixJQUFoQjtBQUNIO0FBQ0osYUFKRCxNQUlPO0FBQ0gsdUJBQU8sT0FBTyxLQUFQLENBQVA7QUFDSDtBQUNKO0FBQ0osS0EvQlk7O0FBaUNiLFdBQU8sZUFBVSxNQUFWLEVBQWtCLEtBQWxCLEVBQXlCLEdBQXpCLEVBQThCO0FBQ2pDLFlBQUksSUFBSSxPQUFPLEtBQVAsQ0FBUjs7QUFFQSxZQUFJLEVBQUUsS0FBRixDQUFRLENBQVIsQ0FBSixFQUFnQjtBQUNaLG1CQUFPLEtBQVAsSUFBZ0IsQ0FBQyxHQUFELENBQWhCO0FBQ0gsU0FGRCxNQUVPLElBQUksQ0FBQyxFQUFFLE9BQUYsQ0FBVSxDQUFWLENBQUwsRUFBbUI7QUFDdEIsbUJBQU8sS0FBUCxDQUFhLDBDQUFiO0FBQ0gsU0FGTSxNQUVBO0FBQ0gsY0FBRSxJQUFGLENBQU8sRUFBRSxTQUFGLENBQVksR0FBWixDQUFQO0FBQ0g7QUFDSixLQTNDWTs7QUE2Q2IsY0FBVSxrQkFBVSxNQUFWLEVBQWtCLEtBQWxCLEVBQXlCLEdBQXpCLEVBQThCO0FBQ3BDLFlBQUksSUFBSSxPQUFPLEtBQVAsQ0FBUjs7QUFFQSxZQUFJLEVBQUUsS0FBRixDQUFRLENBQVIsQ0FBSixFQUFnQjtBQUNaLG1CQUFPLEtBQVAsSUFBZ0IsR0FBaEI7QUFDSCxTQUZELE1BRU8sSUFBSSxDQUFDLEVBQUUsT0FBRixDQUFVLENBQVYsQ0FBTCxFQUFtQjtBQUN0QixtQkFBTyxLQUFQLENBQWEsbURBQWI7QUFDSCxTQUZNLE1BRUE7QUFDSCxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQUksTUFBeEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsa0JBQUUsSUFBRixDQUFPLElBQUksQ0FBSixDQUFQO0FBQ0g7QUFDSjtBQUNKLEtBekRZOztBQTJEYixlQUFXLG1CQUFVLE1BQVYsRUFBa0IsS0FBbEIsRUFBeUIsR0FBekIsRUFBOEI7QUFDckMsWUFBSSxJQUFJLE9BQU8sS0FBUCxDQUFSOztBQUVBLFlBQUksRUFBRSxLQUFGLENBQVEsQ0FBUixDQUFKLEVBQWdCO0FBQ1osbUJBQU8sS0FBUCxJQUFnQixDQUFDLEdBQUQsQ0FBaEI7QUFDSCxTQUZELE1BRU8sSUFBSSxDQUFDLEVBQUUsT0FBRixDQUFVLENBQVYsQ0FBTCxFQUFtQjtBQUN0QixtQkFBTyxLQUFQLENBQWEsOENBQWI7QUFDSCxTQUZNLE1BRUE7QUFDSCxnQkFBSSxTQUFTLEtBQWI7QUFDQSxnQkFBSSxFQUFFLGFBQUYsQ0FBZ0IsR0FBaEIsQ0FBSixFQUEwQjtBQUN0QixxQkFBSyxJQUFJLENBQVQsSUFBYyxHQUFkLEVBQW1CO0FBQ2Ysd0JBQUksTUFBTSxPQUFWLEVBQW1CO0FBQ2YsaUNBQVMsSUFBVDtBQUNIOztBQUVEO0FBQ0g7QUFDSjs7QUFFRCxnQkFBSSxTQUFTLFNBQVMsSUFBSSxPQUFKLENBQVQsR0FBd0IsQ0FBQyxHQUFELENBQXJDO0FBQ0EsY0FBRSxPQUFGLENBQVUsTUFBVixFQUFrQixVQUFVLEtBQVYsRUFBaUI7QUFDL0IscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxFQUFFLE1BQXRCLEVBQThCLEdBQTlCLEVBQW1DO0FBQy9CLHdCQUFJLGdCQUFnQixLQUFoQixDQUFzQixLQUF0QixFQUE2QixFQUFFLENBQUYsQ0FBN0IsQ0FBSixFQUF3QztBQUMzQzs7QUFFRCxrQkFBRSxJQUFGLENBQU8sS0FBUDtBQUNILGFBTkQ7QUFPSDtBQUNKLEtBdkZZOztBQXlGYixVQUFNLGNBQVUsTUFBVixFQUFrQixLQUFsQixFQUF5QixHQUF6QixFQUE4QjtBQUNoQyxZQUFJLEVBQUUsS0FBRixDQUFRLE1BQVIsS0FBbUIsRUFBRSxLQUFGLENBQVEsT0FBTyxLQUFQLENBQVIsQ0FBdkIsRUFBK0M7O0FBRS9DLFlBQUksSUFBSSxPQUFPLEtBQVAsQ0FBUjs7QUFFQSxZQUFJLENBQUMsRUFBRSxPQUFGLENBQVUsQ0FBVixDQUFMLEVBQW1CO0FBQ2YsbUJBQU8sS0FBUCxDQUFhLHlDQUFiO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsZ0JBQUksRUFBRSxRQUFGLENBQVcsR0FBWCxLQUFtQixNQUFNLENBQTdCLEVBQWdDO0FBQzVCLGtCQUFFLE1BQUYsQ0FBUyxDQUFULEVBQVksQ0FBWjtBQUNILGFBRkQsTUFFTztBQUNILGtCQUFFLEdBQUY7QUFDSDtBQUNKO0FBQ0osS0F2R1k7O0FBeUdiLFdBQU8sZUFBVSxNQUFWLEVBQWtCLEtBQWxCLEVBQXlCLEdBQXpCLEVBQThCO0FBQ2pDLFlBQUksRUFBRSxLQUFGLENBQVEsTUFBUixLQUFtQixFQUFFLEtBQUYsQ0FBUSxPQUFPLEtBQVAsQ0FBUixDQUF2QixFQUErQzs7QUFFL0MsWUFBSSxJQUFJLE9BQU8sS0FBUCxDQUFSOztBQUVBLFlBQUksQ0FBQyxFQUFFLE9BQUYsQ0FBVSxDQUFWLENBQUwsRUFBbUI7QUFDZixtQkFBTyxLQUFQLENBQWEsa0RBQWI7QUFDSCxTQUZELE1BRU87QUFDSCxnQkFBSSxNQUFNLEVBQVY7O0FBRUEsZ0JBQUksUUFBTyxHQUFQLHlDQUFPLEdBQVAsT0FBZSxRQUFmLElBQTJCLEVBQUUsZUFBZSxLQUFqQixDQUEvQixFQUF3RDs7Ozs7Ozs7O0FBU3BELG9CQUFJLFFBQVEsSUFBSSxRQUFKLENBQWE7QUFDckIsb0NBQWdCO0FBREssaUJBQWIsQ0FBWjtBQUdBLHFCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksRUFBRSxNQUF0QixFQUE4QixHQUE5QixFQUFtQztBQUMvQix3QkFBSSxRQUFRO0FBQ1Isc0NBQWMsRUFBRSxDQUFGO0FBRE4scUJBQVo7QUFHQSx3QkFBSSxDQUFDLE1BQU0sSUFBTixDQUFXLEtBQVgsQ0FBTCxFQUF3QjtBQUNwQiw0QkFBSSxJQUFKLENBQVMsRUFBRSxDQUFGLENBQVQ7QUFDSDtBQUNKO0FBQ0osYUFwQkQsTUFvQk87QUFDSCxxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEVBQUUsTUFBdEIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0Isd0JBQUksQ0FBQyxnQkFBZ0IsS0FBaEIsQ0FBc0IsRUFBRSxDQUFGLENBQXRCLEVBQTRCLEdBQTVCLENBQUwsRUFBdUM7QUFDbkMsNEJBQUksSUFBSixDQUFTLEVBQUUsQ0FBRixDQUFUO0FBQ0g7QUFDSjtBQUNKOztBQUVELG1CQUFPLEtBQVAsSUFBZ0IsR0FBaEI7QUFDSDtBQUNKLEtBakpZOztBQW1KYixjQUFVLGtCQUFVLE1BQVYsRUFBa0IsS0FBbEIsRUFBeUIsR0FBekIsRUFBOEI7QUFDcEMsWUFBSSxFQUFFLEtBQUYsQ0FBUSxNQUFSLEtBQW1CLEVBQUUsS0FBRixDQUFRLE9BQU8sS0FBUCxDQUFSLENBQXZCLEVBQStDOztBQUUvQyxZQUFJLElBQUksT0FBTyxLQUFQLENBQVI7O0FBRUEsWUFBSSxDQUFDLEVBQUUsS0FBRixDQUFRLENBQVIsQ0FBRCxJQUFlLENBQUMsRUFBRSxPQUFGLENBQVUsQ0FBVixDQUFwQixFQUFrQztBQUM5QixtQkFBTyxLQUFQLENBQWEsbURBQWI7QUFDSCxTQUZELE1BRU8sSUFBSSxDQUFDLEVBQUUsS0FBRixDQUFRLENBQVIsQ0FBTCxFQUFpQjtBQUNwQixnQkFBSSxNQUFNLEVBQVY7O0FBRUEsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxFQUFFLE1BQXRCLEVBQThCLEdBQTlCLEVBQW1DO0FBQy9CLG9CQUFJLFVBQVUsS0FBZDs7QUFFQSxxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQUksTUFBeEIsRUFBZ0MsR0FBaEMsRUFBcUM7QUFDakMsd0JBQUksZ0JBQWdCLEtBQWhCLENBQXNCLEVBQUUsQ0FBRixDQUF0QixFQUE0QixJQUFJLENBQUosQ0FBNUIsQ0FBSixFQUF5QztBQUNyQyxrQ0FBVSxJQUFWOztBQUVBO0FBQ0g7QUFDSjs7QUFFRCxvQkFBSSxDQUFDLE9BQUwsRUFBYztBQUNWLHdCQUFJLElBQUosQ0FBUyxFQUFFLENBQUYsQ0FBVDtBQUNIO0FBQ0o7O0FBRUQsbUJBQU8sS0FBUCxJQUFnQixHQUFoQjtBQUNIO0FBQ0osS0EvS1k7O0FBaUxiLGFBQVMsaUJBQVUsTUFBVixFQUFrQixLQUFsQixFQUF5QixLQUF6QixFQUFnQztBQUNyQyxZQUFJLFVBQVUsS0FBZCxFQUFxQjs7QUFFakIsbUJBQU8sS0FBUCxDQUFhLHNDQUFiO0FBQ0g7O0FBRUQsWUFBSSxDQUFDLEVBQUUsUUFBRixDQUFXLEtBQVgsQ0FBRCxJQUFzQixNQUFNLElBQU4sT0FBaUIsRUFBM0MsRUFBK0M7QUFDM0MsbUJBQU8sS0FBUCxDQUFhLHlDQUFiO0FBQ0g7O0FBRUQsZUFBTyxLQUFQLElBQWdCLE9BQU8sS0FBUCxDQUFoQjtBQUNBLGVBQU8sT0FBTyxLQUFQLENBQVA7QUFDSCxLQTdMWTs7QUErTGIsVUFBTSxjQUFVLE1BQVYsRUFBa0IsS0FBbEIsRUFBeUIsR0FBekIsRUFBOEI7OztBQUdoQyxlQUFPLEtBQVAsQ0FBYSx1QkFBYjtBQUNIO0FBbk1ZLENBQWpCOzs7OztBQXlNQSxXQUFXLG1CQUFYLEdBQWlDLFVBQVMsY0FBVCxFQUF5QjtBQUN0RCxRQUFJLENBQUMsRUFBRSxRQUFGLENBQVcsY0FBWCxDQUFMLEVBQWlDO0FBQzdCLGVBQU8sS0FBUCxDQUFhLGtDQUFiO0FBQ0g7O0FBRUQsUUFBSSxDQUFDLGNBQUQsSUFBbUIsZUFBZSxPQUFmLENBQXVCLElBQXZCLE1BQWlDLENBQUMsQ0FBekQsRUFBNEQ7QUFDeEQsZUFBTyxLQUFQLENBQWEsa0NBQWI7QUFDSDs7QUFFRCxRQUFJLGVBQWUsT0FBZixDQUF1QixHQUF2QixNQUFnQyxDQUFDLENBQWpDLElBQXNDLGVBQWUsS0FBZixDQUFxQiw0QkFBckIsTUFBdUQsSUFBakcsRUFBdUc7QUFDbkcsZUFBTyxLQUFQLENBQWEsdUNBQWI7QUFDSDs7QUFFRCxRQUFJLGVBQWUsS0FBZixDQUFxQixXQUFyQixNQUFzQyxJQUExQyxFQUFnRDtBQUM1QyxlQUFPLEtBQVAsQ0FBYSw0RUFBYjtBQUNIOztBQUVELFFBQUksZUFBZSxLQUFmLENBQXFCLFNBQXJCLE1BQW9DLElBQXhDLEVBQThDO0FBQzFDLGVBQU8sS0FBUCxDQUFhLGlEQUFiO0FBQ0g7QUFDSixDQXBCRDs7Ozs7QUF5QkEsV0FBVyxTQUFYLENBQXFCLE1BQXJCLEdBQThCLFVBQVMsT0FBVCxFQUFrQjtBQUM1QyxRQUFJLEVBQUUsUUFBRixDQUFXLE9BQVgsQ0FBSixFQUF5QjtBQUNyQixZQUFJLEtBQUssSUFBTCxLQUFjLE9BQWxCLEVBQTJCO0FBQ3ZCLHVCQUFXLG1CQUFYLENBQStCLE9BQS9COztBQUVBLGdCQUFJLFNBQVMsS0FBSyxJQUFMLENBQVUsS0FBVixDQUFnQixHQUFoQixFQUFxQixNQUFyQixHQUE4QixDQUE5QixHQUFrQyxLQUFLLElBQUwsQ0FBVSxLQUFWLENBQWdCLEdBQWhCLEVBQXFCLENBQXJCLENBQWxDLEdBQTRELEVBQXpFOztBQUVBLGlCQUFLLElBQUwsR0FBWSxPQUFaO0FBQ0EsaUJBQUssUUFBTCxHQUFnQixTQUFTLEdBQVQsR0FBZSxLQUFLLElBQXBDOztBQUVBLG1CQUFPLElBQVA7QUFDSDtBQUNKLEtBWEQsTUFXTzs7QUFFTjtBQUNKLENBZkQ7O0FBaUJBLE9BQU8sT0FBUCxHQUFpQixVQUFqQjs7Ozs7Ozs7Ozs7QUFXQSxPQUFPLElBQVAsR0FBYyxVQUFTLEdBQVQsRUFBYztBQUN4QixRQUFJLE9BQU8sQ0FBWDtRQUNJLEdBREo7O0FBR0EsU0FBSyxHQUFMLElBQVksR0FBWixFQUFpQjtBQUNiLFlBQUksSUFBSSxjQUFKLENBQW1CLEdBQW5CLENBQUosRUFBNkI7QUFDekI7QUFDSDtBQUNKOztBQUVELFdBQU8sSUFBUDtBQUNILENBWEQ7O0FBYUEsSUFBSSxvQkFBb0IsU0FBcEIsaUJBQW9CLENBQVMsTUFBVCxFQUFpQjs7QUFFckMsUUFBSSxFQUFFLEtBQUYsQ0FBUSxPQUFPLFNBQWYsQ0FBSixFQUErQixPQUFPLFNBQVAsR0FBbUIsRUFBbkI7O0FBRS9CLFFBQUksRUFBRSxLQUFGLENBQVEsT0FBTyxTQUFmLENBQUosRUFBK0IsT0FBTyxTQUFQLEdBQW1CLEVBQW5COztBQUUvQixRQUFJLEVBQUUsS0FBRixDQUFRLE9BQU8sTUFBZixDQUFKLEVBQTRCLE9BQU8sTUFBUCxHQUFnQixFQUFoQjs7QUFFNUIsUUFBSSxFQUFFLEtBQUYsQ0FBUSxPQUFPLE9BQWYsQ0FBSixFQUE2QjtBQUN6QixlQUFPLE9BQVAsR0FBaUI7QUFDYixrQkFBTSxDQURPO0FBRWIsbUJBQU8sRTtBQUZNLFNBQWpCO0FBSUg7OztBQUdELFFBQUksRUFBRSxVQUFGLENBQWEsT0FBTyxTQUFwQixDQUFKLEVBQW9DO0FBQ2hDLGVBQU8sUUFBUCxHQUFrQixPQUFPLFNBQXpCO0FBQ0EsZUFBTyxTQUFQLEdBQW1CLEVBQW5CO0FBQ0g7OztBQUdELFFBQUksRUFBRSxVQUFGLENBQWEsT0FBTyxNQUFwQixDQUFKLEVBQWlDO0FBQzdCLGVBQU8sUUFBUCxHQUFrQixPQUFPLE1BQXpCO0FBQ0EsZUFBTyxNQUFQLEdBQWdCLEVBQWhCO0FBQ0g7OztBQUdELFFBQUksRUFBRSxVQUFGLENBQWEsT0FBTyxPQUFwQixDQUFKLEVBQWtDO0FBQzlCLGVBQU8sUUFBUCxHQUFrQixPQUFPLE9BQXpCO0FBQ0EsZUFBTyxPQUFQLEdBQWlCLEVBQWpCO0FBQ0g7OztBQUdELFFBQUksT0FBTyxTQUFQLFlBQTRCLFFBQWhDLEVBQTBDO0FBQ3RDLGVBQU8sU0FBUCxHQUFtQjtBQUNmLGlCQUFLLE9BQU87QUFERyxTQUFuQjtBQUdIOztBQUVELFFBQUksQ0FBQyxFQUFFLEtBQUYsQ0FBUSxPQUFPLFFBQWYsQ0FBRCxJQUE2QixDQUFDLEVBQUUsVUFBRixDQUFhLE9BQU8sUUFBcEIsQ0FBbEMsRUFBaUU7QUFDN0QsZUFBTyxLQUFQLENBQWEsNkJBQWI7QUFDSDs7QUFFRCxRQUFJLE9BQU8sT0FBUCxDQUFlLE1BQW5CLEVBQTJCO0FBQ3ZCLFlBQUksRUFBRSxLQUFGLENBQVEsT0FBTyxNQUFmLEtBQTBCLE9BQU8sTUFBUCxDQUFjLE1BQWQsS0FBeUIsQ0FBdkQsRUFBMEQ7QUFDdEQsbUJBQU8sTUFBUCxHQUFnQixPQUFPLE9BQVAsQ0FBZSxNQUEvQjtBQUNILFNBRkQsTUFFTztBQUNILG1CQUFPLElBQVAsQ0FBWSxvREFBWjtBQUNIO0FBQ0o7O0FBRUQsV0FBTyxNQUFQO0FBQ0gsQ0FyREQiLCJmaWxlIjoiQ29sbGVjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgQ29sbGVjdGlvbi5qcyAtIGJhc2VkIG9uIE1vbmdsbyNDb2xsZWN0aW9uICh7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL01vbmdsb30pIGJ5IENocmlzdGlhbiBTdWxsaXZhbiA8Y3NAZXVmb3JpYy5jbz4gfCBDb3B5cmlnaHQgKGMpIDIwMTJcbiAqIEB2ZXJzaW9uIDEuMC4wXG4gKiBcbiAqIEBhdXRob3IgRWR1YXJkbyBBc3RvbGZpIDxlYXN0b2xmaTkxQGdtYWlsLmNvbT5cbiAqIEBjb3B5cmlnaHQgMjAxNiBFZHVhcmRvIEFzdG9sZmkgPGVhc3RvbGZpOTFAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIExvZ2dlciA9IHJlcXVpcmUoXCJqc3ctbG9nZ2VyXCIpLFxuICAgIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoXCIuL3V0aWxzL0V2ZW50RW1pdHRlclwiKSxcbiAgICBfID0gcmVxdWlyZShcImxvZGFzaFwiKSxcbiAgICBBZ2dyZWdhdGlvbiA9IHJlcXVpcmUoXCIuL0FnZ3JlZ2F0aW9uXCIpLFxuICAgIEN1cnNvciA9IHJlcXVpcmUoXCIuL0N1cnNvclwiKSxcbiAgICBPYmplY3RJZCA9IHJlcXVpcmUoJy4vT2JqZWN0SWQnKSxcbiAgICBTZWxlY3RvciA9IHJlcXVpcmUoXCIuL1NlbGVjdG9yXCIpLFxuICAgIFNlbGVjdG9yTWF0Y2hlciA9IHJlcXVpcmUoXCIuL1NlbGVjdG9yTWF0Y2hlclwiKTtcbiAgICBcbnZhciBsb2dnZXIgPSBudWxsO1xuICAgIFxuLyoqXG4gKiBDb2xsZWN0aW9uXG4gKiBcbiAqIEBtb2R1bGUgQ29sbGVjdGlvblxuICogQGNvbnN0cnVjdG9yXG4gKiBAc2luY2UgMC4wLjFcbiAqIFxuICogQGNsYXNzZGVzYyBDb2xsZWN0aW9uIGNsYXNzIHRoYXQgbWFwcyBhIE1vbmdvREItbGlrZSBjb2xsZWN0aW9uXG4gKiBcbiAqIEBwYXJhbSB7TW9uZ29Qb3J0YWJsZX0gZGIgLSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBjb2xsZWN0aW9uTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gRGF0YWJhc2Ugb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wa0ZhY3Rvcnk9bnVsbF0gLSBPYmplY3Qgb3ZlcnJpZGluZyB0aGUgYmFzaWMgXCJPYmplY3RJZFwiIHByaW1hcnkga2V5IGdlbmVyYXRpb24uXG4gKiBcbiAqL1xudmFyIGRhdGFiYXNlID0gbnVsbDtcbmNsYXNzIENvbGxlY3Rpb24gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuLy8gdmFyIENvbGxlY3Rpb24gPSBmdW5jdGlvbihkYiwgY29sbGVjdGlvbk5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdHJ1Y3RvcihkYiwgY29sbGVjdGlvbk5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSkgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKGRiLCBjb2xsZWN0aW9uTmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIgPSBMb2dnZXIuaW5zdGFuY2U7XG4gICAgXG4gICAgICAgIGlmIChfLmlzTmlsKGRiKSkgbG9nZ2VyLnRocm93KFwiZGIgcGFyYW1ldGVyIHJlcXVpcmVkXCIpO1xuICAgICAgICBcbiAgICAgICAgaWYgKF8uaXNOaWwoY29sbGVjdGlvbk5hbWUpKSBsb2dnZXIudGhyb3coXCJjb2xsZWN0aW9uTmFtZSBwYXJhbWV0ZXIgcmVxdWlyZWRcIik7XG4gICAgICAgIFxuICAgICAgICBpZiAoXy5pc05pbChvcHRpb25zKSB8fCAhXy5pc1BsYWluT2JqZWN0KG9wdGlvbnMpKSBvcHRpb25zID0ge307XG4gICAgICAgIFxuICAgICAgICBDb2xsZWN0aW9uLmNoZWNrQ29sbGVjdGlvbk5hbWUoY29sbGVjdGlvbk5hbWUpO1xuICAgIFxuICAgICAgICAvLyB0aGlzLmRiID0gZGI7XG4gICAgICAgIGRhdGFiYXNlID0gZGI7XG4gICAgICAgIHRoaXMubmFtZSA9IGNvbGxlY3Rpb25OYW1lO1xuICAgICAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IGRiLmRhdGFiYXNlTmFtZTtcbiAgICAgICAgdGhpcy5mdWxsTmFtZSA9IHRoaXMuZGF0YWJhc2VOYW1lICsgJy4nICsgdGhpcy5uYW1lO1xuICAgICAgICB0aGlzLmRvY3MgPSBbXTtcbiAgICAgICAgdGhpcy5kb2NfaW5kZXhlcyA9IHt9O1xuICAgICAgICB0aGlzLnNuYXBzaG90cyA9IFtdO1xuICAgICAgICB0aGlzLm9wdHMgPSB7fTsgLy8gRGVmYXVsdCBvcHRpb25zXG4gICAgICAgIFxuICAgICAgICBfLm1lcmdlKHRoaXMub3B0cywgb3B0aW9ucyk7XG4gICAgICAgIFxuICAgICAgICAvLyB0aGlzLmVtaXQgPSBkYi5lbWl0O1xuICAgIH1cbiAgICBcbiAgICBlbWl0KG5hbWUsIGFyZ3MsIGNiKSB7XG4gICAgICAgIHN1cGVyLmVtaXQobmFtZSwgYXJncywgY2IsIGRhdGFiYXNlLl9zdG9yZXMpO1xuICAgIH1cbn1cblxuLy8gVE9ETyBlbmZvcmNlIHJ1bGUgdGhhdCBmaWVsZCBuYW1lcyBjYW4ndCBzdGFydCB3aXRoICckJyBvciBjb250YWluICcuJ1xuLy8gKHJlYWwgbW9uZ29kYiBkb2VzIGluIGZhY3QgZW5mb3JjZSB0aGlzKVxuLy8gVE9ETyBwb3NzaWJseSBlbmZvcmNlIHRoYXQgJ3VuZGVmaW5lZCcgZG9lcyBub3QgYXBwZWFyICh3ZSBhc3N1bWVcbi8vIHRoaXMgaW4gb3VyIGhhbmRsaW5nIG9mIG51bGwgYW5kICRleGlzdHMpXG4vKipcbiAqIEluc2VydHMgYSBkb2N1bWVudCBpbnRvIHRoZSBjb2xsZWN0aW9uXG4gKiBcbiAqIEBtZXRob2QgQ29sbGVjdGlvbiNpbnNlcnRcbiAqIFxuICogQHBhcmFtIHtPYmplY3R9IGRvYyAtIERvY3VtZW50IHRvIGJlIGluc2VydGVkXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zXG4gKiBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2hhaW49ZmFsc2VdIC0gSWYgc2V0IHRvIFwidHJ1ZVwiIHJldHVybnMgdGhpcyBpbnN0YW5jZSwgc28gaXQgY2FuIGJlIGNoYWluZWQgd2l0aCBvdGhlciBtZXRob2RzXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1udWxsXSBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgdGhlIGVuZCB3aXRoIHRoZSByZXN1bHRzXG4gKiBcbiAqIEByZXR1cm5zIHtPYmplY3R8Q29sbGVjdGlvbn0gSWYgXCJvcHRpb25zLmNoYWluXCIgc2V0IHRvIFwidHJ1ZVwiIHJldHVybnMgdGhpcyBpbnN0YW5jZSwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGluc2VydGVkIGRvY3VtZW50XG4gKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChkb2MsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKF8uaXNOaWwoZG9jKSkgbG9nZ2VyLnRocm93KFwiZG9jIHBhcmFtZXRlciByZXF1aXJlZFwiKTtcbiAgICBcbiAgICBpZiAoIV8uaXNQbGFpbk9iamVjdChkb2MpKSBsb2dnZXIudGhyb3coXCJkb2MgbXVzdCBiZSBhbiBvYmplY3RcIik7XG4gICAgXG4gICAgaWYgKF8uaXNOaWwob3B0aW9ucykpIG9wdGlvbnMgPSB7fTtcbiAgICBcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBcbiAgICBpZiAoIV8uaXNOaWwoY2FsbGJhY2spICYmICFfLmlzRnVuY3Rpb24oY2FsbGJhY2spKSBsb2dnZXIudGhyb3coXCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgXG4gICAgLy8gQ3JlYXRpbmcgYSBzYWZlIGNvcHkgb2YgdGhlIGRvY3VtZW50XG4gICAgdmFyIF9kb2MgPSBfLmNsb25lRGVlcChkb2MpO1xuXG4gICAgLy8gSWYgdGhlIGRvY3VtZW50IGNvbWVzIHdpdGggYSBudW1iZXIgSUQsIHBhcnNlIGl0IHRvIFN0cmluZ1xuICAgIGlmIChfLmlzTnVtYmVyKF9kb2MuX2lkKSkge1xuICAgICAgICBfZG9jLl9pZCA9IF8udG9TdHJpbmcoX2RvYy5faWQpO1xuICAgIH1cblxuICAgIGlmIChfLmlzTmlsKF9kb2MuX2lkKSB8fCAoIV9kb2MuX2lkIGluc3RhbmNlb2YgT2JqZWN0SWQgJiYgKCFfLmlzU3RyaW5nKF9kb2MuX2lkKSB8fCAhX2RvYy5faWQubGVuZ3RoKSkpIHtcbiAgICAgICAgX2RvYy5faWQgPSBuZXcgT2JqZWN0SWQoKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgb3B0aW9ucyB0byBtb3JlIGRhdGVzXG4gICAgX2RvYy50aW1lc3RhbXAgPSBuZXcgT2JqZWN0SWQoKS5nZW5lcmF0aW9uVGltZTtcbiAgICBcbiAgICAvLyBSZXZlcnNlXG4gICAgdGhpcy5kb2NfaW5kZXhlc1tfLnRvU3RyaW5nKF9kb2MuX2lkKV0gPSB0aGlzLmRvY3MubGVuZ3RoO1xuICAgIHRoaXMuZG9jcy5wdXNoKF9kb2MpO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFwiaW5zZXJ0XCIgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgTW9uZ29Qb3J0YWJsZX5pbnNlcnRcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29sbGVjdGlvbiAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRvYyAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBkb2N1bWVudCBpbnNlcnRlZFxuICAgICAqL1xuICAgIHRoaXMuZW1pdChcbiAgICAgICAgJ2luc2VydCcsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBkb2M6IF9kb2NcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKG51bGwsIF9kb2MpO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hhaW4pIHJldHVybiB0aGlzO1xuICAgIFxuICAgIHJldHVybiBfZG9jO1xufTtcblxuLyoqXG4gKiBGaW5kcyBhbGwgbWF0Y2hpbmcgZG9jdW1lbnRzXG4gKiBcbiAqIEBtZXRob2QgQ29sbGVjdGlvbiNmaW5kXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW3NlbGVjdGlvbj17fV0gLSBUaGUgc2VsZWN0aW9uIGZvciBtYXRjaGluZyBkb2N1bWVudHNcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW2ZpZWxkcz17fV0gLSBUaGUgZmllbGRzIG9mIHRoZSBkb2N1bWVudCB0byBzaG93XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zXG4gKiBcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5za2lwXSAtIE51bWJlciBvZiBkb2N1bWVudHMgdG8gYmUgc2tpcHBlZFxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmxpbWl0XSAtIE1heCBudW1iZXIgb2YgZG9jdW1lbnRzIHRvIGRpc3BsYXlcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW29wdGlvbnMuZmllbGRzXSAtIFNhbWUgYXMgXCJmaWVsZHNcIiBwYXJhbWV0ZXIgKGlmIGJvdGggcGFzc2VkLCBcIm9wdGlvbnMuZmllbGRzXCIgd2lsbCBiZSBpZ25vcmVkKVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5mb3JjZUZldGNoPWZhbHNlXSAtIElmIHNldCB0bydcInRydWVcIiByZXR1cm5zIHRoZSBhcnJheSBvZiBkb2N1bWVudHMgYWxyZWFkeSBmZXRjaGVkXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1udWxsXSAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCB0aGUgZW5kIHdpdGggdGhlIHJlc3VsdHNcbiAqIFxuICogQHJldHVybnMge0FycmF5fEN1cnNvcn0gSWYgXCJvcHRpb25zLmZvcmNlRmV0Y2hcIiBzZXQgdG8gdHJ1ZSByZXR1cm5zIHRoZSBhcnJheSBvZiBkb2N1bWVudHMsIG90aGVyd2lzZSByZXR1cm5zIGEgY3Vyc29yXG4gKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAoc2VsZWN0aW9uLCBmaWVsZHMsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHBhcmFtcyA9IF9lbnN1cmVGaW5kUGFyYW1zKHtcbiAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb24sIFxuICAgICAgICBmaWVsZHM6IGZpZWxkcyxcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucywgXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgIH0pO1xuICAgIFxuICAgIHNlbGVjdGlvbiA9IHBhcmFtcy5zZWxlY3Rpb247XG4gICAgZmllbGRzID0gcGFyYW1zLmZpZWxkcztcbiAgICBvcHRpb25zID0gcGFyYW1zLm9wdGlvbnM7XG4gICAgY2FsbGJhY2sgPSBwYXJhbXMuY2FsbGJhY2s7XG4gICAgXG4gICAgdmFyIGN1cnNvciA9IG5ldyBDdXJzb3IodGhpcy5kb2NzLCBzZWxlY3Rpb24sIGZpZWxkcywgb3B0aW9ucyk7XG5cbiAgICAvKipcbiAgICAgKiBcImZpbmRcIiBldmVudC5cbiAgICAgKlxuICAgICAqIEBldmVudCBNb25nb1BvcnRhYmxlfmZpbmRcbiAgICAgKiBcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY29sbGVjdGlvbiAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2xsZWN0aW9uXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHNlbGVjdG9yIC0gVGhlIHNlbGVjdGlvbiBvZiB0aGUgcXVlcnlcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gZmllbGRzIC0gVGhlIGZpZWxkcyBzaG93ZWQgaW4gdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgdGhpcy5lbWl0KFxuICAgICAgICAnZmluZCcsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICAgICAgfVxuICAgICk7XG4gICAgXG4gICAgLy8gUGFzcyB0aGUgY3Vyc29yIGZldGNoZWQgdG8gdGhlIGNhbGxiYWNrXG4gICAgLy8gQWRkIFtvcHRpb25zLm5vRmV0Y2hDYWxsYmFjayA9IHRydWVdXG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsLCBjdXJzb3IuZmV0Y2goKSk7XG5cbiAgICBpZiAob3B0aW9ucy5mb3JjZUZldGNoKSB7XG4gICAgICAgIHJldHVybiBjdXJzb3IuZmV0Y2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY3Vyc29yO1xuICAgIH1cbn07XG5cbi8qKlxuICogRmluZHMgdGhlIGZpcnN0IG1hdGNoaW5nIGRvY3VtZW50XG4gKiBcbiAqIEBtZXRob2QgQ29sbGVjdGlvbiNmaW5kT25lXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW3NlbGVjdGlvbj17fV0gLSBUaGUgc2VsZWN0aW9uIGZvciBtYXRjaGluZyBkb2N1bWVudHNcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW2ZpZWxkcz17fV0gLSBUaGUgZmllbGRzIG9mIHRoZSBkb2N1bWVudCB0byBzaG93XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zXG4gKiBcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5za2lwXSAtIE51bWJlciBvZiBkb2N1bWVudHMgdG8gYmUgc2tpcHBlZFxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmxpbWl0XSAtIE1heCBudW1iZXIgb2YgZG9jdW1lbnRzIHRvIGRpc3BsYXlcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW29wdGlvbnMuZmllbGRzXSAtIFNhbWUgYXMgXCJmaWVsZHNcIiBwYXJhbWV0ZXIgKGlmIGJvdGggcGFzc2VkLCBcIm9wdGlvbnMuZmllbGRzXCIgd2lsbCBiZSBpZ25vcmVkKVxuICogXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2s9bnVsbF0gLSBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgdGhlIGVuZCB3aXRoIHRoZSByZXN1bHRzXG4gKiBcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGZpcnN0IG1hdGNoaW5nIGRvY3VtZW50IG9mIHRoZSBjb2xsZWN0aW9uXG4gKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLmZpbmRPbmUgPSBmdW5jdGlvbiAoc2VsZWN0aW9uLCBmaWVsZHMsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHBhcmFtcyA9IF9lbnN1cmVGaW5kUGFyYW1zKHtcbiAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb24sIFxuICAgICAgICBmaWVsZHM6IGZpZWxkcyxcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucywgXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgIH0pO1xuICAgIFxuICAgIHNlbGVjdGlvbiA9IHBhcmFtcy5zZWxlY3Rpb247XG4gICAgZmllbGRzID0gcGFyYW1zLmZpZWxkcztcbiAgICBvcHRpb25zID0gcGFyYW1zLm9wdGlvbnM7XG4gICAgY2FsbGJhY2sgPSBwYXJhbXMuY2FsbGJhY2s7XG4gICAgXG4gICAgdmFyIGN1cnNvciA9IG5ldyBDdXJzb3IodGhpcy5kb2NzLCBzZWxlY3Rpb24sIGZpZWxkcywgb3B0aW9ucyk7XG5cbiAgICAvKipcbiAgICAgKiBcImZpbmRPbmVcIiBldmVudC5cbiAgICAgKlxuICAgICAqIEBldmVudCBNb25nb1BvcnRhYmxlfmZpbmRPbmVcbiAgICAgKiBcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY29sbGVjdGlvbiAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2xsZWN0aW9uXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHNlbGVjdG9yIC0gVGhlIHNlbGVjdGlvbiBvZiB0aGUgcXVlcnlcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gZmllbGRzIC0gVGhlIGZpZWxkcyBzaG93ZWQgaW4gdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgdGhpcy5lbWl0KFxuICAgICAgICAnZmluZE9uZScsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICAgICAgfVxuICAgICk7XG4gICAgXG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgXG4gICAgaWYgKGN1cnNvci5oYXNOZXh0KCkpIHtcbiAgICAgICAgcmVzID0gY3Vyc29yLm5leHQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUGFzcyB0aGUgY3Vyc29yIGZldGNoZWQgdG8gdGhlIGNhbGxiYWNrXG4gICAgLy8gQWRkIFtvcHRpb25zLm5vRmV0Y2hDYWxsYmFjayA9IHRydWVdXG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsLCByZXMpO1xuICAgIFxuICAgIHJldHVybiByZXM7XG59O1xuXG5cbi8qKlxuICogVXBkYXRlcyBvbmUgb3IgbWFueSBkb2N1bWVudHNcbiAqIFxuICogQG1ldGhvZCBDb2xsZWN0aW9uI3VwZGF0ZVxuICogXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IFtzZWxlY3Rpb249e31dIC0gVGhlIHNlbGVjdGlvbiBmb3IgbWF0Y2hpbmcgZG9jdW1lbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gW3VwZGF0ZT17fV0gLSBUaGUgdXBkYXRlIG9wZXJhdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9uc1xuICogXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudXBkYXRlQXNNb25nbz10cnVlXSAtIEJ5IGRlZmF1bHQ6IFxuICogICAgICBJZiB0aGUgW3VwZGF0ZV0gb2JqZWN0IGNvbnRhaW5zIHVwZGF0ZSBvcGVyYXRvciBtb2RpZmllcnMsIHN1Y2ggYXMgdGhvc2UgdXNpbmcgdGhlIFwiJHNldFwiIG1vZGlmaWVyLCB0aGVuOlxuICogICAgICAgICAgPHVsPlxuICogICAgICAgICAgICAgIDxsaT5UaGUgW3VwZGF0ZV0gb2JqZWN0IG11c3QgY29udGFpbiBvbmx5IHVwZGF0ZSBvcGVyYXRvciBleHByZXNzaW9uczwvbGk+XG4gKiAgICAgICAgICAgICAgPGxpPlRoZSBDb2xsZWN0aW9uI3VwZGF0ZSBtZXRob2QgdXBkYXRlcyBvbmx5IHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiB0aGUgZG9jdW1lbnQ8L2xpPlxuICogICAgICAgICAgPHVsPlxuICogICAgICBJZiB0aGUgW3VwZGF0ZV0gb2JqZWN0IGNvbnRhaW5zIG9ubHkgXCJmaWVsZDogdmFsdWVcIiBleHByZXNzaW9ucywgdGhlbjpcbiAqICAgICAgICAgIDx1bD5cbiAqICAgICAgICAgICAgICA8bGk+VGhlIENvbGxlY3Rpb24jdXBkYXRlIG1ldGhvZCByZXBsYWNlcyB0aGUgbWF0Y2hpbmcgZG9jdW1lbnQgd2l0aCB0aGUgW3VwZGF0ZV0gb2JqZWN0LiBUaGUgQ29sbGVjdGlvbiN1cGRhdGUgbWV0aG9kIGRvZXMgbm90IHJlcGxhY2UgdGhlIFwiX2lkXCIgdmFsdWU8L2xpPlxuICogICAgICAgICAgICAgIDxsaT5Db2xsZWN0aW9uI3VwZGF0ZSBjYW5ub3QgdXBkYXRlIG11bHRpcGxlIGRvY3VtZW50czwvbGk+XG4gKiAgICAgICAgICA8dWw+XG4gKiBcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5vdmVycmlkZT1mYWxzZV0gLSBSZXBsYWNlcyB0aGUgd2hvbGUgZG9jdW1lbnQgKG9ubHkgYXBsbGllcyB3aGVuIFt1cGRhdGVBc01vbmdvPWZhbHNlXSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy51cHNlcnQ9ZmFsc2VdIC0gQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCB3aGVuIG5vIGRvY3VtZW50IG1hdGNoZXMgdGhlIHF1ZXJ5IGNyaXRlcmlhXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubXVsdGk9ZmFsc2VdIC0gVXBkYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgdGhhdCBtZWV0IHRoZSBjcml0ZXJpYVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLndyaXRlQ29uY2Vybj1udWxsXSAtIEFuIG9iamVjdCBleHByZXNzaW5nIHRoZSB3cml0ZSBjb25jZXJuXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1udWxsXSAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCB0aGUgZW5kIHdpdGggdGhlIHJlc3VsdHNcbiAqIFxuICogQHJldHVybnMge09iamVjdH0gT2JqZWN0IHdpdGggdGhlIHVwZGF0ZS9pbnNlcnQgKGlmIHVwc2VydD10cnVlKSBpbmZvcm1hdGlvblxuICovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoc2VsZWN0aW9uLCB1cGRhdGUsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKF8uaXNOaWwoc2VsZWN0aW9uKSkgc2VsZWN0aW9uID0ge307XG4gICAgXG4gICAgaWYgKF8uaXNOaWwodXBkYXRlKSkgbG9nZ2VyLnRocm93KFwiWW91IG11c3Qgc3BlY2lmeSB0aGUgdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICBcbiAgICBpZiAoXy5pc05pbChvcHRpb25zKSkge1xuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgc2tpcDogMCxcbiAgICAgICAgICAgIGxpbWl0OiAxNSAgIC8vIGZvciBubyBsaW1pdCBwYXNzIFtvcHRpb25zLmxpbWl0ID0gLTFdXG4gICAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIGlmIChfLmlzRnVuY3Rpb24oc2VsZWN0aW9uKSkgbG9nZ2VyLnRocm93KFwiWW91IG11c3Qgc3BlY2lmeSB0aGUgdXBkYXRlIG9wZXJhdGlvblwiKTtcbiAgICBcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHVwZGF0ZSkpIGxvZ2dlci50aHJvdyhcIllvdSBtdXN0IHNwZWNpZnkgdGhlIHVwZGF0ZSBvcGVyYXRpb25cIik7XG4gICAgXG4gICAgaWYgKF8uaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIGFyZSB1c2luZyBhbiBvYmplY3RJZFxuICAgIGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIE9iamVjdElkKSB7XG4gICAgICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIF9pZDogc2VsZWN0aW9uXG4gICAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIGlmICghXy5pc05pbChjYWxsYmFjaykgJiYgIV8uaXNGdW5jdGlvbihjYWxsYmFjaykpIGxvZ2dlci50aHJvdyhcImNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcblxuICAgIHZhciByZXMgPSBudWxsO1xuXG4gICAgdmFyIGRvY3MgPSBudWxsO1xuICAgIGlmIChvcHRpb25zLm11bHRpKSB7XG4gICAgICAgIGRvY3MgPSB0aGlzLmZpbmQoc2VsZWN0aW9uLCBudWxsLCB7IGZvcmNlRmV0Y2g6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG9jcyA9IHRoaXMuZmluZE9uZShzZWxlY3Rpb24pO1xuICAgIH1cbiAgICBcbiAgICBpZiAoXy5pc05pbChkb2NzKSkge1xuICAgICAgICBkb2NzID0gW107XG4gICAgfVxuICAgIFxuICAgIGlmICghXy5pc0FycmF5KGRvY3MpKSB7XG4gICAgICAgIGRvY3MgPSBbZG9jc107XG4gICAgfVxuICAgIFxuICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAob3B0aW9ucy51cHNlcnQpIHtcbiAgICAgICAgICAgIHZhciBpbnNlcnRlZCA9IHRoaXMuaW5zZXJ0KHVwZGF0ZSk7XG5cbiAgICAgICAgICAgIHJlcyA9IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50czogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IDBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluc2VydGVkOiB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50czogW2luc2VydGVkXSxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gZG9jdW1lbnRzIGZvdW5kXG4gICAgICAgICAgICByZXMgPSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZDoge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudHM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiAwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnNlcnRlZDoge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudHM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB1cGRhdGVkRG9jcyA9IFtdO1xuICAgICAgICBcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2NzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZG9jID0gZG9jc1tpXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIG92ZXJyaWRlID0gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIGhhc01vZGlmaWVyID0gZmFsc2U7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJRTcgZG9lc24ndCBzdXBwb3J0IGluZGV4aW5nIGludG8gc3RyaW5ncyAoZWcsIGtleVswXSBvciBrZXkuaW5kZXhPZignJCcpICksIHNvIHVzZSBzdWJzdHIuXG4gICAgICAgICAgICAgICAgLy8gVGVzdGluZyBvdmVyIHRoZSBmaXJzdCBsZXR0ZXI6XG4gICAgICAgICAgICAgICAgLy8gICAgICBCZXN0cyByZXN1bHQgd2l0aCAxZTggbG9vcHMgPT4ga2V5WzBdKH4zcykgPiBzdWJzdHIofjVzKSA+IHJlZ2V4cCh+NnMpID4gaW5kZXhPZih+MTZzKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciBtb2RpZmllciA9IChrZXkuc3Vic3RyKDAsIDEpID09PSAnJCcpO1xuICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcikge1xuICAgICAgICAgICAgICAgICAgICBoYXNNb2RpZmllciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwZGF0ZUFzTW9uZ28pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyICYmICFtb2RpZmllcikgbG9nZ2VyLnRocm93KFwiQWxsIHVwZGF0ZSBmaWVsZHMgbXVzdCBiZSBhbiB1cGRhdGUgb3BlcmF0b3JcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc01vZGlmaWVyICYmIG9wdGlvbnMubXVsdGkpIGxvZ2dlci50aHJvdyhcIllvdSBjYW4gbm90IHVwZGF0ZSBzZXZlcmFsIGRvY3VtZW50cyB3aGVuIG5vIHVwZGF0ZSBvcGVyYXRvcnMgYXJlIGluY2x1ZGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc01vZGlmaWVyKSBvdmVycmlkZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNNb2RpZmllcikgb3ZlcnJpZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlID0gISFvcHRpb25zLm92ZXJyaWRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIF9kb2NVcGRhdGUgPSBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAob3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBPdmVycmlkZXMgdGhlIGRvY3VtZW50IGV4Y2VwdCBmb3IgdGhlIFwiX2lkXCJcbiAgICAgICAgICAgICAgICBfZG9jVXBkYXRlID0ge1xuICAgICAgICAgICAgICAgICAgICBfaWQ6IGRvYy5faWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIE11c3QgaWdub3JlIGZpZWxkcyBzdGFydGluZyB3aXRoICckJywgJy4nLi4uXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHVwZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN1YnN0cigwLCAxKSA9PT0gJyQnIHx8IC9cXC4vZy50ZXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBUaGUgZmllbGQgJHtrZXl9IGNhbiBub3QgYmVnaW4gd2l0aCAnJCcgb3IgY29udGFpbiAnLidgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kb2NVcGRhdGVba2V5XSA9IHVwZGF0ZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBfZG9jVXBkYXRlID0gXy5jbG9uZURlZXAoZG9jKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWwgPSB1cGRhdGVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDEpID09PSAnJCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9kb2NVcGRhdGUgPSBfYXBwbHlNb2RpZmllcihfZG9jVXBkYXRlLCBrZXksIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV8uaXNOaWwoX2RvY1VwZGF0ZVtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICdfaWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kb2NVcGRhdGVba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcIlRoZSBmaWVsZCAnX2lkJyBjYW4gbm90IGJlIHVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgVGhlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW5zIHRoZSBmaWVsZCAke2tleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdXBkYXRlZERvY3MucHVzaChfZG9jVXBkYXRlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGlkeCA9IHRoaXMuZG9jX2luZGV4ZXNbX2RvY1VwZGF0ZS5faWRdO1xuICAgICAgICAgICAgdGhpcy5kb2NzW2lkeF0gPSBfZG9jVXBkYXRlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvKipcbiAgICAgICAgICogXCJ1cGRhdGVcIiBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IE1vbmdvUG9ydGFibGV+dXBkYXRlXG4gICAgICAgICAqIFxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY29sbGVjdGlvbiAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2xsZWN0aW9uXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzZWxlY3RvciAtIFRoZSBzZWxlY3Rpb24gb2YgdGhlIHF1ZXJ5XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtb2RpZmllciAtIFRoZSBtb2RpZmllciB1c2VkIGluIHRoZSBxdWVyeVxuICAgICAgICAgKiBAcHJvcGVydHkge09iamVjdH0gZG9jcyAtIFRoZSB1cGRhdGVkL2luc2VydGVkIGRvY3VtZW50cyBpbmZvcm1hdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgICAgJ3VwZGF0ZScsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyOiB1cGRhdGUsXG4gICAgICAgICAgICAgICAgZG9jczogdXBkYXRlZERvY3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIHJlcyA9IHtcbiAgICAgICAgICAgIHVwZGF0ZWQ6IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudHM6IHVwZGF0ZWREb2NzLFxuICAgICAgICAgICAgICAgIGNvdW50OiB1cGRhdGVkRG9jcy5sZW5ndGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnNlcnRlZDoge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50czogbnVsbCxcbiAgICAgICAgICAgICAgICBjb3VudDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBcbiAgICBcbiAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKG51bGwsIHJlcyk7XG4gICAgXG4gICAgcmV0dXJuIHJlcztcbn07XG5cbnZhciBfYXBwbHlNb2RpZmllciA9IGZ1bmN0aW9uKF9kb2NVcGRhdGUsIGtleSwgdmFsKSB7XG4gICAgdmFyIGRvYyA9IF8uY2xvbmVEZWVwKF9kb2NVcGRhdGUpO1xuICAgIC8vIHZhciBtb2QgPSBfbW9kaWZpZXJzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBpZiAoIV9tb2RpZmllcnNba2V5XSkge1xuICAgICAgICBsb2dnZXIudGhyb3coYEludmFsaWQgbW9kaWZpZXIgc3BlY2lmaWVkOiAke2tleX1gKTtcbiAgICB9XG4gICAgXG4gICAgZm9yICh2YXIga2V5cGF0aCBpbiB2YWwpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdmFsW2tleXBhdGhdO1xuICAgICAgICB2YXIga2V5cGFydHMgPSBrZXlwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgIFxuICAgICAgICBfbW9kaWZ5KGRvYywga2V5cGFydHMsIHZhbHVlLCBrZXkpO1xuICAgICAgICBcbiAgICAgICAgLy8gdmFyIG5vX2NyZWF0ZSA9ICEhQ29sbGVjdGlvbi5fbm9DcmVhdGVNb2RpZmllcnNba2V5XTtcbiAgICAgICAgLy8gdmFyIGZvcmJpZF9hcnJheSA9IChrZXkgPT09IFwiJHJlbmFtZVwiKTtcbiAgICAgICAgLy8gdmFyIHRhcmdldCA9IENvbGxlY3Rpb24uX2ZpbmRNb2RUYXJnZXQoX2RvY1VwZGF0ZSwga2V5cGFydHMsIG5vX2NyZWF0ZSwgZm9yYmlkX2FycmF5KTtcbiAgICAgICAgLy8gdmFyIGZpZWxkID0ga2V5cGFydHMucG9wKCk7XG5cbiAgICAgICAgLy8gbW9kKHRhcmdldCwgZmllbGQsIHZhbHVlLCBrZXlwYXRoLCBfZG9jVXBkYXRlKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGRvYztcbn07XG5cbnZhciBfbW9kaWZ5ID0gZnVuY3Rpb24oZG9jdW1lbnQsIGtleXBhcnRzLCB2YWx1ZSwga2V5LCBsZXZlbCA9IDApIHtcbiAgICBmb3IgKGxldCBpID0gbGV2ZWw7IGkgPCBrZXlwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcGF0aCA9IGtleXBhcnRzW2ldO1xuICAgICAgICBsZXQgaXNOdW1lcmljID0gL15bMC05XSskLy50ZXN0KHBhdGgpO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gZG9jdW1lbnRbcGF0aF07XG4gICAgICAgIFxuICAgICAgICB2YXIgY3JlYXRlID0gXy5oYXNJbihDb2xsZWN0aW9uLl9ub0NyZWF0ZU1vZGlmaWVycywga2V5KSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgaWYgKCFjcmVhdGUgJiYgKCFfLmlzT2JqZWN0KGRvY3VtZW50KSB8fCBfLmlzTmlsKHRhcmdldCkpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3coYFRoZSBlbGVtZW50IFwiJHtwYXRofVwiIG11c3QgZXhpc3RzIGluIFwiJHtKU09OLnN0cmluZ2lmeShkb2N1bWVudCl9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKF8uaXNBcnJheShkb2N1bWVudCkpIHtcbiAgICAgICAgICAgIC8vIERvIG5vdCBhbGxvdyAkcmVuYW1lIG9uIGFycmF5c1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gXCIkcmVuYW1lXCIpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBPbmx5IGxldCB0aGUgdXNlIG9mIFwiYXJyYXlmaWVsZC48bnVtZXJpY19pbmRleD4uc3ViZmllbGRcIlxuICAgICAgICAgICAgaWYgKGlzTnVtZXJpYykge1xuICAgICAgICAgICAgICAgIHBhdGggPSBfLnRvTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3coYFRoZSBmaWVsZCBcIiR7cGF0aH1cIiBjYW4gbm90IGJlIGFwcGVuZGVkIHRvIGFuIGFycmF5YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZpbGwgdGhlIGFycmF5IHRvIHRoZSBkZXNpcmVkIGxlbmd0aFxuICAgICAgICAgICAgd2hpbGUgKGRvY3VtZW50Lmxlbmd0aCA8IHBhdGgpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoaSA8IGtleXBhcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGlmIChfLmlzTmlsKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgYWNjZXNzaW5nIHdpdGggXCJhcnJheUZpZWxkLjxudW1lcmljX2luZGV4PlwiXG4gICAgICAgICAgICAgICAgaWYgKF8uaXNGaW5pdGUoXy50b051bWJlcihrZXlwYXJ0c1tpICsgMV0pKSkgeyAgLy8gIHx8IGtleXBhcnRzW2kgKyAxXSA9PT0gJyQnICAvLyBUT0RPIFwiYXJyYXlGaWVsZC4kXCJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBkb2N1bWVudFtwYXRoXSA9IF9tb2RpZnkodGFyZ2V0LCBrZXlwYXJ0cywgdmFsdWUsIGtleSwgbGV2ZWwgKyAxKTtcblxuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX21vZGlmaWVyc1trZXldKGRvY3VtZW50LCBwYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qKlxuICogUmVtb3ZlcyBvbmUgb3IgbWFueSBkb2N1bWVudHNcbiAqIFxuICogQG1ldGhvZCBDb2xsZWN0aW9uI3JlbW92ZVxuICogXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IFtzZWxlY3Rpb249e31dIC0gVGhlIHNlbGVjdGlvbiBmb3IgbWF0Y2hpbmcgZG9jdW1lbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zXG4gKiBcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5qdXN0T25lPWZhbHNlXSAtIERlbGV0ZXMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNlbGVjdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLndyaXRlQ29uY2Vybj1udWxsXSAtIEFuIG9iamVjdCBleHByZXNzaW5nIHRoZSB3cml0ZSBjb25jZXJuXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1udWxsXSAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCB0aGUgZW5kIHdpdGggdGhlIHJlc3VsdHNcbiAqIFxuICogQHJldHVybnMge09iamVjdH0gT2JqZWN0IHdpdGggdGhlIGRlbGV0ZWQgZG9jdW1lbnRzXG4gKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChzZWxlY3Rpb24sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKF8uaXNOaWwoc2VsZWN0aW9uKSkgc2VsZWN0aW9uID0ge307XG4gICAgXG4gICAgaWYgKF8uaXNGdW5jdGlvbihzZWxlY3Rpb24pKSB7XG4gICAgICAgIGNhbGxiYWNrID0gc2VsZWN0aW9uO1xuICAgICAgICBzZWxlY3Rpb24gPSB7fTtcbiAgICB9XG4gICAgXG4gICAgaWYgKF8uaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgXG4gICAgaWYgKF8uaXNOaWwob3B0aW9ucykpIG9wdGlvbnMgPSB7IGp1c3RPbmU6IGZhbHNlIH07XG4gICAgXG4gICAgLy8gSWYgd2UgYXJlIG5vdCBwYXNzaW5nIGEgc2VsZWN0aW9uIGFuZCB3ZSBhcmUgbm90IHJlbW92aW5nIGp1c3Qgb25lLCBpcyB0aGUgc2FtZSBhcyBhIGRyb3BcbiAgICBpZiAoT2JqZWN0LnNpemUoc2VsZWN0aW9uKSA9PT0gMCAmJiAhb3B0aW9ucy5qdXN0T25lKSByZXR1cm4gdGhpcy5kcm9wKG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICBcbiAgICAvLyBDaGVjayBzcGVjaWFsIGNhc2Ugd2hlcmUgd2UgYXJlIHVzaW5nIGFuIG9iamVjdElkXG4gICAgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgT2JqZWN0SWQpIHtcbiAgICAgICAgc2VsZWN0aW9uID0ge1xuICAgICAgICAgICAgX2lkOiBzZWxlY3Rpb25cbiAgICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFfLmlzTmlsKGNhbGxiYWNrKSAmJiAhXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkgbG9nZ2VyLnRocm93KFwiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgIFxuICAgIHZhciBjdXJzb3IgPSB0aGlzLmZpbmQoc2VsZWN0aW9uKTtcbiAgICBcbiAgICB2YXIgZG9jcyA9IFtdO1xuICAgIGN1cnNvci5mb3JFYWNoKGRvYyA9PiB7XG4gICAgICAgIHZhciBpZHggPSB0aGlzLmRvY19pbmRleGVzW2RvYy5faWRdO1xuICAgICAgICBcbiAgICAgICAgZGVsZXRlIHRoaXMuZG9jX2luZGV4ZXNbZG9jLl9pZF07XG4gICAgICAgIHRoaXMuZG9jcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgXG4gICAgICAgIGRvY3MucHVzaChkb2MpO1xuICAgIH0pO1xuICAgIFxuICAgIC8qKlxuICAgICAqIFwicmVtb3ZlXCIgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgTW9uZ29Qb3J0YWJsZX5yZW1vdmVcbiAgICAgKiBcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY29sbGVjdGlvbiAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2xsZWN0aW9uXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IHNlbGVjdG9yIC0gVGhlIHNlbGVjdGlvbiBvZiB0aGUgcXVlcnlcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gZG9jcyAtIFRoZSBkZWxldGVkIGRvY3VtZW50cyBpbmZvcm1hdGlvblxuICAgICAqL1xuICAgIHRoaXMuZW1pdChcbiAgICAgICAgJ3JlbW92ZScsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgZG9jczogZG9jc1xuICAgICAgICB9XG4gICAgKTtcbiAgICBcbiAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKG51bGwsIGRvY3MpO1xuICAgIFxuICAgIHJldHVybiBkb2NzO1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIENvbGxlY3Rpb24jcmVtb3ZlfVxuICogXG4gKiBAbWV0aG9kIENvbGxlY3Rpb24jZGVsZXRlXG4gKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChzZWxlY3Rpb24sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlKHNlbGVjdGlvbiwgb3B0aW9ucywgY2FsbGJhY2spO1xufTtcbiBcbiAvKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgQ29sbGVjdGlvbiNyZW1vdmV9XG4gKiBcbiAqIEBtZXRob2QgQ29sbGVjdGlvbiNkZXN0cm95XG4gKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoc2VsZWN0aW9uLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLnJlbW92ZShzZWxlY3Rpb24sIG9wdGlvbnMsIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogRHJvcHMgYSBjb2xsZWN0aW9uXG4gKiBcbiAqIEBtZXRob2QgQ29sbGVjdGlvbiNkcm9wXG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAqIFxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRyb3BJbmRleGVzPWZhbHNlXSAtIFRydWUgaWYgd2Ugd2FudCB0byBkcm9wIHRoZSBpbmRleGVzIHRvb1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLndyaXRlQ29uY2Vybj1udWxsXSAtIEFuIG9iamVjdCBleHByZXNzaW5nIHRoZSB3cml0ZSBjb25jZXJuXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1udWxsXSAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCB0aGUgZW5kIHdpdGggdGhlIHJlc3VsdHNcbiAqIFxuICogQHJldHVybnMge09iamVjdH0gVHJ1ZSB3aGVuIHRoZSBjb2xsZWN0aW9uIGlzIGRyb3BwZWRcbiAqL1xuQ29sbGVjdGlvbi5wcm90b3R5cGUuZHJvcCA9IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKF8uaXNOaWwob3B0aW9ucykpIG9wdGlvbnMgPSB7fTtcbiAgICBcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBcbiAgICBpZiAoIV8uaXNOaWwoY2FsbGJhY2spICYmICFfLmlzRnVuY3Rpb24oY2FsbGJhY2spKSBsb2dnZXIudGhyb3coXCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgXG4gICAgdGhpcy5kb2NfaW5kZXhlcyA9IHt9O1xuICAgIHRoaXMuZG9jcyA9IFtdO1xuICAgIFxuICAgIGlmIChvcHRpb25zLmRyb3BJbmRleGVzKSB7fSAvLyBUT0RPXG4gICAgXG4gICAgdGhpcy5lbWl0KFxuICAgICAgICAnZHJvcENvbGxlY3Rpb24nLFxuICAgICAgICB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgICAgaW5kZXhlczogISFvcHRpb25zLmRyb3BJbmRleGVzXG4gICAgICAgIH1cbiAgICApO1xuICAgIFxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEluc2VydCBvciB1cGRhdGUgYSBkb2N1bWVudC4gSWYgdGhlIGRvY3VtZW50IGhhcyBhbiBcIl9pZFwiIGlzIGFuIHVwZGF0ZSAod2l0aCB1cHNlcnQpLCBpZiBub3QgaXMgYW4gaW5zZXJ0LlxuICogXG4gKiBAbWV0aG9kIENvbGxlY3Rpb24jc2F2ZVxuICogXG4gKiBAcGFyYW0ge09iamVjdH0gZG9jIC0gRG9jdW1lbnQgdG8gYmUgaW5zZXJ0ZWQvdXBkYXRlZFxuICogXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHJvcEluZGV4ZXM9ZmFsc2VdIC0gVHJ1ZSBpZiB3ZSB3YW50IHRvIGRyb3AgdGhlIGluZGV4ZXMgdG9vXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMud3JpdGVDb25jZXJuPW51bGxdIC0gQW4gb2JqZWN0IGV4cHJlc3NpbmcgdGhlIHdyaXRlIGNvbmNlcm5cbiAqIFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrPW51bGxdIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IHRoZSBlbmQgd2l0aCB0aGUgcmVzdWx0c1xuICogXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUcnVlIHdoZW4gdGhlIGNvbGxlY3Rpb24gaXMgZHJvcHBlZFxuICovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24oZG9jLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGlmIChfLmlzTmlsKGRvYykgfHwgXy5pc0Z1bmN0aW9uKGRvYykpIGxvZ2dlci50aHJvdyhcIllvdSBtdXN0IHBhc3MgYSBkb2N1bWVudFwiKTtcbiAgICBcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmIChfLmhhc0luKGRvYywgJ19pZCcpKSB7XG4gICAgICAgIG9wdGlvbnMudXBzZXJ0ID0gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShcbiAgICAgICAgICAgIHsgX2lkOiBkb2MuX2lkIH0sXG4gICAgICAgICAgICBkb2MsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnQoZG9jLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgfVxufTtcblxuLyoqXG4qIEBpZ25vcmVcbiovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5lbnN1cmVJbmRleCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vVE9ETyBJbXBsZW1lbnQgRW5zdXJlSW5kZXhcbiAgICBsb2dnZXIudGhyb3coJ0NvbGxlY3Rpb24jZW5zdXJlSW5kZXggdW5pbXBsZW1lbnRlZCBieSBkcml2ZXInKTtcbn07XG5cbi8vIFRPRE8gZG9jdW1lbnQgKGF0IHNvbWUgcG9pbnQpXG4vLyBUT0RPIHRlc3Rcbi8vIFRPRE8gb2J2aW91c2x5IHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCBiZSB2ZXJ5IGVmZmljaWVudFxuLyoqXG4qIEBpZ25vcmVcbiovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5iYWNrdXAgPSBmdW5jdGlvbiAoYmFja3VwSUQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihiYWNrdXBJRCkpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBiYWNrdXBJRDtcbiAgICAgICAgYmFja3VwSUQgPSBuZXcgT2JqZWN0SWQoKS50b1N0cmluZygpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIV8uaXNOaWwoY2FsbGJhY2spICYmICFfLmlzRnVuY3Rpb24oY2FsbGJhY2spKSBsb2dnZXIudGhyb3coXCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG5cbiAgICB0aGlzLnNuYXBzaG90c1tiYWNrdXBJRF0gPSBfLmNsb25lRGVlcCh0aGlzLmRvY3MpO1xuICAgIHRoaXMuZW1pdChcbiAgICAgICAgJ3NuYXBzaG90JyxcbiAgICAgICAge1xuICAgICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICAgIGJhY2t1cElEOiBiYWNrdXBJRCxcbiAgICAgICAgICAgIGRvY3VtZW50czogdGhpcy5zbmFwc2hvdHNbYmFja3VwSURdIFxuICAgICAgICB9XG4gICAgKTtcblxuICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgIGJhY2t1cElEOiBiYWNrdXBJRCxcbiAgICAgICAgZG9jdW1lbnRzOiB0aGlzLnNuYXBzaG90c1tiYWNrdXBJRF1cbiAgICB9O1xuICAgIFxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBMaXN0cyBhdmFpbGFibGUgQmFja3Vwc1xuLyoqXG4qIEBpZ25vcmVcbiovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5iYWNrdXBzID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgaWYgKCFfLmlzTmlsKGNhbGxiYWNrKSAmJiAhXy5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkgbG9nZ2VyLnRocm93KFwiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgIFxuICAgIHZhciBiYWNrdXBzID0gW107XG5cbiAgICBmb3IgKGxldCBpZCBpbiB0aGlzLnNuYXBzaG90cykge1xuICAgICAgICBiYWNrdXBzLnB1c2goe2lkOiBpZCwgZG9jdW1lbnRzOiB0aGlzLnNuYXBzaG90c1tpZF19KTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKG51bGwsIGJhY2t1cHMpO1xuXG4gICAgcmV0dXJuIGJhY2t1cHM7XG59O1xuXG4vLyBMaXN0cyBhdmFpbGFibGUgQmFja3Vwc1xuLyoqXG4qIEBpZ25vcmVcbiovXG5Db2xsZWN0aW9uLnByb3RvdHlwZS5yZW1vdmVCYWNrdXAgPSBmdW5jdGlvbiAoYmFja3VwSUQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihiYWNrdXBJRCkpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBiYWNrdXBJRDtcbiAgICAgICAgYmFja3VwSUQgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIV8uaXNOaWwoY2FsbGJhY2spICYmICFfLmlzRnVuY3Rpb24oY2FsbGJhY2spKSBsb2dnZXIudGhyb3coXCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgXG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgIFxuICAgIGlmIChiYWNrdXBJRCkge1xuICAgICAgICBkZWxldGUgdGhpcy5zbmFwc2hvdHNbXy50b1N0cmluZyhiYWNrdXBJRCldO1xuICAgICAgICBcbiAgICAgICAgcmVzdWx0ID0gYmFja3VwSUQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zbmFwc2hvdHMgPSB7fTtcbiAgICAgICAgXG4gICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgfVxuICAgIFxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vIFJlc3RvcmUgdGhlIHNuYXBzaG90LiBJZiBubyBzbmFwc2hvdCBleGlzdHMsIHJhaXNlIGFuIGV4Y2VwdGlvbjtcbi8qKlxuKiBAaWdub3JlXG4qL1xuQ29sbGVjdGlvbi5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uIChiYWNrdXBJRCwgY2FsbGJhY2spIHtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGJhY2t1cElEKSkge1xuICAgICAgICBjYWxsYmFjayA9IGJhY2t1cElEO1xuICAgICAgICBiYWNrdXBJRCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIGlmICghXy5pc05pbChjYWxsYmFjaykgJiYgIV8uaXNGdW5jdGlvbihjYWxsYmFjaykpIGxvZ2dlci50aHJvdyhcImNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgICBcbiAgICB2YXIgc25hcHNob3RDb3VudCA9IE9iamVjdC5zaXplKHRoaXMuc25hcHNob3RzKTtcbiAgICB2YXIgYmFja3VwRGF0YSA9IG51bGw7XG5cbiAgICBpZiAoc25hcHNob3RDb3VudCA9PT0gMCkge1xuICAgICAgICBsb2dnZXIudGhyb3coXCJUaGVyZSBpcyBubyBzbmFwc2hvdHNcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFiYWNrdXBJRCkge1xuICAgICAgICAgICAgaWYgKHNuYXBzaG90Q291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIk5vIGJhY2t1cElEIHBhc3NlZC4gUmVzdG9yaW5nIHRoZSBvbmx5IHNuYXBzaG90XCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBvbmx5IHNuYXBzaG90XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuc25hcHNob3RzKSBiYWNrdXBJRCA9IGtleTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93KFwiVGhlIGFyZSBzZXZlcmFsIHNuYXBzaG90cy4gUGxlYXNlIHNwZWNpZnkgb25lIGJhY2t1cElEXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGJhY2t1cERhdGEgPSB0aGlzLnNuYXBzaG90c1tiYWNrdXBJRF07XG4gICAgICAgICAgICBcbiAgICBpZiAoIWJhY2t1cERhdGEpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93KGBVbmtub3duIEJhY2t1cCBJRDogJHtiYWNrdXBJRH1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmRvY3MgPSBiYWNrdXBEYXRhO1xuICAgIHRoaXMuZW1pdChcbiAgICAgICAgJ3Jlc3RvcmUnLFxuICAgICAgICB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgICAgYmFja3VwSUQ6IGJhY2t1cElEXG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhudWxsKTtcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIGFnZ3JlZ2F0ZSB2YWx1ZXMgZm9yIHRoZSBkYXRhIGluIGEgY29sbGVjdGlvblxuICogXG4gKiBAbWV0aG9kIENvbGxlY3Rpb24jYWdncmVnYXRlXG4gKiBcbiAqIEBwYXJhbSB7QXJyYXl9IHBpcGVsaW5lIC0gQSBzZXF1ZW5jZSBvZiBkYXRhIGFnZ3JlZ2F0aW9uIG9wZXJhdGlvbnMgb3Igc3RhZ2VzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zXG4gKiBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZm9yY2VGZXRjaD1mYWxzZV0gLSBJZiBzZXQgdG8nXCJ0cnVlXCIgcmV0dXJucyB0aGUgYXJyYXkgb2YgZG9jdW1lbnRzIGFscmVhZHkgZmV0Y2hlZFxuICogXG4gKiBAcmV0dXJucyB7QXJyYXl8Q3Vyc29yfSBJZiBcIm9wdGlvbnMuZm9yY2VGZXRjaFwiIHNldCB0byB0cnVlIHJldHVybnMgdGhlIGFycmF5IG9mIGRvY3VtZW50cywgb3RoZXJ3aXNlIHJldHVybnMgYSBjdXJzb3JcbiAqL1xuQ29sbGVjdGlvbi5wcm90b3R5cGUuYWdncmVnYXRlID0gZnVuY3Rpb24ocGlwZWxpbmUsIG9wdGlvbnMgPSB7IGZvcmNlRmV0Y2g6IGZhbHNlIH0pIHtcbiAgICBpZiAoXy5pc05pbChwaXBlbGluZSkgfHwgIV8uaXNBcnJheShwaXBlbGluZSkpIGxvZ2dlci50aHJvdygnVGhlIFwicGlwZWxpbmVcIiBwYXJhbSBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgXG4gICAgdmFyIGFnZ3JlZ2F0aW9uID0gbmV3IEFnZ3JlZ2F0aW9uKHBpcGVsaW5lKTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBpcGVsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzdGFnZSA9IHBpcGVsaW5lW2ldO1xuICAgICAgICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHN0YWdlKSB7XG4gICAgICAgICAgICBpZiAoa2V5LnN1YnN0cigwLCAxKSAhPT0gJyQnKSBsb2dnZXIudGhyb3coXCJUaGUgcGlwZWxpbmUgc3RhZ2VzIG11c3QgYmVnaW4gd2l0aCAnJCdcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghYWdncmVnYXRpb24udmFsaWRTdGFnZShrZXkpKSBsb2dnZXIudGhyb3coYEludmFsaWQgc3RhZ2UgXCIke2tleX1cImApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB2YXIgcmVzdWx0ID0gYWdncmVnYXRpb24uYWdncmVnYXRlKHRoaXMpO1xuICAgIFxuICAgIHJldHVybiByZXN1bHQ7ICAvLyBjaGFuZ2UgdG8gY3Vyc29yXG59O1xuXG4vKipcbiogQGlnbm9yZVxuKi9cbkNvbGxlY3Rpb24uX25vQ3JlYXRlTW9kaWZpZXJzID0ge1xuICAgICR1bnNldDogdHJ1ZSxcbiAgICAkcG9wOiB0cnVlLFxuICAgICRyZW5hbWU6IHRydWUsXG4gICAgJHB1bGw6IHRydWUsXG4gICAgJHB1bGxBbGw6IHRydWVcbn07XG5cbi8qKlxuKiBAaWdub3JlXG4qL1xudmFyIF9tb2RpZmllcnMgPSB7XG4gICAgJGluYzogZnVuY3Rpb24gKHRhcmdldCwgZmllbGQsIGFyZykge1xuICAgICAgICBpZiAoIV8uaXNOdW1iZXIoYXJnKSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93KFwiTW9kaWZpZXIgJGluYyBhbGxvd2VkIGZvciBudW1iZXJzIG9ubHlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0W2ZpZWxkXSkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3coXCJDYW5ub3QgYXBwbHkgJGluYyBtb2RpZmllciB0byBub24tbnVtYmVyXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0YXJnZXRbZmllbGRdICs9IGFyZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtmaWVsZF0gPSBhcmc7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJHNldDogZnVuY3Rpb24gKHRhcmdldCwgZmllbGQsIGFyZykge1xuICAgICAgICB0YXJnZXRbZmllbGRdID0gXy5jbG9uZURlZXAoYXJnKTtcbiAgICB9LFxuXG4gICAgJHVuc2V0OiBmdW5jdGlvbiAodGFyZ2V0LCBmaWVsZCwgYXJnKSB7XG4gICAgICAgIGlmICghXy5pc05pbCh0YXJnZXQpKSB7XG4gICAgICAgICAgICBpZiAoXy5pc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtmaWVsZF0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRhcmdldFtmaWVsZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJHB1c2g6IGZ1bmN0aW9uICh0YXJnZXQsIGZpZWxkLCBhcmcpIHtcbiAgICAgICAgdmFyIHggPSB0YXJnZXRbZmllbGRdO1xuXG4gICAgICAgIGlmIChfLmlzTmlsKHgpKSB7XG4gICAgICAgICAgICB0YXJnZXRbZmllbGRdID0gW2FyZ107XG4gICAgICAgIH0gZWxzZSBpZiAoIV8uaXNBcnJheSh4KSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93KFwiQ2Fubm90IGFwcGx5ICRwdXNoIG1vZGlmaWVyIHRvIG5vbi1hcnJheVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHgucHVzaChfLmNsb25lRGVlcChhcmcpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAkcHVzaEFsbDogZnVuY3Rpb24gKHRhcmdldCwgZmllbGQsIGFyZykge1xuICAgICAgICB2YXIgeCA9IHRhcmdldFtmaWVsZF07XG5cbiAgICAgICAgaWYgKF8uaXNOaWwoeCkpIHtcbiAgICAgICAgICAgIHRhcmdldFtmaWVsZF0gPSBhcmc7XG4gICAgICAgIH0gZWxzZSBpZiAoIV8uaXNBcnJheSh4KSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93KFwiTW9kaWZpZXIgJHB1c2hBbGwvcHVsbEFsbCBhbGxvd2VkIGZvciBhcnJheXMgb25seVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgeC5wdXNoKGFyZ1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJGFkZFRvU2V0OiBmdW5jdGlvbiAodGFyZ2V0LCBmaWVsZCwgYXJnKSB7XG4gICAgICAgIHZhciB4ID0gdGFyZ2V0W2ZpZWxkXTtcblxuICAgICAgICBpZiAoXy5pc05pbCh4KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2ZpZWxkXSA9IFthcmddO1xuICAgICAgICB9IGVsc2UgaWYgKCFfLmlzQXJyYXkoeCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvdyhcIkNhbm5vdCBhcHBseSAkYWRkVG9TZXQgbW9kaWZpZXIgdG8gbm9uLWFycmF5XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGlzRWFjaCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChhcmcpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayBpbiBhcmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT09IFwiJGVhY2hcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNFYWNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdmFsdWVzID0gaXNFYWNoID8gYXJnW1wiJGVhY2hcIl0gOiBbYXJnXTtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh2YWx1ZXMsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoU2VsZWN0b3JNYXRjaGVyLmVxdWFsKHZhbHVlLCB4W2ldKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHgucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAkcG9wOiBmdW5jdGlvbiAodGFyZ2V0LCBmaWVsZCwgYXJnKSB7XG4gICAgICAgIGlmIChfLmlzTmlsKHRhcmdldCkgfHwgXy5pc05pbCh0YXJnZXRbZmllbGRdKSkgcmV0dXJuO1xuXG4gICAgICAgIHZhciB4ID0gdGFyZ2V0W2ZpZWxkXTtcblxuICAgICAgICBpZiAoIV8uaXNBcnJheSh4KSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93KFwiQ2Fubm90IGFwcGx5ICRwb3AgbW9kaWZpZXIgdG8gbm9uLWFycmF5XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKF8uaXNOdW1iZXIoYXJnKSAmJiBhcmcgPCAwKSB7XG4gICAgICAgICAgICAgICAgeC5zcGxpY2UoMCwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHgucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJHB1bGw6IGZ1bmN0aW9uICh0YXJnZXQsIGZpZWxkLCBhcmcpIHtcbiAgICAgICAgaWYgKF8uaXNOaWwodGFyZ2V0KSB8fCBfLmlzTmlsKHRhcmdldFtmaWVsZF0pKSByZXR1cm47XG5cbiAgICAgICAgdmFyIHggPSB0YXJnZXRbZmllbGRdO1xuXG4gICAgICAgIGlmICghXy5pc0FycmF5KHgpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3coXCJDYW5ub3QgYXBwbHkgJHB1bGwvcHVsbEFsbCBtb2RpZmllciB0byBub24tYXJyYXlcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgb3V0ID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmICEoYXJnIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgLy8gWFhYIHdvdWxkIGJlIG11Y2ggbmljZXIgdG8gY29tcGlsZSB0aGlzIG9uY2UsIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggZG9jdW1lbnQgd2UgbW9kaWZ5Li4gYnV0IHVzdWFsbHkgd2UncmUgbm90XG4gICAgICAgICAgICAgICAgLy8gbW9kaWZ5aW5nIHRoYXQgbWFueSBkb2N1bWVudHMsIHNvIHdlJ2xsIGxldCBpdCBzbGlkZSBmb3JcbiAgICAgICAgICAgICAgICAvLyBub3dcblxuICAgICAgICAgICAgICAgIC8vIFhYWCBfY29tcGlsZVNlbGVjdG9yIGlzbid0IHVwIGZvciB0aGUgam9iLCBiZWNhdXNlIHdlIG5lZWRcbiAgICAgICAgICAgICAgICAvLyB0byBwZXJtaXQgc3R1ZmYgbGlrZSB7JHB1bGw6IHthOiB7JGd0OiA0fX19Li4gc29tZXRoaW5nXG4gICAgICAgICAgICAgICAgLy8gbGlrZSB7JGd0OiA0fSBpcyBub3Qgbm9ybWFsbHkgYSBjb21wbGV0ZSBzZWxlY3Rvci5cbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBuZXcgU2VsZWN0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBcIl9fbWF0Y2hpbmdfX1wiOiBhcmdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9kb2NfID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19tYXRjaGluZ19fOiB4W2ldXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2gudGVzdChfZG9jXykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKHhbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTZWxlY3Rvck1hdGNoZXIuZXF1YWwoeFtpXSwgYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goeFtpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRhcmdldFtmaWVsZF0gPSBvdXQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJHB1bGxBbGw6IGZ1bmN0aW9uICh0YXJnZXQsIGZpZWxkLCBhcmcpIHtcbiAgICAgICAgaWYgKF8uaXNOaWwodGFyZ2V0KSB8fCBfLmlzTmlsKHRhcmdldFtmaWVsZF0pKSByZXR1cm47XG5cbiAgICAgICAgdmFyIHggPSB0YXJnZXRbZmllbGRdO1xuXG4gICAgICAgIGlmICghXy5pc05pbCh4KSAmJiAhXy5pc0FycmF5KHgpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3coXCJNb2RpZmllciAkcHVzaEFsbC9wdWxsQWxsIGFsbG93ZWQgZm9yIGFycmF5cyBvbmx5XCIpO1xuICAgICAgICB9IGVsc2UgaWYgKCFfLmlzTmlsKHgpKSB7XG4gICAgICAgICAgICB2YXIgb3V0ID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBleGNsdWRlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFyZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoU2VsZWN0b3JNYXRjaGVyLmVxdWFsKHhbaV0sIGFyZ1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZSkge1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaCh4W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRhcmdldFtmaWVsZF0gPSBvdXQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJHJlbmFtZTogZnVuY3Rpb24gKHRhcmdldCwgZmllbGQsIHZhbHVlKSB7XG4gICAgICAgIGlmIChmaWVsZCA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIC8vIG5vIGlkZWEgd2h5IG1vbmdvIGhhcyB0aGlzIHJlc3RyaWN0aW9uLi5cbiAgICAgICAgICAgIGxvZ2dlci50aHJvdyhcIlRoZSBuZXcgZmllbGQgbmFtZSBtdXN0IGJlIGRpZmZlcmVudFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghXy5pc1N0cmluZyh2YWx1ZSkgfHwgdmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93KFwiVGhlIG5ldyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0W3ZhbHVlXSA9IHRhcmdldFtmaWVsZF07XG4gICAgICAgIGRlbGV0ZSB0YXJnZXRbZmllbGRdO1xuICAgIH0sXG5cbiAgICAkYml0OiBmdW5jdGlvbiAodGFyZ2V0LCBmaWVsZCwgYXJnKSB7XG4gICAgICAgIC8vIFhYWCBtb25nbyBvbmx5IHN1cHBvcnRzICRiaXQgb24gaW50ZWdlcnMsIGFuZCB3ZSBvbmx5IHN1cHBvcnRcbiAgICAgICAgLy8gbmF0aXZlIGphdmFzY3JpcHQgbnVtYmVycyAoZG91Ymxlcykgc28gZmFyLCBzbyB3ZSBjYW4ndCBzdXBwb3J0ICRiaXRcbiAgICAgICAgbG9nZ2VyLnRocm93KFwiJGJpdCBpcyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIH1cbn07XG5cbi8qKlxuKiBAaWdub3JlXG4qL1xuQ29sbGVjdGlvbi5jaGVja0NvbGxlY3Rpb25OYW1lID0gZnVuY3Rpb24oY29sbGVjdGlvbk5hbWUpIHtcbiAgICBpZiAoIV8uaXNTdHJpbmcoY29sbGVjdGlvbk5hbWUpKSB7XG4gICAgICAgIGxvZ2dlci50aHJvdyhcImNvbGxlY3Rpb24gbmFtZSBtdXN0IGJlIGEgU3RyaW5nXCIpO1xuICAgIH1cblxuICAgIGlmICghY29sbGVjdGlvbk5hbWUgfHwgY29sbGVjdGlvbk5hbWUuaW5kZXhPZignLi4nKSAhPT0gLTEpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93KFwiY29sbGVjdGlvbiBuYW1lcyBjYW5ub3QgYmUgZW1wdHlcIik7XG4gICAgfVxuXG4gICAgaWYgKGNvbGxlY3Rpb25OYW1lLmluZGV4T2YoJyQnKSAhPT0gLTEgJiYgY29sbGVjdGlvbk5hbWUubWF0Y2goLygoXlxcJGNtZCl8KG9wbG9nXFwuXFwkbWFpbikpLykgPT09IG51bGwpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93KFwiY29sbGVjdGlvbiBuYW1lcyBtdXN0IG5vdCBjb250YWluICckJ1wiKTtcbiAgICB9XG5cbiAgICBpZiAoY29sbGVjdGlvbk5hbWUubWF0Y2goL15zeXN0ZW1cXC4vKSAhPT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIudGhyb3coXCJjb2xsZWN0aW9uIG5hbWVzIG11c3Qgbm90IHN0YXJ0IHdpdGggJ3N5c3RlbS4nIChyZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlKVwiKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGNvbGxlY3Rpb25OYW1lLm1hdGNoKC9eXFwufFxcLiQvKSAhPT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIudGhyb3coXCJjb2xsZWN0aW9uIG5hbWVzIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoICcuJ1wiKTtcbiAgICB9XG59O1xuXG4vKipcbiogQGlnbm9yZVxuKi9cbkNvbGxlY3Rpb24ucHJvdG90eXBlLnJlbmFtZSA9IGZ1bmN0aW9uKG5ld05hbWUpIHtcbiAgICBpZiAoXy5pc1N0cmluZyhuZXdOYW1lKSkge1xuICAgICAgICBpZiAodGhpcy5uYW1lICE9PSBuZXdOYW1lKSB7XG4gICAgICAgICAgICBDb2xsZWN0aW9uLmNoZWNrQ29sbGVjdGlvbk5hbWUobmV3TmFtZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBkYk5hbWUgPSB0aGlzLm5hbWUuc3BsaXQoJy4nKS5sZW5ndGggPiAxID8gdGhpcy5uYW1lLnNwbGl0KCcuJylbMF0gOiAnJztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5uYW1lID0gbmV3TmFtZTtcbiAgICAgICAgICAgIHRoaXMuZnVsbE5hbWUgPSBkYk5hbWUgKyAnLicgKyB0aGlzLm5hbWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRXJyb3JcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxlY3Rpb247XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBvYmplY3QuXG4gKiBcbiAqIEBtZXRob2QgT2JqZWN0I3NpemVcbiAqIFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3RcbiAqIFxuICogQHJldHVybnMge051bWJlcn0gVGhlIHNpemUgb2YgdGhlIG9iamVjdFxuICovXG5PYmplY3Quc2l6ZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBzaXplID0gMCwgXG4gICAgICAgIGtleTtcbiAgICBcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBzaXplKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNpemU7XG59O1xuXG52YXIgX2Vuc3VyZUZpbmRQYXJhbXMgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgICAvLyBzZWxlY3Rpb24sIGZpZWxkcywgb3B0aW9ucywgY2FsbGJhY2tcbiAgICBpZiAoXy5pc05pbChwYXJhbXMuc2VsZWN0aW9uKSkgcGFyYW1zLnNlbGVjdGlvbiA9IHt9O1xuXG4gICAgaWYgKF8uaXNOaWwocGFyYW1zLnNlbGVjdGlvbikpIHBhcmFtcy5zZWxlY3Rpb24gPSB7fTtcblxuICAgIGlmIChfLmlzTmlsKHBhcmFtcy5maWVsZHMpKSBwYXJhbXMuZmllbGRzID0gW107XG5cbiAgICBpZiAoXy5pc05pbChwYXJhbXMub3B0aW9ucykpIHtcbiAgICAgICAgcGFyYW1zLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBza2lwOiAwLFxuICAgICAgICAgICAgbGltaXQ6IDE1IC8vIGZvciBubyBsaW1pdCBwYXNzIFtvcHRpb25zLmxpbWl0ID0gLTFdXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gY2FsbGJhY2sgYXMgZmlyc3QgcGFyYW1ldGVyXG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMuc2VsZWN0aW9uKSkge1xuICAgICAgICBwYXJhbXMuY2FsbGJhY2sgPSBwYXJhbXMuc2VsZWN0aW9uO1xuICAgICAgICBwYXJhbXMuc2VsZWN0aW9uID0ge307XG4gICAgfVxuXG4gICAgLy8gY2FsbGJhY2sgYXMgc2Vjb25kIHBhcmFtZXRlclxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmZpZWxkcykpIHtcbiAgICAgICAgcGFyYW1zLmNhbGxiYWNrID0gcGFyYW1zLmZpZWxkcztcbiAgICAgICAgcGFyYW1zLmZpZWxkcyA9IFtdO1xuICAgIH1cblxuICAgIC8vIGNhbGxiYWNrIGFzIHRoaXJkIHBhcmFtZXRlclxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLm9wdGlvbnMpKSB7XG4gICAgICAgIHBhcmFtcy5jYWxsYmFjayA9IHBhcmFtcy5vcHRpb25zO1xuICAgICAgICBwYXJhbXMub3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBhcmUgdXNpbmcgYW4gb2JqZWN0SWRcbiAgICBpZiAocGFyYW1zLnNlbGVjdGlvbiBpbnN0YW5jZW9mIE9iamVjdElkKSB7XG4gICAgICAgIHBhcmFtcy5zZWxlY3Rpb24gPSB7XG4gICAgICAgICAgICBfaWQ6IHBhcmFtcy5zZWxlY3Rpb25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmNhbGxiYWNrKSAmJiAhXy5pc0Z1bmN0aW9uKHBhcmFtcy5jYWxsYmFjaykpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93KFwiY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMub3B0aW9ucy5maWVsZHMpIHtcbiAgICAgICAgaWYgKF8uaXNOaWwocGFyYW1zLmZpZWxkcykgfHwgcGFyYW1zLmZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHBhcmFtcy5maWVsZHMgPSBwYXJhbXMub3B0aW9ucy5maWVsZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIkZpZWxkcyBhbHJlYWR5IHByZXNlbnQuIElnbm9yaW5nICdvcHRpb25zLmZpZWxkcycuXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBwYXJhbXM7XG59OyJdfQ== diff --git a/lib/Cursor.js b/lib/Cursor.js index c858eac..2c790bd 100644 --- a/lib/Cursor.js +++ b/lib/Cursor.js @@ -27,7 +27,7 @@ var logger = null; * @classdesc Cursor class that maps a MongoDB-like cursor * * @param {MongoPortable} db - Additional options - * @param {Collection} collection - The collection instance + * @param {Array} documents - The list of documents * @param {Object|Array|String} [selection={}] - The selection for matching documents * @param {Object|Array|String} [fields={}] - The fields of the document to show * @param {Object} [options] - Database object @@ -36,13 +36,12 @@ var logger = null; * */ -var Cursor = function Cursor(db, collection, selection, fields) { - var options = arguments.length <= 4 || arguments[4] === undefined ? {} : arguments[4]; +var Cursor = function Cursor(documents, selection, fields) { + var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; _classCallCheck(this, Cursor); - this.db = db; - this.collection = collection; + this.documents = documents; this.selector = selection; this.skipValue = options.skip || 0; this.limitValue = options.limit || 15; @@ -51,6 +50,7 @@ var Cursor = function Cursor(db, collection, selection, fields) { logger = Logger.instance; + /** ADD IDX **/ if (Selector.isSelectorCompiled(this.selector)) { this.selector_compiled = this.selector; } else { @@ -73,6 +73,27 @@ var Cursor = function Cursor(db, collection, selection, fields) { } } + /** ADD IDX **/ + + this.fetch_mode = Cursor.COLSCAN || Cursor.IDXSCAN; + this.indexex = null; //findUsableIndexes(); + + // if (cursor.fetch_mode === Cursor.COLSCAN) { + // // COLSCAN, wi will iterate over all documents + // docs = _.cloneDeep(cursor.collection.docs); + // } else if (cursor.fetch_mode === Cursor.IDXSCAN) { + // // IDXSCAN, wi will iterate over all needed documents + // for (let i = 0; i < cursor.indexes.length; i++) { + // let index = cursor.indexes[i]; + + // for (let i = index.start; i < index.end; i++) { + // let idx_id = cursor.collection.getIndex(index.name)[i]; + + // docs.push(cursor.collection.docs[idx_id]); + // } + // } + // } + this.fields = new Selector(fields, Selector.FIELD_SELECTOR); this.sort_compiled = new Selector(this.sortValue, Selector.SORT_SELECTOR); @@ -81,13 +102,14 @@ var Cursor = function Cursor(db, collection, selection, fields) { this.cursor_pos = 0; }; +Cursor.COLSCAN = 'colscan'; +Cursor.IDXSCAN = 'idxscan'; + /** * Moves a cursor to the begining * * @method Cursor#rewind */ - - Cursor.prototype.rewind = function () { this.db_objects = null; this.cursor_pos = 0; @@ -135,7 +157,7 @@ Cursor.prototype.map = function (callback) { * @returns {Boolean} True if we can fetch one more document */ Cursor.prototype.hasNext = function () { - return this.cursor_pos < this.collection.docs.length; + return this.cursor_pos < this.documents.length; }; /** @@ -243,25 +265,44 @@ var _mapFields = function _mapFields(doc, fields) { var _getDocuments = function _getDocuments(cursor) { var justOne = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; - if (cursor.selector_id) { - if (_.hasIn(cursor.collection.doc_indexes, _.toString(cursor.selector_id))) { - var idx = cursor.collection.doc_indexes[_.toString(cursor.selector_id)]; + var docs = []; - return _mapFields(cursor.collection.docs[idx], cursor.fields); - } else { - if (justOne) { - return null; - } else { - return []; + if (cursor.fetch_mode === Cursor.COLSCAN) { + // COLSCAN, wi will iterate over all documents + docs = _.cloneDeep(cursor.documents); + } else if (cursor.fetch_mode === Cursor.IDXSCAN) { + // IDXSCAN, wi will iterate over all needed documents + for (var i = 0; i < cursor.indexes.length; i++) { + var index = cursor.indexes[i]; + + for (var _i2 = index.start; _i2 < index.end; _i2++) { + // let idx_id = cursor.collection.getIndex(index.name)[i]; + var idx_id = index.index[_i2]; + + docs.push(cursor.documents[idx_id]); } } } + // if (cursor.selector_id) { + // if (_.hasIn(cursor.collection.doc_indexes, _.toString(cursor.selector_id))) { + // let idx = cursor.collection.doc_indexes[_.toString(cursor.selector_id)]; + + // return _mapFields(cursor.collection.docs[idx], cursor.fields); + // } else { + // if (justOne) { + // return null; + // } else { + // return []; + // } + // } + // } + // TODO add warning when sort/skip/limit and fetching one // TODO add warning when skip/limit without order // TODO index - while (cursor.cursor_pos < cursor.collection.docs.length) { - var _doc = cursor.collection.docs[cursor.cursor_pos]; + while (cursor.cursor_pos < docs.length) { + var _doc = docs[cursor.cursor_pos]; cursor.cursor_pos++; if (cursor.selector_compiled.test(_doc)) { @@ -299,6 +340,26 @@ Cursor.prototype.count = function () { return this.fetchAll().length; }; +/** + * Set the sorting of the cursor + * + * @method Cursor#sort + * + * @param {Object|Array|String} spec - The sorting specification + * + * @returns {Cursor} This instance so it can be chained with other methods + */ +Cursor.prototype.setSorting = function (spec) { + if (_.isNil(spec)) logger.throw("You need to specify a sorting"); + + if (spec) { + this.sortValue = spec; + this.sort_compiled = new Selector(spec, Selector.SORT_SELECTOR); + } + + return this; +}; + /** * Applies a sorting on the cursor * @@ -316,15 +377,11 @@ Cursor.prototype.sort = function (spec) { } if (_sort) { - if (spec) { - this.sortValue = spec; - this.sort_compiled = _sort; + if (!_.isNil(this.db_objects) && _.isArray(this.db_objects)) { + this.db_objects = this.db_objects.sort(_sort); + this.sorted = true; } else { - // If no spec, do sort - if (!_.isNil(this.db_objects) && _.isArray(this.db_objects)) { - this.db_objects = this.db_objects.sort(_sort); - this.sorted = true; - } + this.setSorting(spec); } } @@ -551,4 +608,4 @@ Cursor.prototype.toArray = function () { }; module.exports = Cursor; -//# sourceMappingURL=data:application/json;base64,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LElBQUksS0FBSixDQUFVLHFCQUFWLENBQU47QUFDSCxDQUhEOzs7OztBQVFBLE9BQU8sU0FBUCxDQUFpQixZQUFqQixHQUFnQyxZQUFXOztBQUV2QyxVQUFNLElBQUksS0FBSixDQUFVLHFCQUFWLENBQU47QUFDSCxDQUhEOzs7OztBQVFBLE9BQU8sU0FBUCxDQUFpQixJQUFqQixHQUF3QixZQUFXOztBQUUvQixVQUFNLElBQUksS0FBSixDQUFVLHFCQUFWLENBQU47QUFDSCxDQUhEOzs7OztBQVFBLE9BQU8sU0FBUCxDQUFpQixRQUFqQixHQUE0QixZQUFXOzs7QUFHbkMsVUFBTSxJQUFJLEtBQUosQ0FBVSxxQkFBVixDQUFOO0FBQ0gsQ0FKRDs7Ozs7QUFTQSxPQUFPLFNBQVAsQ0FBaUIsUUFBakIsR0FBNEIsWUFBVzs7QUFFbkMsVUFBTSxJQUFJLEtBQUosQ0FBVSxxQkFBVixDQUFOO0FBQ0gsQ0FIRDs7Ozs7QUFRQSxPQUFPLFNBQVAsQ0FBaUIsT0FBakIsR0FBMkIsWUFBVzs7QUFFbEMsVUFBTSxJQUFJLEtBQUosQ0FBVSxxQkFBVixDQUFOO0FBQ0gsQ0FIRDs7QUFLQSxPQUFPLE9BQVAsR0FBaUIsTUFBakIiLCJmaWxlIjoiQ3Vyc29yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBDdXJzb3IuanMgLSBiYXNlZCBvbiBNb25nbG8jQ3Vyc29yICh7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL01vbmdsb30pIGJ5IENocmlzdGlhbiBTdWxsaXZhbiA8Y3NAZXVmb3JpYy5jbz4gfCBDb3B5cmlnaHQgKGMpIDIwMTJcbiAqIEB2ZXJzaW9uIDEuMC4wXG4gKiBcbiAqIEBhdXRob3IgRWR1YXJkbyBBc3RvbGZpIDxlZHVhcmRvLmFzdG9sZmk5MUBnbWFpbC5jb20+XG4gKiBAY29weXJpZ2h0IDIwMTYgRWR1YXJkbyBBc3RvbGZpIDxlZHVhcmRvLmFzdG9sZmk5MUBnbWFpbC5jb20+XG4gKiBAbGljZW5zZSBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgTG9nZ2VyID0gcmVxdWlyZShcImpzdy1sb2dnZXJcIiksXG4gICAgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIiksXG4gICAgU2VsZWN0b3IgPSByZXF1aXJlKCcuL1NlbGVjdG9yJyk7XG4gICAgXG52YXIgbG9nZ2VyID0gbnVsbDtcblxuLyoqXG4gKiBDdXJzb3JcbiAqIFxuICogQG1vZHVsZSBDdXJzb3JcbiAqIEBjb25zdHJ1Y3RvclxuICogQHNpbmNlIDAuMC4xXG4gKiBcbiAqIEBjbGFzc2Rlc2MgQ3Vyc29yIGNsYXNzIHRoYXQgbWFwcyBhIE1vbmdvREItbGlrZSBjdXJzb3JcbiAqIFxuICogQHBhcmFtIHtNb25nb1BvcnRhYmxlfSBkYiAtIEFkZGl0aW9uYWwgb3B0aW9uc1xuICogQHBhcmFtIHtDb2xsZWN0aW9ufSBjb2xsZWN0aW9uIC0gVGhlIGNvbGxlY3Rpb24gaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW3NlbGVjdGlvbj17fV0gLSBUaGUgc2VsZWN0aW9uIGZvciBtYXRjaGluZyBkb2N1bWVudHNcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW2ZpZWxkcz17fV0gLSBUaGUgZmllbGRzIG9mIHRoZSBkb2N1bWVudCB0byBzaG93XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gRGF0YWJhc2Ugb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wa0ZhY3Rvcnk9bnVsbF0gLSBPYmplY3Qgb3ZlcnJpZGluZyB0aGUgYmFzaWMgXCJPYmplY3RJZFwiIHByaW1hcnkga2V5IGdlbmVyYXRpb24uXG4gKiBcbiAqL1xuY2xhc3MgQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3RvcihkYiwgY29sbGVjdGlvbiwgc2VsZWN0aW9uLCBmaWVsZHMsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRiID0gZGI7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuc2tpcFZhbHVlID0gb3B0aW9ucy5za2lwIHx8IDA7XG4gICAgICAgIHRoaXMubGltaXRWYWx1ZSA9IG9wdGlvbnMubGltaXQgfHwgMTU7XG4gICAgICAgIHRoaXMuc29ydFZhbHVlID0gb3B0aW9ucy5zb3J0IHx8IG51bGw7XG4gICAgICAgIHRoaXMuc29ydGVkID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIgPSBMb2dnZXIuaW5zdGFuY2U7XG4gICAgXG4gICAgICAgIGlmIChTZWxlY3Rvci5pc1NlbGVjdG9yQ29tcGlsZWQodGhpcy5zZWxlY3RvcikpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3JfY29tcGlsZWQgPSB0aGlzLnNlbGVjdG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rvcl9jb21waWxlZCA9IG5ldyBTZWxlY3Rvcih0aGlzLnNlbGVjdG9yLCBTZWxlY3Rvci5NQVRDSF9TRUxFQ1RPUik7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3Rvcl9jb21waWxlZC5jbGF1c2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rvcl9jb21waWxlZC5jbGF1c2VzW2ldLmtleSA9PT0gJ19pZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdG9yX2lkID0gdGhpcy5zZWxlY3Rvcl9jb21waWxlZC5jbGF1c2VzW2ldLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0b3JfY29tcGlsZWQuY2xhdXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0b3JfY29tcGlsZWQuY2xhdXNlc1tpXS5rZXkgPT09ICdfaWQnKSB7XG4gICAgICAgICAgICAgICAgdmFyIF92YWwgPSB0aGlzLnNlbGVjdG9yX2NvbXBpbGVkLmNsYXVzZXNbaV0udmFsdWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKF8uaXNTdHJpbmcoX3ZhbCkgfHwgXy5pc051bWJlcihfdmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdG9yX2lkID0gX3ZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBcbiAgICAgICAgdGhpcy5maWVsZHMgPSBuZXcgU2VsZWN0b3IoZmllbGRzLCBTZWxlY3Rvci5GSUVMRF9TRUxFQ1RPUik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnNvcnRfY29tcGlsZWQgPSBuZXcgU2VsZWN0b3IodGhpcy5zb3J0VmFsdWUsIFNlbGVjdG9yLlNPUlRfU0VMRUNUT1IpO1xuICAgIFxuICAgICAgICB0aGlzLmRiX29iamVjdHMgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnNvcl9wb3MgPSAwO1xuICAgIH1cbn1cblxuLyoqXG4gKiBNb3ZlcyBhIGN1cnNvciB0byB0aGUgYmVnaW5pbmdcbiAqIFxuICogQG1ldGhvZCBDdXJzb3IjcmV3aW5kXG4gKi9cbkN1cnNvci5wcm90b3R5cGUucmV3aW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5kYl9vYmplY3RzID0gbnVsbDtcbiAgICB0aGlzLmN1cnNvcl9wb3MgPSAwO1xufTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBjdXJzb3IsIGNhbGxpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICogXG4gKiBAbWV0aG9kIEN1cnNvciNmb3JFYWNoXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1udWxsXSAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBkb2N1bWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIGxldCBkb2NzID0gdGhpcy5mZXRjaEFsbCgpO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjYWxsYmFjayhkb2NzW2ldKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgdGhlIGN1cnNvciwgcmV0dXJuaW5nIGEgbmV3IGFycmF5IHdpdGggdGhlIGRvY3VtZW50cyBhZmZlY3RlZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIFxuICogQG1ldGhvZCBDdXJzb3IjbWFwXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1udWxsXSAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBkb2N1bWVudFxuICogXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBkb2N1bWVudHMgYWZ0ZXIgYmVpbmcgYWZmZWN0ZWQgd2l0aCB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIHZhciByZXMgPSBbXTtcblxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgIHJlcy5wdXNoKGNhbGxiYWNrKGRvYykpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJzb3IgaGFzIG9uZSBkb2N1bWVudCB0byBiZSBmZXRjaGVkXG4gKiBcbiAqIEBtZXRob2QgQ3Vyc29yI2hhc05leHRcbiAqIFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgd2UgY2FuIGZldGNoIG9uZSBtb3JlIGRvY3VtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUuaGFzTmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJzb3JfcG9zIDwgdGhpcy5jb2xsZWN0aW9uLmRvY3MubGVuZ3RoKTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBDdXJzb3IjZmV0Y2hPbmV9XG4gKiBcbiAqIEBtZXRob2QgQ3Vyc29yI25leHRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hPbmUoKTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBDdXJzb3IjZmV0Y2hBbGx9XG4gKiBcbiAqIEBtZXRob2QgQ3Vyc29yI2ZldGNoXG4gKi9cbkN1cnNvci5wcm90b3R5cGUuZmV0Y2ggPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaEFsbCgpO1xufTtcblxuLyoqXG4gKiBGZXRjaCBhbGwgZG9jdW1lbnRzIGluIHRoZSBjdXJzb3JcbiAqIFxuICogQG1ldGhvZCBDdXJzb3IjZmV0Y2hBbGxcbiAqIFxuICogQHJldHVybnMge0FycmF5fSBBbGwgdGhlIGRvY3VtZW50cyBjb250YWluZWQgaW4gdGhlIGN1cnNvclxuICovXG5DdXJzb3IucHJvdG90eXBlLmZldGNoQWxsID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF9nZXREb2N1bWVudHModGhpcywgZmFsc2UpIHx8IFtdO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIG5leHQgZG9jdW1lbnQgaW4gdGhlIGN1cnNvclxuICogXG4gKiBAbWV0aG9kIEN1cnNvciNmZXRjaE9uZVxuICogXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgbmV4dCBkb2N1bWVudCBpbiB0aGUgY3Vyc29yXG4gKi9cbkN1cnNvci5wcm90b3R5cGUuZmV0Y2hPbmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gX2dldERvY3VtZW50cyh0aGlzLCB0cnVlKTtcbn07XG5cbnZhciBfbWFwRmllbGRzID0gZnVuY3Rpb24oZG9jLCBmaWVsZHMpIHtcbiAgICB2YXIgX2RvYyA9IF8uY2xvbmVEZWVwKGRvYyk7XG5cbiAgICBpZiAoIV8uaXNOaWwoZmllbGRzKSAmJiBfLmlzUGxhaW5PYmplY3QoZmllbGRzKSAmJiAhXy5pc0VxdWFsKGZpZWxkcywge30pKSB7XG4gICAgICAgIHZhciBzaG93SWQgPSB0cnVlLFxuICAgICAgICAgICAgc2hvd2luZyA9IG51bGw7XG5cbiAgICAgICAgLy8gV2hldGhlciBpZiB3ZSBzaG93aW5nIHRoZSBfaWQgZmllbGRcbiAgICAgICAgaWYgKF8uaGFzSW4oZmllbGRzLCAnX2lkJykgJiYgZmllbGRzLl9pZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHNob3dJZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRtcCA9IG51bGw7XG5cbiAgICAgICAgZm9yICh2YXIgZmllbGQgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAvLyBXaGV0aGVyIGlmIHdlIGFyZSBzaG93aW5nIG9yIGhpZGRpbmcgZmllbGRzXG4gICAgICAgICAgICBpZiAoZmllbGQgIT09ICdfaWQnICYmIHNob3dpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzaG93aW5nID0gZmllbGRzW2ZpZWxkXSA9PT0gMSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNob3dpbmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0bXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gXy5jbG9uZURlZXAoZG9jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZmllbGRcbiAgICAgICAgICAgICAgICBpZiAoc2hvd2luZykge1xuICAgICAgICAgICAgICAgICAgICB0bXBbZmllbGRdID0gZG9jW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdG1wW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBfaWQgZmllbGRcbiAgICAgICAgaWYgKHNob3dJZCkge1xuICAgICAgICAgICAgdG1wLl9pZCA9IGRvYy5faWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdG1wLl9pZDtcbiAgICAgICAgfVxuXG4gICAgICAgIF9kb2MgPSB0bXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9kb2M7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBvbmUgb3IgYWxsIHRoZSBkb2N1bWVudHMgaW4gdGhlIGN1cnNvclxuICogXG4gKiBAbWV0aG9kIF9nZXREb2N1bWVudHNcbiAqIEBwcml2YXRlXG4gKiBcbiAqIEBwYXJhbSB7Q3Vyc29yfSBjdXJzb3IgLSBUaGUgY3Vyc29yIHdpdGggdGhlIGRvY3VtZW50c1xuICogQHBhcmFtIHtCb29sZWFufSBbanVzdE9uZT1mYWxzZV0gLSBXaGV0aGVyIGl0IHJldHJpZXZlcyBvbmUgb3IgYWxsIHRoZSBkb2N1bWVudHNcbiAqIFxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gSWYgW2p1c3RPbmU9dHJ1ZV0gcmV0dXJucyB0aGUgbmV4dCBkb2N1bWVudCwgb3RoZXJ3aXNlIHJldHVybnMgYWxsIHRoZSBkb2N1bWVudHNcbiAqL1xudmFyIF9nZXREb2N1bWVudHMgPSBmdW5jdGlvbihjdXJzb3IsIGp1c3RPbmUgPSBmYWxzZSkge1xuICAgIGlmIChjdXJzb3Iuc2VsZWN0b3JfaWQpIHtcbiAgICAgICAgaWYgKF8uaGFzSW4oY3Vyc29yLmNvbGxlY3Rpb24uZG9jX2luZGV4ZXMsIF8udG9TdHJpbmcoY3Vyc29yLnNlbGVjdG9yX2lkKSkpIHtcbiAgICAgICAgICAgIGxldCBpZHggPSBjdXJzb3IuY29sbGVjdGlvbi5kb2NfaW5kZXhlc1tfLnRvU3RyaW5nKGN1cnNvci5zZWxlY3Rvcl9pZCldO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gX21hcEZpZWxkcyhjdXJzb3IuY29sbGVjdGlvbi5kb2NzW2lkeF0sIGN1cnNvci5maWVsZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGp1c3RPbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFRPRE8gYWRkIHdhcm5pbmcgd2hlbiBzb3J0L3NraXAvbGltaXQgYW5kIGZldGNoaW5nIG9uZVxuICAgIC8vIFRPRE8gYWRkIHdhcm5pbmcgd2hlbiBza2lwL2xpbWl0IHdpdGhvdXQgb3JkZXJcbiAgICAvLyBUT0RPIGluZGV4XG4gICAgd2hpbGUgKGN1cnNvci5jdXJzb3JfcG9zIDwgY3Vyc29yLmNvbGxlY3Rpb24uZG9jcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIF9kb2MgPSBjdXJzb3IuY29sbGVjdGlvbi5kb2NzW2N1cnNvci5jdXJzb3JfcG9zXTtcbiAgICAgICAgY3Vyc29yLmN1cnNvcl9wb3MrKztcbiAgICAgICAgXG4gICAgICAgIGlmIChjdXJzb3Iuc2VsZWN0b3JfY29tcGlsZWQudGVzdChfZG9jKSkge1xuICAgICAgICAgICAgaWYgKF8uaXNOaWwoY3Vyc29yLmRiX29iamVjdHMpKSBjdXJzb3IuZGJfb2JqZWN0cyA9IFtdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBfZG9jID0gX21hcEZpZWxkcyhfZG9jLCBjdXJzb3IuZmllbGRzKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY3Vyc29yLmRiX29iamVjdHMucHVzaChfZG9jKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGp1c3RPbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgZm9yY2Ugc29ydFxuICAgICAgICAgICAgICAgIHJldHVybiBfZG9jO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChfLmlzTmlsKGN1cnNvci5kYl9vYmplY3RzKSkgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgaWYgKCFjdXJzb3Iuc29ydGVkICYmIGhhc1NvcnRpbmcoY3Vyc29yKSkgY3Vyc29yLnNvcnQoKTtcbiAgICBcbiAgICB2YXIgaWR4RnJvbSA9IGN1cnNvci5za2lwVmFsdWU7XG4gICAgdmFyIGlkeFRvID0gY3Vyc29yLmxpbWl0VmFsdWUgIT09IC0xID8gKGN1cnNvci5saW1pdFZhbHVlICsgaWR4RnJvbSkgOiBjdXJzb3IuZGJfb2JqZWN0cy5sZW5ndGg7XG4gICAgXG4gICAgcmV0dXJuIGN1cnNvci5kYl9vYmplY3RzLnNsaWNlKGlkeEZyb20sIGlkeFRvKTtcbiAgICBcbn07XG5cbi8qKlxuICogT2J0YWlucyB0aGUgdG90YWwgb2YgZG9jdW1lbnRzIG9mIHRoZSBjdXJzb3JcbiAqIFxuICogQG1ldGhvZCBDdXJzb3IjY291bnRcbiAqIFxuICogQHJldHVybnMge051bWJlcn0gVGhlIHRvdGFsIG9mIGRvY3VtZW50cyBpbiB0aGUgY3Vyc29yXG4gKi9cbkN1cnNvci5wcm90b3R5cGUuY291bnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaEFsbCgpLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQXBwbGllcyBhIHNvcnRpbmcgb24gdGhlIGN1cnNvclxuICogXG4gKiBAbWV0aG9kIEN1cnNvciNzb3J0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gc3BlYyAtIFRoZSBzb3J0aW5nIHNwZWNpZmljYXRpb25cbiAqIFxuICogQHJldHVybnMge0N1cnNvcn0gVGhpcyBpbnN0YW5jZSBzbyBpdCBjYW4gYmUgY2hhaW5lZCB3aXRoIG90aGVyIG1ldGhvZHNcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24oc3BlYykge1xuICAgIHZhciBfc29ydCA9IHRoaXMuc29ydF9jb21waWxlZCB8fCBudWxsO1xuICAgIFxuICAgIGlmIChzcGVjKSB7XG4gICAgICAgIF9zb3J0ID0gbmV3IFNlbGVjdG9yKHNwZWMsIFNlbGVjdG9yLlNPUlRfU0VMRUNUT1IpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoX3NvcnQpIHtcbiAgICAgICAgaWYgKHNwZWMpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydFZhbHVlID0gc3BlYztcbiAgICAgICAgICAgIHRoaXMuc29ydF9jb21waWxlZCA9IF9zb3J0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgbm8gc3BlYywgZG8gc29ydFxuICAgICAgICAgICAgaWYgKCFfLmlzTmlsKHRoaXMuZGJfb2JqZWN0cykgJiYgXy5pc0FycmF5KHRoaXMuZGJfb2JqZWN0cykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRiX29iamVjdHMgPSB0aGlzLmRiX29iamVjdHMuc29ydChfc29ydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIG51bWJlciBvZiBkb2N1bWVudCB0byBza2lwIHdoZW4gZmV0Y2hpbmcgdGhlIGN1cnNvclxuICogXG4gKiBAbWV0aG9kIEN1cnNvciNza2lwXG4gKiBcbiAqIEBwYXJhbSB7TnVtYmVyfSBza2lwIC0gVGhlIG51bWJlciBvZiBkb2N1bWVudHMgdG8gc2tpcFxuICogXG4gKiBAcmV0dXJucyB7Q3Vyc29yfSBUaGlzIGluc3RhbmNlIHNvIGl0IGNhbiBiZSBjaGFpbmVkIHdpdGggb3RoZXIgbWV0aG9kc1xuICovXG5DdXJzb3IucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbihza2lwKSB7XG4gICAgaWYgKF8uaXNOaWwoc2tpcCkgfHwgXy5pc05hTihza2lwKSkgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBwYXNzIGEgbnVtYmVyXCIpO1xuICAgIFxuICAgIHRoaXMuc2tpcFZhbHVlID0gc2tpcDtcbiAgICBcbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBtYXggbnVtYmVyIG9mIGRvY3VtZW50IHRvIGZldGNoXG4gKiBcbiAqIEBtZXRob2QgQ3Vyc29yI2xpbWl0XG4gKiBcbiAqIEBwYXJhbSB7TnVtYmVyfSBsaW1pdCAtIFRoZSBtYXggbnVtYmVyIG9mIGRvY3VtZW50c1xuICogXG4gKiBAcmV0dXJucyB7Q3Vyc29yfSBUaGlzIGluc3RhbmNlIHNvIGl0IGNhbiBiZSBjaGFpbmVkIHdpdGggb3RoZXIgbWV0aG9kc1xuICovXG5DdXJzb3IucHJvdG90eXBlLmxpbWl0ID0gZnVuY3Rpb24obGltaXQpIHtcbiAgICBpZiAoXy5pc05pbChsaW1pdCkgfHwgXy5pc05hTihsaW1pdCkpIHRocm93IG5ldyBFcnJvcihcIk11c3QgcGFzcyBhIG51bWJlclwiKTtcbiAgICBcbiAgICB0aGlzLmxpbWl0VmFsdWUgPSBsaW1pdDtcbiAgICBcbiAgICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgY3Vyc29yIGhhcyBhIHNvcnRpbmcgZGVmaW5lZFxuICogXG4gKiBAbWV0aG9kIGhhc1NvcnRpbmdcbiAqIEBwcml2YXRlXG4gKiBcbiAqIEBwYXJhbSB7Q3Vyc29yfSBjdXJzb3IgLSBUaGUgY3Vyc29yXG4gKiBcbiAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHRoZSBjdXJzb3IgaGFzIHNvcnRpbmcgb3Igbm90XG4gKi9cbnZhciBoYXNTb3J0aW5nID0gZnVuY3Rpb24oY3Vyc29yKSB7XG4gICAgaWYgKF8uaXNOaWwoY3Vyc29yLnNvcnRWYWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUuYmF0Y2hTaXplID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gQ29udHJvbHMgdGhlIG51bWJlciBvZiBkb2N1bWVudHMgTW9uZ29EQiB3aWxsIHJldHVybiB0byB0aGUgY2xpZW50IGluIGEgc2luZ2xlIG5ldHdvcmsgbWVzc2FnZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIENsb3NlIGEgY3Vyc29yIGFuZCBmcmVlIGFzc29jaWF0ZWQgc2VydmVyIHJlc291cmNlcy5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5jb21tZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gQXR0YWNoZXMgYSBjb21tZW50IHRvIHRoZSBxdWVyeSB0byBhbGxvdyBmb3IgdHJhY2VhYmlsaXR5IGluIHRoZSBsb2dzIGFuZCB0aGUgc3lzdGVtLnByb2ZpbGUgY29sbGVjdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5leHBsYWluID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gUmVwb3J0cyBvbiB0aGUgcXVlcnkgZXhlY3V0aW9uIHBsYW4gZm9yIGEgY3Vyc29yLlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLmhpbnQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBGb3JjZXMgTW9uZ29EQiB0byB1c2UgYSBzcGVjaWZpYyBpbmRleCBmb3IgYSBxdWVyeS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5pdGNvdW50ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gQ29tcHV0ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBkb2N1bWVudHMgaW4gdGhlIGN1cnNvciBjbGllbnQtc2lkZSBieSBmZXRjaGluZyBhbmQgaXRlcmF0aW5nIHRoZSByZXN1bHQgc2V0LlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLm1heFNjYW4gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHNjYW47IGRvY3VtZW50cyBmb3IgY29sbGVjdGlvbiBzY2Fucywga2V5cyBmb3IgaW5kZXggc2NhbnMuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUubWF4VGltZU1TID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gU3BlY2lmaWVzIGEgY3VtdWxhdGl2ZSB0aW1lIGxpbWl0IGluIG1pbGxpc2Vjb25kcyBmb3IgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGEgY3Vyc29yLlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLm1heCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFNwZWNpZmllcyBhbiBleGNsdXNpdmUgdXBwZXIgaW5kZXggYm91bmQgZm9yIGEgY3Vyc29yLiBGb3IgdXNlIHdpdGggY3Vyc29yLmhpbnQoKVxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLm1pbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFNwZWNpZmllcyBhbiBpbmNsdXNpdmUgbG93ZXIgaW5kZXggYm91bmQgZm9yIGEgY3Vyc29yLiBGb3IgdXNlIHdpdGggY3Vyc29yLmhpbnQoKVxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLm5vQ3Vyc29yVGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEluc3RydWN0cyB0aGUgc2VydmVyIHRvIGF2b2lkIGNsb3NpbmcgYSBjdXJzb3IgYXV0b21hdGljYWxseSBhZnRlciBhIHBlcmlvZCBvZiBpbmFjdGl2aXR5LlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLm9ianNMZWZ0SW5CYXRjaCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkb2N1bWVudHMgbGVmdCBpbiB0aGUgY3VycmVudCBjdXJzb3IgYmF0Y2guXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUucHJldHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gQ29uZmlndXJlcyB0aGUgY3Vyc29yIHRvIGRpc3BsYXkgcmVzdWx0cyBpbiBhbiBlYXN5LXRvLXJlYWQgZm9ybWF0LlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLnJlYWRDb25jZXJuID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gU3BlY2lmaWVzIGEgcmVhZCBjb25jZXJuIGZvciBhIGZpbmQoKSBvcGVyYXRpb24uXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUucmVhZFByZWYgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBTcGVjaWZpZXMgYSByZWFkIHByZWZlcmVuY2UgdG8gYSBjdXJzb3IgdG8gY29udHJvbCBob3cgdGhlIGNsaWVudCBkaXJlY3RzIHF1ZXJpZXMgdG8gYSByZXBsaWNhIHNldC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5yZXR1cm5LZXkgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBNb2RpZmllcyB0aGUgY3Vyc29yIHRvIHJldHVybiBpbmRleCBrZXlzIHJhdGhlciB0aGFuIHRoZSBkb2N1bWVudHMuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUuc2hvd1JlY29yZElkID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gQWRkcyBhbiBpbnRlcm5hbCBzdG9yYWdlIGVuZ2luZSBJRCBmaWVsZCB0byBlYWNoIGRvY3VtZW50IHJldHVybmVkIGJ5IHRoZSBjdXJzb3IuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybnMgYSBjb3VudCBvZiB0aGUgZG9jdW1lbnRzIGluIHRoZSBjdXJzb3IgYWZ0ZXIgYXBwbHlpbmcgc2tpcCgpIGFuZCBsaW1pdCgpIG1ldGhvZHMuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUuc25hcHNob3QgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBGb3JjZXMgdGhlIGN1cnNvciB0byB1c2UgdGhlIGluZGV4IG9uIHRoZSBfaWQgZmllbGQuIEVuc3VyZXMgdGhhdCB0aGUgY3Vyc29yIHJldHVybnMgZWFjaCBkb2N1bWVudCwgXG4gICAgLy8gd2l0aCByZWdhcmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgX2lkIGZpZWxkLCBvbmx5IG9uY2UuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUudGFpbGFibGUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBNYXJrcyB0aGUgY3Vyc29yIGFzIHRhaWxhYmxlLiBPbmx5IHZhbGlkIGZvciBjdXJzb3JzIG92ZXIgY2FwcGVkIGNvbGxlY3Rpb25zLlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBSZXR1cm5zIGFuIGFycmF5IHRoYXQgY29udGFpbnMgYWxsIGRvY3VtZW50cyByZXR1cm5lZCBieSB0aGUgY3Vyc29yLlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEN1cnNvcjsiXX0= +//# sourceMappingURL=data:application/json;base64,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SSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLE9BQWpCLEdBQTJCLFlBQVc7O0FBRWxDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLE9BQWpCLEdBQTJCLFlBQVc7O0FBRWxDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLElBQWpCLEdBQXdCLFlBQVc7O0FBRS9CLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLE9BQWpCLEdBQTJCLFlBQVc7O0FBRWxDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLE9BQWpCLEdBQTJCLFlBQVc7O0FBRWxDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLFNBQWpCLEdBQTZCLFlBQVc7O0FBRXBDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLEdBQWpCLEdBQXVCLFlBQVc7O0FBRTlCLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLEdBQWpCLEdBQXVCLFlBQVc7O0FBRTlCLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLGVBQWpCLEdBQW1DLFlBQVc7O0FBRTFDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLGVBQWpCLEdBQW1DLFlBQVc7O0FBRTFDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLE1BQWpCLEdBQTBCLFlBQVc7O0FBRWpDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLFdBQWpCLEdBQStCLFlBQVc7O0FBRXRDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLFFBQWpCLEdBQTRCLFlBQVc7O0FBRW5DLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLFNBQWpCLEdBQTZCLFlBQVc7O0FBRXBDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLFlBQWpCLEdBQWdDLFlBQVc7O0FBRXZDLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLElBQWpCLEdBQXdCLFlBQVc7O0FBRS9CLFVBQU0sSUFBSSxLQUFKLENBQVUscUJBQVYsQ0FBTjtBQUNILENBSEQ7Ozs7O0FBUUEsT0FBTyxTQUFQLENBQWlCLFFBQWpCLEdBQTRCLFlBQVc7OztBQUduQyxVQUFNLElBQUksS0FBSixDQUFVLHFCQUFWLENBQU47QUFDSCxDQUpEOzs7OztBQVNBLE9BQU8sU0FBUCxDQUFpQixRQUFqQixHQUE0QixZQUFXOztBQUVuQyxVQUFNLElBQUksS0FBSixDQUFVLHFCQUFWLENBQU47QUFDSCxDQUhEOzs7OztBQVFBLE9BQU8sU0FBUCxDQUFpQixPQUFqQixHQUEyQixZQUFXOztBQUVsQyxVQUFNLElBQUksS0FBSixDQUFVLHFCQUFWLENBQU47QUFDSCxDQUhEOztBQUtBLE9BQU8sT0FBUCxHQUFpQixNQUFqQiIsImZpbGUiOiJDdXJzb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIEN1cnNvci5qcyAtIGJhc2VkIG9uIE1vbmdsbyNDdXJzb3IgKHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vTW9uZ2xvfSkgYnkgQ2hyaXN0aWFuIFN1bGxpdmFuIDxjc0BldWZvcmljLmNvPiB8IENvcHlyaWdodCAoYykgMjAxMlxuICogQHZlcnNpb24gMS4wLjBcbiAqIFxuICogQGF1dGhvciBFZHVhcmRvIEFzdG9sZmkgPGVkdWFyZG8uYXN0b2xmaTkxQGdtYWlsLmNvbT5cbiAqIEBjb3B5cmlnaHQgMjAxNiBFZHVhcmRvIEFzdG9sZmkgPGVkdWFyZG8uYXN0b2xmaTkxQGdtYWlsLmNvbT5cbiAqIEBsaWNlbnNlIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBMb2dnZXIgPSByZXF1aXJlKFwianN3LWxvZ2dlclwiKSxcbiAgICBfID0gcmVxdWlyZShcImxvZGFzaFwiKSxcbiAgICBTZWxlY3RvciA9IHJlcXVpcmUoJy4vU2VsZWN0b3InKTtcbiAgICBcbnZhciBsb2dnZXIgPSBudWxsO1xuXG4vKipcbiAqIEN1cnNvclxuICogXG4gKiBAbW9kdWxlIEN1cnNvclxuICogQGNvbnN0cnVjdG9yXG4gKiBAc2luY2UgMC4wLjFcbiAqIFxuICogQGNsYXNzZGVzYyBDdXJzb3IgY2xhc3MgdGhhdCBtYXBzIGEgTW9uZ29EQi1saWtlIGN1cnNvclxuICogXG4gKiBAcGFyYW0ge01vbmdvUG9ydGFibGV9IGRiIC0gQWRkaXRpb25hbCBvcHRpb25zXG4gKiBAcGFyYW0ge0FycmF5fSBkb2N1bWVudHMgLSBUaGUgbGlzdCBvZiBkb2N1bWVudHNcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW3NlbGVjdGlvbj17fV0gLSBUaGUgc2VsZWN0aW9uIGZvciBtYXRjaGluZyBkb2N1bWVudHNcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ30gW2ZpZWxkcz17fV0gLSBUaGUgZmllbGRzIG9mIHRoZSBkb2N1bWVudCB0byBzaG93XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gRGF0YWJhc2Ugb2JqZWN0XG4gKiBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wa0ZhY3Rvcnk9bnVsbF0gLSBPYmplY3Qgb3ZlcnJpZGluZyB0aGUgYmFzaWMgXCJPYmplY3RJZFwiIHByaW1hcnkga2V5IGdlbmVyYXRpb24uXG4gKiBcbiAqL1xuY2xhc3MgQ3Vyc29yIHtcbiAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudHMsIHNlbGVjdGlvbiwgZmllbGRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSBkb2N1bWVudHM7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuc2tpcFZhbHVlID0gb3B0aW9ucy5za2lwIHx8IDA7XG4gICAgICAgIHRoaXMubGltaXRWYWx1ZSA9IG9wdGlvbnMubGltaXQgfHwgMTU7XG4gICAgICAgIHRoaXMuc29ydFZhbHVlID0gb3B0aW9ucy5zb3J0IHx8IG51bGw7XG4gICAgICAgIHRoaXMuc29ydGVkID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIgPSBMb2dnZXIuaW5zdGFuY2U7XG4gICAgXG4gICAgICAgIC8qKiBBREQgSURYICoqL1xuICAgICAgICBpZiAoU2VsZWN0b3IuaXNTZWxlY3RvckNvbXBpbGVkKHRoaXMuc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdG9yX2NvbXBpbGVkID0gdGhpcy5zZWxlY3RvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3JfY29tcGlsZWQgPSBuZXcgU2VsZWN0b3IodGhpcy5zZWxlY3RvciwgU2VsZWN0b3IuTUFUQ0hfU0VMRUNUT1IpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0b3JfY29tcGlsZWQuY2xhdXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0b3JfY29tcGlsZWQuY2xhdXNlc1tpXS5rZXkgPT09ICdfaWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rvcl9pZCA9IHRoaXMuc2VsZWN0b3JfY29tcGlsZWQuY2xhdXNlc1tpXS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdG9yX2NvbXBpbGVkLmNsYXVzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdG9yX2NvbXBpbGVkLmNsYXVzZXNbaV0ua2V5ID09PSAnX2lkJykge1xuICAgICAgICAgICAgICAgIHZhciBfdmFsID0gdGhpcy5zZWxlY3Rvcl9jb21waWxlZC5jbGF1c2VzW2ldLnZhbHVlO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChfLmlzU3RyaW5nKF92YWwpIHx8IF8uaXNOdW1iZXIoX3ZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rvcl9pZCA9IF92YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqIEFERCBJRFggKiovXG4gICAgICAgIFxuICAgICAgICB0aGlzLmZldGNoX21vZGUgPSBDdXJzb3IuQ09MU0NBTiB8fCBDdXJzb3IuSURYU0NBTjtcbiAgICAgICAgdGhpcy5pbmRleGV4ID0gbnVsbDsvL2ZpbmRVc2FibGVJbmRleGVzKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZiAoY3Vyc29yLmZldGNoX21vZGUgPT09IEN1cnNvci5DT0xTQ0FOKSB7XG4gICAgICAgIC8vICAgICAvLyBDT0xTQ0FOLCB3aSB3aWxsIGl0ZXJhdGUgb3ZlciBhbGwgZG9jdW1lbnRzXG4gICAgICAgIC8vICAgICBkb2NzID0gXy5jbG9uZURlZXAoY3Vyc29yLmNvbGxlY3Rpb24uZG9jcyk7XG4gICAgICAgIC8vIH0gZWxzZSBpZiAoY3Vyc29yLmZldGNoX21vZGUgPT09IEN1cnNvci5JRFhTQ0FOKSB7XG4gICAgICAgIC8vICAgICAvLyBJRFhTQ0FOLCB3aSB3aWxsIGl0ZXJhdGUgb3ZlciBhbGwgbmVlZGVkIGRvY3VtZW50c1xuICAgICAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJzb3IuaW5kZXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgICAgICAgIGxldCBpbmRleCA9IGN1cnNvci5pbmRleGVzW2ldO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAvLyAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleC5zdGFydDsgaSA8IGluZGV4LmVuZDsgaSsrKSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGxldCBpZHhfaWQgPSBjdXJzb3IuY29sbGVjdGlvbi5nZXRJbmRleChpbmRleC5uYW1lKVtpXTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIC8vICAgICAgICAgICAgIGRvY3MucHVzaChjdXJzb3IuY29sbGVjdGlvbi5kb2NzW2lkeF9pZF0pO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5maWVsZHMgPSBuZXcgU2VsZWN0b3IoZmllbGRzLCBTZWxlY3Rvci5GSUVMRF9TRUxFQ1RPUik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnNvcnRfY29tcGlsZWQgPSBuZXcgU2VsZWN0b3IodGhpcy5zb3J0VmFsdWUsIFNlbGVjdG9yLlNPUlRfU0VMRUNUT1IpO1xuICAgIFxuICAgICAgICB0aGlzLmRiX29iamVjdHMgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnNvcl9wb3MgPSAwO1xuICAgIH1cbn1cblxuQ3Vyc29yLkNPTFNDQU4gPSAnY29sc2Nhbic7XG5DdXJzb3IuSURYU0NBTiA9ICdpZHhzY2FuJztcblxuLyoqXG4gKiBNb3ZlcyBhIGN1cnNvciB0byB0aGUgYmVnaW5pbmdcbiAqIFxuICogQG1ldGhvZCBDdXJzb3IjcmV3aW5kXG4gKi9cbkN1cnNvci5wcm90b3R5cGUucmV3aW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5kYl9vYmplY3RzID0gbnVsbDtcbiAgICB0aGlzLmN1cnNvcl9wb3MgPSAwO1xufTtcblxuLyoqXG4gKiBJdGVyYXRlcyBvdmVyIHRoZSBjdXJzb3IsIGNhbGxpbmcgYSBjYWxsYmFjayBmdW5jdGlvblxuICogXG4gKiBAbWV0aG9kIEN1cnNvciNmb3JFYWNoXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1udWxsXSAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBkb2N1bWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIGxldCBkb2NzID0gdGhpcy5mZXRjaEFsbCgpO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjYWxsYmFjayhkb2NzW2ldKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgdGhlIGN1cnNvciwgcmV0dXJuaW5nIGEgbmV3IGFycmF5IHdpdGggdGhlIGRvY3VtZW50cyBhZmZlY3RlZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIFxuICogQG1ldGhvZCBDdXJzb3IjbWFwXG4gKiBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFjaz1udWxsXSAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBkb2N1bWVudFxuICogXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBkb2N1bWVudHMgYWZ0ZXIgYmVpbmcgYWZmZWN0ZWQgd2l0aCB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIHZhciByZXMgPSBbXTtcblxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoZG9jKSB7XG4gICAgICAgIHJlcy5wdXNoKGNhbGxiYWNrKGRvYykpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjdXJzb3IgaGFzIG9uZSBkb2N1bWVudCB0byBiZSBmZXRjaGVkXG4gKiBcbiAqIEBtZXRob2QgQ3Vyc29yI2hhc05leHRcbiAqIFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgd2UgY2FuIGZldGNoIG9uZSBtb3JlIGRvY3VtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUuaGFzTmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAodGhpcy5jdXJzb3JfcG9zIDwgdGhpcy5kb2N1bWVudHMubGVuZ3RoKTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBDdXJzb3IjZmV0Y2hPbmV9XG4gKiBcbiAqIEBtZXRob2QgQ3Vyc29yI25leHRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hPbmUoKTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBDdXJzb3IjZmV0Y2hBbGx9XG4gKiBcbiAqIEBtZXRob2QgQ3Vyc29yI2ZldGNoXG4gKi9cbkN1cnNvci5wcm90b3R5cGUuZmV0Y2ggPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaEFsbCgpO1xufTtcblxuLyoqXG4gKiBGZXRjaCBhbGwgZG9jdW1lbnRzIGluIHRoZSBjdXJzb3JcbiAqIFxuICogQG1ldGhvZCBDdXJzb3IjZmV0Y2hBbGxcbiAqIFxuICogQHJldHVybnMge0FycmF5fSBBbGwgdGhlIGRvY3VtZW50cyBjb250YWluZWQgaW4gdGhlIGN1cnNvclxuICovXG5DdXJzb3IucHJvdG90eXBlLmZldGNoQWxsID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF9nZXREb2N1bWVudHModGhpcywgZmFsc2UpIHx8IFtdO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIG5leHQgZG9jdW1lbnQgaW4gdGhlIGN1cnNvclxuICogXG4gKiBAbWV0aG9kIEN1cnNvciNmZXRjaE9uZVxuICogXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgbmV4dCBkb2N1bWVudCBpbiB0aGUgY3Vyc29yXG4gKi9cbkN1cnNvci5wcm90b3R5cGUuZmV0Y2hPbmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gX2dldERvY3VtZW50cyh0aGlzLCB0cnVlKTtcbn07XG5cbnZhciBfbWFwRmllbGRzID0gZnVuY3Rpb24oZG9jLCBmaWVsZHMpIHtcbiAgICB2YXIgX2RvYyA9IF8uY2xvbmVEZWVwKGRvYyk7XG5cbiAgICBpZiAoIV8uaXNOaWwoZmllbGRzKSAmJiBfLmlzUGxhaW5PYmplY3QoZmllbGRzKSAmJiAhXy5pc0VxdWFsKGZpZWxkcywge30pKSB7XG4gICAgICAgIHZhciBzaG93SWQgPSB0cnVlLFxuICAgICAgICAgICAgc2hvd2luZyA9IG51bGw7XG5cbiAgICAgICAgLy8gV2hldGhlciBpZiB3ZSBzaG93aW5nIHRoZSBfaWQgZmllbGRcbiAgICAgICAgaWYgKF8uaGFzSW4oZmllbGRzLCAnX2lkJykgJiYgZmllbGRzLl9pZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHNob3dJZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRtcCA9IG51bGw7XG5cbiAgICAgICAgZm9yICh2YXIgZmllbGQgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAvLyBXaGV0aGVyIGlmIHdlIGFyZSBzaG93aW5nIG9yIGhpZGRpbmcgZmllbGRzXG4gICAgICAgICAgICBpZiAoZmllbGQgIT09ICdfaWQnICYmIHNob3dpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzaG93aW5nID0gZmllbGRzW2ZpZWxkXSA9PT0gMSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNob3dpbmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0bXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gXy5jbG9uZURlZXAoZG9jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZmllbGRcbiAgICAgICAgICAgICAgICBpZiAoc2hvd2luZykge1xuICAgICAgICAgICAgICAgICAgICB0bXBbZmllbGRdID0gZG9jW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdG1wW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBfaWQgZmllbGRcbiAgICAgICAgaWYgKHNob3dJZCkge1xuICAgICAgICAgICAgdG1wLl9pZCA9IGRvYy5faWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdG1wLl9pZDtcbiAgICAgICAgfVxuXG4gICAgICAgIF9kb2MgPSB0bXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9kb2M7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyBvbmUgb3IgYWxsIHRoZSBkb2N1bWVudHMgaW4gdGhlIGN1cnNvclxuICogXG4gKiBAbWV0aG9kIF9nZXREb2N1bWVudHNcbiAqIEBwcml2YXRlXG4gKiBcbiAqIEBwYXJhbSB7Q3Vyc29yfSBjdXJzb3IgLSBUaGUgY3Vyc29yIHdpdGggdGhlIGRvY3VtZW50c1xuICogQHBhcmFtIHtCb29sZWFufSBbanVzdE9uZT1mYWxzZV0gLSBXaGV0aGVyIGl0IHJldHJpZXZlcyBvbmUgb3IgYWxsIHRoZSBkb2N1bWVudHNcbiAqIFxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gSWYgW2p1c3RPbmU9dHJ1ZV0gcmV0dXJucyB0aGUgbmV4dCBkb2N1bWVudCwgb3RoZXJ3aXNlIHJldHVybnMgYWxsIHRoZSBkb2N1bWVudHNcbiAqL1xudmFyIF9nZXREb2N1bWVudHMgPSBmdW5jdGlvbihjdXJzb3IsIGp1c3RPbmUgPSBmYWxzZSkge1xuICAgIHZhciBkb2NzID0gW107XG4gICAgXG4gICAgaWYgKGN1cnNvci5mZXRjaF9tb2RlID09PSBDdXJzb3IuQ09MU0NBTikge1xuICAgICAgICAvLyBDT0xTQ0FOLCB3aSB3aWxsIGl0ZXJhdGUgb3ZlciBhbGwgZG9jdW1lbnRzXG4gICAgICAgIGRvY3MgPSBfLmNsb25lRGVlcChjdXJzb3IuZG9jdW1lbnRzKTtcbiAgICB9IGVsc2UgaWYgKGN1cnNvci5mZXRjaF9tb2RlID09PSBDdXJzb3IuSURYU0NBTikge1xuICAgICAgICAvLyBJRFhTQ0FOLCB3aSB3aWxsIGl0ZXJhdGUgb3ZlciBhbGwgbmVlZGVkIGRvY3VtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnNvci5pbmRleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBjdXJzb3IuaW5kZXhlc1tpXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4LnN0YXJ0OyBpIDwgaW5kZXguZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBsZXQgaWR4X2lkID0gY3Vyc29yLmNvbGxlY3Rpb24uZ2V0SW5kZXgoaW5kZXgubmFtZSlbaV07XG4gICAgICAgICAgICAgICAgbGV0IGlkeF9pZCA9IGluZGV4LmluZGV4W2ldO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGRvY3MucHVzaChjdXJzb3IuZG9jdW1lbnRzW2lkeF9pZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIGlmIChjdXJzb3Iuc2VsZWN0b3JfaWQpIHtcbiAgICAvLyAgICAgaWYgKF8uaGFzSW4oY3Vyc29yLmNvbGxlY3Rpb24uZG9jX2luZGV4ZXMsIF8udG9TdHJpbmcoY3Vyc29yLnNlbGVjdG9yX2lkKSkpIHtcbiAgICAvLyAgICAgICAgIGxldCBpZHggPSBjdXJzb3IuY29sbGVjdGlvbi5kb2NfaW5kZXhlc1tfLnRvU3RyaW5nKGN1cnNvci5zZWxlY3Rvcl9pZCldO1xuICAgICAgICAgICAgXG4gICAgLy8gICAgICAgICByZXR1cm4gX21hcEZpZWxkcyhjdXJzb3IuY29sbGVjdGlvbi5kb2NzW2lkeF0sIGN1cnNvci5maWVsZHMpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgaWYgKGp1c3RPbmUpIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxuICAgIFxuICAgIC8vIFRPRE8gYWRkIHdhcm5pbmcgd2hlbiBzb3J0L3NraXAvbGltaXQgYW5kIGZldGNoaW5nIG9uZVxuICAgIC8vIFRPRE8gYWRkIHdhcm5pbmcgd2hlbiBza2lwL2xpbWl0IHdpdGhvdXQgb3JkZXJcbiAgICAvLyBUT0RPIGluZGV4XG4gICAgd2hpbGUgKGN1cnNvci5jdXJzb3JfcG9zIDwgZG9jcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIF9kb2MgPSBkb2NzW2N1cnNvci5jdXJzb3JfcG9zXTtcbiAgICAgICAgY3Vyc29yLmN1cnNvcl9wb3MrKztcbiAgICAgICAgXG4gICAgICAgIGlmIChjdXJzb3Iuc2VsZWN0b3JfY29tcGlsZWQudGVzdChfZG9jKSkge1xuICAgICAgICAgICAgaWYgKF8uaXNOaWwoY3Vyc29yLmRiX29iamVjdHMpKSBjdXJzb3IuZGJfb2JqZWN0cyA9IFtdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBfZG9jID0gX21hcEZpZWxkcyhfZG9jLCBjdXJzb3IuZmllbGRzKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY3Vyc29yLmRiX29iamVjdHMucHVzaChfZG9jKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGp1c3RPbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgZm9yY2Ugc29ydFxuICAgICAgICAgICAgICAgIHJldHVybiBfZG9jO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChfLmlzTmlsKGN1cnNvci5kYl9vYmplY3RzKSkgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgaWYgKCFjdXJzb3Iuc29ydGVkICYmIGhhc1NvcnRpbmcoY3Vyc29yKSkgY3Vyc29yLnNvcnQoKTtcbiAgICBcbiAgICB2YXIgaWR4RnJvbSA9IGN1cnNvci5za2lwVmFsdWU7XG4gICAgdmFyIGlkeFRvID0gY3Vyc29yLmxpbWl0VmFsdWUgIT09IC0xID8gKGN1cnNvci5saW1pdFZhbHVlICsgaWR4RnJvbSkgOiBjdXJzb3IuZGJfb2JqZWN0cy5sZW5ndGg7XG4gICAgXG4gICAgcmV0dXJuIGN1cnNvci5kYl9vYmplY3RzLnNsaWNlKGlkeEZyb20sIGlkeFRvKTtcbiAgICBcbn07XG5cbi8qKlxuICogT2J0YWlucyB0aGUgdG90YWwgb2YgZG9jdW1lbnRzIG9mIHRoZSBjdXJzb3JcbiAqIFxuICogQG1ldGhvZCBDdXJzb3IjY291bnRcbiAqIFxuICogQHJldHVybnMge051bWJlcn0gVGhlIHRvdGFsIG9mIGRvY3VtZW50cyBpbiB0aGUgY3Vyc29yXG4gKi9cbkN1cnNvci5wcm90b3R5cGUuY291bnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaEFsbCgpLmxlbmd0aDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3J0aW5nIG9mIHRoZSBjdXJzb3JcbiAqIFxuICogQG1ldGhvZCBDdXJzb3Ijc29ydFxuICogXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IHNwZWMgLSBUaGUgc29ydGluZyBzcGVjaWZpY2F0aW9uXG4gKiBcbiAqIEByZXR1cm5zIHtDdXJzb3J9IFRoaXMgaW5zdGFuY2Ugc28gaXQgY2FuIGJlIGNoYWluZWQgd2l0aCBvdGhlciBtZXRob2RzXG4gKi9cbkN1cnNvci5wcm90b3R5cGUuc2V0U29ydGluZyA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICBpZiAoXy5pc05pbChzcGVjKSkgbG9nZ2VyLnRocm93KFwiWW91IG5lZWQgdG8gc3BlY2lmeSBhIHNvcnRpbmdcIik7XG4gICAgXG4gICAgaWYgKHNwZWMpIHtcbiAgICAgICAgdGhpcy5zb3J0VmFsdWUgPSBzcGVjO1xuICAgICAgICB0aGlzLnNvcnRfY29tcGlsZWQgPSAobmV3IFNlbGVjdG9yKHNwZWMsIFNlbGVjdG9yLlNPUlRfU0VMRUNUT1IpKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFwcGxpZXMgYSBzb3J0aW5nIG9uIHRoZSBjdXJzb3JcbiAqIFxuICogQG1ldGhvZCBDdXJzb3Ijc29ydFxuICogXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd9IHNwZWMgLSBUaGUgc29ydGluZyBzcGVjaWZpY2F0aW9uXG4gKiBcbiAqIEByZXR1cm5zIHtDdXJzb3J9IFRoaXMgaW5zdGFuY2Ugc28gaXQgY2FuIGJlIGNoYWluZWQgd2l0aCBvdGhlciBtZXRob2RzXG4gKi9cbkN1cnNvci5wcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICB2YXIgX3NvcnQgPSB0aGlzLnNvcnRfY29tcGlsZWQgfHwgbnVsbDtcbiAgICBcbiAgICBpZiAoc3BlYykge1xuICAgICAgICBfc29ydCA9IG5ldyBTZWxlY3RvcihzcGVjLCBTZWxlY3Rvci5TT1JUX1NFTEVDVE9SKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKF9zb3J0KSB7XG4gICAgICAgIGlmICghXy5pc05pbCh0aGlzLmRiX29iamVjdHMpICYmIF8uaXNBcnJheSh0aGlzLmRiX29iamVjdHMpKSB7XG4gICAgICAgICAgICB0aGlzLmRiX29iamVjdHMgPSB0aGlzLmRiX29iamVjdHMuc29ydChfc29ydCk7XG4gICAgICAgICAgICB0aGlzLnNvcnRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvcnRpbmcoc3BlYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgbnVtYmVyIG9mIGRvY3VtZW50IHRvIHNraXAgd2hlbiBmZXRjaGluZyB0aGUgY3Vyc29yXG4gKiBcbiAqIEBtZXRob2QgQ3Vyc29yI3NraXBcbiAqIFxuICogQHBhcmFtIHtOdW1iZXJ9IHNraXAgLSBUaGUgbnVtYmVyIG9mIGRvY3VtZW50cyB0byBza2lwXG4gKiBcbiAqIEByZXR1cm5zIHtDdXJzb3J9IFRoaXMgaW5zdGFuY2Ugc28gaXQgY2FuIGJlIGNoYWluZWQgd2l0aCBvdGhlciBtZXRob2RzXG4gKi9cbkN1cnNvci5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHNraXApIHtcbiAgICBpZiAoXy5pc05pbChza2lwKSB8fCBfLmlzTmFOKHNraXApKSB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IHBhc3MgYSBudW1iZXJcIik7XG4gICAgXG4gICAgdGhpcy5za2lwVmFsdWUgPSBza2lwO1xuICAgIFxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIG1heCBudW1iZXIgb2YgZG9jdW1lbnQgdG8gZmV0Y2hcbiAqIFxuICogQG1ldGhvZCBDdXJzb3IjbGltaXRcbiAqIFxuICogQHBhcmFtIHtOdW1iZXJ9IGxpbWl0IC0gVGhlIG1heCBudW1iZXIgb2YgZG9jdW1lbnRzXG4gKiBcbiAqIEByZXR1cm5zIHtDdXJzb3J9IFRoaXMgaW5zdGFuY2Ugc28gaXQgY2FuIGJlIGNoYWluZWQgd2l0aCBvdGhlciBtZXRob2RzXG4gKi9cbkN1cnNvci5wcm90b3R5cGUubGltaXQgPSBmdW5jdGlvbihsaW1pdCkge1xuICAgIGlmIChfLmlzTmlsKGxpbWl0KSB8fCBfLmlzTmFOKGxpbWl0KSkgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBwYXNzIGEgbnVtYmVyXCIpO1xuICAgIFxuICAgIHRoaXMubGltaXRWYWx1ZSA9IGxpbWl0O1xuICAgIFxuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBjdXJzb3IgaGFzIGEgc29ydGluZyBkZWZpbmVkXG4gKiBcbiAqIEBtZXRob2QgaGFzU29ydGluZ1xuICogQHByaXZhdGVcbiAqIFxuICogQHBhcmFtIHtDdXJzb3J9IGN1cnNvciAtIFRoZSBjdXJzb3JcbiAqIFxuICogQHJldHVybnMge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGN1cnNvciBoYXMgc29ydGluZyBvciBub3RcbiAqL1xudmFyIGhhc1NvcnRpbmcgPSBmdW5jdGlvbihjdXJzb3IpIHtcbiAgICBpZiAoXy5pc05pbChjdXJzb3Iuc29ydFZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5iYXRjaFNpemUgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBDb250cm9scyB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyBNb25nb0RCIHdpbGwgcmV0dXJuIHRvIHRoZSBjbGllbnQgaW4gYSBzaW5nbGUgbmV0d29yayBtZXNzYWdlLlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gQ2xvc2UgYSBjdXJzb3IgYW5kIGZyZWUgYXNzb2NpYXRlZCBzZXJ2ZXIgcmVzb3VyY2VzLlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLmNvbW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBBdHRhY2hlcyBhIGNvbW1lbnQgdG8gdGhlIHF1ZXJ5IHRvIGFsbG93IGZvciB0cmFjZWFiaWxpdHkgaW4gdGhlIGxvZ3MgYW5kIHRoZSBzeXN0ZW0ucHJvZmlsZSBjb2xsZWN0aW9uLlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLmV4cGxhaW4gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBSZXBvcnRzIG9uIHRoZSBxdWVyeSBleGVjdXRpb24gcGxhbiBmb3IgYSBjdXJzb3IuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUuaGludCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEZvcmNlcyBNb25nb0RCIHRvIHVzZSBhIHNwZWNpZmljIGluZGV4IGZvciBhIHF1ZXJ5LlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLml0Y291bnQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBDb21wdXRlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGRvY3VtZW50cyBpbiB0aGUgY3Vyc29yIGNsaWVudC1zaWRlIGJ5IGZldGNoaW5nIGFuZCBpdGVyYXRpbmcgdGhlIHJlc3VsdCBzZXQuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUubWF4U2NhbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gc2NhbjsgZG9jdW1lbnRzIGZvciBjb2xsZWN0aW9uIHNjYW5zLCBrZXlzIGZvciBpbmRleCBzY2Fucy5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5tYXhUaW1lTVMgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBTcGVjaWZpZXMgYSBjdW11bGF0aXZlIHRpbWUgbGltaXQgaW4gbWlsbGlzZWNvbmRzIGZvciBwcm9jZXNzaW5nIG9wZXJhdGlvbnMgb24gYSBjdXJzb3IuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUubWF4ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gU3BlY2lmaWVzIGFuIGV4Y2x1c2l2ZSB1cHBlciBpbmRleCBib3VuZCBmb3IgYSBjdXJzb3IuIEZvciB1c2Ugd2l0aCBjdXJzb3IuaGludCgpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUubWluID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gU3BlY2lmaWVzIGFuIGluY2x1c2l2ZSBsb3dlciBpbmRleCBib3VuZCBmb3IgYSBjdXJzb3IuIEZvciB1c2Ugd2l0aCBjdXJzb3IuaGludCgpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUubm9DdXJzb3JUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gSW5zdHJ1Y3RzIHRoZSBzZXJ2ZXIgdG8gYXZvaWQgY2xvc2luZyBhIGN1cnNvciBhdXRvbWF0aWNhbGx5IGFmdGVyIGEgcGVyaW9kIG9mIGluYWN0aXZpdHkuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUub2Jqc0xlZnRJbkJhdGNoID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyBsZWZ0IGluIHRoZSBjdXJyZW50IGN1cnNvciBiYXRjaC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5wcmV0dHkgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBDb25maWd1cmVzIHRoZSBjdXJzb3IgdG8gZGlzcGxheSByZXN1bHRzIGluIGFuIGVhc3ktdG8tcmVhZCBmb3JtYXQuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUucmVhZENvbmNlcm4gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBTcGVjaWZpZXMgYSByZWFkIGNvbmNlcm4gZm9yIGEgZmluZCgpIG9wZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5yZWFkUHJlZiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFNwZWNpZmllcyBhIHJlYWQgcHJlZmVyZW5jZSB0byBhIGN1cnNvciB0byBjb250cm9sIGhvdyB0aGUgY2xpZW50IGRpcmVjdHMgcXVlcmllcyB0byBhIHJlcGxpY2Egc2V0LlxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1xuXG4vKipcbiAqIEB0b2RvIEltcGxlbWVudFxuICovXG5DdXJzb3IucHJvdG90eXBlLnJldHVybktleSA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE1vZGlmaWVzIHRoZSBjdXJzb3IgdG8gcmV0dXJuIGluZGV4IGtleXMgcmF0aGVyIHRoYW4gdGhlIGRvY3VtZW50cy5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5zaG93UmVjb3JkSWQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBBZGRzIGFuIGludGVybmFsIHN0b3JhZ2UgZW5naW5lIElEIGZpZWxkIHRvIGVhY2ggZG9jdW1lbnQgcmV0dXJuZWQgYnkgdGhlIGN1cnNvci5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gUmV0dXJucyBhIGNvdW50IG9mIHRoZSBkb2N1bWVudHMgaW4gdGhlIGN1cnNvciBhZnRlciBhcHBseWluZyBza2lwKCkgYW5kIGxpbWl0KCkgbWV0aG9kcy5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS5zbmFwc2hvdCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEZvcmNlcyB0aGUgY3Vyc29yIHRvIHVzZSB0aGUgaW5kZXggb24gdGhlIF9pZCBmaWVsZC4gRW5zdXJlcyB0aGF0IHRoZSBjdXJzb3IgcmV0dXJucyBlYWNoIGRvY3VtZW50LCBcbiAgICAvLyB3aXRoIHJlZ2FyZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSBfaWQgZmllbGQsIG9ubHkgb25jZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtcblxuLyoqXG4gKiBAdG9kbyBJbXBsZW1lbnRcbiAqL1xuQ3Vyc29yLnByb3RvdHlwZS50YWlsYWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE1hcmtzIHRoZSBjdXJzb3IgYXMgdGFpbGFibGUuIE9ubHkgdmFsaWQgZm9yIGN1cnNvcnMgb3ZlciBjYXBwZWQgY29sbGVjdGlvbnMuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbi8qKlxuICogQHRvZG8gSW1wbGVtZW50XG4gKi9cbkN1cnNvci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybnMgYW4gYXJyYXkgdGhhdCBjb250YWlucyBhbGwgZG9jdW1lbnRzIHJldHVybmVkIGJ5IHRoZSBjdXJzb3IuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ3Vyc29yOyJdfQ== diff --git a/lib/Selector.js b/lib/Selector.js index 367cbbc..4ff6588 100644 --- a/lib/Selector.js +++ b/lib/Selector.js @@ -6,7 +6,8 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var Logger = require("jsw-logger"), _ = require("lodash"), - SelectorMatcher = require("./SelectorMatcher"); + SelectorMatcher = require("./SelectorMatcher"), + ObjectId = require("./ObjectId"); var logger = null; @@ -430,6 +431,11 @@ var _buildKeypathSelector = function _buildKeypathSelector(keypath, value) { clause.type = 'operator_object'; } + } else if (value instanceof ObjectId) { + logger.debug('clause of type ObjectId -> String'); + + clause.type = 'string'; + clause.value = value.toString(); } else { clause.type = '__invalid__'; } @@ -457,4 +463,4 @@ Selector.SORT_SELECTOR = 'sort'; Selector.FIELD_SELECTOR = 'field'; module.exports = Selector; -//# sourceMappingURL=data:application/json;base64,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LE9BQTFCO0FBQ0EsU0FBUyxhQUFULEdBQXlCLE1BQXpCO0FBQ0EsU0FBUyxjQUFULEdBQTBCLE9BQTFCOztBQUVBLE9BQU8sT0FBUCxHQUFpQixRQUFqQiIsImZpbGUiOiJTZWxlY3Rvci5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBMb2dnZXIgPSByZXF1aXJlKFwianN3LWxvZ2dlclwiKSxcbiAgICBfID0gcmVxdWlyZShcImxvZGFzaFwiKSxcbiAgICBTZWxlY3Rvck1hdGNoZXIgPSByZXF1aXJlKFwiLi9TZWxlY3Rvck1hdGNoZXJcIik7XG4gICAgXG52YXIgbG9nZ2VyID0gbnVsbDtcblxuY2xhc3MgU2VsZWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHNlbGVjdG9yLCB0eXBlID0gU2VsZWN0b3IuTUFUQ0hfU0VMRUNUT1IpIHtcbiAgICAgICAgbG9nZ2VyID0gTG9nZ2VyLmluc3RhbmNlO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5zZWxlY3Rvcl9jb21waWxlZCA9IG51bGw7XG5cdFx0XG5cdFx0aWYgKHR5cGUgPT09IFNlbGVjdG9yLk1BVENIX1NFTEVDVE9SKSB7XG5cdFx0XHR0aGlzLnNlbGVjdG9yX2NvbXBpbGVkID0gdGhpcy5jb21waWxlKHNlbGVjdG9yKTtcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09IFNlbGVjdG9yLlNPUlRfU0VMRUNUT1IpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbXBpbGVTb3J0KHNlbGVjdG9yKTtcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09IFNlbGVjdG9yLkZJRUxEX1NFTEVDVE9SKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jb21waWxlRmllbGRzKHNlbGVjdG9yKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bG9nZ2VyLnRocm93KFwiWW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZVwiKTtcblx0XHR9XG4gICAgfVxuICAgIFxuICAgIHRlc3QoZG9jKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yX2NvbXBpbGVkLnRlc3QoZG9jKTtcbiAgICB9XG4gICAgXG4gICAgY29tcGlsZShzZWxlY3Rvcikge1xuXHRcdGlmIChfLmlzTmlsKHNlbGVjdG9yKSkge1xuXHRcdFx0bG9nZ2VyLmRlYnVnKCdzZWxlY3RvciAtPiBudWxsJyk7XG5cdFx0XHRcblx0XHRcdHNlbGVjdG9yID0ge307XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxvZ2dlci5kZWJ1Zygnc2VsZWN0b3IgLT4gbm90IG51bGwnKTtcblx0XHRcdFxuXHRcdFx0aWYgKCFzZWxlY3RvciB8fCAoXy5oYXNJbihzZWxlY3RvciwgJ19pZCcpICYmICFzZWxlY3Rvci5faWQpKSB7XG5cdFx0XHRcdGxvZ2dlci5kZWJ1Zygnc2VsZWN0b3IgLT4gZmFsc2UgdmFsdWUgfHwgeyBfaWQ6IGZhbHNlIHZhbHVlIH0nKTtcblx0XHRcdFx0XG5cdFx0XHRcdHNlbGVjdG9yID0ge1xuXHRcdFx0XHRcdF9pZDogZmFsc2Vcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0aWYgKF8uaXNGdW5jdGlvbihzZWxlY3RvcikpIHtcblx0XHRcdGxvZ2dlci5kZWJ1Zygnc2VsZWN0b3IgLT4gZnVuY3Rpb24oZG9jKSB7IC4uLiB9Jyk7XG5cdFx0XHRcblx0XHRcdC8vX2luaXRGdW5jdGlvbi5jYWxsKG1hdGNoZXIsIHNlbGVjdG9yKTtcblx0XHRcdHRoaXMuY2xhdXNlcyA9IFt7XG5cdFx0XHRcdGtpbmQ6ICdmdW5jdGlvbicsXG5cdFx0XHRcdHZhbHVlOiBzZWxlY3RvclxuXHRcdFx0fV07XG5cdFx0XHRcblx0XHRcdGxvZ2dlci5kZWJ1ZygnY2xhdXNlcyBjcmVhdGVkOiAnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5jbGF1c2VzKSk7XG5cdFx0fSBlbHNlIGlmIChfLmlzU3RyaW5nKHNlbGVjdG9yKSB8fCBfLmlzTnVtYmVyKHNlbGVjdG9yKSkge1xuXHRcdFx0bG9nZ2VyLmRlYnVnKCdzZWxlY3RvciAtPiBcIjEyMzQ1Njc4OVwiIHx8IDEyMzQ1Njc5OCcpO1xuXHRcdFx0XG5cdFx0XHRzZWxlY3RvciA9IHtcblx0XHRcdFx0X2lkOiBzZWxlY3RvclxuXHRcdFx0fTtcblx0XHRcdFxuXHRcdFx0Ly9faW5pdE9iamVjdC5jYWxsKG1hdGNoZXIsIHNlbGVjdG9yKTtcblx0XHRcdHRoaXMuY2xhdXNlcyA9IF9idWlsZFNlbGVjdG9yKHNlbGVjdG9yKTtcblx0XHRcdFxuXHRcdFx0bG9nZ2VyLmRlYnVnKCdjbGF1c2VzIGNyZWF0ZWQ6ICcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLmNsYXVzZXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bG9nZ2VyLmRlYnVnKCdzZWxlY3RvciAtPiB7IGZpZWxkOiB2YWx1ZSB9Jyk7XG5cdFx0XHRcblx0XHRcdC8vX2luaXRPYmplY3QuY2FsbChtYXRjaGVyLCBzZWxlY3Rvcik7XG5cdFx0XHR0aGlzLmNsYXVzZXMgPSBfYnVpbGRTZWxlY3RvcihzZWxlY3Rvcik7XG5cdFx0XHRcblx0XHRcdGxvZ2dlci5kZWJ1ZygnY2xhdXNlcyBjcmVhdGVkOiAnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5jbGF1c2VzKSk7XG5cdFx0fVxuXHRcdFxuXHRcdHZhciBtYXRjaGVyID0gbmV3IFNlbGVjdG9yTWF0Y2hlcih0aGlzKTtcblx0XHRcblx0XHRyZXR1cm4gbWF0Y2hlcjtcbiAgICB9XG4gICAgXG4gICAgY29tcGlsZVNvcnQoc3BlYykge1xuICAgICAgICBpZiAoXy5pc05pbChzcGVjKSkgIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICB2YXIgYXNjID0gW107XG4gICAgICAgIFxuICAgICAgICBpZiAoXy5pc1N0cmluZyhzcGVjKSkge1xuICAgICAgICAgICAgc3BlYyA9IHNwZWMucmVwbGFjZSgvKCApKy9pZywgJyAnKS50cmltKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzcGVjLmluZGV4T2YoJywnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGNvbW1hcyBieSBzcGFjZXMsIGFuZCB0cmVhdCBpdCBhcyBhIHNwYWNlZC1zZXBhcmF0ZWQgc3RyaW5nXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZVNvcnQoc3BlYy5yZXBsYWNlKC8sL2lnLCAnICcpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BlYy5pbmRleE9mKCcgJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkcyA9IHNwZWMuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaV0udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKChmaWVsZCA9PT0gJ2Rlc2MnICB8fCBmaWVsZCA9PT0gJ2FzYycpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZmllbGQgPT09ICctMScgICAgfHwgZmllbGQgPT09ICcxJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZCA9PT0gJ2ZhbHNlJyB8fCBmaWVsZCA9PT0gJ3RydWUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJCYWQgc29ydCBzcGVjaWZpY2F0aW9uOiBcIiwgSlNPTi5zdHJpbmdpZnkoc3BlYykpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBfLnRvU3RyaW5nKGZpZWxkc1tpKzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICdkZXNjJyB8fCBuZXh0ID09PSAnYXNjJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLnB1c2goKG5leHQgPT09ICdhc2MnKSA/IHRydWUgOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09PSAnLTEnIHx8IG5leHQgPT09ICcxJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLnB1c2goKG5leHQgPT09ICcxJykgPyB0cnVlIDogZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PT0gJ2ZhbHNlJyB8fCBuZXh0ID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy5wdXNoKChuZXh0ID09PSAndHJ1ZScpID8gdHJ1ZSA6IGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjLnB1c2godHJ1ZSk7IC8vIERlZmF1bHQgc29ydFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLy5zb3J0KFwiZmllbGQxXCIpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKHNwZWMpO1xuICAgICAgICAgICAgICAgIGFzYy5wdXNoKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKF8uaXNBcnJheShzcGVjKSkge1xuICAgICAgICAgICAgLy8gSm9pbiB0aGUgYXJyYXkgd2l0aCBzcGFjZXMsIGFuZCB0cmVhdCBpdCBhcyBhIHNwYWNlZC1zZXBhcmF0ZWQgc3RyaW5nXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlU29ydChzcGVjLmpvaW4oJyAnKSk7XG4gICAgICAgICAgICAvLyBmb3IgKHZhciBpID0gMDsgaSA8IHNwZWMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoXy5pc1N0cmluZyhzcGVjW2ldKSkge1xuICAgICAgICAgICAgLy8gICAgICAgICBrZXlzLnB1c2goc3BlY1tpXSk7XG4gICAgICAgICAgICAvLyAgICAgICAgIGFzYy5wdXNoKHRydWUpO1xuICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGtleXMucHVzaChzcGVjW2ldWzBdKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgYXNjLnB1c2goc3BlY1tpXVsxXSAhPT0gXCJkZXNjXCIpO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3Qoc3BlYykpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gTmVzdGVkIHBhdGggLT4gLnNvcnQoeyBcImZpZWxkMS5maWVsZDEyXCI6IFwiYXNjXCIgfSlcbiAgICAgICAgICAgIHZhciBfc3BlYyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNwZWMpIHtcbiAgICAgICAgICAgICAgICBpZiAoXy5oYXNJbihzcGVjLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zcGVjLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgX3NwZWMucHVzaChzcGVjW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZVNvcnQoX3NwZWMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJCYWQgc29ydCBzcGVjaWZpY2F0aW9uOiBcIiwgSlNPTi5zdHJpbmdpZnkoc3BlYykpO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIC8vIHJldHVybiB7a2V5czoga2V5cywgYXNjOiBhc2N9O1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgICAgdmFyIHggPSAwO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiB4ICE9PSAwKSByZXR1cm4geDsgICAvLyBOb24gcmVhY2hhYmxlP1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIHggPSBTZWxlY3Rvci5fZi5fY21wKGFbSlNPTi5zdHJpbmdpZnkoa2V5c1tpXSldLCBiW0pTT04uc3RyaW5naWZ5KGtleXNbaV0pXSk7XG4gICAgICAgICAgICAgICAgeCA9IFNlbGVjdG9yTWF0Y2hlci5jbXAoYVtrZXlzW2ldXSwgYltrZXlzW2ldXSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKCFhc2NbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgeCAqPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gZXZhbCgpIGRvZXMgbm90IHJldHVybiBhIHZhbHVlIGluIElFOCwgbm9yIGRvZXMgdGhlIHNwZWMgc2F5IGl0XG4gICAgICAgIC8vIHNob3VsZC4gQXNzaWduIHRvIGEgbG9jYWwgdG8gZ2V0IHRoZSB2YWx1ZSwgaW5zdGVhZC5cbiAgICAgICAgXG4gICAgICAgIC8vIHZhciBfZnVuYztcbiAgICAgICAgLy8gdmFyIGNvZGUgPSBcIl9mdW5jID0gKGZ1bmN0aW9uKGMpe3JldHVybiBmdW5jdGlvbihhLGIpe3ZhciB4O1wiO1xuICAgICAgICAvLyBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIC8vICAgICAgICAgY29kZSArPSBcImlmKHghPT0wKXJldHVybiB4O1wiO1xuICAgICAgICAvLyAgICAgfVxuICAgIFxuICAgICAgICAvLyAgICAgY29kZSArPSBcIng9XCIgKyAoYXNjW2ldID8gXCJcIiA6IFwiLVwiKSArIFwiYyhhW1wiICsgSlNPTi5zdHJpbmdpZnkoa2V5c1tpXSkgKyBcIl0sYltcIiArIEpTT04uc3RyaW5naWZ5KGtleXNbaV0pICsgXCJdKTtcIjtcbiAgICAgICAgLy8gfVxuICAgIFxuICAgICAgICAvLyBjb2RlICs9IFwicmV0dXJuIHg7fTt9KVwiO1xuICAgIFxuICAgICAgICAvLyBldmFsKGNvZGUpO1xuICAgIFxuICAgICAgICAvLyByZXR1cm4gX2Z1bmMoU2VsZWN0b3IuX2YuX2NtcCk7XG4gICAgfVxuICAgIFxuICAgIGNvbXBpbGVGaWVsZHMoc3BlYykge1xuICAgICAgICB2YXIgcHJvamVjdGlvbiA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKF8uaXNOaWwoc3BlYykpIHJldHVybiBwcm9qZWN0aW9uO1xuICAgICAgICBcbiAgICAgICAgaWYgKF8uaXNTdHJpbmcoc3BlYykpIHtcbiAgICAgICAgICAgIHNwZWMgPSBzcGVjLnJlcGxhY2UoLyggKSsvaWcsICcgJykudHJpbSgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoc3BlYy5pbmRleE9mKCcsJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBjb21tYXMgYnkgc3BhY2VzLCBhbmQgdHJlYXQgaXQgYXMgYSBzcGFjZWQtc2VwYXJhdGVkIHN0cmluZ1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVGaWVsZHMoc3BlYy5yZXBsYWNlKC8sL2lnLCAnICcpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BlYy5pbmRleE9mKCcgJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkcyA9IHNwZWMuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaV0udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKChmaWVsZCA9PT0gJy0xJyAgICB8fCBmaWVsZCA9PT0gJzEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGZpZWxkID09PSAnZmFsc2UnIHx8IGZpZWxkID09PSAndHJ1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkJhZCBmaWVsZHMgc3BlY2lmaWNhdGlvbjogXCIsIEpTT04uc3RyaW5naWZ5KHNwZWMpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gXy50b1N0cmluZyhmaWVsZHNbaSsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnLTEnIHx8IG5leHQgPT09ICcxJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnLTEnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IF9rZXkgaW4gcHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9PSAnX2lkJyAmJiBwcm9qZWN0aW9uW19rZXldID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBwcm9qZWN0aW9uIGNhbm5vdCBjb250YWluIGJvdGggaW5jbHVkZSBhbmQgZXhjbHVkZSBzcGVjaWZpY2F0aW9uc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbltmaWVsZF0gPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uW2ZpZWxkXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PT0gJ2ZhbHNlJyB8fCBuZXh0ID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgPT09ICdfaWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uW2ZpZWxkXSA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBwcm9qZWN0aW9uIGNhbm5vdCBjb250YWluIGJvdGggaW5jbHVkZSBhbmQgZXhjbHVkZSBzcGVjaWZpY2F0aW9uc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25bZmllbGRdID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uW2ZpZWxkXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNwZWMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vLmZpbmQoe30sIFwiZmllbGQxXCIpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcHJvamVjdGlvbltzcGVjXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc0FycmF5KHNwZWMpKSB7XG4gICAgICAgICAgICAvLyBKb2luIHRoZSBhcnJheSB3aXRoIHNwYWNlcywgYW5kIHRyZWF0IGl0IGFzIGEgc3BhY2VkLXNlcGFyYXRlZCBzdHJpbmdcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVGaWVsZHMoc3BlYy5qb2luKCcgJykpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChzcGVjKSkge1xuICAgICAgICAgICAgLy8gVE9ETyBOZXN0ZWQgcGF0aCAtPiAuZmluZCh7fSwgeyBcImZpZWxkMS5maWVsZDEyXCI6IFwiYXNjXCIgfSlcbiAgICAgICAgICAgIHZhciBfc3BlYyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHNwZWMpIHtcbiAgICAgICAgICAgICAgICBpZiAoXy5oYXNJbihzcGVjLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zcGVjLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgX3NwZWMucHVzaChzcGVjW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZUZpZWxkcyhfc3BlYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkJhZCBmaWVsZHMgc3BlY2lmaWNhdGlvbjogXCIsIEpTT04uc3RyaW5naWZ5KHNwZWMpKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb247XG4gICAgfVxuXHRcblx0LyogU1RBVElDIE1FVEhPRFMgKi9cblx0c3RhdGljIGlzU2VsZWN0b3JDb21waWxlZChzZWxlY3Rvcikge1xuXHRcdGlmICghXy5pc05pbChzZWxlY3RvcikgJiYgKFxuXHRcdCAgICBzZWxlY3RvciBpbnN0YW5jZW9mIFNlbGVjdG9yTWF0Y2hlciB8fCAoc2VsZWN0b3IgaW5zdGFuY2VvZiBTZWxlY3RvciAmJiBcblx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnNlbGVjdG9yX2NvbXBpbGVkIGluc3RhbmNlb2YgU2VsZWN0b3JNYXRjaGVyKVxuXHQgICAgKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblx0XG5cdHN0YXRpYyBtYXRjaGVzKHNlbGVjdG9yLCBkb2MpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgU2VsZWN0b3Ioc2VsZWN0b3IpKS50ZXN0KGRvYyk7XG4gICAgfVxufVxuXG52YXIgX2J1aWxkU2VsZWN0b3IgPSBmdW5jdGlvbihzZWxlY3Rvcikge1xuXHRsb2dnZXIuZGVidWcoJ0NhbGxlZDogX2J1aWxkU2VsZWN0b3InKTtcbiAgICBcbiAgICB2YXIgY2xhdXNlcyA9IFtdO1xuICAgIFxuICAgIGZvciAodmFyIGtleSBpbiBzZWxlY3Rvcikge1xuICAgICAgICB2YXIgdmFsdWUgPSBzZWxlY3RvcltrZXldO1xuICAgICAgICBcbiAgICAgICAgaWYgKGtleS5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdzZWxlY3RvciAtPiBvcGVyYXRvciA9PiB7ICRhbmQ6IFt7Li4ufSwgey4uLn1dIH0nKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKF9idWlsZERvY3VtZW50U2VsZWN0b3Ioa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdzZWxlY3RvciAtPiBwbGFpbiA9PiB7IGZpZWxkMTogPHZhbHVlPiB9Jyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChfYnVpbGRLZXlwYXRoU2VsZWN0b3Ioa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjbGF1c2VzO1xufTtcblxudmFyIF9idWlsZERvY3VtZW50U2VsZWN0b3IgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdmFyIGNsYXVzZSA9IHt9O1xuICAgIFxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJyRvcic6XG4gICAgICAgIGNhc2UgJyRhbmQnOlxuICAgICAgICBjYXNlICckbm9yJzpcbiAgICAgICAgICAgIGNsYXVzZS5rZXkgPSBrZXkucmVwbGFjZSgvXFwkLywgJycpO1xuICAgICAgICAgICAgLy8gVGhlIHJlc3Qgd2lsbCBiZSBoYW5kbGVkIGJ5ICdfb3BlcmF0b3JfJ1xuICAgICAgICBjYXNlICdfb3BlcmF0b3JfJzpcbiAgICAgICAgICAgIC8vIEdlbmVyaWMgaGFuZGxlciBmb3Igb3BlcmF0b3JzICgkb3IsICRhbmQsICRub3IpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNsYXVzZS5raW5kID0gJ29wZXJhdG9yJztcbiAgICAgICAgICAgIGNsYXVzZS50eXBlID0gJ2FycmF5JztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xhdXNlLnZhbHVlID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2xhdXNlLnZhbHVlID0gXy51bmlvbihjbGF1c2UudmFsdWUsIF9idWlsZFNlbGVjdG9yKHZhbHVlW2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJVbnJlY29naXplZCBrZXkgaW4gc2VsZWN0b3I6IFwiLCBrZXkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBUT0RPIGNhc2VzOiAkd2hlcmUsICRlbGVtTWF0Y2hcbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBjcmVhdGVkOiAnICsgSlNPTi5zdHJpbmdpZnkoY2xhdXNlKSk7XG4gICAgXG4gICAgcmV0dXJuIGNsYXVzZTtcbn07XG5cbnZhciBfYnVpbGRLZXlwYXRoU2VsZWN0b3IgPSBmdW5jdGlvbiAoa2V5cGF0aCwgdmFsdWUpIHtcbiAgICBsb2dnZXIuZGVidWcoJ0NhbGxlZDogX2J1aWxkS2V5cGF0aFNlbGVjdG9yJyk7XG4gICAgXG4gICAgdmFyIGNsYXVzZSA9IHt9O1xuICAgIFxuICAgIGNsYXVzZS52YWx1ZSA9IHZhbHVlO1xuICAgIFxuICAgIGlmIChfLmlzTmlsKHZhbHVlKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvZiB0eXBlIG51bGwnKTtcbiAgICAgICAgXG4gICAgICAgIGNsYXVzZS50eXBlID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoXy5pc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdjbGF1c2Ugb2YgdHlwZSBSZWdFeHAnKTtcblxuICAgICAgICBjbGF1c2UudHlwZSA9ICdyZWdleHAnO1xuICAgICAgICBcbiAgICAgICAgdmFyIHNvdXJjZSA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy8nKTtcblxuICAgICAgICBjbGF1c2UudmFsdWUgPSB7XG4gICAgICAgICAgICAkcmVnZXg6IHNvdXJjZVsxXSAgIC8vIFRoZSBmaXJzdCBpdGVtIHNwbGl0dGVkIGlzIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHNvdXJjZVsyXSAhPSBcIlwiKSB7XG4gICAgICAgICAgICBjbGF1c2UudmFsdWVbXCIkb3B0aW9uc1wiXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXy5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvZiB0eXBlIEFycmF5Jyk7XG4gICAgICAgIFxuICAgICAgICBjbGF1c2UudHlwZSA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmIChfLmlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvZiB0eXBlIFN0cmluZycpO1xuICAgICAgICBcbiAgICAgICAgY2xhdXNlLnR5cGUgPSAnc3RyaW5nJztcbiAgICB9IGVsc2UgaWYgKF8uaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnY2xhdXNlIG9mIHR5cGUgTnVtYmVyJyk7XG4gICAgICAgIFxuICAgICAgICBjbGF1c2UudHlwZSA9ICdudW1iZXInO1xuICAgIH0gZWxzZSBpZiAoXy5pc0Jvb2xlYW4odmFsdWUpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnY2xhdXNlIG9mIHR5cGUgQm9vbGVhbicpO1xuICAgICAgICBcbiAgICAgICAgY2xhdXNlLnR5cGUgPSAnYm9vbGVhbic7XG4gICAgfSBlbHNlIGlmIChfLmlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnY2xhdXNlIG9mIHR5cGUgRnVuY3Rpb24nKTtcbiAgICAgICAgXG4gICAgICAgIGNsYXVzZS50eXBlID0gJ2Z1bmN0aW9uJztcbiAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIGxpdGVyYWxPYmplY3QgPSB0cnVlO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChrZXkuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgICAgICAgICBsaXRlcmFsT2JqZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChsaXRlcmFsT2JqZWN0KSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvZiB0eXBlIE9iamVjdCA9PiB7IGZpZWxkOiB7IGZpZWxkXzE6IDx2YWx1ZT4sIGZpZWxkXzI6IDx2YWx1ZT4gfSB9Jyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNsYXVzZS50eXBlID0gJ2xpdGVyYWxfb2JqZWN0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnY2xhdXNlIG9mIHR5cGUgT3BlcmF0b3IgPT4geyBmaWVsZDogeyAkZ3Q6IDIsICRsdCA1IH0gfScpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjbGF1c2UudHlwZSA9ICdvcGVyYXRvcl9vYmplY3QnO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY2xhdXNlLnR5cGUgPSAnX19pbnZhbGlkX18nO1xuICAgIH1cbiAgICBcbiAgICB2YXIgcGFydHMgPSBrZXlwYXRoLnNwbGl0KCcuJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdjbGF1c2Ugb3ZlciBPYmplY3QgZmllbGQgPT4geyBcImZpZWxkMS5maWVsZDFfMlwiOiA8dmFsdWU+IH0nKTtcbiAgICAgICAgXG4gICAgICAgIGNsYXVzZS5raW5kID0gJ29iamVjdCc7XG4gICAgICAgIGNsYXVzZS5rZXkgPSBwYXJ0cztcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvdmVyIFBsYWluIGZpZWxkID0+IHsgXCJmaWVsZFwiOiA8dmFsdWU+IH0nKTtcbiAgICAgICAgXG4gICAgICAgIGNsYXVzZS5raW5kID0gJ3BsYWluJztcbiAgICAgICAgY2xhdXNlLmtleSA9IHBhcnRzWzBdO1xuICAgIH1cbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBjcmVhdGVkOiAnICsgSlNPTi5zdHJpbmdpZnkoY2xhdXNlKSk7XG4gICAgXG4gICAgcmV0dXJuIGNsYXVzZTtcbn07XG5cblNlbGVjdG9yLk1BVENIX1NFTEVDVE9SID0gJ21hdGNoJztcblNlbGVjdG9yLlNPUlRfU0VMRUNUT1IgPSAnc29ydCc7XG5TZWxlY3Rvci5GSUVMRF9TRUxFQ1RPUiA9ICdmaWVsZCc7XG5cbm1vZHVsZS5leHBvcnRzID0gU2VsZWN0b3I7Il19 +//# sourceMappingURL=data:application/json;base64,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QUFjLE9BQWQ7QUFDQSxlQUFPLEdBQVAsR0FBYSxNQUFNLENBQU4sQ0FBYjtBQUNIOztBQUVELFdBQU8sS0FBUCxDQUFhLHFCQUFxQixLQUFLLFNBQUwsQ0FBZSxNQUFmLENBQWxDOztBQUVBLFdBQU8sTUFBUDtBQUNILENBeEZEOztBQTBGQSxTQUFTLGNBQVQsR0FBMEIsT0FBMUI7QUFDQSxTQUFTLGFBQVQsR0FBeUIsTUFBekI7QUFDQSxTQUFTLGNBQVQsR0FBMEIsT0FBMUI7O0FBRUEsT0FBTyxPQUFQLEdBQWlCLFFBQWpCIiwiZmlsZSI6IlNlbGVjdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIExvZ2dlciA9IHJlcXVpcmUoXCJqc3ctbG9nZ2VyXCIpLFxuICAgIF8gPSByZXF1aXJlKFwibG9kYXNoXCIpLFxuICAgIFNlbGVjdG9yTWF0Y2hlciA9IHJlcXVpcmUoXCIuL1NlbGVjdG9yTWF0Y2hlclwiKSxcbiAgICBPYmplY3RJZCA9IHJlcXVpcmUoXCIuL09iamVjdElkXCIpO1xuICAgIFxudmFyIGxvZ2dlciA9IG51bGw7XG5cbmNsYXNzIFNlbGVjdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgdHlwZSA9IFNlbGVjdG9yLk1BVENIX1NFTEVDVE9SKSB7XG4gICAgICAgIGxvZ2dlciA9IExvZ2dlci5pbnN0YW5jZTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc2VsZWN0b3JfY29tcGlsZWQgPSBudWxsO1xuXHRcdFxuXHRcdGlmICh0eXBlID09PSBTZWxlY3Rvci5NQVRDSF9TRUxFQ1RPUikge1xuXHRcdFx0dGhpcy5zZWxlY3Rvcl9jb21waWxlZCA9IHRoaXMuY29tcGlsZShzZWxlY3Rvcik7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSBTZWxlY3Rvci5TT1JUX1NFTEVDVE9SKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jb21waWxlU29ydChzZWxlY3Rvcik7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSBTZWxlY3Rvci5GSUVMRF9TRUxFQ1RPUikge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29tcGlsZUZpZWxkcyhzZWxlY3Rvcik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxvZ2dlci50aHJvdyhcIllvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIHNlbGVjdG9yIHR5cGVcIik7XG5cdFx0fVxuICAgIH1cbiAgICBcbiAgICB0ZXN0KGRvYykge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rvcl9jb21waWxlZC50ZXN0KGRvYyk7XG4gICAgfVxuICAgIFxuICAgIGNvbXBpbGUoc2VsZWN0b3IpIHtcblx0XHRpZiAoXy5pc05pbChzZWxlY3RvcikpIHtcblx0XHRcdGxvZ2dlci5kZWJ1Zygnc2VsZWN0b3IgLT4gbnVsbCcpO1xuXHRcdFx0XG5cdFx0XHRzZWxlY3RvciA9IHt9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsb2dnZXIuZGVidWcoJ3NlbGVjdG9yIC0+IG5vdCBudWxsJyk7XG5cdFx0XHRcblx0XHRcdGlmICghc2VsZWN0b3IgfHwgKF8uaGFzSW4oc2VsZWN0b3IsICdfaWQnKSAmJiAhc2VsZWN0b3IuX2lkKSkge1xuXHRcdFx0XHRsb2dnZXIuZGVidWcoJ3NlbGVjdG9yIC0+IGZhbHNlIHZhbHVlIHx8IHsgX2lkOiBmYWxzZSB2YWx1ZSB9Jyk7XG5cdFx0XHRcdFxuXHRcdFx0XHRzZWxlY3RvciA9IHtcblx0XHRcdFx0XHRfaWQ6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdFxuXHRcdGlmIChfLmlzRnVuY3Rpb24oc2VsZWN0b3IpKSB7XG5cdFx0XHRsb2dnZXIuZGVidWcoJ3NlbGVjdG9yIC0+IGZ1bmN0aW9uKGRvYykgeyAuLi4gfScpO1xuXHRcdFx0XG5cdFx0XHQvL19pbml0RnVuY3Rpb24uY2FsbChtYXRjaGVyLCBzZWxlY3Rvcik7XG5cdFx0XHR0aGlzLmNsYXVzZXMgPSBbe1xuXHRcdFx0XHRraW5kOiAnZnVuY3Rpb24nLFxuXHRcdFx0XHR2YWx1ZTogc2VsZWN0b3Jcblx0XHRcdH1dO1xuXHRcdFx0XG5cdFx0XHRsb2dnZXIuZGVidWcoJ2NsYXVzZXMgY3JlYXRlZDogJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuY2xhdXNlcykpO1xuXHRcdH0gZWxzZSBpZiAoXy5pc1N0cmluZyhzZWxlY3RvcikgfHwgXy5pc051bWJlcihzZWxlY3RvcikpIHtcblx0XHRcdGxvZ2dlci5kZWJ1Zygnc2VsZWN0b3IgLT4gXCIxMjM0NTY3ODlcIiB8fCAxMjM0NTY3OTgnKTtcblx0XHRcdFxuXHRcdFx0c2VsZWN0b3IgPSB7XG5cdFx0XHRcdF9pZDogc2VsZWN0b3Jcblx0XHRcdH07XG5cdFx0XHRcblx0XHRcdC8vX2luaXRPYmplY3QuY2FsbChtYXRjaGVyLCBzZWxlY3Rvcik7XG5cdFx0XHR0aGlzLmNsYXVzZXMgPSBfYnVpbGRTZWxlY3RvcihzZWxlY3Rvcik7XG5cdFx0XHRcblx0XHRcdGxvZ2dlci5kZWJ1ZygnY2xhdXNlcyBjcmVhdGVkOiAnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5jbGF1c2VzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxvZ2dlci5kZWJ1Zygnc2VsZWN0b3IgLT4geyBmaWVsZDogdmFsdWUgfScpO1xuXHRcdFx0XG5cdFx0XHQvL19pbml0T2JqZWN0LmNhbGwobWF0Y2hlciwgc2VsZWN0b3IpO1xuXHRcdFx0dGhpcy5jbGF1c2VzID0gX2J1aWxkU2VsZWN0b3Ioc2VsZWN0b3IpO1xuXHRcdFx0XG5cdFx0XHRsb2dnZXIuZGVidWcoJ2NsYXVzZXMgY3JlYXRlZDogJyArIEpTT04uc3RyaW5naWZ5KHRoaXMuY2xhdXNlcykpO1xuXHRcdH1cblx0XHRcblx0XHR2YXIgbWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIodGhpcyk7XG5cdFx0XG5cdFx0cmV0dXJuIG1hdGNoZXI7XG4gICAgfVxuICAgIFxuICAgIGNvbXBpbGVTb3J0KHNwZWMpIHtcbiAgICAgICAgaWYgKF8uaXNOaWwoc3BlYykpICB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgdmFyIGFzYyA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKF8uaXNTdHJpbmcoc3BlYykpIHtcbiAgICAgICAgICAgIHNwZWMgPSBzcGVjLnJlcGxhY2UoLyggKSsvaWcsICcgJykudHJpbSgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoc3BlYy5pbmRleE9mKCcsJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBjb21tYXMgYnkgc3BhY2VzLCBhbmQgdHJlYXQgaXQgYXMgYSBzcGFjZWQtc2VwYXJhdGVkIHN0cmluZ1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTb3J0KHNwZWMucmVwbGFjZSgvLC9pZywgJyAnKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNwZWMuaW5kZXhPZignICcpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBzcGVjLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGQgPT09ICdkZXNjJyAgfHwgZmllbGQgPT09ICdhc2MnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGZpZWxkID09PSAnLTEnICAgIHx8IGZpZWxkID09PSAnMScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZmllbGQgPT09ICdmYWxzZScgfHwgZmllbGQgPT09ICd0cnVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiQmFkIHNvcnQgc3BlY2lmaWNhdGlvbjogXCIsIEpTT04uc3RyaW5naWZ5KHNwZWMpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gXy50b1N0cmluZyhmaWVsZHNbaSsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnZGVzYycgfHwgbmV4dCA9PT0gJ2FzYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy5wdXNoKChuZXh0ID09PSAnYXNjJykgPyB0cnVlIDogZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PT0gJy0xJyB8fCBuZXh0ID09PSAnMScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy5wdXNoKChuZXh0ID09PSAnMScpID8gdHJ1ZSA6IGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT09ICdmYWxzZScgfHwgbmV4dCA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2MucHVzaCgobmV4dCA9PT0gJ3RydWUnKSA/IHRydWUgOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzYy5wdXNoKHRydWUpOyAvLyBEZWZhdWx0IHNvcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8uc29ydChcImZpZWxkMVwiKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGtleXMucHVzaChzcGVjKTtcbiAgICAgICAgICAgICAgICBhc2MucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfLmlzQXJyYXkoc3BlYykpIHtcbiAgICAgICAgICAgIC8vIEpvaW4gdGhlIGFycmF5IHdpdGggc3BhY2VzLCBhbmQgdHJlYXQgaXQgYXMgYSBzcGFjZWQtc2VwYXJhdGVkIHN0cmluZ1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZVNvcnQoc3BlYy5qb2luKCcgJykpO1xuICAgICAgICAgICAgLy8gZm9yICh2YXIgaSA9IDA7IGkgPCBzcGVjLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyAgICAgaWYgKF8uaXNTdHJpbmcoc3BlY1tpXSkpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAga2V5cy5wdXNoKHNwZWNbaV0pO1xuICAgICAgICAgICAgLy8gICAgICAgICBhc2MucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgICAgICBrZXlzLnB1c2goc3BlY1tpXVswXSk7XG4gICAgICAgICAgICAvLyAgICAgICAgIGFzYy5wdXNoKHNwZWNbaV1bMV0gIT09IFwiZGVzY1wiKTtcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc1BsYWluT2JqZWN0KHNwZWMpKSB7XG4gICAgICAgICAgICAvLyBUT0RPIE5lc3RlZCBwYXRoIC0+IC5zb3J0KHsgXCJmaWVsZDEuZmllbGQxMlwiOiBcImFzY1wiIH0pXG4gICAgICAgICAgICB2YXIgX3NwZWMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzcGVjKSB7XG4gICAgICAgICAgICAgICAgaWYgKF8uaGFzSW4oc3BlYywga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBfc3BlYy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIF9zcGVjLnB1c2goc3BlY1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVTb3J0KF9zcGVjKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwiQmFkIHNvcnQgc3BlY2lmaWNhdGlvbjogXCIsIEpTT04uc3RyaW5naWZ5KHNwZWMpKTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICAvLyByZXR1cm4ge2tleXM6IGtleXMsIGFzYzogYXNjfTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gMDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IDAgJiYgeCAhPT0gMCkgcmV0dXJuIHg7ICAgLy8gTm9uIHJlYWNoYWJsZT9cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyB4ID0gU2VsZWN0b3IuX2YuX2NtcChhW0pTT04uc3RyaW5naWZ5KGtleXNbaV0pXSwgYltKU09OLnN0cmluZ2lmeShrZXlzW2ldKV0pO1xuICAgICAgICAgICAgICAgIHggPSBTZWxlY3Rvck1hdGNoZXIuY21wKGFba2V5c1tpXV0sIGJba2V5c1tpXV0pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghYXNjW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHggKj0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4geDtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIGV2YWwoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZSBpbiBJRTgsIG5vciBkb2VzIHRoZSBzcGVjIHNheSBpdFxuICAgICAgICAvLyBzaG91bGQuIEFzc2lnbiB0byBhIGxvY2FsIHRvIGdldCB0aGUgdmFsdWUsIGluc3RlYWQuXG4gICAgICAgIFxuICAgICAgICAvLyB2YXIgX2Z1bmM7XG4gICAgICAgIC8vIHZhciBjb2RlID0gXCJfZnVuYyA9IChmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oYSxiKXt2YXIgeDtcIjtcbiAgICAgICAgLy8gZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAvLyAgICAgICAgIGNvZGUgKz0gXCJpZih4IT09MClyZXR1cm4geDtcIjtcbiAgICAgICAgLy8gICAgIH1cbiAgICBcbiAgICAgICAgLy8gICAgIGNvZGUgKz0gXCJ4PVwiICsgKGFzY1tpXSA/IFwiXCIgOiBcIi1cIikgKyBcImMoYVtcIiArIEpTT04uc3RyaW5naWZ5KGtleXNbaV0pICsgXCJdLGJbXCIgKyBKU09OLnN0cmluZ2lmeShrZXlzW2ldKSArIFwiXSk7XCI7XG4gICAgICAgIC8vIH1cbiAgICBcbiAgICAgICAgLy8gY29kZSArPSBcInJldHVybiB4O307fSlcIjtcbiAgICBcbiAgICAgICAgLy8gZXZhbChjb2RlKTtcbiAgICBcbiAgICAgICAgLy8gcmV0dXJuIF9mdW5jKFNlbGVjdG9yLl9mLl9jbXApO1xuICAgIH1cbiAgICBcbiAgICBjb21waWxlRmllbGRzKHNwZWMpIHtcbiAgICAgICAgdmFyIHByb2plY3Rpb24gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmIChfLmlzTmlsKHNwZWMpKSByZXR1cm4gcHJvamVjdGlvbjtcbiAgICAgICAgXG4gICAgICAgIGlmIChfLmlzU3RyaW5nKHNwZWMpKSB7XG4gICAgICAgICAgICBzcGVjID0gc3BlYy5yZXBsYWNlKC8oICkrL2lnLCAnICcpLnRyaW0oKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHNwZWMuaW5kZXhPZignLCcpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgY29tbWFzIGJ5IHNwYWNlcywgYW5kIHRyZWF0IGl0IGFzIGEgc3BhY2VkLXNlcGFyYXRlZCBzdHJpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlRmllbGRzKHNwZWMucmVwbGFjZSgvLC9pZywgJyAnKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNwZWMuaW5kZXhPZignICcpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZHMgPSBzcGVjLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2ldLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGQgPT09ICctMScgICAgfHwgZmllbGQgPT09ICcxJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZCA9PT0gJ2ZhbHNlJyB8fCBmaWVsZCA9PT0gJ3RydWUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJCYWQgZmllbGRzIHNwZWNpZmljYXRpb246IFwiLCBKU09OLnN0cmluZ2lmeShzcGVjKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IF8udG9TdHJpbmcoZmllbGRzW2krMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJy0xJyB8fCBuZXh0ID09PSAnMScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJy0xJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBfa2V5IGluIHByb2plY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCAhPT0gJ19pZCcgJiYgcHJvamVjdGlvbltfa2V5XSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgcHJvamVjdGlvbiBjYW5ub3QgY29udGFpbiBib3RoIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgc3BlY2lmaWNhdGlvbnNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25bZmllbGRdID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbltmaWVsZF0gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT09ICdmYWxzZScgfHwgbmV4dCA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkID09PSAnX2lkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbltmaWVsZF0gPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgcHJvamVjdGlvbiBjYW5ub3QgY29udGFpbiBib3RoIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgc3BlY2lmaWNhdGlvbnNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uW2ZpZWxkXSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbltmaWVsZF0gPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzcGVjLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLy5maW5kKHt9LCBcImZpZWxkMVwiKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHByb2plY3Rpb25bc3BlY10gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKF8uaXNBcnJheShzcGVjKSkge1xuICAgICAgICAgICAgLy8gSm9pbiB0aGUgYXJyYXkgd2l0aCBzcGFjZXMsIGFuZCB0cmVhdCBpdCBhcyBhIHNwYWNlZC1zZXBhcmF0ZWQgc3RyaW5nXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlRmllbGRzKHNwZWMuam9pbignICcpKTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3Qoc3BlYykpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gTmVzdGVkIHBhdGggLT4gLmZpbmQoe30sIHsgXCJmaWVsZDEuZmllbGQxMlwiOiBcImFzY1wiIH0pXG4gICAgICAgICAgICB2YXIgX3NwZWMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzcGVjKSB7XG4gICAgICAgICAgICAgICAgaWYgKF8uaGFzSW4oc3BlYywga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBfc3BlYy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIF9zcGVjLnB1c2goc3BlY1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVGaWVsZHMoX3NwZWMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJCYWQgZmllbGRzIHNwZWNpZmljYXRpb246IFwiLCBKU09OLnN0cmluZ2lmeShzcGVjKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cblx0XG5cdC8qIFNUQVRJQyBNRVRIT0RTICovXG5cdHN0YXRpYyBpc1NlbGVjdG9yQ29tcGlsZWQoc2VsZWN0b3IpIHtcblx0XHRpZiAoIV8uaXNOaWwoc2VsZWN0b3IpICYmIChcblx0XHQgICAgc2VsZWN0b3IgaW5zdGFuY2VvZiBTZWxlY3Rvck1hdGNoZXIgfHwgKHNlbGVjdG9yIGluc3RhbmNlb2YgU2VsZWN0b3IgJiYgXG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5zZWxlY3Rvcl9jb21waWxlZCBpbnN0YW5jZW9mIFNlbGVjdG9yTWF0Y2hlcilcblx0ICAgICkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cdFxuXHRzdGF0aWMgbWF0Y2hlcyhzZWxlY3RvciwgZG9jKSB7XG4gICAgICAgIHJldHVybiAobmV3IFNlbGVjdG9yKHNlbGVjdG9yKSkudGVzdChkb2MpO1xuICAgIH1cbn1cblxudmFyIF9idWlsZFNlbGVjdG9yID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcblx0bG9nZ2VyLmRlYnVnKCdDYWxsZWQ6IF9idWlsZFNlbGVjdG9yJyk7XG4gICAgXG4gICAgdmFyIGNsYXVzZXMgPSBbXTtcbiAgICBcbiAgICBmb3IgKHZhciBrZXkgaW4gc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gc2VsZWN0b3Jba2V5XTtcbiAgICAgICAgXG4gICAgICAgIGlmIChrZXkuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnc2VsZWN0b3IgLT4gb3BlcmF0b3IgPT4geyAkYW5kOiBbey4uLn0sIHsuLi59XSB9Jyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChfYnVpbGREb2N1bWVudFNlbGVjdG9yKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zygnc2VsZWN0b3IgLT4gcGxhaW4gPT4geyBmaWVsZDE6IDx2YWx1ZT4gfScpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goX2J1aWxkS2V5cGF0aFNlbGVjdG9yKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY2xhdXNlcztcbn07XG5cbnZhciBfYnVpbGREb2N1bWVudFNlbGVjdG9yID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBjbGF1c2UgPSB7fTtcbiAgICBcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICckb3InOlxuICAgICAgICBjYXNlICckYW5kJzpcbiAgICAgICAgY2FzZSAnJG5vcic6XG4gICAgICAgICAgICBjbGF1c2Uua2V5ID0ga2V5LnJlcGxhY2UoL1xcJC8sICcnKTtcbiAgICAgICAgICAgIC8vIFRoZSByZXN0IHdpbGwgYmUgaGFuZGxlZCBieSAnX29wZXJhdG9yXydcbiAgICAgICAgY2FzZSAnX29wZXJhdG9yXyc6XG4gICAgICAgICAgICAvLyBHZW5lcmljIGhhbmRsZXIgZm9yIG9wZXJhdG9ycyAoJG9yLCAkYW5kLCAkbm9yKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjbGF1c2Uua2luZCA9ICdvcGVyYXRvcic7XG4gICAgICAgICAgICBjbGF1c2UudHlwZSA9ICdhcnJheSc7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNsYXVzZS52YWx1ZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNsYXVzZS52YWx1ZSA9IF8udW5pb24oY2xhdXNlLnZhbHVlLCBfYnVpbGRTZWxlY3Rvcih2YWx1ZVtpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwiVW5yZWNvZ2l6ZWQga2V5IGluIHNlbGVjdG9yOiBcIiwga2V5KTtcbiAgICB9XG4gICAgXG4gICAgLy8gVE9ETyBjYXNlczogJHdoZXJlLCAkZWxlbU1hdGNoXG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdjbGF1c2UgY3JlYXRlZDogJyArIEpTT04uc3RyaW5naWZ5KGNsYXVzZSkpO1xuICAgIFxuICAgIHJldHVybiBjbGF1c2U7XG59O1xuXG52YXIgX2J1aWxkS2V5cGF0aFNlbGVjdG9yID0gZnVuY3Rpb24gKGtleXBhdGgsIHZhbHVlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdDYWxsZWQ6IF9idWlsZEtleXBhdGhTZWxlY3RvcicpO1xuICAgIFxuICAgIHZhciBjbGF1c2UgPSB7fTtcbiAgICBcbiAgICBjbGF1c2UudmFsdWUgPSB2YWx1ZTtcbiAgICBcbiAgICBpZiAoXy5pc05pbCh2YWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdjbGF1c2Ugb2YgdHlwZSBudWxsJyk7XG4gICAgICAgIFxuICAgICAgICBjbGF1c2UudHlwZSA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKF8uaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnY2xhdXNlIG9mIHR5cGUgUmVnRXhwJyk7XG5cbiAgICAgICAgY2xhdXNlLnR5cGUgPSAncmVnZXhwJztcbiAgICAgICAgXG4gICAgICAgIHZhciBzb3VyY2UgPSB2YWx1ZS50b1N0cmluZygpLnNwbGl0KCcvJyk7XG5cbiAgICAgICAgY2xhdXNlLnZhbHVlID0ge1xuICAgICAgICAgICAgJHJlZ2V4OiBzb3VyY2VbMV0gICAvLyBUaGUgZmlyc3QgaXRlbSBzcGxpdHRlZCBpcyBhbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGlmIChzb3VyY2VbMl0gIT0gXCJcIikge1xuICAgICAgICAgICAgY2xhdXNlLnZhbHVlW1wiJG9wdGlvbnNcIl0gPSBzb3VyY2VbMl07XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF8uaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdjbGF1c2Ugb2YgdHlwZSBBcnJheScpO1xuICAgICAgICBcbiAgICAgICAgY2xhdXNlLnR5cGUgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAoXy5pc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdjbGF1c2Ugb2YgdHlwZSBTdHJpbmcnKTtcbiAgICAgICAgXG4gICAgICAgIGNsYXVzZS50eXBlID0gJ3N0cmluZyc7XG4gICAgfSBlbHNlIGlmIChfLmlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvZiB0eXBlIE51bWJlcicpO1xuICAgICAgICBcbiAgICAgICAgY2xhdXNlLnR5cGUgPSAnbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKF8uaXNCb29sZWFuKHZhbHVlKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvZiB0eXBlIEJvb2xlYW4nKTtcbiAgICAgICAgXG4gICAgICAgIGNsYXVzZS50eXBlID0gJ2Jvb2xlYW4nO1xuICAgIH0gZWxzZSBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvZiB0eXBlIEZ1bmN0aW9uJyk7XG4gICAgICAgIFxuICAgICAgICBjbGF1c2UudHlwZSA9ICdmdW5jdGlvbic7XG4gICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHZhciBsaXRlcmFsT2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoa2V5LmNoYXJBdCgwKSA9PT0gJyQnKSB7XG4gICAgICAgICAgICAgICAgbGl0ZXJhbE9iamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAobGl0ZXJhbE9iamVjdCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdjbGF1c2Ugb2YgdHlwZSBPYmplY3QgPT4geyBmaWVsZDogeyBmaWVsZF8xOiA8dmFsdWU+LCBmaWVsZF8yOiA8dmFsdWU+IH0gfScpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjbGF1c2UudHlwZSA9ICdsaXRlcmFsX29iamVjdCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvZiB0eXBlIE9wZXJhdG9yID0+IHsgZmllbGQ6IHsgJGd0OiAyLCAkbHQgNSB9IH0nKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xhdXNlLnR5cGUgPSAnb3BlcmF0b3Jfb2JqZWN0JztcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RJZCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvZiB0eXBlIE9iamVjdElkIC0+IFN0cmluZycpO1xuICAgICAgICBcbiAgICAgICAgY2xhdXNlLnR5cGUgPSAnc3RyaW5nJztcbiAgICAgICAgY2xhdXNlLnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjbGF1c2UudHlwZSA9ICdfX2ludmFsaWRfXyc7XG4gICAgfVxuICAgIFxuICAgIHZhciBwYXJ0cyA9IGtleXBhdGguc3BsaXQoJy4nKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ2NsYXVzZSBvdmVyIE9iamVjdCBmaWVsZCA9PiB7IFwiZmllbGQxLmZpZWxkMV8yXCI6IDx2YWx1ZT4gfScpO1xuICAgICAgICBcbiAgICAgICAgY2xhdXNlLmtpbmQgPSAnb2JqZWN0JztcbiAgICAgICAgY2xhdXNlLmtleSA9IHBhcnRzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnY2xhdXNlIG92ZXIgUGxhaW4gZmllbGQgPT4geyBcImZpZWxkXCI6IDx2YWx1ZT4gfScpO1xuICAgICAgICBcbiAgICAgICAgY2xhdXNlLmtpbmQgPSAncGxhaW4nO1xuICAgICAgICBjbGF1c2Uua2V5ID0gcGFydHNbMF07XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5kZWJ1ZygnY2xhdXNlIGNyZWF0ZWQ6ICcgKyBKU09OLnN0cmluZ2lmeShjbGF1c2UpKTtcbiAgICBcbiAgICByZXR1cm4gY2xhdXNlO1xufTtcblxuU2VsZWN0b3IuTUFUQ0hfU0VMRUNUT1IgPSAnbWF0Y2gnO1xuU2VsZWN0b3IuU09SVF9TRUxFQ1RPUiA9ICdzb3J0JztcblNlbGVjdG9yLkZJRUxEX1NFTEVDVE9SID0gJ2ZpZWxkJztcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3RvcjsiXX0= diff --git a/src/Aggregation.js b/src/Aggregation.js index cf1f305..8693c99 100644 --- a/src/Aggregation.js +++ b/src/Aggregation.js @@ -8,20 +8,22 @@ */ var _ = require("lodash"), - Logger = require("jsw-logger"); + Logger = require("jsw-logger"), + Cursor = require("./Cursor"), + Selector = require("./Selector"); var logger = null; var stages = { '$project': false, - '$match': false, + '$match': true, '$redact': false, '$limit': false, '$skip': false, '$unwind': false, '$group': true, '$sample': false, - '$sort': false, + '$sort': true, '$geoNear': false, '$lookup': false, '$out': false, @@ -158,10 +160,28 @@ var do_complex_group = function() { }; +var do_sort = function(documents, sort_stage) { + return documents.sort(new Selector(sort_stage, Selector.SORT_SELECTOR)); +}; + +var do_match = function(documents, match_stage) { + var cursor = new Cursor(documents, match_stage); + + return cursor.fetch(); +}; + var do_group = function(documents, group_stage) { if (!_.hasIn(group_stage, '_id')) logger.throw('The field "_id" is required in the "$group" stage'); let new_id = group_stage['_id']; + + if (!_.isNull(new_id)) { + if (new_id.substr(0, 1) !== '$') { + logger.throw("Field names references in a right side assignement must be preceded by '$'"); + } else { + new_id = new_id.substr(1, new_id.length); + } + } if (_.isPlainObject(new_id)) { // complex_id @@ -180,16 +200,30 @@ class Aggregation { } aggregate(collection) { + var docs = collection.docs; + for (let i = 0; i < this.pipeline.length; i++) { let stage = this.pipeline[i]; for (let key in stage) { switch (key) { + case '$match': + docs = do_match(docs, stage[key]); + + break; case '$group': - return do_group(collection.docs, stage[key]); + docs = do_group(docs, stage[key]); + + break; + case '$sort': + docs = do_sort(docs, stage[key]); + + break; } } } + + return docs; // move to cursor } validStage(stage) { diff --git a/src/Collection.js b/src/Collection.js index 26afc09..5b92125 100644 --- a/src/Collection.js +++ b/src/Collection.js @@ -177,8 +177,7 @@ Collection.prototype.find = function (selection, fields, options, callback) { options = params.options; callback = params.callback; - // callback for backward compatibility - var cursor = new Cursor(this.db, this, selection, fields, options); + var cursor = new Cursor(this.docs, selection, fields, options); /** * "find" event. @@ -239,7 +238,7 @@ Collection.prototype.findOne = function (selection, fields, options, callback) { options = params.options; callback = params.callback; - var cursor = new Cursor(this.db, this, selection, fields, options); + var cursor = new Cursor(this.docs, selection, fields, options); /** * "findOne" event. diff --git a/src/Cursor.js b/src/Cursor.js index 12d4edc..3a2846d 100644 --- a/src/Cursor.js +++ b/src/Cursor.js @@ -23,7 +23,7 @@ var logger = null; * @classdesc Cursor class that maps a MongoDB-like cursor * * @param {MongoPortable} db - Additional options - * @param {Collection} collection - The collection instance + * @param {Array} documents - The list of documents * @param {Object|Array|String} [selection={}] - The selection for matching documents * @param {Object|Array|String} [fields={}] - The fields of the document to show * @param {Object} [options] - Database object @@ -32,9 +32,8 @@ var logger = null; * */ class Cursor { - constructor(db, collection, selection, fields, options = {}) { - this.db = db; - this.collection = collection; + constructor(documents, selection, fields, options = {}) { + this.documents = documents; this.selector = selection; this.skipValue = options.skip || 0; this.limitValue = options.limit || 15; @@ -43,6 +42,7 @@ class Cursor { logger = Logger.instance; + /** ADD IDX **/ if (Selector.isSelectorCompiled(this.selector)) { this.selector_compiled = this.selector; } else { @@ -65,6 +65,26 @@ class Cursor { } } + /** ADD IDX **/ + + this.fetch_mode = Cursor.COLSCAN || Cursor.IDXSCAN; + this.indexex = null;//findUsableIndexes(); + + // if (cursor.fetch_mode === Cursor.COLSCAN) { + // // COLSCAN, wi will iterate over all documents + // docs = _.cloneDeep(cursor.collection.docs); + // } else if (cursor.fetch_mode === Cursor.IDXSCAN) { + // // IDXSCAN, wi will iterate over all needed documents + // for (let i = 0; i < cursor.indexes.length; i++) { + // let index = cursor.indexes[i]; + + // for (let i = index.start; i < index.end; i++) { + // let idx_id = cursor.collection.getIndex(index.name)[i]; + + // docs.push(cursor.collection.docs[idx_id]); + // } + // } + // } this.fields = new Selector(fields, Selector.FIELD_SELECTOR); @@ -75,6 +95,9 @@ class Cursor { } } +Cursor.COLSCAN = 'colscan'; +Cursor.IDXSCAN = 'idxscan'; + /** * Moves a cursor to the begining * @@ -127,7 +150,7 @@ Cursor.prototype.map = function(callback) { * @returns {Boolean} True if we can fetch one more document */ Cursor.prototype.hasNext = function() { - return (this.cursor_pos < this.collection.docs.length); + return (this.cursor_pos < this.documents.length); }; /** @@ -233,25 +256,44 @@ var _mapFields = function(doc, fields) { * @returns {Array|Object} If [justOne=true] returns the next document, otherwise returns all the documents */ var _getDocuments = function(cursor, justOne = false) { - if (cursor.selector_id) { - if (_.hasIn(cursor.collection.doc_indexes, _.toString(cursor.selector_id))) { - let idx = cursor.collection.doc_indexes[_.toString(cursor.selector_id)]; + var docs = []; + + if (cursor.fetch_mode === Cursor.COLSCAN) { + // COLSCAN, wi will iterate over all documents + docs = _.cloneDeep(cursor.documents); + } else if (cursor.fetch_mode === Cursor.IDXSCAN) { + // IDXSCAN, wi will iterate over all needed documents + for (let i = 0; i < cursor.indexes.length; i++) { + let index = cursor.indexes[i]; - return _mapFields(cursor.collection.docs[idx], cursor.fields); - } else { - if (justOne) { - return null; - } else { - return []; + for (let i = index.start; i < index.end; i++) { + // let idx_id = cursor.collection.getIndex(index.name)[i]; + let idx_id = index.index[i]; + + docs.push(cursor.documents[idx_id]); } } } + // if (cursor.selector_id) { + // if (_.hasIn(cursor.collection.doc_indexes, _.toString(cursor.selector_id))) { + // let idx = cursor.collection.doc_indexes[_.toString(cursor.selector_id)]; + + // return _mapFields(cursor.collection.docs[idx], cursor.fields); + // } else { + // if (justOne) { + // return null; + // } else { + // return []; + // } + // } + // } + // TODO add warning when sort/skip/limit and fetching one // TODO add warning when skip/limit without order // TODO index - while (cursor.cursor_pos < cursor.collection.docs.length) { - var _doc = cursor.collection.docs[cursor.cursor_pos]; + while (cursor.cursor_pos < docs.length) { + var _doc = docs[cursor.cursor_pos]; cursor.cursor_pos++; if (cursor.selector_compiled.test(_doc)) { @@ -290,6 +332,26 @@ Cursor.prototype.count = function() { return this.fetchAll().length; }; +/** + * Set the sorting of the cursor + * + * @method Cursor#sort + * + * @param {Object|Array|String} spec - The sorting specification + * + * @returns {Cursor} This instance so it can be chained with other methods + */ +Cursor.prototype.setSorting = function(spec) { + if (_.isNil(spec)) logger.throw("You need to specify a sorting"); + + if (spec) { + this.sortValue = spec; + this.sort_compiled = (new Selector(spec, Selector.SORT_SELECTOR)); + } + + return this; +}; + /** * Applies a sorting on the cursor * @@ -307,15 +369,11 @@ Cursor.prototype.sort = function(spec) { } if (_sort) { - if (spec) { - this.sortValue = spec; - this.sort_compiled = _sort; + if (!_.isNil(this.db_objects) && _.isArray(this.db_objects)) { + this.db_objects = this.db_objects.sort(_sort); + this.sorted = true; } else { - // If no spec, do sort - if (!_.isNil(this.db_objects) && _.isArray(this.db_objects)) { - this.db_objects = this.db_objects.sort(_sort); - this.sorted = true; - } + this.setSorting(spec); } } diff --git a/src/Selector.js b/src/Selector.js index 84096a3..4b39d99 100644 --- a/src/Selector.js +++ b/src/Selector.js @@ -1,6 +1,7 @@ var Logger = require("jsw-logger"), _ = require("lodash"), - SelectorMatcher = require("./SelectorMatcher"); + SelectorMatcher = require("./SelectorMatcher"), + ObjectId = require("./ObjectId"); var logger = null; @@ -415,6 +416,11 @@ var _buildKeypathSelector = function (keypath, value) { clause.type = 'operator_object'; } + } else if (value instanceof ObjectId) { + logger.debug('clause of type ObjectId -> String'); + + clause.type = 'string'; + clause.value = value.toString(); } else { clause.type = '__invalid__'; } diff --git a/test/3_Cursor.js b/test/3_Cursor.js index 074623d..7df269d 100644 --- a/test/3_Cursor.js +++ b/test/3_Cursor.js @@ -32,11 +32,10 @@ describe("Cursor", function() { expect(selector).to.exist; - var c = new Cursor(null, null, selector, ["field1, field2"], { sort: { field2: -1 } }); + var c = new Cursor([], selector, ["field1, field2"], { sort: { field2: -1 } }); expect(c).to.exist; - expect(c.db).to.not.exist; expect(c.collection).to.not.exist; expect(c.selector).to.exist; expect(c.fields).to.exist; @@ -52,11 +51,10 @@ describe("Cursor", function() { }); it("should be able to create a new instance from a compiled selector", function() { - var c = new Cursor(null, null, { field1: { $gte: 3 } }, ["field1, field2"], { sort: { field2: -1 } }); + var c = new Cursor([], { field1: { $gte: 3 } }, ["field1, field2"], { sort: { field2: -1 } }); expect(c).to.exist; - expect(c.db).to.not.exist; expect(c.collection).to.not.exist; expect(c.selector).to.exist; expect(c.fields).to.exist; diff --git a/test/5_Aggregation.js b/test/5_Aggregation.js index 75acc1d..3aa41b4 100644 --- a/test/5_Aggregation.js +++ b/test/5_Aggregation.js @@ -42,7 +42,7 @@ describe("Aggregation", function() { describe("#Group", function() { it("should be able to group several documents ($sum)", function() { - var coll = db.collection("coll_1"); + var coll = db.collection("coll_group_1"); coll.insert({ _id: 1111, @@ -72,7 +72,7 @@ describe("Aggregation", function() { var docs = coll.aggregate([{ $group: { - _id: "age", + _id: "$age", count: { $sum: 1 }, @@ -93,7 +93,7 @@ describe("Aggregation", function() { }); it("should be able to group several documents ($avg)", function() { - var coll = db.collection("coll_2"); + var coll = db.collection("coll_group_2"); coll.insert({ _id: 1111, @@ -138,1071 +138,159 @@ describe("Aggregation", function() { expect(docs[0].aver_age).to.be.equal(23); }); }); - // describe(" - Create", function() { - // it("should be able to insert a document", function(done) { - // var coll = db.collection(TEST_COLL); - - // buildDoc(); - - // coll.insert(TEST_DOC, function(error, inserted) { - // expect(error).to.not.exist; - // expect(inserted).to.exist; - - // expect(inserted.stringField).to.be.equal(TEST_DOC.stringField); - // expect(inserted.numberField).to.be.equal(TEST_DOC.numberField); - // expect(coll.docs).to.have.length(1); - - // done(); - // }); - // }); - - // it("should be able to insert several documents chained", function() { - // var coll = db.collection("coll_2"); - - // coll.insert({ field: 'a' }, {chain: true}).insert({ _id: 12345, field: 'b' }); - - // expect(coll.docs).to.have.length(2); - // }); - - // it("should be able to save a document", function(done) { - // var coll = db.collection(TEST_COLL); - - // // new document - // var inserted = coll.save({ - // stringField: "save", - // numberField: 3 - // }); - - // expect(inserted).to.exist; - - // expect(inserted._id).to.exist; - // expect(inserted.stringField).to.be.equal("save"); - // expect(inserted.numberField).to.be.equal(3); - - // // update / upsert - - // coll.save({ _id: 12345, stringField: "save" }, function(error, updatedInfo) { - // expect(updatedInfo).to.exist; - // expect(updatedInfo.updated).to.exist; - // expect(updatedInfo.inserted).to.exist; - - // expect(updatedInfo.updated.documents).to.not.exist; - // expect(updatedInfo.updated.count).to.be.equal(0); - - // expect(updatedInfo.inserted.documents).to.be.instanceof(Array); - // expect(updatedInfo.inserted.count).to.be.equal(1); - - // var inserted = updatedInfo.inserted.documents[0]; - - // expect(inserted._id).to.be.equal("12345"); - // expect(inserted.stringField).to.be.equal("save"); - - // done(); - // }); - // }); - // }); - - // describe(" - Read", function() { - // it("should be able to read the first document", function(done) { - // var coll = db.collection(TEST_COLL); - - // coll.findOne(function(error, doc) { - // expect(doc).to.exist; - - // expect(doc._id).to.exist; - // expect(doc.stringField).to.exist; - // expect(doc.numberField).to.be.equal(TEST_DOC.numberField); - - // done(); - // }); - // }); - - // it("should be able to read a document", function(done) { - // var coll = db.collection(TEST_COLL); - - // var doc = coll.findOne({stringField: "yes"}, {_id: -1, numberField: 1}, { fields: { numberField: 1 }}); - - // expect(doc).to.exist; - - // expect(doc._id).to.not.exist; - // expect(doc.stringField).to.not.exist; - // expect(doc.numberField).to.be.equal(TEST_DOC.numberField); - - // doc = coll.findOne({_id: 123456789}, null, { fields: { numberField: 1 }}); - - // expect(doc).to.not.exist; - - // doc = coll.findOne(TEST_DOC._id); - - // expect(doc).to.exist; - - // expect(doc._id).to.exist; - // expect(doc.stringField).to.be.equal(TEST_DOC.stringField); - // expect(doc.numberField).to.be.equal(TEST_DOC.numberField); - - // doc = coll.findOne({_id: new ObjectId()}); - - // expect(doc).to.not.exist; - - // coll.findOne({_id: TEST_DOC._id}, function(error, doc) { - // expect(doc).to.exist; - - // expect(doc._id).to.exist; - // expect(doc.stringField).to.exist; - // expect(doc.numberField).to.be.equal(TEST_DOC.numberField); - - // done(); - // }); - // }); - - // it("should be able to read several documents", function(done) { - // var coll = db.collection(TEST_COLL); - - // var cursor = coll.find({stringField: "yes"}); - - // expect(cursor).to.exist; - - // cursor.forEach(function (doc) { - // expect(doc).to.exist; - - // expect(doc._id).to.exist; - // expect(doc.stringField).to.exist; - // expect(doc.numberField).to.exist; - // }); - - // var docs = coll.find({_id: new ObjectId()}, null, { forceFetch: true }); - - // expect(docs).to.exist; - // expect(docs).to.have.length(0); - - // // Callback - - // var calls = 3; - - // coll.find(function(error, docs) { - // expect(error).to.not.exist; - // expect(docs).to.exist; - - // expect(docs).to.have.length(3); - - // var doc = docs[0]; - - // expect(doc).to.exist; - - // expect(doc._id).to.exist; - // expect(doc.stringField).to.exist; - // expect(doc.numberField).to.exist; - - // if (calls === 1) { - // done(); - // } else { - // calls--; - // } - // }); - - // coll.find({ stringField: "yes" }, function(error, docs) { - // expect(error).to.not.exist; - // expect(docs).to.exist; - - // expect(docs).to.have.length(1); - - // var doc = docs[0]; - - // expect(doc).to.exist; - - // expect(doc._id).to.exist; - // expect(doc.stringField).to.exist; - // expect(doc.numberField).to.exist; - - // if (calls === 1) { - // done(); - // } else { - // calls--; - // } - // }); - - // coll.find({ stringField: "yes" }, { stringField: -1 }, function(error, docs) { - // expect(error).to.not.exist; - // expect(docs).to.exist; - - // expect(docs).to.have.length(1); - - // var doc = docs[0]; - - // expect(doc).to.exist; - - // expect(doc._id).to.exist; - // expect(doc.stringField).to.not.exist; - // expect(doc.numberField).to.exist; - - // if (calls === 1) { - // done(); - // } else { - // calls--; - // } - // }); - // }); - // }); - - // describe(" - Update", function() { - // it("should be able to update a document", function() { - // var coll = db.collection(TEST_COLL); - - // /**/ - // // coll.insert({ - // // _id: "TESTING", - // // objectField1: { - // // arrayField1: [1, 2, "3"], - // // arrayField2: [{ - // // subField1: "test1" - // // }, { - // // subField1: "test2" - // // }] - // // }, - // // arrayField1: [1, 2, "3"], - // // arrayField2: [{ - // // subField1: "test1" - // // }, { - // // subField1: "test2" - // // }] - // // }); - - // // coll.update( - // // { - // // _id: "TESTING" - // // }, { - // // $set: { - // // "objectField1.arrayField1.1": "setted", - // // "objectField1.arrayField2.1.subField1": "setted", - // // "arrayField1.1": "setted", - // // "arrayField2.1.subField1": "setted" - // // } - // // }); - // /**/ - - // // By _id - // var updatedInfo = coll.update( - // TEST_DOC._id, - // { - // numberField: 5, - // unexistingField: 1, - // _id: "non updated" - // } - // ); - - // expect(updatedInfo).to.exist; - // expect(updatedInfo.updated).to.exist; - // expect(updatedInfo.inserted).to.exist; - - // expect(updatedInfo.updated.documents).to.be.instanceof(Array); - // expect(updatedInfo.updated.count).to.be.equal(1); - - // expect(updatedInfo.inserted.documents).to.not.exist; - // expect(updatedInfo.inserted.count).to.be.equal(0); - - // var updated = updatedInfo.updated.documents[0]; - - // expect(updated.unexistingField).to.not.exist; - // expect(updated._id).to.be.eql(TEST_DOC._id); - // expect(updated.stringField).to.be.equal("yes"); - // expect(updated.numberField).to.be.equal(5); - - // var doc = coll.findOne({stringField: "yes"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("yes"); - // expect(doc.numberField).to.be.equal(5); - - // // By field - // updatedInfo = coll.update({stringField: "yes"}, {numberField: 1}); - - // expect(updatedInfo).to.exist; - // expect(updatedInfo.updated).to.exist; - // expect(updatedInfo.inserted).to.exist; - - // expect(updatedInfo.updated.documents).to.be.instanceof(Array); - // expect(updatedInfo.updated.count).to.be.equal(1); - - // expect(updatedInfo.inserted.documents).to.not.exist; - // expect(updatedInfo.inserted.count).to.be.equal(0); - - // updated = updatedInfo.updated.documents[0]; - - // expect(updated.stringField).to.be.equal("yes"); - // expect(updated.numberField).to.be.equal(1); - - // doc = coll.findOne({stringField: "yes"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("yes"); - // expect(doc.numberField).to.be.equal(1); - - // // No matches - // updatedInfo = coll.update({stringField: "nope"}, {numberField: 1}); - - // expect(updatedInfo).to.exist; - // expect(updatedInfo.updated).to.exist; - // expect(updatedInfo.inserted).to.exist; - - // expect(updatedInfo.updated.documents).to.not.exist; - // expect(updatedInfo.updated.count).to.be.equal(0); - - // expect(updatedInfo.inserted.documents).to.not.exist; - // expect(updatedInfo.inserted.count).to.be.equal(0); - // }); - - // describe("should be able to use update operators", function() { - - // var expectUpdateInfo = function(error, updatedInfo, nUpdated, nInserted) { - // expect(error).to.not.exist; - // expect(updatedInfo).to.exist; - - // expect(updatedInfo.updated).to.exist; - // expect(updatedInfo.inserted).to.exist; - - // if (nUpdated > 0) { - // expect(updatedInfo.updated.documents).to.be.instanceof(Array); - // expect(updatedInfo.updated.count).to.be.equal(nUpdated); - // } else { - // expect(updatedInfo.updated.documents).to.not.exist; - // expect(updatedInfo.updated.count).to.be.equal(0); - // } - - // if (nInserted > 0) { - // expect(updatedInfo.inserted.documents).to.be.instanceof(Array); - // expect(updatedInfo.inserted.count).to.be.equal(nInserted); - // } else { - // expect(updatedInfo.inserted.documents).to.not.exist; - // expect(updatedInfo.inserted.count).to.be.equal(0); - // } - // }; - - // before(function() { - // db.collection("FIELD_OP") - // .insert({ stringField: "field_op", numberField: 3 }, { chain: true }) - // .insert({ stringField: "array_op", arrayField: ["first", "inside", "other", "last"] }, { chain: true }) - // .insert({ stringField: "yep6", numberField: 7 }, { chain: true }) - // .insert({ stringField: "yep8", numberField: 9 }); - // }); - - // describe("- Field Update Operators", function() { - // it("should update with the $inc operator", function(done) { - // var coll = db.collection("FIELD_OP"); - - // coll.update( - // { - // stringField: "field_op" - // }, { - // $inc: { - // numberField: 2, - // otherNumberField: 3 - // } - // }, - // function(error, updatedInfo) { - // expectUpdateInfo(error, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "field_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("field_op"); - // expect(doc.numberField).to.be.equal(5); - // expect(doc.otherNumberField).to.be.equal(3); - - // done(); - // } - // ); - // }); - - // it.skip("should update with the $mul operator", function() { - - // }); - - // it("should update with the $rename operator", function(done) { - // var coll = db.collection("FIELD_OP"); - - // var selector = { - // stringField: "field_op" - // }; - // var update = { - // $rename: { - // numberField: 'numericField' - // } - // }; - - // coll.update(selector, update, function(error, updatedInfo) { - - // expectUpdateInfo(error, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "field_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("field_op"); - // expect(doc.numberField).to.not.exist; - // expect(doc.numericField).to.be.equal(5); - - // done(); - // }); - // }); - - // it.skip("should update with the $setOnInsert operator", function() { - - // }); - - // it("should update with the $set operator", function(done) { - // var coll = db.collection("FIELD_OP"); - - // var selector = { - // stringField: "field_op" - // }; - // var update = { - // $set: { - // booleanField: true, - // "objectField.field": ["yes!", "noo"], - // newField: "ok", - // "newArray.1": "second" - // } - // }; - - // coll.update(selector, update, function(error, updatedInfo) { - // expectUpdateInfo(error, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "field_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("field_op"); - // expect(doc.numberField).to.not.exist; - // expect(doc.numericField).to.be.equal(5); - // expect(doc.booleanField).to.be.true; - // expect(doc.objectField).to.be.eql({ field: ["yes!", "noo"] }); - // expect(doc.newField).to.be.equal("ok"); - - // expect(doc.newArray).to.exist; - // expect(doc.newArray).to.be.instanceof(Array); - // expect(doc.newArray).to.have.length(2); - // expect(doc.newArray[1]).to.be.equal("second"); - - // done(); - // }); - // }); - - // it("should update with the $unset operator", function() { - // var coll = db.collection("FIELD_OP"); - - // var selector = { - // stringField: "field_op", - // "objectField.field.1": "noo" - // }; - // var update = { - // $unset: { - // booleanField: "does not matter", - // "newArray.1": "neither does this" // TODO - // } - // }; - - // var updatedInfo = coll.update(selector, update); - - // expectUpdateInfo(null, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "field_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("field_op"); - // expect(doc.numberField).to.not.exist; - // expect(doc.numericField).to.be.equal(5); - // expect(doc.booleanField).to.not.exist; - // expect(doc.objectField).to.be.eql({ field: ["yes!", "noo"] }); - // expect(doc.newArray).to.exist; - // expect(doc.newArray).to.have.length(2); - // expect(doc.newArray[1]).to.be.equal(null); - // }); - - // it.skip("should update with the $min operator", function() { - - // }); - - // it.skip("should update with the $max operator", function() { - - // }); - - // it.skip("should update with the $currentDate operator", function() { - - // }); - // }); - - // describe("- Array Update Operators", function() { - // it("should update with the $addToSet operator", function() { - // var coll = db.collection("FIELD_OP"); - - // var selector = { - // stringField: "array_op" - // }; - // var update = { - // $addToSet: { - // arrayField: "newly", - // unexistingArray: "first" - // } - // }; - - // var updatedInfo = coll.update(selector, update); - - // expectUpdateInfo(null, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "array_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("array_op"); - // expect(doc.arrayField).to.exist; - // expect(doc.arrayField).to.have.length(5); - // expect(doc.arrayField[1]).to.be.equal("inside"); - // expect(doc.arrayField[4]).to.be.equal("newly"); - // expect(doc.unexistingArray).to.exist; - // expect(doc.unexistingArray).to.have.length(1); - // expect(doc.unexistingArray[0]).to.be.equal("first"); - - // // operator $each - // update = { - // $addToSet: { - // unexistingArray: { - // $each: ["first", "second"] - // } - // } - // }; - - // updatedInfo = coll.update(selector, update); - - // expectUpdateInfo(null, updatedInfo, 1, 0); - - // doc = coll.findOne({stringField: "array_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("array_op"); - // expect(doc.arrayField).to.exist; - // expect(doc.arrayField).to.have.length(5); - // expect(doc.arrayField[1]).to.be.equal("inside"); - // expect(doc.arrayField[4]).to.be.equal("newly"); - // expect(doc.unexistingArray).to.exist; - // expect(doc.unexistingArray).to.have.length(2); - // expect(doc.unexistingArray[1]).to.be.equal("second"); - - // }); - - // it("should update with the $pop operator", function() { - // var coll = db.collection("FIELD_OP"); - - // var selector = { - // stringField: "array_op" - // }; - // var update = { - // $pop: { - // arrayField: 1 - // } - // }; - - // var updatedInfo = coll.update(selector, update); - - // expectUpdateInfo(null, updatedInfo, 1, 0); - - // update['$pop'].arrayField = -1; - // updatedInfo = coll.update(selector, update); - - // expectUpdateInfo(null, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "array_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("array_op"); - // expect(doc.arrayField).to.exist; - // expect(doc.arrayField).to.have.length(3); - // expect(doc.arrayField[0]).to.not.be.equal("first"); - // expect(doc.arrayField[2]).to.be.equal("last"); - // }); - - // it("should update with the $push operator", function() { - // var coll = db.collection("FIELD_OP"); - - // var selector = { - // stringField: "array_op" - // }; - // var update = { - // $push: { - // arrayField: "added", - // arrayField2: "first" - // } - // }; - - // var updatedInfo = coll.update(selector, update); - - // expectUpdateInfo(null, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "array_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("array_op"); - // expect(doc.arrayField).to.exist; - // expect(doc.arrayField).to.have.length(4); - // expect(doc.arrayField[3]).to.be.equal("added"); - // expect(doc.arrayField2).to.exist; - // expect(doc.arrayField2).to.have.length(1); - // expect(doc.arrayField2[0]).to.be.equal("first"); - // }); - - // it("should update with the $pushAll operator", function() { // TODO Change, as is deprecated in MongoDB 2.4+ - // var coll = db.collection("FIELD_OP"); - - // var selector = { - // stringField: "array_op" - // }; - // var update = { - // $pushAll: { - // arrayField2: ["second", "third", "ot99her", "some99thing", "last"], - // addedArray: ["new"] - // } - // }; - - // var updatedInfo = coll.update(selector, update); - - // expectUpdateInfo(null, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "array_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("array_op"); - // expect(doc.arrayField).to.exist; - // expect(doc.arrayField2).to.exist; - // expect(doc.arrayField2).to.have.length(6); - // expect(doc.arrayField2[0]).to.be.equal("first"); - // expect(doc.arrayField2[1]).to.be.equal("second"); - // expect(doc.arrayField2[2]).to.be.equal("third"); - // expect(doc.arrayField2[5]).to.be.equal("last"); - // expect(doc.addedArray).to.exist; - // expect(doc.addedArray).to.have.length(1); - // expect(doc.addedArray[0]).to.be.equal("new"); - // }); - - // it("should update with the $pull operator", function() { - // var coll = db.collection("FIELD_OP"); - - // var selector = { - // stringField: "array_op" - // }; - // var update = { - // $pull: { - // arrayField: "first", - // arrayField2: { - // $regex: /^[\D][a-z]+[\d]+[a-z]+$/, - // $options: 'ig' - // } - // } - // }; - - // var updatedInfo = coll.update(selector, update); - - // expectUpdateInfo(null, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "array_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("array_op"); - // expect(doc.arrayField).to.exist; - // expect(doc.arrayField).to.have.length(4); - // expect(doc.arrayField2).to.exist; - // expect(doc.arrayField2).to.have.length(4); - // expect(doc.arrayField2[0]).to.be.equal("first"); - // expect(doc.arrayField2[1]).to.be.equal("second"); - // expect(doc.arrayField2[2]).to.be.equal("third"); - // expect(doc.arrayField2[3]).to.be.equal("last"); - // }); - - // it("should update with the $pullAll operator", function() { - // var coll = db.collection("FIELD_OP"); - - // var selector = { - // stringField: "array_op" - // }; - // var update = { - // $pullAll: { - // arrayField2: ["first", "last"] - // } - // }; - - // var updatedInfo = coll.update(selector, update); - - // expectUpdateInfo(null, updatedInfo, 1, 0); - - // var doc = coll.findOne({stringField: "array_op"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("array_op"); - // expect(doc.arrayField).to.exist; - // expect(doc.arrayField).to.have.length(4); - // expect(doc.arrayField2).to.exist; - // expect(doc.arrayField2).to.have.length(2); - // expect(doc.arrayField2[0]).to.not.be.equal("first"); - // expect(doc.arrayField2[1]).to.not.be.equal("last"); - // }); - // }); - - // describe.skip("- Bitwise Update Operators", function() { - // it("should update with the $bit operator", function() { - - // }); - // }); - - // describe.skip("- Isolation Update Operators", function() { - // it("should update with the $isolated operator", function() { - - // }); - // }); - // }); + + describe("#Match", function() { + it("should be able to match documents", function() { + var coll = db.collection("coll_match_1"); - // it("should be able to use upsert a document", function() { - // var coll = db.collection(TEST_COLL); - - // var updatedInfo = coll.update( - // { - // stringField: "noope" - // }, { - // stringField: "yees", - // numberField: 2 - // }, { - // upsert: true - // } - // ); - - // expect(updatedInfo).to.exist; - // expect(updatedInfo.updated).to.exist; - // expect(updatedInfo.inserted).to.exist; - - // expect(updatedInfo.updated.documents).to.not.exist; - // expect(updatedInfo.updated.count).to.be.equal(0); - - // expect(updatedInfo.inserted.documents).to.be.instanceof(Array); - // expect(updatedInfo.inserted.count).to.be.equal(1); - - // var created = updatedInfo.inserted.documents[0]; - - // expect(created).to.exist; - - // expect(created.stringField).to.be.equal("yees"); - // expect(created.numberField).to.be.equal(2); - - // var doc = coll.findOne({stringField: "yees"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("yees"); - // expect(doc.numberField).to.be.equal(2); - // }); + coll.insert({ + _id: 1111, + name: 'eeee', + age: 22 + }, {chain: true}) + .insert({ + _id: 1112, + name: 'dddd', + age: 23 + }, {chain: true}) + .insert({ + _id: 1113, + name: 'cccc', + age: 22 + }, {chain: true}) + .insert({ + _id: 1114, + name: 'bbbb', + age: 25 + }, {chain: true}) + .insert({ + _id: 1115, + name: 'aaaa', + age: 23 + }); - // it("should be able to update several documents", function() { - // var coll = db.collection(TEST_COLL); - - // // add _id - // var updatedInfo = coll.update( - // { - // stringField: /^ye+s$/ig - // }, { - // numberField: 9 - // }, { - // multi: true - // } - // ); - - // expect(updatedInfo).to.exist; - // expect(updatedInfo.updated).to.exist; - // expect(updatedInfo.inserted).to.exist; - - // expect(updatedInfo.updated.documents).to.be.instanceof(Array); - // expect(updatedInfo.updated.count).to.be.equal(2); - - // expect(updatedInfo.inserted.documents).to.not.exist; - // expect(updatedInfo.inserted.count).to.be.equal(0); - - // var updated1 = updatedInfo.updated.documents[0]; - // var updated2 = updatedInfo.updated.documents[1]; - - // expect(updated1.stringField).to.be.equal("yes"); - // expect(updated1.numberField).to.be.equal(9); - - // expect(updated2.stringField).to.be.equal("yees"); - // expect(updated2.numberField).to.be.equal(9); - - // var cursor = coll.find({numberField: 9}); - - // expect(cursor.count()).to.be.equal(2); - // }); + var docs = coll.aggregate([{ + $match: { + age: { + $gte: 23 + } + } + }]); - // it("should be able to override a document", function() { - // var coll = db.collection(TEST_COLL); - - // // add _id - // var updatedInfo = coll.update( - // { - // stringField: "yees" - // }, { - // numberField: 10, - // booleanField: true, - // $inc: { - // numberField: 1 - // } - // }, { - // override: true - // } - // ); - - // expect(updatedInfo).to.exist; - // expect(updatedInfo.updated).to.exist; - // expect(updatedInfo.inserted).to.exist; - - // expect(updatedInfo.updated.documents).to.be.instanceof(Array); - // expect(updatedInfo.updated.count).to.be.equal(1); - - // expect(updatedInfo.inserted.documents).to.not.exist; - // expect(updatedInfo.inserted.count).to.be.equal(0); - - // var updated = updatedInfo.updated.documents[0]; - - // expect(updated.stringField).to.not.exist; - // expect(updated.numberField).to.be.equal(10); - // expect(updated.booleanField).to.be.true; - - // var cursor = coll.find({numberField: 10}); - - // expect(cursor.count()).to.be.equal(1); - // }); + console.log(docs); - // it.skip("should be able to update as MongoDB does", function() { - // var coll = db.collection(TEST_COLL); - - // var updatedInfo = coll.update( - // { - // stringField: "yes" - // }, { - // $inc: { - // numberField: 2 - // } - // }, { - // updateAsMongo: true - // } - // ); - - // expect(updatedInfo).to.exist; - // expect(updatedInfo.updated).to.exist; - // expect(updatedInfo.inserted).to.exist; - - // expect(updatedInfo.updated.documents).to.be.instanceof(Array); - // expect(updatedInfo.updated.count).to.be.equal(1); - - // expect(updatedInfo.inserted.documents).to.not.exist; - // expect(updatedInfo.inserted.count).to.be.equal(0); - - // var updated = updatedInfo.updated.documents[0]; - - // expect(updated).to.exist; - - // expect(updated.stringField).to.be.equal("yes"); - // expect(updated.numberField).to.be.equal(3); - - // var doc = coll.findOne({stringField: "yes"}); - - // expect(doc).to.exist; - - // expect(doc.stringField).to.be.equal("yes"); - // expect(doc.numberField).to.be.equal(3); - // }); - // }); - - // describe(" - Delete", function() { - // it("should be able to remove a document", function(done) { - // var coll = db.collection(TEST_COLL); - - // var removed = coll.remove({stringField: "yes"}); - - // expect(removed).to.exist; - // expect(removed).to.be.instanceof(Array); - - // expect(removed).to.be.have.length(1); - // expect(removed[0].stringField).to.be.equal("yes"); - - // var doc = coll.findOne({stringField: "yes"}); - - // expect(doc).to.not.exist; - - // // Remove by _id - // coll.delete(TEST_DOC._id, function(error, removed) { - // expect(error).to.not.exist; - // expect(removed).to.exist; - - // expect(removed).to.be.instanceof(Array); - - // expect(removed).to.be.have.length(0); - - // done(); - // }); - // }); + expect(docs).to.exist; + expect(docs).to.be.instanceof(Array); + expect(docs).to.have.length(3); + }); + }); + + describe("#Sort", function() { + it("should be able to sort documents", function() { + var coll = db.collection("coll_sort_1"); - // it("should be able to remove all documents", function(done) { - // var coll = db.collection(TEST_COLL); - - // coll.destroy(function (error, removed) { - // expect(error).to.not.exist; - // expect(removed).to.exist; - - // expect(removed).to.be.true; - - // var doc = coll.findOne({stringField: "yes"}); - - // expect(doc).to.not.exist; - - // done(); - // }); - // }); + coll.insert({ + _id: 1111, + name: 'eeee', + age: 22 + }, {chain: true}) + .insert({ + _id: 1112, + name: 'dddd', + age: 23 + }, {chain: true}) + .insert({ + _id: 1113, + name: 'cccc', + age: 22 + }, {chain: true}) + .insert({ + _id: 1114, + name: 'bbbb', + age: 25 + }, {chain: true}) + .insert({ + _id: 1115, + name: 'aaaa', + age: 23 + }); - // it("should be able to drop the collection", function(done) { - // var coll = db.collection(TEST_COLL); - - // coll.drop(function (error, removed) { - // expect(error).to.not.exist; - // expect(removed).to.exist; - - // expect(removed).to.be.true; - - // var doc = coll.findOne({stringField: "yes"}); - - // expect(doc).to.not.exist; - - // done(); - // }); - // }); - // }); - // }); - - describe("#Backups", function() { - var ID = null; - - before(function() { - if (db) db.dropDatabase(); + var docs = coll.aggregate([{ + $sort: { + age: -1 + } + }]); - db = new MongoPortable("BACKUPS"); + console.log(docs); - db.collection("pruebas") - .insert({ stringField: "first" }, { chain: true }) - .insert({ stringField: "second" }, { chain: true }) - .insert({ stringField: "third" }, { chain: true }) - .insert({ stringField: "fourth" }); + expect(docs).to.exist; + expect(docs).to.be.instanceof(Array); + expect(docs).to.have.length(5); }); - - describe("#Backups", function() { - it("should create a new backup", function(done) { - var coll = db.collection("pruebas"); - - var snapshot = coll.backup("FIRST"); - - expect(snapshot).to.exist; - - expect(snapshot.backupID).to.exist; - expect(snapshot.documents).to.exist; - - expect(snapshot.backupID).to.be.equal("FIRST"); - expect(snapshot.documents).to.be.instanceof(Array); - expect(snapshot.documents).to.have.length(4); - - coll.insert({ stringField: "new" }); - - coll.backup(function(error, snapshot) { - expect(snapshot.backupID).to.exist; - expect(snapshot.documents).to.exist; - - expect(snapshot.documents).to.be.instanceof(Array); - expect(snapshot.documents).to.have.length(5); - - ID = snapshot.backupID; - - done(); - }); - }); + }); + + describe("#Mixed", function() { + it("should be able to aggregate several stages", function() { + var coll = db.collection("coll_mixed_1"); - it("should retrieve all backups", function() { - var coll = db.collection("pruebas"); - - var snapshots = coll.backups(); - - expect(snapshots).to.exist; - - expect(snapshots).to.be.instanceof(Array); - expect(snapshots).to.have.length(2); - - expect(snapshots[0].id).to.be.equal("FIRST"); - expect(snapshots[0].documents).to.be.instanceof(Array); - expect(snapshots[0].documents).to.have.length(4); - - expect(snapshots[1].documents).to.be.instanceof(Array); - expect(snapshots[1].documents).to.have.length(5); + coll.insert({ + _id: 1111, + name: 'eeee', + age: 22 + }, {chain: true}) + .insert({ + _id: 1112, + name: 'dddd', + age: 23 + }, {chain: true}) + .insert({ + _id: 1113, + name: 'cccc', + age: 22 + }, {chain: true}) + .insert({ + _id: 1114, + name: 'bbbb', + age: 25 + }, {chain: true}) + .insert({ + _id: 1115, + name: 'aaaa', + age: 23 + }, {chain: true}) + .insert({ + _id: 1115, + name: 'abab', + age: 22 }); - it("should restore a backup", function() { - var coll = db.collection("pruebas"); - - expect(coll.find().count()).to.be.equal(5); - - // By backupID - var cursor = coll.restore("FIRST").find(); - - expect(cursor.count()).to.be.equal(4); - }); + var docs = coll.aggregate([{ + $match: { + age: { + $lt: 25 + } + } + }, { + $group: { + _id: "$age", + total: { + $sum: 1 + } + } + }, { + $sort: { + total: -1 + } + }]); - it("should remove a backup", function() { - var coll = db.collection("pruebas"); - - var removed = coll.removeBackup(ID); - - expect(removed).to.exist; - expect(removed).to.be.equal(ID); - - var snapshots = coll.backups(); - - expect(snapshots).to.exist; - - expect(snapshots).to.be.instanceof(Array); - expect(snapshots).to.have.length(1); - }); + console.log(docs); - it("should restore the only backup", function() { - var coll = db.collection("pruebas"); - - expect(coll.find().count()).to.be.equal(4); - - // By backupID - var cursor = coll.restore(function(error) { - expect(error).to.not.exist; - }).find(); - - expect(cursor.count()).to.be.equal(4); - }); + expect(docs).to.exist; + expect(docs).to.be.instanceof(Array); + expect(docs).to.have.length(2); - it("should drop all the backups", function(done) { - var coll = db.collection("pruebas"); - - coll.removeBackup(function(error, removed) { - expect(error).to.not.exist; - expect(removed).to.be.true; - - done(); - }); - }); + expect(docs[0]).to.be.eql({ _id: 22, total: 3 }); + expect(docs[1]).to.be.eql({ _id: 23, total: 2 }); }); }); }); \ No newline at end of file