diff --git a/CHANGELOG.md b/CHANGELOG.md index c5cac292..05866817 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* [[`f5c9f6a363`](https://github.com/StoneCypher/jssm/commit/f5c9f6a363)] - all the attributes are now parsed (John Haugeland) * [[`631c5c6e6c`](https://github.com/StoneCypher/jssm/commit/631c5c6e6c)] - 5.5.0 comment fixes and minor trash (John Haugeland) * [[`25a9bb8391`](https://github.com/StoneCypher/jssm/commit/25a9bb8391)] - comment testing (John Haugeland) * [[`124c2654c7`](https://github.com/StoneCypher/jssm/commit/124c2654c7)] - Merge pull request #304 from msmorgan/bugfix/comment-grammar (John Haugeland) diff --git a/build/jssm.es5.cjs.js b/build/jssm.es5.cjs.js index 8f9ce554..6b78dcba 100644 --- a/build/jssm.es5.cjs.js +++ b/build/jssm.es5.cjs.js @@ -578,7 +578,8 @@ var Machine = function () { } var wstate_to = wstate.to, - wtf = wstate_to.map(function (ws) { + wtf // wstate_to_filtered -> wtf + = wstate_to.map(function (ws) { return _this2.lookup_transition_for(_this2.state(), ws); }).filter(Boolean); diff --git a/build/jssm.es5.js b/build/jssm.es5.js index 0a20f4b5..f5030af1 100644 --- a/build/jssm.es5.js +++ b/build/jssm.es5.js @@ -501,7 +501,8 @@ var Machine = function () { } var wstate_to = wstate.to, - wtf = wstate_to.map(function (ws) { + wtf // wstate_to_filtered -> wtf + = wstate_to.map(function (ws) { return _this2.lookup_transition_for(_this2.state(), ws); }).filter(Boolean); @@ -799,4 +800,4 @@ exports.weighted_rand_select = _jssmUtil.weighted_rand_select; exports.histograph = _jssmUtil.histograph; exports.weighted_sample_select = _jssmUtil.weighted_sample_select; exports.weighted_histo_key = _jssmUtil.weighted_histo_key; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9qcy9qc3NtLmpzIl0sIm5hbWVzIjpbInBhcnNlIiwicmVxdWlyZSIsInZlcnNpb24iLCJhcnJvd19kaXJlY3Rpb24iLCJhcnJvdyIsIlN0cmluZyIsIkVycm9yIiwiYXJyb3dfbGVmdF9raW5kIiwiYXJyb3dfcmlnaHRfa2luZCIsImNvbXBpbGVfcnVsZV90cmFuc2l0aW9uX3N0ZXAiLCJhY2MiLCJmcm9tIiwidG8iLCJ0aGlzX3NlIiwibmV4dF9zZSIsImVkZ2VzIiwidUZyb20iLCJBcnJheSIsImlzQXJyYXkiLCJ1VG8iLCJtYXAiLCJmIiwidCIsInJrIiwia2luZCIsImxrIiwicmlnaHQiLCJmb3JjZWRfb25seSIsIm1haW5fcGF0aCIsInJfYWN0aW9uIiwiYWN0aW9uIiwicl9wcm9iYWJpbGl0eSIsInByb2JhYmlsaXR5IiwicHVzaCIsImxlZnQiLCJsX2FjdGlvbiIsImxfcHJvYmFiaWxpdHkiLCJuZXdfYWNjIiwiY29uY2F0Iiwic2UiLCJjb21waWxlX3J1bGVfaGFuZGxlX3RyYW5zaXRpb24iLCJydWxlIiwiY29tcGlsZV9ydWxlX2hhbmRsZXIiLCJrZXkiLCJhZ2dfYXMiLCJ2YWwiLCJ0YXV0b2xvZ2llcyIsImluY2x1ZGVzIiwidmFsdWUiLCJKU09OIiwic3RyaW5naWZ5IiwiY29tcGlsZSIsInRyZWUiLCJyZXN1bHRzIiwiZ3JhcGhfbGF5b3V0IiwidHJhbnNpdGlvbiIsInN0YXJ0X3N0YXRlcyIsImVuZF9zdGF0ZXMiLCJmc2xfdmVyc2lvbiIsIm1hY2hpbmVfYXV0aG9yIiwibWFjaGluZV9jb21tZW50IiwibWFjaGluZV9jb250cmlidXRvciIsIm1hY2hpbmVfZGVmaW5pdGlvbiIsIm1hY2hpbmVfbGljZW5zZSIsIm1hY2hpbmVfbmFtZSIsIm1hY2hpbmVfdmVyc2lvbiIsInRyIiwiYXNzZW1ibGVkX3RyYW5zaXRpb25zIiwicmVzdWx0X2NmZyIsImxlbmd0aCIsInRyYW5zaXRpb25zIiwib25lT25seUtleXMiLCJvbmVPbmx5S2V5IiwibXVsdGlLZXkiLCJtYWtlIiwicGxhbiIsIk1hY2hpbmUiLCJjb21wbGV0ZSIsIl9zdGF0ZSIsIl9zdGF0ZXMiLCJNYXAiLCJfZWRnZXMiLCJfZWRnZV9tYXAiLCJfbmFtZWRfdHJhbnNpdGlvbnMiLCJfYWN0aW9ucyIsIl9yZXZlcnNlX2FjdGlvbnMiLCJfcmV2ZXJzZV9hY3Rpb25fdGFyZ2V0cyIsIl9ncmFwaF9sYXlvdXQiLCJ1bmRlZmluZWQiLCJjdXJzb3JfZnJvbSIsImdldCIsIm5hbWUiLCJoYXMiLCJfbmV3X3N0YXRlIiwiY3Vyc29yX3RvIiwidGhpc0VkZ2VJZCIsInNldCIsImZyb21fbWFwcGluZyIsImFjdGlvbk1hcCIsInJBY3Rpb25NYXAiLCJzdGF0ZV9jb25maWciLCJ3aGljaFN0YXRlIiwic3RhdGVfaXNfdGVybWluYWwiLCJzdGF0ZV9pc19jb21wbGV0ZSIsInN0YXRlX2lzX2ZpbmFsIiwic3RhdGUiLCJpbnRlcm5hbF9zdGF0ZV9pbXBsX3ZlcnNpb24iLCJhY3Rpb25zIiwiZWRnZV9tYXAiLCJuYW1lZF90cmFuc2l0aW9ucyIsInJldmVyc2VfYWN0aW9ucyIsInN0YXRlcyIsImtleXMiLCJlbWciLCJpZCIsImdldF90cmFuc2l0aW9uX2J5X3N0YXRlX25hbWVzIiwiZW50cmFuY2VzIiwibGlzdF9lbnRyYW5jZXMiLCJleGl0cyIsImxpc3RfZXhpdHMiLCJ3c3RhdGUiLCJ3c3RhdGVfdG8iLCJ3dGYiLCJ3cyIsImxvb2t1cF90cmFuc2l0aW9uX2ZvciIsImZpbHRlciIsIkJvb2xlYW4iLCJzZWxlY3RlZCIsInByb2JhYmxlX2V4aXRzX2ZvciIsIm4iLCJzdGF0ZV93YXMiLCJwcm9iYWJpbGlzdGljX3RyYW5zaXRpb24iLCJwcm9iYWJpbGlzdGljX3dhbGsiLCJyYV9iYXNlIiwidmFsdWVzIiwiZWRnZUlkIiwibyIsImZpbHRlcmVkIiwic29tZSIsIngiLCJpc191bmVudGVyYWJsZSIsIm5ld0RhdGEiLCJ2YWxpZF9hY3Rpb24iLCJlZGdlIiwiY3VycmVudF9hY3Rpb25fZWRnZV9mb3IiLCJuZXdTdGF0ZSIsInZhbGlkX3RyYW5zaXRpb24iLCJ2YWxpZF9mb3JjZV90cmFuc2l0aW9uIiwiYWN0aW9uX2Jhc2UiLCJpZHgiLCJjdXJyZW50X2FjdGlvbl9mb3IiLCJfbmV3RGF0YSIsInRyYW5zaXRpb25fZm9yIiwic20iLCJ0ZW1wbGF0ZV9zdHJpbmdzIiwicmVkdWNlIiwic2VxIiwid2VpZ2h0ZWRfcmFuZF9zZWxlY3QiLCJoaXN0b2dyYXBoIiwid2VpZ2h0ZWRfc2FtcGxlX3NlbGVjdCIsIndlaWdodGVkX2hpc3RvX2tleSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBcUJBOzs7Ozs7QUFwQkE7O0FBc0JBLElBQU1BLFFBQWdEQyxRQUFRLGVBQVIsRUFBeUJELEtBQS9FLEMsQ0FBdUY7O0FBRXZGLElBQU1FLFVBQWlCLElBQXZCLEMsQ0FBNkI7OztBQU03QixTQUFTQyxlQUFULENBQXlCQyxLQUF6QixFQUFpRTs7QUFFL0QsVUFBU0MsT0FBT0QsS0FBUCxDQUFUOztBQUVFLFNBQUssSUFBTCxDQUFhLEtBQUssSUFBTCxDQUFjLEtBQUssSUFBTDtBQUN6QixhQUFPLE9BQVA7O0FBRUYsU0FBSyxJQUFMLENBQWEsS0FBSyxJQUFMLENBQWMsS0FBSyxJQUFMO0FBQ3pCLGFBQU8sTUFBUDs7QUFFRixTQUFLLEtBQUwsQ0FBYSxLQUFLLE1BQUwsQ0FBYyxLQUFLLE1BQUw7QUFDM0IsU0FBSyxLQUFMLENBQWEsS0FBSyxNQUFMLENBQWMsS0FBSyxNQUFMO0FBQzNCLFNBQUssS0FBTCxDQUFhLEtBQUssTUFBTCxDQUFjLEtBQUssTUFBTDtBQUN6QixhQUFPLE1BQVA7O0FBRUY7QUFDRSxZQUFNLElBQUlFLEtBQUosMENBQWlERixLQUFqRCxDQUFOOztBQWRKO0FBa0JEOztBQU1ELFNBQVNHLGVBQVQsQ0FBeUJILEtBQXpCLEVBQTREOztBQUUxRCxVQUFTQyxPQUFPRCxLQUFQLENBQVQ7O0FBRUUsU0FBSyxJQUFMLENBQVksS0FBSyxJQUFMLENBQWEsS0FBSyxJQUFMO0FBQ3ZCLGFB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QTs7QUFFQSxTQUFPLElBQUk5RSxPQUFKLENBQVlGLEtBQUtnRixpQkFBaUJDLE1BQWpCOztBQUV0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxZQUFDakosR0FBRCxFQUFNbUMsR0FBTixFQUFXd0csR0FBWDtBQUFBLGdCQUErQjNJLEdBQS9CLEdBQXFDLFdBQVUySSxHQUFWLENBQXJDLEdBQXNEeEcsR0FBdEQ7QUFBQSxHQVBzQixDQU91QztBQUM3RDtBQUNBOztBQVRzQixHQUFMLENBQVosQ0FBUDtBQWFIOztRQVFDM0MsTyxHQUFBQSxPO1FBRUEwRSxPLEdBQUFBLE87UUFFQUYsSSxHQUFBQSxJO1FBQ0UxRSxLLEdBQUFBLEs7UUFDQW1ELE8sR0FBQUEsTztRQUVGc0csRSxHQUFBQSxFO1FBRUF0SixlLEdBQUFBLGU7UUFDQUksZSxHQUFBQSxlO1FBQ0FDLGdCLEdBQUFBLGdCO1FBR0FvSixHO1FBQUtDLG9CO1FBQXNCQyxVO1FBQVlDLHNCO1FBQXdCQyxrQiIsImZpbGUiOiJqc3NtLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyB3aGFyZ2FyYmwgbG90cyBvZiB0aGVzZSByZXR1cm4gYXJyYXlzIGNvdWxkL3Nob3VsZCBiZSBzZXRzXG5cbi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtcblxuICBKc3NtR2VuZXJpY1N0YXRlLCBKc3NtR2VuZXJpY0NvbmZpZyxcbiAgSnNzbVRyYW5zaXRpb24sIEpzc21UcmFuc2l0aW9uTGlzdCxcbiAgSnNzbU1hY2hpbmVJbnRlcm5hbFN0YXRlLFxuICBKc3NtUGFyc2VUcmVlLFxuICBKc3NtQ29tcGlsZVNlLCBKc3NtQ29tcGlsZVNlU3RhcnQsIEpzc21Db21waWxlUnVsZSxcbiAgSnNzbUFycm93LCBKc3NtQXJyb3dEaXJlY3Rpb24sIEpzc21BcnJvd0tpbmQsXG4gIEpzc21MYXlvdXRcblxufSBmcm9tICcuL2pzc20tdHlwZXMnO1xuXG5cblxuXG5cbmltcG9ydCB7IHNlcSwgd2VpZ2h0ZWRfcmFuZF9zZWxlY3QsIHdlaWdodGVkX3NhbXBsZV9zZWxlY3QsIGhpc3RvZ3JhcGgsIHdlaWdodGVkX2hpc3RvX2tleSB9IGZyb20gJy4vanNzbS11dGlsLmpzJztcblxuY29uc3QgcGFyc2UgOiA8TlQsIERUPihzdHJpbmcpID0+IEpzc21QYXJzZVRyZWU8TlQ+ID0gcmVxdWlyZSgnLi9qc3NtLWRvdC5qcycpLnBhcnNlOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmbG93dHlwZS9uby13ZWFrLXR5cGVzIC8vIHRvZG8gd2hhcmdhcmJsIHJlbW92ZSBhbnlcblxuY29uc3QgdmVyc2lvbiA6IG51bGwgPSBudWxsOyAvLyByZXBsYWNlZCBmcm9tIHBhY2thZ2UuanMgaW4gYnVpbGRcblxuXG5cblxuXG5mdW5jdGlvbiBhcnJvd19kaXJlY3Rpb24oYXJyb3cgOiBKc3NtQXJyb3cpIDogSnNzbUFycm93RGlyZWN0aW9uIHtcblxuICBzd2l0Y2ggKCBTdHJpbmcoYXJyb3cpICkge1xuXG4gICAgY2FzZSAnLT4nIDogIGNhc2UgJz0+JyAgOiAgY2FzZSAnfj4nICA6XG4gICAgICByZXR1cm4gJ3JpZ2h0JztcblxuICAgIGNhc2UgJzwtJyA6ICBjYXNlICc8PScgIDogIGNhc2UgJzx+JyAgOlxuICAgICAgcmV0dXJuICdsZWZ0JztcblxuICAgIGNhc2UgJzwtPic6ICBjYXNlICc8LT0+JzogIGNhc2UgJzwtfj4nOlxuICAgIGNhc2UgJzw9Pic6ICBjYXNlICc8PS0+JzogIGNhc2UgJzw9fj4nOlxuICAgIGNhc2UgJzx+Pic6ICBjYXNlICc8fi0+JzogIGNhc2UgJzx+PT4nOlxuICAgICAgcmV0dXJuICdib3RoJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFycm93X2RpcmVjdGlvbjogdW5rbm93biBhcnJvdyB0eXBlICR7YXJyb3d9YCk7XG5cbiAgfVxuXG59XG5cblxuXG5cblxuZnVuY3Rpb24gYXJyb3dfbGVmdF9raW5kKGFycm93IDogSnNzbUFycm93KSA6IEpzc21BcnJvd0tpbmQge1xuXG4gIHN3aXRjaCAoIFN0cmluZyhhcnJvdykgKSB7XG5cbiAgICBjYXNlICctPic6ICBjYXNlICc9PicgOiAgY2FzZSAnfj4nOlxuICAgICAgcmV0dXJuICdub25lJztcblxuICAgIGNhc2UgJzwtJzogIGNhc2UgJzwtPic6ICBjYXNlICc8LT0+JzogIGNhc2UgJzwtfj4nOlxuICAgICAgcmV0dXJuICdsZWdhbCc7XG5cbiAgICBjYXNlICc8PSc6ICBjYXNlICc8PT4nOiAgY2FzZSAnPD0tPic6ICBjYXNlICc8PX4+JzpcbiAgICAgIHJldHVybiAnbWFpbic7XG5cbiAgICBjYXNlICc8fic6ICBjYXNlICc8fj4nOiAgY2FzZSAnPH4tPic6ICBjYXNlICc8fj0+JzpcbiAgICAgIHJldHVybiAnZm9yY2VkJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGFycm93X2RpcmVjdGlvbjogdW5rbm93biBhcnJvdyB0eXBlICR7YXJyb3d9YCk7XG5cbiAgfVxuXG59XG5cblxuXG5cblxuZnVuY3Rpb24gYXJyb3dfcmlnaHRfa2luZChhcnJvdyA6IEpzc21BcnJvdykgOiBKc3NtQXJyb3dLaW5kIHtcblxuICBzd2l0Y2ggKCBTdHJpbmcoYXJyb3cpICkge1xuXG4gICAgY2FzZSAnPC0nOiAgY2FzZSAnPD0nIDogIGNhc2UgJzx+JzpcbiAgICAgIHJldHVybiAnbm9uZSc7XG5cbiAgICBjYXNlICctPic6ICBjYXNlICc8LT4nOiAgY2FzZSAnPD0tPic6ICBjYXNlICc8fi0+JzpcbiAgICAgIHJldHVybiAnbGVnYWwnO1xuXG4gICAgY2FzZSAnPT4nOiAgY2FzZSAnPD0+JzogIGNhc2UgJzwtPT4nOiAgY2FzZSAnPH49Pic6XG4gICAgICByZXR1cm4gJ21haW4nO1xuXG4gICAgY2FzZSAnfj4nOiAgY2FzZSAnPH4+JzogIGNhc2UgJzwtfj4nOiAgY2FzZSAnPD1+Pic6XG4gICAgICByZXR1cm4gJ2ZvcmNlZCc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhcnJvd19kaXJlY3Rpb246IHVua25vd24gYXJyb3cgdHlwZSAke2Fycm93fWApO1xuXG4gIH1cblxufVxuXG5cblxuXG5cbmZ1bmN0aW9uIGNvbXBpbGVfcnVsZV90cmFuc2l0aW9uX3N0ZXA8bU5ULCBtRFQ+KFxuICAgICAgICAgICAgIGFjYyAgICAgOiBBcnJheTwgSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID4sXG4gICAgICAgICAgICAgZnJvbSAgICA6IG1OVCxcbiAgICAgICAgICAgICB0byAgICAgIDogbU5ULFxuICAgICAgICAgICAgIHRoaXNfc2UgOiBKc3NtQ29tcGlsZVNlPG1OVD4sXG4gICAgICAgICAgICAgbmV4dF9zZSA6IEpzc21Db21waWxlU2U8bU5UPlxuICAgICAgICAgKSA6IEFycmF5PCBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPiB7IC8vIHRvZG8gZmxvdyBkZXNjcmliZSB0aGUgcGFyc2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNpdGlvbiBzdGVwIGV4dGVuc2lvblxuXG4gIGNvbnN0IGVkZ2VzIDogQXJyYXk8IEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPiA+ID0gW107XG5cbiAgY29uc3QgdUZyb20gOiBBcnJheTwgbU5UID4gPSAoQXJyYXkuaXNBcnJheShmcm9tKT8gZnJvbSA6IFtmcm9tXSksXG4gICAgICAgIHVUbyAgIDogQXJyYXk8IG1OVCA+ID0gKEFycmF5LmlzQXJyYXkodG8pPyAgIHRvICAgOiBbdG9dICApO1xuXG4gIHVGcm9tLm1hcCggKGY6bU5UKSA9PiB7XG4gICAgdVRvLm1hcCggKHQ6bU5UKSA9PiB7XG5cbiAgICAgIGNvbnN0IHJrIDogSnNzbUFycm93S2luZCA9IGFycm93X3JpZ2h0X2tpbmQodGhpc19zZS5raW5kKSxcbiAgICAgICAgICAgIGxrIDogSnNzbUFycm93S2luZCA9IGFycm93X2xlZnRfa2luZCh0aGlzX3NlLmtpbmQpO1xuXG5cbiAgICAgIGNvbnN0IHJpZ2h0IDogSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID0ge1xuICAgICAgICBmcm9tICAgICAgICA6IGYsXG4gICAgICAgIHRvICAgICAgICAgIDogdCxcbiAgICAgICAga2luZCAgICAgICAgOiByayxcbiAgICAgICAgZm9yY2VkX29ubHkgOiByayA9PT0gJ2ZvcmNlZCcsXG4gICAgICAgIG1haW5fcGF0aCAgIDogcmsgPT09ICdtYWluJ1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXNfc2Uucl9hY3Rpb24pICAgICAgeyByaWdodC5hY3Rpb24gICAgICA9IHRoaXNfc2Uucl9hY3Rpb247ICAgICAgfVxuICAgICAgaWYgKHRoaXNfc2Uucl9wcm9iYWJpbGl0eSkgeyByaWdodC5wcm9iYWJpbGl0eSA9IHRoaXNfc2Uucl9wcm9iYWJpbGl0eTsgfVxuICAgICAgaWYgKHJpZ2h0LmtpbmQgIT09ICdub25lJykgeyBlZGdlcy5wdXNoKHJpZ2h0KTsgfVxuXG5cbiAgICAgIGNvbnN0IGxlZnQgOiBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPSB7XG4gICAgICAgIGZyb20gICAgICAgIDogdCxcbiAgICAgICAgdG8gICAgICAgICAgOiBmLFxuICAgICAgICBraW5kICAgICAgICA6IGxrLFxuICAgICAgICBmb3JjZWRfb25seSA6IGxrID09PSAnZm9yY2VkJyxcbiAgICAgICAgbWFpbl9wYXRoICAgOiBsayA9PT0gJ21haW4nXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpc19zZS5sX2FjdGlvbikgICAgICB7IGxlZnQuYWN0aW9uICAgICAgPSB0aGlzX3NlLmxfYWN0aW9uOyAgICAgIH1cbiAgICAgIGlmICh0aGlzX3NlLmxfcHJvYmFiaWxpdHkpIHsgbGVmdC5wcm9iYWJpbGl0eSA9IHRoaXNfc2UubF9wcm9iYWJpbGl0eTsgfVxuICAgICAgaWYgKGxlZnQua2luZCAhPT0gJ25vbmUnKSAgeyBlZGdlcy5wdXNoKGxlZnQpOyB9XG5cbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgbmV3X2FjYyA6IEFycmF5PCBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPiA9IGFjYy5jb25jYXQoZWRnZXMpO1xuXG4gIGlmIChuZXh0X3NlKSB7XG4gICAgcmV0dXJuIGNvbXBpbGVfcnVsZV90cmFuc2l0aW9uX3N0ZXAobmV3X2FjYywgdG8sIG5leHRfc2UudG8sIG5leHRfc2UsIG5leHRfc2Uuc2UpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXdfYWNjO1xuICB9XG5cbn1cblxuXG5cbmZ1bmN0aW9uIGNvbXBpbGVfcnVsZV9oYW5kbGVfdHJhbnNpdGlvbjxtTlQ+KHJ1bGUgOiBKc3NtQ29tcGlsZVNlU3RhcnQ8bU5UPikgOiBtaXhlZCB7IC8vIHRvZG8gZmxvdyBkZXNjcmliZSB0aGUgcGFyc2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNpdGlvblxuICByZXR1cm4gY29tcGlsZV9ydWxlX3RyYW5zaXRpb25fc3RlcChbXSwgcnVsZS5mcm9tLCBydWxlLnNlLnRvLCBydWxlLnNlLCBydWxlLnNlLnNlKTtcbn1cblxuXG5cbmZ1bmN0aW9uIGNvbXBpbGVfcnVsZV9oYW5kbGVyPG1OVD4ocnVsZSA6IEpzc21Db21waWxlU2VTdGFydDxtTlQ+KSA6IEpzc21Db21waWxlUnVsZSB7IC8vIHRvZG8gZmxvdyBkZXNjcmliZSB0aGUgb3V0cHV0IG9mIHRoZSBwYXJzZXJcblxuICBpZiAocnVsZS5rZXkgPT09ICd0cmFuc2l0aW9uJykgeyByZXR1cm4geyBhZ2dfYXM6ICd0cmFuc2l0aW9uJywgdmFsOiBjb21waWxlX3J1bGVfaGFuZGxlX3RyYW5zaXRpb24ocnVsZSkgfTsgfVxuXG4gIGNvbnN0IHRhdXRvbG9naWVzIDogQXJyYXk8c3RyaW5nPiA9IFtcbiAgICAnZ3JhcGhfbGF5b3V0JywgJ3N0YXJ0X3N0YXRlcycsICdlbmRfc3RhdGVzJywgJ21hY2hpbmVfbmFtZScsICdtYWNoaW5lX3ZlcnNpb24nLFxuICAgICdtYWNoaW5lX2NvbW1lbnQnLCAnbWFjaGluZV9hdXRob3InLCAnbWFjaGluZV9jb250cmlidXRvcicsICdtYWNoaW5lX2RlZmluaXRpb24nLFxuICAgICdtYWNoaW5lX3JlZmVyZW5jZScsICdtYWNoaW5lX2xpY2Vuc2UnLCAnZnNsX3ZlcnNpb24nXG4gIF07XG5cbiAgaWYgKHRhdXRvbG9naWVzLmluY2x1ZGVzKHJ1bGUua2V5KSkge1xuICAgIHJldHVybiB7IGFnZ19hczogcnVsZS5rZXksIHZhbDogcnVsZS52YWx1ZSB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBjb21waWxlX3J1bGVfaGFuZGxlcjogVW5rbm93biBydWxlOiAke0pTT04uc3RyaW5naWZ5KHJ1bGUpfWApO1xuXG59XG5cblxuXG5mdW5jdGlvbiBjb21waWxlPG1OVCwgbURUPih0cmVlIDogSnNzbVBhcnNlVHJlZTxtTlQ+KSA6IEpzc21HZW5lcmljQ29uZmlnPG1OVCwgbURUPiB7ICAvLyB0b2RvIGZsb3cgZGVzY3JpYmUgdGhlIG91dHB1dCBvZiB0aGUgcGFyc2VyXG5cbiAgY29uc3QgcmVzdWx0cyA6IHtcbiAgICBncmFwaF9sYXlvdXQgICAgICAgIDogQXJyYXk8IEpzc21MYXlvdXQgPixcbiAgICB0cmFuc2l0aW9uICAgICAgICAgIDogQXJyYXk8IEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPiA+LFxuICAgIHN0YXJ0X3N0YXRlcyAgICAgICAgOiBBcnJheTwgbU5UID4sXG4gICAgZW5kX3N0YXRlcyAgICAgICAgICA6IEFycmF5PCBtTlQgPixcbiAgICBmc2xfdmVyc2lvbiAgICAgICAgIDogQXJyYXk8IHN0cmluZyA+LFxuICAgIG1hY2hpbmVfYXV0aG9yICAgICAgOiBBcnJheTwgc3RyaW5nID4sXG4gICAgbWFjaGluZV9jb21tZW50ICAgICA6IEFycmF5PCBzdHJpbmcgPixcbiAgICBtYWNoaW5lX2NvbnRyaWJ1dG9yIDogQXJyYXk8IHN0cmluZyA+LFxuICAgIG1hY2hpbmVfZGVmaW5pdGlvbiAgOiBBcnJheTwgc3RyaW5nID4sXG4gICAgbWFjaGluZV9saWNlbnNlICAgICA6IEFycmF5PCBzdHJpbmcgPixcbiAgICBtYWNoaW5lX25hbWUgICAgICAgIDogQXJyYXk8IHN0cmluZyA+LFxuICAgIG1hY2hpbmVfdmVyc2lvbiAgICAgOiBBcnJheTwgc3RyaW5nID4gLy8gc2VtdmVyXG4gIH0gPSB7XG4gICAgZ3JhcGhfbGF5b3V0ICAgICAgICA6IFtdLFxuICAgIHRyYW5zaXRpb24gICAgICAgICAgOiBbXSxcbiAgICBzdGFydF9zdGF0ZXMgICAgICAgIDogW10sXG4gICAgZW5kX3N0YXRlcyAgICAgICAgICA6IFtdLFxuICAgIGZzbF92ZXJzaW9uICAgICAgICAgOiBbXSxcbiAgICBtYWNoaW5lX2F1dGhvciAgICAgIDogW10sXG4gICAgbWFjaGluZV9jb21tZW50ICAgICA6IFtdLFxuICAgIG1hY2hpbmVfY29udHJpYnV0b3IgOiBbXSxcbiAgICBtYWNoaW5lX2RlZmluaXRpb24gIDogW10sXG4gICAgbWFjaGluZV9saWNlbnNlICAgICA6IFtdLFxuICAgIG1hY2hpbmVfbmFtZSAgICAgICAgOiBbXSxcbiAgICBtYWNoaW5lX3ZlcnNpb24gICAgIDogW11cbiAgfTtcblxuICB0cmVlLm1hcCggKHRyIDogSnNzbUNvbXBpbGVTZVN0YXJ0PG1OVD4pID0+IHtcblxuICAgIGNvbnN0IHJ1bGUgICA6IEpzc21Db21waWxlUnVsZSA9IGNvbXBpbGVfcnVsZV9oYW5kbGVyKHRyKSxcbiAgICAgICAgICBhZ2dfYXMgOiBzdHJpbmcgICAgICAgICAgPSBydWxlLmFnZ19hcyxcbiAgICAgICAgICB2YWwgICAgOiBtaXhlZCAgICAgICAgICAgPSBydWxlLnZhbDsgICAgICAgICAgICAgICAgICAvLyB0b2RvIGJldHRlciB0eXBlc1xuXG4gICAgcmVzdWx0c1thZ2dfYXNdID0gcmVzdWx0c1thZ2dfYXNdLmNvbmNhdCh2YWwpO1xuXG4gIH0pO1xuXG4gIGNvbnN0IGFzc2VtYmxlZF90cmFuc2l0aW9ucyA6IEFycmF5PCBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPiA9IFtdLmNvbmNhdCguLi4gcmVzdWx0c1sndHJhbnNpdGlvbiddKTtcblxuICBjb25zdCByZXN1bHRfY2ZnIDogSnNzbUdlbmVyaWNDb25maWc8bU5ULCBtRFQ+ID0ge1xuICAgIHN0YXJ0X3N0YXRlcyA6IHJlc3VsdHMuc3RhcnRfc3RhdGVzLmxlbmd0aD8gcmVzdWx0cy5zdGFydF9zdGF0ZXMgOiBbYXNzZW1ibGVkX3RyYW5zaXRpb25zWzBdLmZyb21dLFxuICAgIHRyYW5zaXRpb25zICA6IGFzc2VtYmxlZF90cmFuc2l0aW9uc1xuICB9O1xuXG4gIGNvbnN0IG9uZU9ubHlLZXlzIDogQXJyYXk8c3RyaW5nPiA9IFtcbiAgICAnZ3JhcGhfbGF5b3V0JywgJ21hY2hpbmVfbmFtZScsICdtYWNoaW5lX3ZlcnNpb24nLCAnbWFjaGluZV9jb21tZW50JywgJ2ZzbF92ZXJzaW9uJywgJ21hY2hpbmVfbGljZW5zZSdcbiAgXTtcblxuICBvbmVPbmx5S2V5cy5tYXAoIChvbmVPbmx5S2V5IDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHJlc3VsdHNbb25lT25seUtleV0ubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXkgb25seSBoYXZlIG9uZSAke29uZU9ubHlLZXl9IHN0YXRlbWVudCBtYXhpbXVtOiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdHNbb25lT25seUtleV0pfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVzdWx0c1tvbmVPbmx5S2V5XS5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0X2NmZ1tvbmVPbmx5S2V5XSA9IHJlc3VsdHNbb25lT25seUtleV1bMF07XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBbJ21hY2hpbmVfYXV0aG9yJ10ubWFwKCAobXVsdGlLZXkgOiBzdHJpbmcpID0+IHtcbiAgICBpZiAocmVzdWx0c1ttdWx0aUtleV0ubGVuZ3RoKSB7XG4gICAgICByZXN1bHRfY2ZnW211bHRpS2V5XSA9IHJlc3VsdHNbbXVsdGlLZXldO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdF9jZmc7XG5cbn1cblxuXG5cbmZ1bmN0aW9uIG1ha2U8bU5ULCBtRFQ+KHBsYW4gOiBzdHJpbmcpIDogSnNzbUdlbmVyaWNDb25maWc8bU5ULCBtRFQ+IHtcbiAgcmV0dXJuIGNvbXBpbGUocGFyc2UocGxhbikpO1xufVxuXG5cblxuXG5cbmNsYXNzIE1hY2hpbmU8bU5ULCBtRFQ+IHtcblxuXG4gIF9zdGF0ZSAgICAgICAgICAgICAgICAgIDogbU5UO1xuICBfc3RhdGVzICAgICAgICAgICAgICAgICA6IE1hcDxtTlQsIEpzc21HZW5lcmljU3RhdGU8bU5UPj47XG4gIF9lZGdlcyAgICAgICAgICAgICAgICAgIDogQXJyYXk8SnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+PjtcbiAgX2VkZ2VfbWFwICAgICAgICAgICAgICAgOiBNYXA8bU5ULCBNYXA8bU5ULCBudW1iZXI+PjtcbiAgX25hbWVkX3RyYW5zaXRpb25zICAgICAgOiBNYXA8bU5ULCBudW1iZXI+O1xuICBfYWN0aW9ucyAgICAgICAgICAgICAgICA6IE1hcDxtTlQsIE1hcDxtTlQsIG51bWJlcj4+O1xuICBfcmV2ZXJzZV9hY3Rpb25zICAgICAgICA6IE1hcDxtTlQsIE1hcDxtTlQsIG51bWJlcj4+O1xuICBfcmV2ZXJzZV9hY3Rpb25fdGFyZ2V0cyA6IE1hcDxtTlQsIE1hcDxtTlQsIG51bWJlcj4+O1xuXG4gIF9ncmFwaF9sYXlvdXQgICAgICAgICAgIDogSnNzbUxheW91dDtcblxuICAvLyB3aGFyZ2FyYmwgdGhpcyBiYWRseSBuZWVkcyB0byBiZSBicm9rZW4gdXAsIG1vbm9saXRoIG1hc3RlclxuICBjb25zdHJ1Y3Rvcih7IHN0YXJ0X3N0YXRlcywgY29tcGxldGU9W10sIHRyYW5zaXRpb25zLCBncmFwaF9sYXlvdXQgPSAnZG90JyB9IDogSnNzbUdlbmVyaWNDb25maWc8bU5ULCBtRFQ+KSB7XG5cbiAgICB0aGlzLl9zdGF0ZSAgICAgICAgICAgICAgICAgID0gc3RhcnRfc3RhdGVzWzBdO1xuICAgIHRoaXMuX3N0YXRlcyAgICAgICAgICAgICAgICAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fZWRnZXMgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgIHRoaXMuX2VkZ2VfbWFwICAgICAgICAgICAgICAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fbmFtZWRfdHJhbnNpdGlvbnMgICAgICA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9hY3Rpb25zICAgICAgICAgICAgICAgID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX3JldmVyc2VfYWN0aW9ucyAgICAgICAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fcmV2ZXJzZV9hY3Rpb25fdGFyZ2V0cyA9IG5ldyBNYXAoKTsgICAvLyB0b2RvXG5cbiAgICB0aGlzLl9ncmFwaF9sYXlvdXQgICAgICAgICAgID0gZ3JhcGhfbGF5b3V0O1xuXG4gICAgdHJhbnNpdGlvbnMubWFwKCAodHI6SnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+KSA9PiB7XG5cbiAgICAgIGlmICh0ci5mcm9tID09PSB1bmRlZmluZWQpIHsgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2l0aW9uIG11c3QgZGVmaW5lICdmcm9tJzogJHtKU09OLnN0cmluZ2lmeSh0cil9YCk7IH1cbiAgICAgIGlmICh0ci50byAgID09PSB1bmRlZmluZWQpIHsgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2l0aW9uIG11c3QgZGVmaW5lICd0byc6ICR7ICBKU09OLnN0cmluZ2lmeSh0cil9YCk7IH1cblxuICAgICAgLy8gZ2V0IHRoZSBjdXJzb3JzLiAgd2hhdCBhIG1lc3NcbiAgICAgIGNvbnN0IGN1cnNvcl9mcm9tIDogSnNzbUdlbmVyaWNTdGF0ZTxtTlQ+XG4gICAgICAgICAgPSB0aGlzLl9zdGF0ZXMuZ2V0KHRyLmZyb20pXG4gICAgICAgICB8fCB7IG5hbWU6IHRyLmZyb20sIGZyb206IFtdLCB0bzogW10sIGNvbXBsZXRlOiBjb21wbGV0ZS5pbmNsdWRlcyh0ci5mcm9tKSB9O1xuXG4gICAgICBpZiAoISh0aGlzLl9zdGF0ZXMuaGFzKHRyLmZyb20pKSkge1xuICAgICAgICB0aGlzLl9uZXdfc3RhdGUoY3Vyc29yX2Zyb20pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJzb3JfdG8gOiBKc3NtR2VuZXJpY1N0YXRlPG1OVD5cbiAgICAgICAgICA9IHRoaXMuX3N0YXRlcy5nZXQodHIudG8pXG4gICAgICAgICB8fCB7bmFtZTogdHIudG8sIGZyb206IFtdLCB0bzogW10sIGNvbXBsZXRlOiBjb21wbGV0ZS5pbmNsdWRlcyh0ci50bykgfTtcblxuICAgICAgaWYgKCEodGhpcy5fc3RhdGVzLmhhcyh0ci50bykpKSB7XG4gICAgICAgIHRoaXMuX25ld19zdGF0ZShjdXJzb3JfdG8pO1xuICAgICAgfVxuXG4gICAgICAvLyBndWFyZCBhZ2FpbnN0IGV4aXN0aW5nIGNvbm5lY3Rpb25zIGJlaW5nIHJlLWFkZGVkXG4gICAgICBpZiAoY3Vyc29yX2Zyb20udG8uaW5jbHVkZXModHIudG8pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYWxyZWFkeSBoYXMgJHtKU09OLnN0cmluZ2lmeSh0ci5mcm9tKX0gdG8gJHtKU09OLnN0cmluZ2lmeSh0ci50byl9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJzb3JfZnJvbS50by5wdXNoKHRyLnRvKTtcbiAgICAgICAgY3Vyc29yX3RvLmZyb20ucHVzaCh0ci5mcm9tKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBlZGdlOyBub3RlIGl0cyBpZFxuICAgICAgdGhpcy5fZWRnZXMucHVzaCh0cik7XG4gICAgICBjb25zdCB0aGlzRWRnZUlkIDogbnVtYmVyID0gdGhpcy5fZWRnZXMubGVuZ3RoIC0gMTtcblxuICAgICAgLy8gZ3VhcmQgYWdhaW5zdCByZXBlYXRpbmcgYSB0cmFuc2l0aW9uIG5hbWVcbiAgICAgIGlmICh0ci5uYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9uYW1lZF90cmFuc2l0aW9ucy5oYXModHIubmFtZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5hbWVkIHRyYW5zaXRpb24gXCIke0pTT04uc3RyaW5naWZ5KHRyLm5hbWUpfVwiIGFscmVhZHkgY3JlYXRlZGApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX25hbWVkX3RyYW5zaXRpb25zLnNldCh0ci5uYW1lLCB0aGlzRWRnZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdXAgdGhlIG1hcHBpbmcsIHNvIHRoYXQgZWRnZXMgY2FuIGJlIGxvb2tlZCB1cCBieSBlbmRwb2ludCBwYWlyc1xuICAgICAgY29uc3QgZnJvbV9tYXBwaW5nIDogTWFwPG1OVCwgbnVtYmVyPiA9IHRoaXMuX2VkZ2VfbWFwLmdldCh0ci5mcm9tKSB8fCBuZXcgTWFwKCk7XG4gICAgICBpZiAoISh0aGlzLl9lZGdlX21hcC5oYXModHIuZnJvbSkpKSB7XG4gICAgICAgIHRoaXMuX2VkZ2VfbWFwLnNldCh0ci5mcm9tLCBmcm9tX21hcHBpbmcpO1xuICAgICAgfVxuXG4vLyAgICBjb25zdCB0b19tYXBwaW5nID0gZnJvbV9tYXBwaW5nLmdldCh0ci50byk7XG4gICAgICBmcm9tX21hcHBpbmcuc2V0KHRyLnRvLCB0aGlzRWRnZUlkKTsgLy8gYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhpcyBtYXBwaW5nIGRvZXNuJ3QgZXhpc3QsIGFib3ZlXG5cbiAgICAgIC8vIHNldCB1cCB0aGUgYWN0aW9uIG1hcHBpbmcsIHNvIHRoYXQgYWN0aW9ucyBjYW4gYmUgbG9va2VkIHVwIGJ5IG9yaWdpblxuICAgICAgaWYgKHRyLmFjdGlvbikge1xuXG5cbiAgICAgICAgLy8gZm9yd2FyZCBtYXBwaW5nIGZpcnN0IGJ5IGFjdGlvbiBuYW1lXG4gICAgICAgIGxldCBhY3Rpb25NYXAgOiA/TWFwPG1OVCwgbnVtYmVyPiA9IHRoaXMuX2FjdGlvbnMuZ2V0KHRyLmFjdGlvbik7XG4gICAgICAgIGlmICghKGFjdGlvbk1hcCkpIHtcbiAgICAgICAgICBhY3Rpb25NYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fYWN0aW9ucy5zZXQodHIuYWN0aW9uLCBhY3Rpb25NYXApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGlvbk1hcC5oYXModHIuZnJvbSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFjdGlvbiAke0pTT04uc3RyaW5naWZ5KHRyLmFjdGlvbil9IGFscmVhZHkgYXR0YWNoZWQgdG8gb3JpZ2luICR7SlNPTi5zdHJpbmdpZnkodHIuZnJvbSl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0aW9uTWFwLnNldCh0ci5mcm9tLCB0aGlzRWRnZUlkKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gcmV2ZXJzZSBtYXBwaW5nIGZpcnN0IGJ5IHN0YXRlIG9yaWdpbiBuYW1lXG4gICAgICAgIGxldCByQWN0aW9uTWFwIDogP01hcDxtTlQsIG51bWJlcj4gPSB0aGlzLl9yZXZlcnNlX2FjdGlvbnMuZ2V0KHRyLmZyb20pO1xuICAgICAgICBpZiAoIShyQWN0aW9uTWFwKSkge1xuICAgICAgICAgIHJBY3Rpb25NYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgdGhpcy5fcmV2ZXJzZV9hY3Rpb25zLnNldCh0ci5mcm9tLCByQWN0aW9uTWFwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIG5lZWQgdG8gdGVzdCBmb3IgcmV2ZXJzZSBtYXBwaW5nIHByZS1wcmVzZW5jZTtcbiAgICAgICAgLy8gZm9yd2FyZCBtYXBwaW5nIGFscmVhZHkgY292ZXJzIGNvbGxpc2lvbnNcbiAgICAgICAgckFjdGlvbk1hcC5zZXQodHIuYWN0aW9uLCB0aGlzRWRnZUlkKTtcblxuXG4gICAgICAgIC8vIHJldmVyc2UgbWFwcGluZyBmaXJzdCBieSBzdGF0ZSB0YXJnZXQgbmFtZVxuICAgICAgICBpZiAoISh0aGlzLl9yZXZlcnNlX2FjdGlvbl90YXJnZXRzLmhhcyh0ci50bykpKSB7XG4gICAgICAgICAgdGhpcy5fcmV2ZXJzZV9hY3Rpb25fdGFyZ2V0cy5zZXQodHIudG8sIG5ldyBNYXAoKSk7XG4gICAgICAgIH1cblxuLyogdG9kbyBjb21lYmFja1xuICAgZnVuZGFtZW50YWwgcHJvYmxlbSBpcyByb0FjdGlvbk1hcCBuZWVkcyB0byBiZSBhIG11bHRpbWFwXG4gICAgICAgIGNvbnN0IHJvQWN0aW9uTWFwID0gdGhpcy5fcmV2ZXJzZV9hY3Rpb25fdGFyZ2V0cy5nZXQodHIudG8pOyAgLy8gd2FzdGVmdWwgLSBhbHJlYWR5IGRpZCBoYXMgLSByZWZhY3RvclxuICAgICAgICBpZiAocm9BY3Rpb25NYXApIHtcbiAgICAgICAgICBpZiAocm9BY3Rpb25NYXAuaGFzKHRyLmFjdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcm8tYWN0aW9uICR7dHIudG99IGFscmVhZHkgYXR0YWNoZWQgdG8gYWN0aW9uICR7dHIuYWN0aW9ufWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb0FjdGlvbk1hcC5zZXQodHIuYWN0aW9uLCB0aGlzRWRnZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaG91bGQgYmUgaW1wb3NzaWJsZSAtIGZsb3cgZG9lc25cXCd0IGtub3cgLnNldCBwcmVjZWRlcyAuZ2V0IHlldCBhZ2Fpbi4gIHNldmVyZSBlcnJvcj8nKTtcbiAgICAgICAgfVxuKi9cbiAgICAgIH1cblxuICAgIH0pO1xuXG4gIH1cblxuICBfbmV3X3N0YXRlKHN0YXRlX2NvbmZpZyA6IEpzc21HZW5lcmljU3RhdGU8bU5UPikgOiBtTlQgeyAvLyB3aGFyZ2FyYmwgZ2V0IHRoYXQgc3RhdGVfY29uZmlnIGFueSB1bmRlciBjb250cm9sXG5cbiAgICBpZiAodGhpcy5fc3RhdGVzLmhhcyhzdGF0ZV9jb25maWcubmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc3RhdGUgJHtKU09OLnN0cmluZ2lmeShzdGF0ZV9jb25maWcubmFtZSl9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGVzLnNldChzdGF0ZV9jb25maWcubmFtZSwgc3RhdGVfY29uZmlnKTtcbiAgICByZXR1cm4gc3RhdGVfY29uZmlnLm5hbWU7XG5cbiAgfVxuXG5cblxuICBzdGF0ZSgpIDogbU5UIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gIH1cblxuLyogd2hhcmdhcmJsIHRvZG8gbWFqb3JcbiAgIHdoZW4gd2UgcmVpbXBsZW1lbnQgdGhpcywgcmVpbnRyb2R1Y2UgdGhpcyBjaGFuZ2UgdG8gdGhlIGlzX2ZpbmFsIGNhbGxcblxuICBpc19jaGFuZ2luZygpIDogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7IC8vIHRvZG8gd2hhcmdhcmJsXG4gIH1cbiovXG5cblxuICBzdGF0ZV9pc19maW5hbCh3aGljaFN0YXRlIDogbU5UKSA6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoICh0aGlzLnN0YXRlX2lzX3Rlcm1pbmFsKHdoaWNoU3RhdGUpKSAmJiAodGhpcy5zdGF0ZV9pc19jb21wbGV0ZSh3aGljaFN0YXRlKSkgKTtcbiAgfVxuXG4gIGlzX2ZpbmFsKCkgOiBib29sZWFuIHtcbi8vICByZXR1cm4gKCghdGhpcy5pc19jaGFuZ2luZygpKSAmJiB0aGlzLnN0YXRlX2lzX2ZpbmFsKHRoaXMuc3RhdGUoKSkpO1xuICAgIHJldHVybiB0aGlzLnN0YXRlX2lzX2ZpbmFsKHRoaXMuc3RhdGUoKSk7XG4gIH1cblxuICBncmFwaF9sYXlvdXQoKSA6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLl9ncmFwaF9sYXlvdXQpO1xuICB9XG5cblxuXG4gIG1hY2hpbmVfc3RhdGUoKSA6IEpzc21NYWNoaW5lSW50ZXJuYWxTdGF0ZTxtTlQsIG1EVD4ge1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGludGVybmFsX3N0YXRlX2ltcGxfdmVyc2lvbiA6IDEsXG5cbiAgICAgIGFjdGlvbnMgICAgICAgICAgICAgICAgOiB0aGlzLl9hY3Rpb25zLFxuICAgICAgZWRnZV9tYXAgICAgICAgICAgICAgICA6IHRoaXMuX2VkZ2VfbWFwLFxuICAgICAgZWRnZXMgICAgICAgICAgICAgICAgICA6IHRoaXMuX2VkZ2VzLFxuICAgICAgbmFtZWRfdHJhbnNpdGlvbnMgICAgICA6IHRoaXMuX25hbWVkX3RyYW5zaXRpb25zLFxuICAgICAgcmV2ZXJzZV9hY3Rpb25zICAgICAgICA6IHRoaXMuX3JldmVyc2VfYWN0aW9ucyxcbi8vICAgIHJldmVyc2VfYWN0aW9uX3RhcmdldHMgOiB0aGlzLl9yZXZlcnNlX2FjdGlvbl90YXJnZXRzLFxuICAgICAgc3RhdGUgICAgICAgICAgICAgICAgICA6IHRoaXMuX3N0YXRlLFxuICAgICAgc3RhdGVzICAgICAgICAgICAgICAgICA6IHRoaXMuX3N0YXRlc1xuICAgIH07XG5cbiAgfVxuXG4vKlxuICBsb2FkX21hY2hpbmVfc3RhdGUoKSA6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTsgLy8gdG9kbyB3aGFyZ2FyYmxcbiAgfVxuKi9cblxuXG4gIHN0YXRlcygpIDogQXJyYXk8bU5UPiB7XG4gICAgcmV0dXJuIFsuLi4gdGhpcy5fc3RhdGVzLmtleXMoKV07XG4gIH1cblxuICBzdGF0ZV9mb3Iod2hpY2hTdGF0ZSA6IG1OVCkgOiBKc3NtR2VuZXJpY1N0YXRlPG1OVD4ge1xuICAgIGNvbnN0IHN0YXRlIDogP0pzc21HZW5lcmljU3RhdGU8bU5UPiA9IHRoaXMuX3N0YXRlcy5nZXQod2hpY2hTdGF0ZSk7XG4gICAgaWYgKHN0YXRlKSB7IHJldHVybiBzdGF0ZTsgfVxuICAgIGVsc2UgICAgICAgeyB0aHJvdyBuZXcgRXJyb3IoYG5vIHN1Y2ggc3RhdGUgJHtKU09OLnN0cmluZ2lmeShzdGF0ZSl9YCk7IH1cbiAgfVxuXG5cblxuICBsaXN0X2VkZ2VzKCkgOiBBcnJheTwgSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID4ge1xuICAgIHJldHVybiB0aGlzLl9lZGdlcztcbiAgfVxuXG4gIGxpc3RfbmFtZWRfdHJhbnNpdGlvbnMoKSA6IE1hcDxtTlQsIG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9uYW1lZF90cmFuc2l0aW9ucztcbiAgfVxuXG4gIGxpc3RfYWN0aW9ucygpIDogQXJyYXk8bU5UPiB7XG4gICAgcmV0dXJuIFsuLi4gdGhpcy5fYWN0aW9ucy5rZXlzKCldO1xuICB9XG5cblxuXG4gIGdldF90cmFuc2l0aW9uX2J5X3N0YXRlX25hbWVzKGZyb206IG1OVCwgdG86IG1OVCkgOiA/bnVtYmVyIHtcblxuICAgIGNvbnN0IGVtZyA6ID9NYXA8bU5ULCBudW1iZXI+ID0gdGhpcy5fZWRnZV9tYXAuZ2V0KGZyb20pO1xuXG4gICAgaWYgKGVtZykge1xuICAgICAgcmV0dXJuIGVtZy5nZXQodG8pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICB9XG5cblxuXG4gIGxvb2t1cF90cmFuc2l0aW9uX2Zvcihmcm9tOiBtTlQsIHRvOiBtTlQpIDogP0pzc21UcmFuc2l0aW9uPG1OVCwgbURUPiB7XG4gICAgY29uc3QgaWQgOiA/bnVtYmVyID0gdGhpcy5nZXRfdHJhbnNpdGlvbl9ieV9zdGF0ZV9uYW1lcyhmcm9tLCB0byk7XG4gICAgcmV0dXJuICgoaWQgPT09IHVuZGVmaW5lZCkgfHwgKGlkID09PSBudWxsKSk/IHVuZGVmaW5lZCA6IHRoaXMuX2VkZ2VzW2lkXTtcbiAgfVxuXG5cblxuICBsaXN0X3RyYW5zaXRpb25zKHdoaWNoU3RhdGUgOiBtTlQgPSB0aGlzLnN0YXRlKCkpIDogSnNzbVRyYW5zaXRpb25MaXN0PG1OVD4ge1xuICAgIHJldHVybiB7ZW50cmFuY2VzOiB0aGlzLmxpc3RfZW50cmFuY2VzKHdoaWNoU3RhdGUpLCBleGl0czogdGhpcy5saXN0X2V4aXRzKHdoaWNoU3RhdGUpfTtcbiAgfVxuXG4gIGxpc3RfZW50cmFuY2VzKHdoaWNoU3RhdGUgOiBtTlQgPSB0aGlzLnN0YXRlKCkpIDogQXJyYXk8bU5UPiB7XG4gICAgcmV0dXJuICh0aGlzLl9zdGF0ZXMuZ2V0KHdoaWNoU3RhdGUpIHx8IHt9KS5mcm9tIHx8IFtdO1xuICB9XG5cbiAgbGlzdF9leGl0cyh3aGljaFN0YXRlIDogbU5UID0gdGhpcy5zdGF0ZSgpKSA6IEFycmF5PG1OVD4ge1xuICAgIHJldHVybiAodGhpcy5fc3RhdGVzLmdldCh3aGljaFN0YXRlKSB8fCB7fSkudG8gICB8fCBbXTtcbiAgfVxuXG5cblxuICBwcm9iYWJsZV9leGl0c19mb3Iod2hpY2hTdGF0ZSA6IG1OVCkgOiBBcnJheTwgSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID4ge1xuXG4gICAgY29uc3Qgd3N0YXRlIDogP0pzc21HZW5lcmljU3RhdGU8bU5UPiA9IHRoaXMuX3N0YXRlcy5nZXQod2hpY2hTdGF0ZSk7XG4gICAgaWYgKCEod3N0YXRlKSkgeyB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggc3RhdGUgJHtKU09OLnN0cmluZ2lmeSh3aGljaFN0YXRlKX0gaW4gcHJvYmFibGVfZXhpdHNfZm9yYCk7IH1cblxuICAgIGNvbnN0IHdzdGF0ZV90byA6IEFycmF5PCBtTlQgPiA9IHdzdGF0ZS50byxcblxuICAgICAgICAgIHd0ZiAgICAgICA6IEFycmF5PCBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPlxuICAgICAgICAgICAgICAgICAgICA9IHdzdGF0ZV90b1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCggKHdzKSA6ID9Kc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPT4gdGhpcy5sb29rdXBfdHJhbnNpdGlvbl9mb3IodGhpcy5zdGF0ZSgpLCB3cykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgcmV0dXJuIHd0ZjtcblxuICB9XG5cbiAgcHJvYmFiaWxpc3RpY190cmFuc2l0aW9uKCkgOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWxlY3RlZCA6IEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPiA9IHdlaWdodGVkX3JhbmRfc2VsZWN0KHRoaXMucHJvYmFibGVfZXhpdHNfZm9yKHRoaXMuc3RhdGUoKSkpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb24oIHNlbGVjdGVkLnRvICk7XG4gIH1cblxuICBwcm9iYWJpbGlzdGljX3dhbGsobiA6IG51bWJlcikgOiBBcnJheTxtTlQ+IHtcbiAgICByZXR1cm4gc2VxKG4pXG4gICAgICAgICAgLm1hcCgoKSA6IG1OVCA9PiB7XG4gICAgICAgICAgICAgY29uc3Qgc3RhdGVfd2FzIDogbU5UID0gdGhpcy5zdGF0ZSgpO1xuICAgICAgICAgICAgIHRoaXMucHJvYmFiaWxpc3RpY190cmFuc2l0aW9uKCk7XG4gICAgICAgICAgICAgcmV0dXJuIHN0YXRlX3dhcztcbiAgICAgICAgICAgfSlcbiAgICAgICAgICAuY29uY2F0KFt0aGlzLnN0YXRlKCldKTtcbiAgfVxuXG4gIHByb2JhYmlsaXN0aWNfaGlzdG9fd2FsayhuIDogbnVtYmVyKSA6IE1hcDxtTlQsIG51bWJlcj4ge1xuICAgIHJldHVybiBoaXN0b2dyYXBoKHRoaXMucHJvYmFiaWxpc3RpY193YWxrKG4pKTtcbiAgfVxuXG5cblxuICBhY3Rpb25zKHdoaWNoU3RhdGUgOiBtTlQgPSB0aGlzLnN0YXRlKCkgKSA6IEFycmF5PG1OVD4ge1xuICAgIGNvbnN0IHdzdGF0ZSA6ID9NYXA8bU5ULCBudW1iZXI+ID0gdGhpcy5fcmV2ZXJzZV9hY3Rpb25zLmdldCh3aGljaFN0YXRlKTtcbiAgICBpZiAod3N0YXRlKSB7IHJldHVybiBbLi4uIHdzdGF0ZS5rZXlzKCldOyB9XG4gICAgZWxzZSAgICAgICAgeyB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggc3RhdGUgJHtKU09OLnN0cmluZ2lmeSh3aGljaFN0YXRlKX1gKTsgfVxuICB9XG5cbiAgbGlzdF9zdGF0ZXNfaGF2aW5nX2FjdGlvbih3aGljaFN0YXRlIDogbU5UKSA6IEFycmF5PG1OVD4ge1xuICAgIGNvbnN0IHdzdGF0ZSA6ID9NYXA8bU5ULCBudW1iZXI+ID0gdGhpcy5fYWN0aW9ucy5nZXQod2hpY2hTdGF0ZSk7XG4gICAgaWYgKHdzdGF0ZSkgeyByZXR1cm4gWy4uLiB3c3RhdGUua2V5cygpXTsgfVxuICAgIGVsc2UgICAgICAgIHsgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIHN0YXRlICR7SlNPTi5zdHJpbmdpZnkod2hpY2hTdGF0ZSl9YCk7IH1cbiAgfVxuXG4vLyBjb21lYmFja1xuLypcbiAgbGlzdF9lbnRyYW5jZV9hY3Rpb25zKHdoaWNoU3RhdGUgOiBtTlQgPSB0aGlzLnN0YXRlKCkgKSA6IEFycmF5PG1OVD4ge1xuICAgIHJldHVybiBbLi4uICh0aGlzLl9yZXZlcnNlX2FjdGlvbl90YXJnZXRzLmdldCh3aGljaFN0YXRlKSB8fCBuZXcgTWFwKCkpLnZhbHVlcygpXSAvLyB3YXN0ZWZ1bFxuICAgICAgICAgICAubWFwKCAoZWRnZUlkOmFueSkgPT4gKHRoaXMuX2VkZ2VzW2VkZ2VJZF0gOiBhbnkpKSAvLyB3aGFyZ2FyYmwgYnVybiBvdXQgYW55XG4gICAgICAgICAgIC5maWx0ZXIoIChvOmFueSkgPT4gby50byA9PT0gd2hpY2hTdGF0ZSlcbiAgICAgICAgICAgLm1hcCggZmlsdGVyZWQgPT4gZmlsdGVyZWQuZnJvbSApO1xuICB9XG4qL1xuICBsaXN0X2V4aXRfYWN0aW9ucyh3aGljaFN0YXRlIDogbU5UID0gdGhpcy5zdGF0ZSgpICkgOiBBcnJheTw/bU5UPiB7IC8vIHRoZXNlIGFyZSBtTlQsIG5vdCA/bU5UXG4gICAgY29uc3QgcmFfYmFzZSA6ID9NYXA8bU5ULCBudW1iZXI+ID0gdGhpcy5fcmV2ZXJzZV9hY3Rpb25zLmdldCh3aGljaFN0YXRlKTtcbiAgICBpZiAoIShyYV9iYXNlKSkgeyB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggc3RhdGUgJHtKU09OLnN0cmluZ2lmeSh3aGljaFN0YXRlKX1gKTsgfVxuXG4gICAgcmV0dXJuIFsuLi4gcmFfYmFzZS52YWx1ZXMoKV1cbiAgICAgICAgICAgLm1hcCAgICAoIChlZGdlSWQ6bnVtYmVyKSAgICAgICAgICAgICAgOiBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPT4gdGhpcy5fZWRnZXNbZWRnZUlkXSAgIClcbiAgICAgICAgICAgLmZpbHRlciAoIChvOkpzc21UcmFuc2l0aW9uPG1OVCwgbURUPikgOiBib29sZWFuICAgICAgICAgICAgICAgICAgPT4gby5mcm9tID09PSB3aGljaFN0YXRlIClcbiAgICAgICAgICAgLm1hcCAgICAoIChmaWx0ZXJlZCA6IEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPikgOiA/bU5UICAgICAgICAgICAgPT4gZmlsdGVyZWQuYWN0aW9uICAgICAgICk7XG4gIH1cblxuICBwcm9iYWJsZV9hY3Rpb25fZXhpdHMod2hpY2hTdGF0ZSA6IG1OVCA9IHRoaXMuc3RhdGUoKSApIDogQXJyYXk8bWl4ZWQ+IHsgLy8gdGhlc2UgYXJlIG1OVFxuICAgIGNvbnN0IHJhX2Jhc2UgOiA/TWFwPG1OVCwgbnVtYmVyPiA9IHRoaXMuX3JldmVyc2VfYWN0aW9ucy5nZXQod2hpY2hTdGF0ZSk7XG4gICAgaWYgKCEocmFfYmFzZSkpIHsgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIHN0YXRlICR7SlNPTi5zdHJpbmdpZnkod2hpY2hTdGF0ZSl9YCk7IH1cblxuICAgIHJldHVybiBbLi4uIHJhX2Jhc2UudmFsdWVzKCldXG4gICAgICAgICAgIC5tYXAgICAgKCAoZWRnZUlkOm51bWJlcikgOiBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPT4gdGhpcy5fZWRnZXNbZWRnZUlkXSAgIClcbiAgICAgICAgICAgLmZpbHRlciAoIChvOkpzc21UcmFuc2l0aW9uPG1OVCwgbURUPikgOiBib29sZWFuICAgICA9PiBvLmZyb20gPT09IHdoaWNoU3RhdGUgKVxuICAgICAgICAgICAubWFwICAgICggKGZpbHRlcmVkKSA6IG1peGVkICAgICAgICAgICAgICAgICAgICAgICAgID0+ICggeyBhY3Rpb24gICAgICA6IGZpbHRlcmVkLmFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmFiaWxpdHkgOiBmaWx0ZXJlZC5wcm9iYWJpbGl0eSB9IClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICB9XG5cblxuXG4gIGlzX3VuZW50ZXJhYmxlKHdoaWNoU3RhdGUgOiBtTlQpIDogYm9vbGVhbiB7XG4gICAgLy8gd2hhcmdhcmJsIHNob3VsZCB0aHJvdyBvbiB1bmtub3duIHN0YXRlXG4gICAgcmV0dXJuIHRoaXMubGlzdF9lbnRyYW5jZXMod2hpY2hTdGF0ZSkubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgaGFzX3VuZW50ZXJhYmxlcygpIDogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVzKCkuc29tZSggKHgpIDogYm9vbGVhbiA9PiB0aGlzLmlzX3VuZW50ZXJhYmxlKHgpKTtcbiAgfVxuXG5cblxuICBpc190ZXJtaW5hbCgpIDogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVfaXNfdGVybWluYWwodGhpcy5zdGF0ZSgpKTtcbiAgfVxuXG4gIHN0YXRlX2lzX3Rlcm1pbmFsKHdoaWNoU3RhdGUgOiBtTlQpIDogYm9vbGVhbiB7XG4gICAgLy8gd2hhcmdhcmJsIHNob3VsZCB0aHJvdyBvbiB1bmtub3duIHN0YXRlXG4gICAgcmV0dXJuIHRoaXMubGlzdF9leGl0cyh3aGljaFN0YXRlKS5sZW5ndGggPT09IDA7XG4gIH1cblxuICBoYXNfdGVybWluYWxzKCkgOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZXMoKS5zb21lKCAoeCkgOiBib29sZWFuID0+IHRoaXMuc3RhdGVfaXNfdGVybWluYWwoeCkpO1xuICB9XG5cblxuXG4gIGlzX2NvbXBsZXRlKCkgOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZV9pc19jb21wbGV0ZSh0aGlzLnN0YXRlKCkpO1xuICB9XG5cbiAgc3RhdGVfaXNfY29tcGxldGUod2hpY2hTdGF0ZSA6IG1OVCkgOiBib29sZWFuIHtcbiAgICBjb25zdCB3c3RhdGUgOiA/SnNzbUdlbmVyaWNTdGF0ZTxtTlQ+ID0gdGhpcy5fc3RhdGVzLmdldCh3aGljaFN0YXRlKTtcbiAgICBpZiAod3N0YXRlKSB7IHJldHVybiB3c3RhdGUuY29tcGxldGU7IH1cbiAgICBlbHNlICAgICAgICB7IHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBzdGF0ZSAke0pTT04uc3RyaW5naWZ5KHdoaWNoU3RhdGUpfWApOyB9XG4gIH1cblxuICBoYXNfY29tcGxldGVzKCkgOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZXMoKS5zb21lKCAoeCkgOiBib29sZWFuID0+IHRoaXMuc3RhdGVfaXNfY29tcGxldGUoeCkgKTtcbiAgfVxuXG5cblxuICBhY3Rpb24obmFtZSA6IG1OVCwgbmV3RGF0YT8gOiBtRFQpIDogYm9vbGVhbiB7XG4gICAgLy8gdG9kbyB3aGFyZ2FyYmwgaW1wbGVtZW50IGhvb2tzXG4gICAgLy8gdG9kbyB3aGFyZ2FyYmwgaW1wbGVtZW50IGRhdGEgc3R1ZmZcbiAgICAvLyB0b2RvIG1ham9yIGluY29tcGxldGUgd2hhcmdhcmJsIGNvbWViYWNrXG4gICAgaWYgKHRoaXMudmFsaWRfYWN0aW9uKG5hbWUsIG5ld0RhdGEpKSB7XG4gICAgICBjb25zdCBlZGdlIDogSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID0gdGhpcy5jdXJyZW50X2FjdGlvbl9lZGdlX2ZvcihuYW1lKTtcbiAgICAgIHRoaXMuX3N0YXRlID0gZWRnZS50bztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdHJhbnNpdGlvbihuZXdTdGF0ZSA6IG1OVCwgbmV3RGF0YT8gOiBtRFQpIDogYm9vbGVhbiB7XG4gICAgLy8gdG9kbyB3aGFyZ2FyYmwgaW1wbGVtZW50IGhvb2tzXG4gICAgLy8gdG9kbyB3aGFyZ2FyYmwgaW1wbGVtZW50IGRhdGEgc3R1ZmZcbiAgICAvLyB0b2RvIG1ham9yIGluY29tcGxldGUgd2hhcmdhcmJsIGNvbWViYWNrXG4gICAgaWYgKHRoaXMudmFsaWRfdHJhbnNpdGlvbihuZXdTdGF0ZSwgbmV3RGF0YSkpIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gbmV3U3RhdGU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNhbiBsZWF2ZSBtYWNoaW5lIGluIGluY29uc2lzdGVudCBzdGF0ZS4gIGdlbmVyYWxseSBkbyBub3QgdXNlXG4gIGZvcmNlX3RyYW5zaXRpb24obmV3U3RhdGUgOiBtTlQsIG5ld0RhdGE/IDogbURUKSA6IGJvb2xlYW4ge1xuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBob29rc1xuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBkYXRhIHN0dWZmXG4gICAgLy8gdG9kbyBtYWpvciBpbmNvbXBsZXRlIHdoYXJnYXJibCBjb21lYmFja1xuICAgIGlmICh0aGlzLnZhbGlkX2ZvcmNlX3RyYW5zaXRpb24obmV3U3RhdGUsIG5ld0RhdGEpKSB7XG4gICAgICB0aGlzLl9zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuXG5cbiAgY3VycmVudF9hY3Rpb25fZm9yKGFjdGlvbiA6IG1OVCkgOiBudW1iZXIgfCB2b2lkIHtcbiAgICBjb25zdCBhY3Rpb25fYmFzZSA6ID9NYXA8bU5ULCBudW1iZXI+ID0gdGhpcy5fYWN0aW9ucy5nZXQoYWN0aW9uKTtcbiAgICByZXR1cm4gYWN0aW9uX2Jhc2U/IGFjdGlvbl9iYXNlLmdldCh0aGlzLnN0YXRlKCkpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgY3VycmVudF9hY3Rpb25fZWRnZV9mb3IoYWN0aW9uIDogbU5UKSA6IEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPiB7XG4gICAgY29uc3QgaWR4IDogP251bWJlciA9IHRoaXMuY3VycmVudF9hY3Rpb25fZm9yKGFjdGlvbik7XG4gICAgaWYgKChpZHggPT09IHVuZGVmaW5lZCkgfHwgKGlkeCA9PT0gbnVsbCkpIHsgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGFjdGlvbiAke0pTT04uc3RyaW5naWZ5KGFjdGlvbil9YCk7IH1cbiAgICByZXR1cm4gdGhpcy5fZWRnZXNbaWR4XTtcbiAgfVxuXG4gIHZhbGlkX2FjdGlvbihhY3Rpb24gOiBtTlQsIF9uZXdEYXRhPyA6IG1EVCkgOiBib29sZWFuIHsgIC8vIHRvZG8gY29tZWJhY2sgdW5pZ25vcmUgbmV3RGF0YVxuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBob29rc1xuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBkYXRhIHN0dWZmXG4gICAgLy8gdG9kbyBtYWpvciBpbmNvbXBsZXRlIHdoYXJnYXJibCBjb21lYmFja1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRfYWN0aW9uX2ZvcihhY3Rpb24pICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICB2YWxpZF90cmFuc2l0aW9uKG5ld1N0YXRlIDogbU5ULCBfbmV3RGF0YT8gOiBtRFQpIDogYm9vbGVhbiB7ICAvLyB0b2RvIGNvbWViYWNrIHVuaWdub3JlIG5ld0RhdGFcbiAgICAvLyB0b2RvIHdoYXJnYXJibCBpbXBsZW1lbnQgaG9va3NcbiAgICAvLyB0b2RvIHdoYXJnYXJibCBpbXBsZW1lbnQgZGF0YSBzdHVmZlxuICAgIC8vIHRvZG8gbWFqb3IgaW5jb21wbGV0ZSB3aGFyZ2FyYmwgY29tZWJhY2tcbiAgICBjb25zdCB0cmFuc2l0aW9uX2ZvciA6ID9Kc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPSB0aGlzLmxvb2t1cF90cmFuc2l0aW9uX2Zvcih0aGlzLnN0YXRlKCksIG5ld1N0YXRlKTtcblxuICAgIGlmICghKHRyYW5zaXRpb25fZm9yKSkgICAgICAgICAgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpZiAodHJhbnNpdGlvbl9mb3IuZm9yY2VkX29ubHkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcblxuICB9XG5cbiAgdmFsaWRfZm9yY2VfdHJhbnNpdGlvbihuZXdTdGF0ZSA6IG1OVCwgX25ld0RhdGE/IDogbURUKSA6IGJvb2xlYW4geyAgLy8gdG9kbyBjb21lYmFjayB1bmlnbm9yZSBuZXdEYXRhXG4gICAgLy8gdG9kbyB3aGFyZ2FyYmwgaW1wbGVtZW50IGhvb2tzXG4gICAgLy8gdG9kbyB3aGFyZ2FyYmwgaW1wbGVtZW50IGRhdGEgc3R1ZmZcbiAgICAvLyB0b2RvIG1ham9yIGluY29tcGxldGUgd2hhcmdhcmJsIGNvbWViYWNrXG4gICAgcmV0dXJuICh0aGlzLmxvb2t1cF90cmFuc2l0aW9uX2Zvcih0aGlzLnN0YXRlKCksIG5ld1N0YXRlKSAhPT0gdW5kZWZpbmVkKTtcbiAgfVxuXG5cbn1cblxuXG5cblxuXG5mdW5jdGlvbiBzbTxtTlQsIG1EVD4odGVtcGxhdGVfc3RyaW5ncyA6IEFycmF5PHN0cmluZz4gLyogLCBhcmd1bWVudHMgKi8pIDogTWFjaGluZTxtTlQsIG1EVD4ge1xuXG4gICAgLy8gZm9vYGEkezF9YiR7Mn1jYCB3aWxsIGNvbWUgaW4gYXMgKFsnYScsJ2InLCdjJ10sMSwyKVxuICAgIC8vIHRoaXMgaW5jbHVkZXMgd2hlbiBhIGFuZCBjIGFyZSBlbXB0eSBzdHJpbmdzXG4gICAgLy8gdGhlcmVmb3JlIHRlbXBsYXRlX3N0cmluZ3Mgd2lsbCBhbHdheXMgaGF2ZSBvbmUgbW9yZSBlbCB0aGFuIHRlbXBsYXRlX2FyZ3NcbiAgICAvLyB0aGVyZWZvcmUgbWFwIHRoZSBzbWFsbGVyIGNvbnRhaW5lciBhbmQgdG9zcyB0aGUgbGFzdCBvbmUgb24gb24gdGhlIHdheSBvdXRcblxuICAgIHJldHVybiBuZXcgTWFjaGluZShtYWtlKHRlbXBsYXRlX3N0cmluZ3MucmVkdWNlKFxuXG4gICAgICAvLyBpbiBnZW5lcmFsIGF2b2lkaW5nIGBhcmd1bWVudHNgIGlzIHNtYXJ0LiAgaG93ZXZlciB3aXRoIHRoZSB0ZW1wbGF0ZVxuICAgICAgLy8gc3RyaW5nIG5vdGF0aW9uLCBhcyBkZXNpZ25lZCwgaXQncyBub3QgcmVhbGx5IHdvcnRoIHRoZSBoYXNzbGVcblxuICAgICAgLyogZXNsaW50LWRpc2FibGUgZnAvbm8tYXJndW1lbnRzICovXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cbiAgICAgIChhY2MsIHZhbCwgaWR4KSA6IHN0cmluZyA9PiBgJHthY2N9JHthcmd1bWVudHNbaWR4XX0ke3ZhbH1gICAvLyBhcmd1bWVudHNbMF0gaXMgbmV2ZXIgbG9hZGVkLCBzbyBhcmdzIGRvZXNuJ3QgbmVlZCB0byBiZSBnYXRlZFxuICAgICAgLyogZXNsaW50LWVuYWJsZSAgcHJlZmVyLXJlc3QtcGFyYW1zICovXG4gICAgICAvKiBlc2xpbnQtZW5hYmxlICBmcC9uby1hcmd1bWVudHMgKi9cblxuICAgICkpKTtcblxufVxuXG5cblxuXG5cbmV4cG9ydCB7XG5cbiAgdmVyc2lvbixcblxuICBNYWNoaW5lLFxuXG4gIG1ha2UsXG4gICAgcGFyc2UsXG4gICAgY29tcGlsZSxcblxuICBzbSxcblxuICBhcnJvd19kaXJlY3Rpb24sXG4gIGFycm93X2xlZnRfa2luZCxcbiAgYXJyb3dfcmlnaHRfa2luZCxcblxuICAvLyB0b2RvIHdoYXJnYXJibCB0aGVzZSBzaG91bGQgYmUgZXhwb3J0ZWQgdG8gYSB1dGlsaXR5IGxpYnJhcnlcbiAgc2VxLCB3ZWlnaHRlZF9yYW5kX3NlbGVjdCwgaGlzdG9ncmFwaCwgd2VpZ2h0ZWRfc2FtcGxlX3NlbGVjdCwgd2VpZ2h0ZWRfaGlzdG9fa2V5XG5cbn07XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9qcy9qc3NtLmpzIl0sIm5hbWVzIjpbInBhcnNlIiwicmVxdWlyZSIsInZlcnNpb24iLCJhcnJvd19kaXJlY3Rpb24iLCJhcnJvdyIsIlN0cmluZyIsIkVycm9yIiwiYXJyb3dfbGVmdF9raW5kIiwiYXJyb3dfcmlnaHRfa2luZCIsImNvbXBpbGVfcnVsZV90cmFuc2l0aW9uX3N0ZXAiLCJhY2MiLCJmcm9tIiwidG8iLCJ0aGlzX3NlIiwibmV4dF9zZSIsImVkZ2VzIiwidUZyb20iLCJBcnJheSIsImlzQXJyYXkiLCJ1VG8iLCJtYXAiLCJmIiwidCIsInJrIiwia2luZCIsImxrIiwicmlnaHQiLCJmb3JjZWRfb25seSIsIm1haW5fcGF0aCIsInJfYWN0aW9uIiwiYWN0aW9uIiwicl9wcm9iYWJpbGl0eSIsInByb2JhYmlsaXR5IiwicHVzaCIsImxlZnQiLCJsX2FjdGlvbiIsImxfcHJvYmFiaWxpdHkiLCJuZXdfYWNjIiwiY29uY2F0Iiwic2UiLCJjb21waWxlX3J1bGVfaGFuZGxlX3RyYW5zaXRpb24iLCJydWxlIiwiY29tcGlsZV9ydWxlX2hhbmRsZXIiLCJrZXkiLCJhZ2dfYXMiLCJ2YWwiLCJ0YXV0b2xvZ2llcyIsImluY2x1ZGVzIiwidmFsdWUiLCJKU09OIiwic3RyaW5naWZ5IiwiY29tcGlsZSIsInRyZWUiLCJyZXN1bHRzIiwiZ3JhcGhfbGF5b3V0IiwidHJhbnNpdGlvbiIsInN0YXJ0X3N0YXRlcyIsImVuZF9zdGF0ZXMiLCJmc2xfdmVyc2lvbiIsIm1hY2hpbmVfYXV0aG9yIiwibWFjaGluZV9jb21tZW50IiwibWFjaGluZV9jb250cmlidXRvciIsIm1hY2hpbmVfZGVmaW5pdGlvbiIsIm1hY2hpbmVfbGljZW5zZSIsIm1hY2hpbmVfbmFtZSIsIm1hY2hpbmVfdmVyc2lvbiIsInRyIiwiYXNzZW1ibGVkX3RyYW5zaXRpb25zIiwicmVzdWx0X2NmZyIsImxlbmd0aCIsInRyYW5zaXRpb25zIiwib25lT25seUtleXMiLCJvbmVPbmx5S2V5IiwibXVsdGlLZXkiLCJtYWtlIiwicGxhbiIsIk1hY2hpbmUiLCJjb21wbGV0ZSIsIl9zdGF0ZSIsIl9zdGF0ZXMiLCJNYXAiLCJfZWRnZXMiLCJfZWRnZV9tYXAiLCJfbmFtZWRfdHJhbnNpdGlvbnMiLCJfYWN0aW9ucyIsIl9yZXZlcnNlX2FjdGlvbnMiLCJfcmV2ZXJzZV9hY3Rpb25fdGFyZ2V0cyIsIl9ncmFwaF9sYXlvdXQiLCJ1bmRlZmluZWQiLCJjdXJzb3JfZnJvbSIsImdldCIsIm5hbWUiLCJoYXMiLCJfbmV3X3N0YXRlIiwiY3Vyc29yX3RvIiwidGhpc0VkZ2VJZCIsInNldCIsImZyb21fbWFwcGluZyIsImFjdGlvbk1hcCIsInJBY3Rpb25NYXAiLCJzdGF0ZV9jb25maWciLCJ3aGljaFN0YXRlIiwic3RhdGVfaXNfdGVybWluYWwiLCJzdGF0ZV9pc19jb21wbGV0ZSIsInN0YXRlX2lzX2ZpbmFsIiwic3RhdGUiLCJpbnRlcm5hbF9zdGF0ZV9pbXBsX3ZlcnNpb24iLCJhY3Rpb25zIiwiZWRnZV9tYXAiLCJuYW1lZF90cmFuc2l0aW9ucyIsInJldmVyc2VfYWN0aW9ucyIsInN0YXRlcyIsImtleXMiLCJlbWciLCJpZCIsImdldF90cmFuc2l0aW9uX2J5X3N0YXRlX25hbWVzIiwiZW50cmFuY2VzIiwibGlzdF9lbnRyYW5jZXMiLCJleGl0cyIsImxpc3RfZXhpdHMiLCJ3c3RhdGUiLCJ3c3RhdGVfdG8iLCJ3dGYiLCJ3cyIsImxvb2t1cF90cmFuc2l0aW9uX2ZvciIsImZpbHRlciIsIkJvb2xlYW4iLCJzZWxlY3RlZCIsInByb2JhYmxlX2V4aXRzX2ZvciIsIm4iLCJzdGF0ZV93YXMiLCJwcm9iYWJpbGlzdGljX3RyYW5zaXRpb24iLCJwcm9iYWJpbGlzdGljX3dhbGsiLCJyYV9iYXNlIiwidmFsdWVzIiwiZWRnZUlkIiwibyIsImZpbHRlcmVkIiwic29tZSIsIngiLCJpc191bmVudGVyYWJsZSIsIm5ld0RhdGEiLCJ2YWxpZF9hY3Rpb24iLCJlZGdlIiwiY3VycmVudF9hY3Rpb25fZWRnZV9mb3IiLCJuZXdTdGF0ZSIsInZhbGlkX3RyYW5zaXRpb24iLCJ2YWxpZF9mb3JjZV90cmFuc2l0aW9uIiwiYWN0aW9uX2Jhc2UiLCJpZHgiLCJjdXJyZW50X2FjdGlvbl9mb3IiLCJfbmV3RGF0YSIsInRyYW5zaXRpb25fZm9yIiwic20iLCJ0ZW1wbGF0ZV9zdHJpbmdzIiwicmVkdWNlIiwic2VxIiwid2VpZ2h0ZWRfcmFuZF9zZWxlY3QiLCJoaXN0b2dyYXBoIiwid2VpZ2h0ZWRfc2FtcGxlX3NlbGVjdCIsIndlaWdodGVkX2hpc3RvX2tleSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBcUJBOzs7Ozs7QUFwQkE7O0FBc0JBLElBQU1BLFFBQWdEQyxRQUFRLGVBQVIsRUFBeUJELEtBQS9FLEMsQ0FBdUY7O0FBRXZGLElBQU1FLFVBQWlCLElBQXZCLEMsQ0FBNkI7OztBQU03QixTQUFTQyxlQUFULENBQXlCQyxLQUF6QixFQUFpRTs7QUFFL0QsVUFBU0MsT0FBT0QsS0FBUCxDQUFUOztBQUVFLFNBQUssSUFBTCxDQUFhLEtBQUssSUFBTCxDQUFjLEtBQUssSUFBTDtBQUN6QixhQUFPLE9BQVA7O0FBRUYsU0FBSyxJQUFMLENBQWEsS0FBSyxJQUFMLENBQWMsS0FBSyxJQUFMO0FBQ3pCLGFBQU8sTUFBUDs7QUFFRixTQUFLLEtBQUwsQ0FBYSxLQUFLLE1BQUwsQ0FBYyxLQUFLLE1BQUw7QUFDM0IsU0FBSyxLQUFMLENBQWEsS0FBSyxNQUFMLENBQWMsS0FBSyxNQUFMO0FBQzNCLFNBQUssS0FBTCxDQUFhLEtBQUssTUFBTCxDQUFjLEtBQUssTUFBTDtBQUN6QixhQUFPLE1BQVA7O0FBRUY7QUFDRSxZQUFNLElBQUlFLEtBQUosMENBQWlERixLQUFqRCxDQUFOOztBQWRKO0FBa0JEOztBQU1ELFNBQVNHLGVBQVQsQ0FBeUJILEtBQXpCLEVBQTREOztBQUUxRCxVQUFTQyxPQUFPRCxLQUFQLENBQVQ7O0FBRUUsU0FBSyxJQUFMLENBQVksS0FBSyxJQUFMLENBQWEsS0FBSyxJQUFMO0FBQ3ZCLGFB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QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBTyxJQUFJOUUsT0FBSixDQUFZRixLQUFLZ0YsaUJBQWlCQyxNQUFqQjs7QUFFdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBQ2pKLEdBQUQsRUFBTW1DLEdBQU4sRUFBV3dHLEdBQVg7QUFBQSxnQkFBK0IzSSxHQUEvQixHQUFxQyxXQUFVMkksR0FBVixDQUFyQyxHQUFzRHhHLEdBQXREO0FBQUEsR0FQc0IsQ0FPdUM7QUFDN0Q7QUFDQTs7QUFUc0IsR0FBTCxDQUFaLENBQVA7QUFhSDs7UUFRQzNDLE8sR0FBQUEsTztRQUVBMEUsTyxHQUFBQSxPO1FBRUFGLEksR0FBQUEsSTtRQUNFMUUsSyxHQUFBQSxLO1FBQ0FtRCxPLEdBQUFBLE87UUFFRnNHLEUsR0FBQUEsRTtRQUVBdEosZSxHQUFBQSxlO1FBQ0FJLGUsR0FBQUEsZTtRQUNBQyxnQixHQUFBQSxnQjtRQUdBb0osRztRQUFLQyxvQjtRQUFzQkMsVTtRQUFZQyxzQjtRQUF3QkMsa0IiLCJmaWxlIjoianNzbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLy8gd2hhcmdhcmJsIGxvdHMgb2YgdGhlc2UgcmV0dXJuIGFycmF5cyBjb3VsZC9zaG91bGQgYmUgc2V0c1xuXG4vLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7XG5cbiAgSnNzbUdlbmVyaWNTdGF0ZSwgSnNzbUdlbmVyaWNDb25maWcsXG4gIEpzc21UcmFuc2l0aW9uLCBKc3NtVHJhbnNpdGlvbkxpc3QsXG4gIEpzc21NYWNoaW5lSW50ZXJuYWxTdGF0ZSxcbiAgSnNzbVBhcnNlVHJlZSxcbiAgSnNzbUNvbXBpbGVTZSwgSnNzbUNvbXBpbGVTZVN0YXJ0LCBKc3NtQ29tcGlsZVJ1bGUsXG4gIEpzc21BcnJvdywgSnNzbUFycm93RGlyZWN0aW9uLCBKc3NtQXJyb3dLaW5kLFxuICBKc3NtTGF5b3V0XG5cbn0gZnJvbSAnLi9qc3NtLXR5cGVzJztcblxuXG5cblxuXG5pbXBvcnQgeyBzZXEsIHdlaWdodGVkX3JhbmRfc2VsZWN0LCB3ZWlnaHRlZF9zYW1wbGVfc2VsZWN0LCBoaXN0b2dyYXBoLCB3ZWlnaHRlZF9oaXN0b19rZXkgfSBmcm9tICcuL2pzc20tdXRpbC5qcyc7XG5cbmNvbnN0IHBhcnNlIDogPE5ULCBEVD4oc3RyaW5nKSA9PiBKc3NtUGFyc2VUcmVlPE5UPiA9IHJlcXVpcmUoJy4vanNzbS1kb3QuanMnKS5wYXJzZTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZmxvd3R5cGUvbm8td2Vhay10eXBlcyAvLyB0b2RvIHdoYXJnYXJibCByZW1vdmUgYW55XG5cbmNvbnN0IHZlcnNpb24gOiBudWxsID0gbnVsbDsgLy8gcmVwbGFjZWQgZnJvbSBwYWNrYWdlLmpzIGluIGJ1aWxkXG5cblxuXG5cblxuZnVuY3Rpb24gYXJyb3dfZGlyZWN0aW9uKGFycm93IDogSnNzbUFycm93KSA6IEpzc21BcnJvd0RpcmVjdGlvbiB7XG5cbiAgc3dpdGNoICggU3RyaW5nKGFycm93KSApIHtcblxuICAgIGNhc2UgJy0+JyA6ICBjYXNlICc9PicgIDogIGNhc2UgJ34+JyAgOlxuICAgICAgcmV0dXJuICdyaWdodCc7XG5cbiAgICBjYXNlICc8LScgOiAgY2FzZSAnPD0nICA6ICBjYXNlICc8ficgIDpcbiAgICAgIHJldHVybiAnbGVmdCc7XG5cbiAgICBjYXNlICc8LT4nOiAgY2FzZSAnPC09Pic6ICBjYXNlICc8LX4+JzpcbiAgICBjYXNlICc8PT4nOiAgY2FzZSAnPD0tPic6ICBjYXNlICc8PX4+JzpcbiAgICBjYXNlICc8fj4nOiAgY2FzZSAnPH4tPic6ICBjYXNlICc8fj0+JzpcbiAgICAgIHJldHVybiAnYm90aCc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhcnJvd19kaXJlY3Rpb246IHVua25vd24gYXJyb3cgdHlwZSAke2Fycm93fWApO1xuXG4gIH1cblxufVxuXG5cblxuXG5cbmZ1bmN0aW9uIGFycm93X2xlZnRfa2luZChhcnJvdyA6IEpzc21BcnJvdykgOiBKc3NtQXJyb3dLaW5kIHtcblxuICBzd2l0Y2ggKCBTdHJpbmcoYXJyb3cpICkge1xuXG4gICAgY2FzZSAnLT4nOiAgY2FzZSAnPT4nIDogIGNhc2UgJ34+JzpcbiAgICAgIHJldHVybiAnbm9uZSc7XG5cbiAgICBjYXNlICc8LSc6ICBjYXNlICc8LT4nOiAgY2FzZSAnPC09Pic6ICBjYXNlICc8LX4+JzpcbiAgICAgIHJldHVybiAnbGVnYWwnO1xuXG4gICAgY2FzZSAnPD0nOiAgY2FzZSAnPD0+JzogIGNhc2UgJzw9LT4nOiAgY2FzZSAnPD1+Pic6XG4gICAgICByZXR1cm4gJ21haW4nO1xuXG4gICAgY2FzZSAnPH4nOiAgY2FzZSAnPH4+JzogIGNhc2UgJzx+LT4nOiAgY2FzZSAnPH49Pic6XG4gICAgICByZXR1cm4gJ2ZvcmNlZCc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBhcnJvd19kaXJlY3Rpb246IHVua25vd24gYXJyb3cgdHlwZSAke2Fycm93fWApO1xuXG4gIH1cblxufVxuXG5cblxuXG5cbmZ1bmN0aW9uIGFycm93X3JpZ2h0X2tpbmQoYXJyb3cgOiBKc3NtQXJyb3cpIDogSnNzbUFycm93S2luZCB7XG5cbiAgc3dpdGNoICggU3RyaW5nKGFycm93KSApIHtcblxuICAgIGNhc2UgJzwtJzogIGNhc2UgJzw9JyA6ICBjYXNlICc8fic6XG4gICAgICByZXR1cm4gJ25vbmUnO1xuXG4gICAgY2FzZSAnLT4nOiAgY2FzZSAnPC0+JzogIGNhc2UgJzw9LT4nOiAgY2FzZSAnPH4tPic6XG4gICAgICByZXR1cm4gJ2xlZ2FsJztcblxuICAgIGNhc2UgJz0+JzogIGNhc2UgJzw9Pic6ICBjYXNlICc8LT0+JzogIGNhc2UgJzx+PT4nOlxuICAgICAgcmV0dXJuICdtYWluJztcblxuICAgIGNhc2UgJ34+JzogIGNhc2UgJzx+Pic6ICBjYXNlICc8LX4+JzogIGNhc2UgJzw9fj4nOlxuICAgICAgcmV0dXJuICdmb3JjZWQnO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgYXJyb3dfZGlyZWN0aW9uOiB1bmtub3duIGFycm93IHR5cGUgJHthcnJvd31gKTtcblxuICB9XG5cbn1cblxuXG5cblxuXG5mdW5jdGlvbiBjb21waWxlX3J1bGVfdHJhbnNpdGlvbl9zdGVwPG1OVCwgbURUPihcbiAgICAgICAgICAgICBhY2MgICAgIDogQXJyYXk8IEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPiA+LFxuICAgICAgICAgICAgIGZyb20gICAgOiBtTlQsXG4gICAgICAgICAgICAgdG8gICAgICA6IG1OVCxcbiAgICAgICAgICAgICB0aGlzX3NlIDogSnNzbUNvbXBpbGVTZTxtTlQ+LFxuICAgICAgICAgICAgIG5leHRfc2UgOiBKc3NtQ29tcGlsZVNlPG1OVD5cbiAgICAgICAgICkgOiBBcnJheTwgSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID4geyAvLyB0b2RvIGZsb3cgZGVzY3JpYmUgdGhlIHBhcnNlciByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zaXRpb24gc3RlcCBleHRlbnNpb25cblxuICBjb25zdCBlZGdlcyA6IEFycmF5PCBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPiA9IFtdO1xuXG4gIGNvbnN0IHVGcm9tIDogQXJyYXk8IG1OVCA+ID0gKEFycmF5LmlzQXJyYXkoZnJvbSk/IGZyb20gOiBbZnJvbV0pLFxuICAgICAgICB1VG8gICA6IEFycmF5PCBtTlQgPiA9IChBcnJheS5pc0FycmF5KHRvKT8gICB0byAgIDogW3RvXSAgKTtcblxuICB1RnJvbS5tYXAoIChmOm1OVCkgPT4ge1xuICAgIHVUby5tYXAoICh0Om1OVCkgPT4ge1xuXG4gICAgICBjb25zdCByayA6IEpzc21BcnJvd0tpbmQgPSBhcnJvd19yaWdodF9raW5kKHRoaXNfc2Uua2luZCksXG4gICAgICAgICAgICBsayA6IEpzc21BcnJvd0tpbmQgPSBhcnJvd19sZWZ0X2tpbmQodGhpc19zZS5raW5kKTtcblxuXG4gICAgICBjb25zdCByaWdodCA6IEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPiA9IHtcbiAgICAgICAgZnJvbSAgICAgICAgOiBmLFxuICAgICAgICB0byAgICAgICAgICA6IHQsXG4gICAgICAgIGtpbmQgICAgICAgIDogcmssXG4gICAgICAgIGZvcmNlZF9vbmx5IDogcmsgPT09ICdmb3JjZWQnLFxuICAgICAgICBtYWluX3BhdGggICA6IHJrID09PSAnbWFpbidcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzX3NlLnJfYWN0aW9uKSAgICAgIHsgcmlnaHQuYWN0aW9uICAgICAgPSB0aGlzX3NlLnJfYWN0aW9uOyAgICAgIH1cbiAgICAgIGlmICh0aGlzX3NlLnJfcHJvYmFiaWxpdHkpIHsgcmlnaHQucHJvYmFiaWxpdHkgPSB0aGlzX3NlLnJfcHJvYmFiaWxpdHk7IH1cbiAgICAgIGlmIChyaWdodC5raW5kICE9PSAnbm9uZScpIHsgZWRnZXMucHVzaChyaWdodCk7IH1cblxuXG4gICAgICBjb25zdCBsZWZ0IDogSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID0ge1xuICAgICAgICBmcm9tICAgICAgICA6IHQsXG4gICAgICAgIHRvICAgICAgICAgIDogZixcbiAgICAgICAga2luZCAgICAgICAgOiBsayxcbiAgICAgICAgZm9yY2VkX29ubHkgOiBsayA9PT0gJ2ZvcmNlZCcsXG4gICAgICAgIG1haW5fcGF0aCAgIDogbGsgPT09ICdtYWluJ1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXNfc2UubF9hY3Rpb24pICAgICAgeyBsZWZ0LmFjdGlvbiAgICAgID0gdGhpc19zZS5sX2FjdGlvbjsgICAgICB9XG4gICAgICBpZiAodGhpc19zZS5sX3Byb2JhYmlsaXR5KSB7IGxlZnQucHJvYmFiaWxpdHkgPSB0aGlzX3NlLmxfcHJvYmFiaWxpdHk7IH1cbiAgICAgIGlmIChsZWZ0LmtpbmQgIT09ICdub25lJykgIHsgZWRnZXMucHVzaChsZWZ0KTsgfVxuXG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IG5ld19hY2MgOiBBcnJheTwgSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID4gPSBhY2MuY29uY2F0KGVkZ2VzKTtcblxuICBpZiAobmV4dF9zZSkge1xuICAgIHJldHVybiBjb21waWxlX3J1bGVfdHJhbnNpdGlvbl9zdGVwKG5ld19hY2MsIHRvLCBuZXh0X3NlLnRvLCBuZXh0X3NlLCBuZXh0X3NlLnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3X2FjYztcbiAgfVxuXG59XG5cblxuXG5mdW5jdGlvbiBjb21waWxlX3J1bGVfaGFuZGxlX3RyYW5zaXRpb248bU5UPihydWxlIDogSnNzbUNvbXBpbGVTZVN0YXJ0PG1OVD4pIDogbWl4ZWQgeyAvLyB0b2RvIGZsb3cgZGVzY3JpYmUgdGhlIHBhcnNlciByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zaXRpb25cbiAgcmV0dXJuIGNvbXBpbGVfcnVsZV90cmFuc2l0aW9uX3N0ZXAoW10sIHJ1bGUuZnJvbSwgcnVsZS5zZS50bywgcnVsZS5zZSwgcnVsZS5zZS5zZSk7XG59XG5cblxuXG5mdW5jdGlvbiBjb21waWxlX3J1bGVfaGFuZGxlcjxtTlQ+KHJ1bGUgOiBKc3NtQ29tcGlsZVNlU3RhcnQ8bU5UPikgOiBKc3NtQ29tcGlsZVJ1bGUgeyAvLyB0b2RvIGZsb3cgZGVzY3JpYmUgdGhlIG91dHB1dCBvZiB0aGUgcGFyc2VyXG5cbiAgaWYgKHJ1bGUua2V5ID09PSAndHJhbnNpdGlvbicpIHsgcmV0dXJuIHsgYWdnX2FzOiAndHJhbnNpdGlvbicsIHZhbDogY29tcGlsZV9ydWxlX2hhbmRsZV90cmFuc2l0aW9uKHJ1bGUpIH07IH1cblxuICBjb25zdCB0YXV0b2xvZ2llcyA6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgJ2dyYXBoX2xheW91dCcsICdzdGFydF9zdGF0ZXMnLCAnZW5kX3N0YXRlcycsICdtYWNoaW5lX25hbWUnLCAnbWFjaGluZV92ZXJzaW9uJyxcbiAgICAnbWFjaGluZV9jb21tZW50JywgJ21hY2hpbmVfYXV0aG9yJywgJ21hY2hpbmVfY29udHJpYnV0b3InLCAnbWFjaGluZV9kZWZpbml0aW9uJyxcbiAgICAnbWFjaGluZV9yZWZlcmVuY2UnLCAnbWFjaGluZV9saWNlbnNlJywgJ2ZzbF92ZXJzaW9uJ1xuICBdO1xuXG4gIGlmICh0YXV0b2xvZ2llcy5pbmNsdWRlcyhydWxlLmtleSkpIHtcbiAgICByZXR1cm4geyBhZ2dfYXM6IHJ1bGUua2V5LCB2YWw6IHJ1bGUudmFsdWUgfTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgY29tcGlsZV9ydWxlX2hhbmRsZXI6IFVua25vd24gcnVsZTogJHtKU09OLnN0cmluZ2lmeShydWxlKX1gKTtcblxufVxuXG5cblxuZnVuY3Rpb24gY29tcGlsZTxtTlQsIG1EVD4odHJlZSA6IEpzc21QYXJzZVRyZWU8bU5UPikgOiBKc3NtR2VuZXJpY0NvbmZpZzxtTlQsIG1EVD4geyAgLy8gdG9kbyBmbG93IGRlc2NyaWJlIHRoZSBvdXRwdXQgb2YgdGhlIHBhcnNlclxuXG4gIGNvbnN0IHJlc3VsdHMgOiB7XG4gICAgZ3JhcGhfbGF5b3V0ICAgICAgICA6IEFycmF5PCBKc3NtTGF5b3V0ID4sXG4gICAgdHJhbnNpdGlvbiAgICAgICAgICA6IEFycmF5PCBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPixcbiAgICBzdGFydF9zdGF0ZXMgICAgICAgIDogQXJyYXk8IG1OVCA+LFxuICAgIGVuZF9zdGF0ZXMgICAgICAgICAgOiBBcnJheTwgbU5UID4sXG4gICAgZnNsX3ZlcnNpb24gICAgICAgICA6IEFycmF5PCBzdHJpbmcgPixcbiAgICBtYWNoaW5lX2F1dGhvciAgICAgIDogQXJyYXk8IHN0cmluZyA+LFxuICAgIG1hY2hpbmVfY29tbWVudCAgICAgOiBBcnJheTwgc3RyaW5nID4sXG4gICAgbWFjaGluZV9jb250cmlidXRvciA6IEFycmF5PCBzdHJpbmcgPixcbiAgICBtYWNoaW5lX2RlZmluaXRpb24gIDogQXJyYXk8IHN0cmluZyA+LFxuICAgIG1hY2hpbmVfbGljZW5zZSAgICAgOiBBcnJheTwgc3RyaW5nID4sXG4gICAgbWFjaGluZV9uYW1lICAgICAgICA6IEFycmF5PCBzdHJpbmcgPixcbiAgICBtYWNoaW5lX3ZlcnNpb24gICAgIDogQXJyYXk8IHN0cmluZyA+IC8vIHNlbXZlclxuICB9ID0ge1xuICAgIGdyYXBoX2xheW91dCAgICAgICAgOiBbXSxcbiAgICB0cmFuc2l0aW9uICAgICAgICAgIDogW10sXG4gICAgc3RhcnRfc3RhdGVzICAgICAgICA6IFtdLFxuICAgIGVuZF9zdGF0ZXMgICAgICAgICAgOiBbXSxcbiAgICBmc2xfdmVyc2lvbiAgICAgICAgIDogW10sXG4gICAgbWFjaGluZV9hdXRob3IgICAgICA6IFtdLFxuICAgIG1hY2hpbmVfY29tbWVudCAgICAgOiBbXSxcbiAgICBtYWNoaW5lX2NvbnRyaWJ1dG9yIDogW10sXG4gICAgbWFjaGluZV9kZWZpbml0aW9uICA6IFtdLFxuICAgIG1hY2hpbmVfbGljZW5zZSAgICAgOiBbXSxcbiAgICBtYWNoaW5lX25hbWUgICAgICAgIDogW10sXG4gICAgbWFjaGluZV92ZXJzaW9uICAgICA6IFtdXG4gIH07XG5cbiAgdHJlZS5tYXAoICh0ciA6IEpzc21Db21waWxlU2VTdGFydDxtTlQ+KSA9PiB7XG5cbiAgICBjb25zdCBydWxlICAgOiBKc3NtQ29tcGlsZVJ1bGUgPSBjb21waWxlX3J1bGVfaGFuZGxlcih0ciksXG4gICAgICAgICAgYWdnX2FzIDogc3RyaW5nICAgICAgICAgID0gcnVsZS5hZ2dfYXMsXG4gICAgICAgICAgdmFsICAgIDogbWl4ZWQgICAgICAgICAgID0gcnVsZS52YWw7ICAgICAgICAgICAgICAgICAgLy8gdG9kbyBiZXR0ZXIgdHlwZXNcblxuICAgIHJlc3VsdHNbYWdnX2FzXSA9IHJlc3VsdHNbYWdnX2FzXS5jb25jYXQodmFsKTtcblxuICB9KTtcblxuICBjb25zdCBhc3NlbWJsZWRfdHJhbnNpdGlvbnMgOiBBcnJheTwgSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID4gPSBbXS5jb25jYXQoLi4uIHJlc3VsdHNbJ3RyYW5zaXRpb24nXSk7XG5cbiAgY29uc3QgcmVzdWx0X2NmZyA6IEpzc21HZW5lcmljQ29uZmlnPG1OVCwgbURUPiA9IHtcbiAgICBzdGFydF9zdGF0ZXMgOiByZXN1bHRzLnN0YXJ0X3N0YXRlcy5sZW5ndGg/IHJlc3VsdHMuc3RhcnRfc3RhdGVzIDogW2Fzc2VtYmxlZF90cmFuc2l0aW9uc1swXS5mcm9tXSxcbiAgICB0cmFuc2l0aW9ucyAgOiBhc3NlbWJsZWRfdHJhbnNpdGlvbnNcbiAgfTtcblxuICBjb25zdCBvbmVPbmx5S2V5cyA6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgJ2dyYXBoX2xheW91dCcsICdtYWNoaW5lX25hbWUnLCAnbWFjaGluZV92ZXJzaW9uJywgJ21hY2hpbmVfY29tbWVudCcsICdmc2xfdmVyc2lvbicsICdtYWNoaW5lX2xpY2Vuc2UnXG4gIF07XG5cbiAgb25lT25seUtleXMubWFwKCAob25lT25seUtleSA6IHN0cmluZykgPT4ge1xuICAgIGlmIChyZXN1bHRzW29uZU9ubHlLZXldLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWF5IG9ubHkgaGF2ZSBvbmUgJHtvbmVPbmx5S2V5fSBzdGF0ZW1lbnQgbWF4aW11bTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHRzW29uZU9ubHlLZXldKX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlc3VsdHNbb25lT25seUtleV0ubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdF9jZmdbb25lT25seUtleV0gPSByZXN1bHRzW29uZU9ubHlLZXldWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgWydtYWNoaW5lX2F1dGhvciddLm1hcCggKG11bHRpS2V5IDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHJlc3VsdHNbbXVsdGlLZXldLmxlbmd0aCkge1xuICAgICAgcmVzdWx0X2NmZ1ttdWx0aUtleV0gPSByZXN1bHRzW211bHRpS2V5XTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHRfY2ZnO1xuXG59XG5cblxuXG5mdW5jdGlvbiBtYWtlPG1OVCwgbURUPihwbGFuIDogc3RyaW5nKSA6IEpzc21HZW5lcmljQ29uZmlnPG1OVCwgbURUPiB7XG4gIHJldHVybiBjb21waWxlKHBhcnNlKHBsYW4pKTtcbn1cblxuXG5cblxuXG5jbGFzcyBNYWNoaW5lPG1OVCwgbURUPiB7XG5cblxuICBfc3RhdGUgICAgICAgICAgICAgICAgICA6IG1OVDtcbiAgX3N0YXRlcyAgICAgICAgICAgICAgICAgOiBNYXA8bU5ULCBKc3NtR2VuZXJpY1N0YXRlPG1OVD4+O1xuICBfZWRnZXMgICAgICAgICAgICAgICAgICA6IEFycmF5PEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPj47XG4gIF9lZGdlX21hcCAgICAgICAgICAgICAgIDogTWFwPG1OVCwgTWFwPG1OVCwgbnVtYmVyPj47XG4gIF9uYW1lZF90cmFuc2l0aW9ucyAgICAgIDogTWFwPG1OVCwgbnVtYmVyPjtcbiAgX2FjdGlvbnMgICAgICAgICAgICAgICAgOiBNYXA8bU5ULCBNYXA8bU5ULCBudW1iZXI+PjtcbiAgX3JldmVyc2VfYWN0aW9ucyAgICAgICAgOiBNYXA8bU5ULCBNYXA8bU5ULCBudW1iZXI+PjtcbiAgX3JldmVyc2VfYWN0aW9uX3RhcmdldHMgOiBNYXA8bU5ULCBNYXA8bU5ULCBudW1iZXI+PjtcbiAgX2F1dGhvciAgICAgICAgICAgICAgICAgOiBBcnJheTxzdHJpbmc+O1xuICBfY29udHJpYnV0b3IgICAgICAgICAgICA6IEFycmF5PHN0cmluZz47XG5cbiAgX2dyYXBoX2xheW91dCAgICAgICAgICAgOiBKc3NtTGF5b3V0O1xuXG4gIC8vIHdoYXJnYXJibCB0aGlzIGJhZGx5IG5lZWRzIHRvIGJlIGJyb2tlbiB1cCwgbW9ub2xpdGggbWFzdGVyXG4gIGNvbnN0cnVjdG9yKHsgc3RhcnRfc3RhdGVzLCBjb21wbGV0ZT1bXSwgdHJhbnNpdGlvbnMsIGdyYXBoX2xheW91dCA9ICdkb3QnIH0gOiBKc3NtR2VuZXJpY0NvbmZpZzxtTlQsIG1EVD4pIHtcblxuICAgIHRoaXMuX3N0YXRlICAgICAgICAgICAgICAgICAgPSBzdGFydF9zdGF0ZXNbMF07XG4gICAgdGhpcy5fc3RhdGVzICAgICAgICAgICAgICAgICA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9lZGdlcyAgICAgICAgICAgICAgICAgID0gW107XG4gICAgdGhpcy5fZWRnZV9tYXAgICAgICAgICAgICAgICA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9uYW1lZF90cmFuc2l0aW9ucyAgICAgID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX2FjdGlvbnMgICAgICAgICAgICAgICAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fcmV2ZXJzZV9hY3Rpb25zICAgICAgICA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLl9yZXZlcnNlX2FjdGlvbl90YXJnZXRzID0gbmV3IE1hcCgpOyAgIC8vIHRvZG9cblxuICAgIHRoaXMuX2dyYXBoX2xheW91dCAgICAgICAgICAgPSBncmFwaF9sYXlvdXQ7XG5cbiAgICB0cmFuc2l0aW9ucy5tYXAoICh0cjpKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4pID0+IHtcblxuICAgICAgaWYgKHRyLmZyb20gPT09IHVuZGVmaW5lZCkgeyB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gbXVzdCBkZWZpbmUgJ2Zyb20nOiAke0pTT04uc3RyaW5naWZ5KHRyKX1gKTsgfVxuICAgICAgaWYgKHRyLnRvICAgPT09IHVuZGVmaW5lZCkgeyB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gbXVzdCBkZWZpbmUgJ3RvJzogJHsgIEpTT04uc3RyaW5naWZ5KHRyKX1gKTsgfVxuXG4gICAgICAvLyBnZXQgdGhlIGN1cnNvcnMuICB3aGF0IGEgbWVzc1xuICAgICAgY29uc3QgY3Vyc29yX2Zyb20gOiBKc3NtR2VuZXJpY1N0YXRlPG1OVD5cbiAgICAgICAgICA9IHRoaXMuX3N0YXRlcy5nZXQodHIuZnJvbSlcbiAgICAgICAgIHx8IHsgbmFtZTogdHIuZnJvbSwgZnJvbTogW10sIHRvOiBbXSwgY29tcGxldGU6IGNvbXBsZXRlLmluY2x1ZGVzKHRyLmZyb20pIH07XG5cbiAgICAgIGlmICghKHRoaXMuX3N0YXRlcy5oYXModHIuZnJvbSkpKSB7XG4gICAgICAgIHRoaXMuX25ld19zdGF0ZShjdXJzb3JfZnJvbSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnNvcl90byA6IEpzc21HZW5lcmljU3RhdGU8bU5UPlxuICAgICAgICAgID0gdGhpcy5fc3RhdGVzLmdldCh0ci50bylcbiAgICAgICAgIHx8IHtuYW1lOiB0ci50bywgZnJvbTogW10sIHRvOiBbXSwgY29tcGxldGU6IGNvbXBsZXRlLmluY2x1ZGVzKHRyLnRvKSB9O1xuXG4gICAgICBpZiAoISh0aGlzLl9zdGF0ZXMuaGFzKHRyLnRvKSkpIHtcbiAgICAgICAgdGhpcy5fbmV3X3N0YXRlKGN1cnNvcl90byk7XG4gICAgICB9XG5cbiAgICAgIC8vIGd1YXJkIGFnYWluc3QgZXhpc3RpbmcgY29ubmVjdGlvbnMgYmVpbmcgcmUtYWRkZWRcbiAgICAgIGlmIChjdXJzb3JfZnJvbS50by5pbmNsdWRlcyh0ci50bykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhbHJlYWR5IGhhcyAke0pTT04uc3RyaW5naWZ5KHRyLmZyb20pfSB0byAke0pTT04uc3RyaW5naWZ5KHRyLnRvKX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnNvcl9mcm9tLnRvLnB1c2godHIudG8pO1xuICAgICAgICBjdXJzb3JfdG8uZnJvbS5wdXNoKHRyLmZyb20pO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgdGhlIGVkZ2U7IG5vdGUgaXRzIGlkXG4gICAgICB0aGlzLl9lZGdlcy5wdXNoKHRyKTtcbiAgICAgIGNvbnN0IHRoaXNFZGdlSWQgOiBudW1iZXIgPSB0aGlzLl9lZGdlcy5sZW5ndGggLSAxO1xuXG4gICAgICAvLyBndWFyZCBhZ2FpbnN0IHJlcGVhdGluZyBhIHRyYW5zaXRpb24gbmFtZVxuICAgICAgaWYgKHRyLm5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX25hbWVkX3RyYW5zaXRpb25zLmhhcyh0ci5uYW1lKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbmFtZWQgdHJhbnNpdGlvbiBcIiR7SlNPTi5zdHJpbmdpZnkodHIubmFtZSl9XCIgYWxyZWFkeSBjcmVhdGVkYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fbmFtZWRfdHJhbnNpdGlvbnMuc2V0KHRyLm5hbWUsIHRoaXNFZGdlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHNldCB1cCB0aGUgbWFwcGluZywgc28gdGhhdCBlZGdlcyBjYW4gYmUgbG9va2VkIHVwIGJ5IGVuZHBvaW50IHBhaXJzXG4gICAgICBjb25zdCBmcm9tX21hcHBpbmcgOiBNYXA8bU5ULCBudW1iZXI+ID0gdGhpcy5fZWRnZV9tYXAuZ2V0KHRyLmZyb20pIHx8IG5ldyBNYXAoKTtcbiAgICAgIGlmICghKHRoaXMuX2VkZ2VfbWFwLmhhcyh0ci5mcm9tKSkpIHtcbiAgICAgICAgdGhpcy5fZWRnZV9tYXAuc2V0KHRyLmZyb20sIGZyb21fbWFwcGluZyk7XG4gICAgICB9XG5cbi8vICAgIGNvbnN0IHRvX21hcHBpbmcgPSBmcm9tX21hcHBpbmcuZ2V0KHRyLnRvKTtcbiAgICAgIGZyb21fbWFwcGluZy5zZXQodHIudG8sIHRoaXNFZGdlSWQpOyAvLyBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGlzIG1hcHBpbmcgZG9lc24ndCBleGlzdCwgYWJvdmVcblxuICAgICAgLy8gc2V0IHVwIHRoZSBhY3Rpb24gbWFwcGluZywgc28gdGhhdCBhY3Rpb25zIGNhbiBiZSBsb29rZWQgdXAgYnkgb3JpZ2luXG4gICAgICBpZiAodHIuYWN0aW9uKSB7XG5cblxuICAgICAgICAvLyBmb3J3YXJkIG1hcHBpbmcgZmlyc3QgYnkgYWN0aW9uIG5hbWVcbiAgICAgICAgbGV0IGFjdGlvbk1hcCA6ID9NYXA8bU5ULCBudW1iZXI+ID0gdGhpcy5fYWN0aW9ucy5nZXQodHIuYWN0aW9uKTtcbiAgICAgICAgaWYgKCEoYWN0aW9uTWFwKSkge1xuICAgICAgICAgIGFjdGlvbk1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLl9hY3Rpb25zLnNldCh0ci5hY3Rpb24sIGFjdGlvbk1hcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0aW9uTWFwLmhhcyh0ci5mcm9tKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYWN0aW9uICR7SlNPTi5zdHJpbmdpZnkodHIuYWN0aW9uKX0gYWxyZWFkeSBhdHRhY2hlZCB0byBvcmlnaW4gJHtKU09OLnN0cmluZ2lmeSh0ci5mcm9tKX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3Rpb25NYXAuc2V0KHRyLmZyb20sIHRoaXNFZGdlSWQpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyByZXZlcnNlIG1hcHBpbmcgZmlyc3QgYnkgc3RhdGUgb3JpZ2luIG5hbWVcbiAgICAgICAgbGV0IHJBY3Rpb25NYXAgOiA/TWFwPG1OVCwgbnVtYmVyPiA9IHRoaXMuX3JldmVyc2VfYWN0aW9ucy5nZXQodHIuZnJvbSk7XG4gICAgICAgIGlmICghKHJBY3Rpb25NYXApKSB7XG4gICAgICAgICAgckFjdGlvbk1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLl9yZXZlcnNlX2FjdGlvbnMuc2V0KHRyLmZyb20sIHJBY3Rpb25NYXApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm8gbmVlZCB0byB0ZXN0IGZvciByZXZlcnNlIG1hcHBpbmcgcHJlLXByZXNlbmNlO1xuICAgICAgICAvLyBmb3J3YXJkIG1hcHBpbmcgYWxyZWFkeSBjb3ZlcnMgY29sbGlzaW9uc1xuICAgICAgICByQWN0aW9uTWFwLnNldCh0ci5hY3Rpb24sIHRoaXNFZGdlSWQpO1xuXG5cbiAgICAgICAgLy8gcmV2ZXJzZSBtYXBwaW5nIGZpcnN0IGJ5IHN0YXRlIHRhcmdldCBuYW1lXG4gICAgICAgIGlmICghKHRoaXMuX3JldmVyc2VfYWN0aW9uX3RhcmdldHMuaGFzKHRyLnRvKSkpIHtcbiAgICAgICAgICB0aGlzLl9yZXZlcnNlX2FjdGlvbl90YXJnZXRzLnNldCh0ci50bywgbmV3IE1hcCgpKTtcbiAgICAgICAgfVxuXG4vKiB0b2RvIGNvbWViYWNrXG4gICBmdW5kYW1lbnRhbCBwcm9ibGVtIGlzIHJvQWN0aW9uTWFwIG5lZWRzIHRvIGJlIGEgbXVsdGltYXBcbiAgICAgICAgY29uc3Qgcm9BY3Rpb25NYXAgPSB0aGlzLl9yZXZlcnNlX2FjdGlvbl90YXJnZXRzLmdldCh0ci50byk7ICAvLyB3YXN0ZWZ1bCAtIGFscmVhZHkgZGlkIGhhcyAtIHJlZmFjdG9yXG4gICAgICAgIGlmIChyb0FjdGlvbk1hcCkge1xuICAgICAgICAgIGlmIChyb0FjdGlvbk1hcC5oYXModHIuYWN0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGByby1hY3Rpb24gJHt0ci50b30gYWxyZWFkeSBhdHRhY2hlZCB0byBhY3Rpb24gJHt0ci5hY3Rpb259YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvQWN0aW9uTWFwLnNldCh0ci5hY3Rpb24sIHRoaXNFZGdlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBiZSBpbXBvc3NpYmxlIC0gZmxvdyBkb2VzblxcJ3Qga25vdyAuc2V0IHByZWNlZGVzIC5nZXQgeWV0IGFnYWluLiAgc2V2ZXJlIGVycm9yPycpO1xuICAgICAgICB9XG4qL1xuICAgICAgfVxuXG4gICAgfSk7XG5cbiAgfVxuXG4gIF9uZXdfc3RhdGUoc3RhdGVfY29uZmlnIDogSnNzbUdlbmVyaWNTdGF0ZTxtTlQ+KSA6IG1OVCB7IC8vIHdoYXJnYXJibCBnZXQgdGhhdCBzdGF0ZV9jb25maWcgYW55IHVuZGVyIGNvbnRyb2xcblxuICAgIGlmICh0aGlzLl9zdGF0ZXMuaGFzKHN0YXRlX2NvbmZpZy5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdGF0ZSAke0pTT04uc3RyaW5naWZ5KHN0YXRlX2NvbmZpZy5uYW1lKX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0ZXMuc2V0KHN0YXRlX2NvbmZpZy5uYW1lLCBzdGF0ZV9jb25maWcpO1xuICAgIHJldHVybiBzdGF0ZV9jb25maWcubmFtZTtcblxuICB9XG5cblxuXG4gIHN0YXRlKCkgOiBtTlQge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4vKiB3aGFyZ2FyYmwgdG9kbyBtYWpvclxuICAgd2hlbiB3ZSByZWltcGxlbWVudCB0aGlzLCByZWludHJvZHVjZSB0aGlzIGNoYW5nZSB0byB0aGUgaXNfZmluYWwgY2FsbFxuXG4gIGlzX2NoYW5naW5nKCkgOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gdG9kbyB3aGFyZ2FyYmxcbiAgfVxuKi9cblxuXG4gIHN0YXRlX2lzX2ZpbmFsKHdoaWNoU3RhdGUgOiBtTlQpIDogYm9vbGVhbiB7XG4gICAgcmV0dXJuICggKHRoaXMuc3RhdGVfaXNfdGVybWluYWwod2hpY2hTdGF0ZSkpICYmICh0aGlzLnN0YXRlX2lzX2NvbXBsZXRlKHdoaWNoU3RhdGUpKSApO1xuICB9XG5cbiAgaXNfZmluYWwoKSA6IGJvb2xlYW4ge1xuLy8gIHJldHVybiAoKCF0aGlzLmlzX2NoYW5naW5nKCkpICYmIHRoaXMuc3RhdGVfaXNfZmluYWwodGhpcy5zdGF0ZSgpKSk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVfaXNfZmluYWwodGhpcy5zdGF0ZSgpKTtcbiAgfVxuXG4gIGdyYXBoX2xheW91dCgpIDogc3RyaW5nIHtcbiAgICByZXR1cm4gU3RyaW5nKHRoaXMuX2dyYXBoX2xheW91dCk7XG4gIH1cblxuXG5cbiAgbWFjaGluZV9zdGF0ZSgpIDogSnNzbU1hY2hpbmVJbnRlcm5hbFN0YXRlPG1OVCwgbURUPiB7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW50ZXJuYWxfc3RhdGVfaW1wbF92ZXJzaW9uIDogMSxcblxuICAgICAgYWN0aW9ucyAgICAgICAgICAgICAgICA6IHRoaXMuX2FjdGlvbnMsXG4gICAgICBlZGdlX21hcCAgICAgICAgICAgICAgIDogdGhpcy5fZWRnZV9tYXAsXG4gICAgICBlZGdlcyAgICAgICAgICAgICAgICAgIDogdGhpcy5fZWRnZXMsXG4gICAgICBuYW1lZF90cmFuc2l0aW9ucyAgICAgIDogdGhpcy5fbmFtZWRfdHJhbnNpdGlvbnMsXG4gICAgICByZXZlcnNlX2FjdGlvbnMgICAgICAgIDogdGhpcy5fcmV2ZXJzZV9hY3Rpb25zLFxuLy8gICAgcmV2ZXJzZV9hY3Rpb25fdGFyZ2V0cyA6IHRoaXMuX3JldmVyc2VfYWN0aW9uX3RhcmdldHMsXG4gICAgICBzdGF0ZSAgICAgICAgICAgICAgICAgIDogdGhpcy5fc3RhdGUsXG4gICAgICBzdGF0ZXMgICAgICAgICAgICAgICAgIDogdGhpcy5fc3RhdGVzXG4gICAgfTtcblxuICB9XG5cbi8qXG4gIGxvYWRfbWFjaGluZV9zdGF0ZSgpIDogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyB0b2RvIHdoYXJnYXJibFxuICB9XG4qL1xuXG5cbiAgc3RhdGVzKCkgOiBBcnJheTxtTlQ+IHtcbiAgICByZXR1cm4gWy4uLiB0aGlzLl9zdGF0ZXMua2V5cygpXTtcbiAgfVxuXG4gIHN0YXRlX2Zvcih3aGljaFN0YXRlIDogbU5UKSA6IEpzc21HZW5lcmljU3RhdGU8bU5UPiB7XG4gICAgY29uc3Qgc3RhdGUgOiA/SnNzbUdlbmVyaWNTdGF0ZTxtTlQ+ID0gdGhpcy5fc3RhdGVzLmdldCh3aGljaFN0YXRlKTtcbiAgICBpZiAoc3RhdGUpIHsgcmV0dXJuIHN0YXRlOyB9XG4gICAgZWxzZSAgICAgICB7IHRocm93IG5ldyBFcnJvcihgbm8gc3VjaCBzdGF0ZSAke0pTT04uc3RyaW5naWZ5KHN0YXRlKX1gKTsgfVxuICB9XG5cblxuXG4gIGxpc3RfZWRnZXMoKSA6IEFycmF5PCBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPiB7XG4gICAgcmV0dXJuIHRoaXMuX2VkZ2VzO1xuICB9XG5cbiAgbGlzdF9uYW1lZF90cmFuc2l0aW9ucygpIDogTWFwPG1OVCwgbnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVkX3RyYW5zaXRpb25zO1xuICB9XG5cbiAgbGlzdF9hY3Rpb25zKCkgOiBBcnJheTxtTlQ+IHtcbiAgICByZXR1cm4gWy4uLiB0aGlzLl9hY3Rpb25zLmtleXMoKV07XG4gIH1cblxuXG5cbiAgZ2V0X3RyYW5zaXRpb25fYnlfc3RhdGVfbmFtZXMoZnJvbTogbU5ULCB0bzogbU5UKSA6ID9udW1iZXIge1xuXG4gICAgY29uc3QgZW1nIDogP01hcDxtTlQsIG51bWJlcj4gPSB0aGlzLl9lZGdlX21hcC5nZXQoZnJvbSk7XG5cbiAgICBpZiAoZW1nKSB7XG4gICAgICByZXR1cm4gZW1nLmdldCh0byk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gIH1cblxuXG5cbiAgbG9va3VwX3RyYW5zaXRpb25fZm9yKGZyb206IG1OVCwgdG86IG1OVCkgOiA/SnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+IHtcbiAgICBjb25zdCBpZCA6ID9udW1iZXIgPSB0aGlzLmdldF90cmFuc2l0aW9uX2J5X3N0YXRlX25hbWVzKGZyb20sIHRvKTtcbiAgICByZXR1cm4gKChpZCA9PT0gdW5kZWZpbmVkKSB8fCAoaWQgPT09IG51bGwpKT8gdW5kZWZpbmVkIDogdGhpcy5fZWRnZXNbaWRdO1xuICB9XG5cblxuXG4gIGxpc3RfdHJhbnNpdGlvbnMod2hpY2hTdGF0ZSA6IG1OVCA9IHRoaXMuc3RhdGUoKSkgOiBKc3NtVHJhbnNpdGlvbkxpc3Q8bU5UPiB7XG4gICAgcmV0dXJuIHtlbnRyYW5jZXM6IHRoaXMubGlzdF9lbnRyYW5jZXMod2hpY2hTdGF0ZSksIGV4aXRzOiB0aGlzLmxpc3RfZXhpdHMod2hpY2hTdGF0ZSl9O1xuICB9XG5cbiAgbGlzdF9lbnRyYW5jZXMod2hpY2hTdGF0ZSA6IG1OVCA9IHRoaXMuc3RhdGUoKSkgOiBBcnJheTxtTlQ+IHtcbiAgICByZXR1cm4gKHRoaXMuX3N0YXRlcy5nZXQod2hpY2hTdGF0ZSkgfHwge30pLmZyb20gfHwgW107XG4gIH1cblxuICBsaXN0X2V4aXRzKHdoaWNoU3RhdGUgOiBtTlQgPSB0aGlzLnN0YXRlKCkpIDogQXJyYXk8bU5UPiB7XG4gICAgcmV0dXJuICh0aGlzLl9zdGF0ZXMuZ2V0KHdoaWNoU3RhdGUpIHx8IHt9KS50byAgIHx8IFtdO1xuICB9XG5cblxuXG4gIHByb2JhYmxlX2V4aXRzX2Zvcih3aGljaFN0YXRlIDogbU5UKSA6IEFycmF5PCBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPiB7XG5cbiAgICBjb25zdCB3c3RhdGUgOiA/SnNzbUdlbmVyaWNTdGF0ZTxtTlQ+ID0gdGhpcy5fc3RhdGVzLmdldCh3aGljaFN0YXRlKTtcbiAgICBpZiAoISh3c3RhdGUpKSB7IHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBzdGF0ZSAke0pTT04uc3RyaW5naWZ5KHdoaWNoU3RhdGUpfSBpbiBwcm9iYWJsZV9leGl0c19mb3JgKTsgfVxuXG4gICAgY29uc3Qgd3N0YXRlX3RvIDogQXJyYXk8IG1OVCA+ID0gd3N0YXRlLnRvLFxuXG4gICAgICAgICAgd3RmICAgICAgIDogQXJyYXk8IEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPiA+IC8vIHdzdGF0ZV90b19maWx0ZXJlZCAtPiB3dGZcbiAgICAgICAgICAgICAgICAgICAgPSB3c3RhdGVfdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoICh3cykgOiA/SnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID0+IHRoaXMubG9va3VwX3RyYW5zaXRpb25fZm9yKHRoaXMuc3RhdGUoKSwgd3MpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgIHJldHVybiB3dGY7XG5cbiAgfVxuXG4gIHByb2JhYmlsaXN0aWNfdHJhbnNpdGlvbigpIDogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgOiBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4gPSB3ZWlnaHRlZF9yYW5kX3NlbGVjdCh0aGlzLnByb2JhYmxlX2V4aXRzX2Zvcih0aGlzLnN0YXRlKCkpKTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uKCBzZWxlY3RlZC50byApO1xuICB9XG5cbiAgcHJvYmFiaWxpc3RpY193YWxrKG4gOiBudW1iZXIpIDogQXJyYXk8bU5UPiB7XG4gICAgcmV0dXJuIHNlcShuKVxuICAgICAgICAgIC5tYXAoKCkgOiBtTlQgPT4ge1xuICAgICAgICAgICAgIGNvbnN0IHN0YXRlX3dhcyA6IG1OVCA9IHRoaXMuc3RhdGUoKTtcbiAgICAgICAgICAgICB0aGlzLnByb2JhYmlsaXN0aWNfdHJhbnNpdGlvbigpO1xuICAgICAgICAgICAgIHJldHVybiBzdGF0ZV93YXM7XG4gICAgICAgICAgIH0pXG4gICAgICAgICAgLmNvbmNhdChbdGhpcy5zdGF0ZSgpXSk7XG4gIH1cblxuICBwcm9iYWJpbGlzdGljX2hpc3RvX3dhbGsobiA6IG51bWJlcikgOiBNYXA8bU5ULCBudW1iZXI+IHtcbiAgICByZXR1cm4gaGlzdG9ncmFwaCh0aGlzLnByb2JhYmlsaXN0aWNfd2FsayhuKSk7XG4gIH1cblxuXG5cbiAgYWN0aW9ucyh3aGljaFN0YXRlIDogbU5UID0gdGhpcy5zdGF0ZSgpICkgOiBBcnJheTxtTlQ+IHtcbiAgICBjb25zdCB3c3RhdGUgOiA/TWFwPG1OVCwgbnVtYmVyPiA9IHRoaXMuX3JldmVyc2VfYWN0aW9ucy5nZXQod2hpY2hTdGF0ZSk7XG4gICAgaWYgKHdzdGF0ZSkgeyByZXR1cm4gWy4uLiB3c3RhdGUua2V5cygpXTsgfVxuICAgIGVsc2UgICAgICAgIHsgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIHN0YXRlICR7SlNPTi5zdHJpbmdpZnkod2hpY2hTdGF0ZSl9YCk7IH1cbiAgfVxuXG4gIGxpc3Rfc3RhdGVzX2hhdmluZ19hY3Rpb24od2hpY2hTdGF0ZSA6IG1OVCkgOiBBcnJheTxtTlQ+IHtcbiAgICBjb25zdCB3c3RhdGUgOiA/TWFwPG1OVCwgbnVtYmVyPiA9IHRoaXMuX2FjdGlvbnMuZ2V0KHdoaWNoU3RhdGUpO1xuICAgIGlmICh3c3RhdGUpIHsgcmV0dXJuIFsuLi4gd3N0YXRlLmtleXMoKV07IH1cbiAgICBlbHNlICAgICAgICB7IHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBzdGF0ZSAke0pTT04uc3RyaW5naWZ5KHdoaWNoU3RhdGUpfWApOyB9XG4gIH1cblxuLy8gY29tZWJhY2tcbi8qXG4gIGxpc3RfZW50cmFuY2VfYWN0aW9ucyh3aGljaFN0YXRlIDogbU5UID0gdGhpcy5zdGF0ZSgpICkgOiBBcnJheTxtTlQ+IHtcbiAgICByZXR1cm4gWy4uLiAodGhpcy5fcmV2ZXJzZV9hY3Rpb25fdGFyZ2V0cy5nZXQod2hpY2hTdGF0ZSkgfHwgbmV3IE1hcCgpKS52YWx1ZXMoKV0gLy8gd2FzdGVmdWxcbiAgICAgICAgICAgLm1hcCggKGVkZ2VJZDphbnkpID0+ICh0aGlzLl9lZGdlc1tlZGdlSWRdIDogYW55KSkgLy8gd2hhcmdhcmJsIGJ1cm4gb3V0IGFueVxuICAgICAgICAgICAuZmlsdGVyKCAobzphbnkpID0+IG8udG8gPT09IHdoaWNoU3RhdGUpXG4gICAgICAgICAgIC5tYXAoIGZpbHRlcmVkID0+IGZpbHRlcmVkLmZyb20gKTtcbiAgfVxuKi9cbiAgbGlzdF9leGl0X2FjdGlvbnMod2hpY2hTdGF0ZSA6IG1OVCA9IHRoaXMuc3RhdGUoKSApIDogQXJyYXk8P21OVD4geyAvLyB0aGVzZSBhcmUgbU5ULCBub3QgP21OVFxuICAgIGNvbnN0IHJhX2Jhc2UgOiA/TWFwPG1OVCwgbnVtYmVyPiA9IHRoaXMuX3JldmVyc2VfYWN0aW9ucy5nZXQod2hpY2hTdGF0ZSk7XG4gICAgaWYgKCEocmFfYmFzZSkpIHsgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIHN0YXRlICR7SlNPTi5zdHJpbmdpZnkod2hpY2hTdGF0ZSl9YCk7IH1cblxuICAgIHJldHVybiBbLi4uIHJhX2Jhc2UudmFsdWVzKCldXG4gICAgICAgICAgIC5tYXAgICAgKCAoZWRnZUlkOm51bWJlcikgICAgICAgICAgICAgIDogSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID0+IHRoaXMuX2VkZ2VzW2VkZ2VJZF0gICApXG4gICAgICAgICAgIC5maWx0ZXIgKCAobzpKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4pIDogYm9vbGVhbiAgICAgICAgICAgICAgICAgID0+IG8uZnJvbSA9PT0gd2hpY2hTdGF0ZSApXG4gICAgICAgICAgIC5tYXAgICAgKCAoZmlsdGVyZWQgOiBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4pIDogP21OVCAgICAgICAgICAgID0+IGZpbHRlcmVkLmFjdGlvbiAgICAgICApO1xuICB9XG5cbiAgcHJvYmFibGVfYWN0aW9uX2V4aXRzKHdoaWNoU3RhdGUgOiBtTlQgPSB0aGlzLnN0YXRlKCkgKSA6IEFycmF5PG1peGVkPiB7IC8vIHRoZXNlIGFyZSBtTlRcbiAgICBjb25zdCByYV9iYXNlIDogP01hcDxtTlQsIG51bWJlcj4gPSB0aGlzLl9yZXZlcnNlX2FjdGlvbnMuZ2V0KHdoaWNoU3RhdGUpO1xuICAgIGlmICghKHJhX2Jhc2UpKSB7IHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBzdGF0ZSAke0pTT04uc3RyaW5naWZ5KHdoaWNoU3RhdGUpfWApOyB9XG5cbiAgICByZXR1cm4gWy4uLiByYV9iYXNlLnZhbHVlcygpXVxuICAgICAgICAgICAubWFwICAgICggKGVkZ2VJZDpudW1iZXIpIDogSnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID0+IHRoaXMuX2VkZ2VzW2VkZ2VJZF0gICApXG4gICAgICAgICAgIC5maWx0ZXIgKCAobzpKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4pIDogYm9vbGVhbiAgICAgPT4gby5mcm9tID09PSB3aGljaFN0YXRlIClcbiAgICAgICAgICAgLm1hcCAgICAoIChmaWx0ZXJlZCkgOiBtaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAoIHsgYWN0aW9uICAgICAgOiBmaWx0ZXJlZC5hY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JhYmlsaXR5IDogZmlsdGVyZWQucHJvYmFiaWxpdHkgfSApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgfVxuXG5cblxuICBpc191bmVudGVyYWJsZSh3aGljaFN0YXRlIDogbU5UKSA6IGJvb2xlYW4ge1xuICAgIC8vIHdoYXJnYXJibCBzaG91bGQgdGhyb3cgb24gdW5rbm93biBzdGF0ZVxuICAgIHJldHVybiB0aGlzLmxpc3RfZW50cmFuY2VzKHdoaWNoU3RhdGUpLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIGhhc191bmVudGVyYWJsZXMoKSA6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlcygpLnNvbWUoICh4KSA6IGJvb2xlYW4gPT4gdGhpcy5pc191bmVudGVyYWJsZSh4KSk7XG4gIH1cblxuXG5cbiAgaXNfdGVybWluYWwoKSA6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlX2lzX3Rlcm1pbmFsKHRoaXMuc3RhdGUoKSk7XG4gIH1cblxuICBzdGF0ZV9pc190ZXJtaW5hbCh3aGljaFN0YXRlIDogbU5UKSA6IGJvb2xlYW4ge1xuICAgIC8vIHdoYXJnYXJibCBzaG91bGQgdGhyb3cgb24gdW5rbm93biBzdGF0ZVxuICAgIHJldHVybiB0aGlzLmxpc3RfZXhpdHMod2hpY2hTdGF0ZSkubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgaGFzX3Rlcm1pbmFscygpIDogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVzKCkuc29tZSggKHgpIDogYm9vbGVhbiA9PiB0aGlzLnN0YXRlX2lzX3Rlcm1pbmFsKHgpKTtcbiAgfVxuXG5cblxuICBpc19jb21wbGV0ZSgpIDogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVfaXNfY29tcGxldGUodGhpcy5zdGF0ZSgpKTtcbiAgfVxuXG4gIHN0YXRlX2lzX2NvbXBsZXRlKHdoaWNoU3RhdGUgOiBtTlQpIDogYm9vbGVhbiB7XG4gICAgY29uc3Qgd3N0YXRlIDogP0pzc21HZW5lcmljU3RhdGU8bU5UPiA9IHRoaXMuX3N0YXRlcy5nZXQod2hpY2hTdGF0ZSk7XG4gICAgaWYgKHdzdGF0ZSkgeyByZXR1cm4gd3N0YXRlLmNvbXBsZXRlOyB9XG4gICAgZWxzZSAgICAgICAgeyB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggc3RhdGUgJHtKU09OLnN0cmluZ2lmeSh3aGljaFN0YXRlKX1gKTsgfVxuICB9XG5cbiAgaGFzX2NvbXBsZXRlcygpIDogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVzKCkuc29tZSggKHgpIDogYm9vbGVhbiA9PiB0aGlzLnN0YXRlX2lzX2NvbXBsZXRlKHgpICk7XG4gIH1cblxuXG5cbiAgYWN0aW9uKG5hbWUgOiBtTlQsIG5ld0RhdGE/IDogbURUKSA6IGJvb2xlYW4ge1xuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBob29rc1xuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBkYXRhIHN0dWZmXG4gICAgLy8gdG9kbyBtYWpvciBpbmNvbXBsZXRlIHdoYXJnYXJibCBjb21lYmFja1xuICAgIGlmICh0aGlzLnZhbGlkX2FjdGlvbihuYW1lLCBuZXdEYXRhKSkge1xuICAgICAgY29uc3QgZWRnZSA6IEpzc21UcmFuc2l0aW9uPG1OVCwgbURUPiA9IHRoaXMuY3VycmVudF9hY3Rpb25fZWRnZV9mb3IobmFtZSk7XG4gICAgICB0aGlzLl9zdGF0ZSA9IGVkZ2UudG87XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRpb24obmV3U3RhdGUgOiBtTlQsIG5ld0RhdGE/IDogbURUKSA6IGJvb2xlYW4ge1xuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBob29rc1xuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBkYXRhIHN0dWZmXG4gICAgLy8gdG9kbyBtYWpvciBpbmNvbXBsZXRlIHdoYXJnYXJibCBjb21lYmFja1xuICAgIGlmICh0aGlzLnZhbGlkX3RyYW5zaXRpb24obmV3U3RhdGUsIG5ld0RhdGEpKSB7XG4gICAgICB0aGlzLl9zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBjYW4gbGVhdmUgbWFjaGluZSBpbiBpbmNvbnNpc3RlbnQgc3RhdGUuICBnZW5lcmFsbHkgZG8gbm90IHVzZVxuICBmb3JjZV90cmFuc2l0aW9uKG5ld1N0YXRlIDogbU5ULCBuZXdEYXRhPyA6IG1EVCkgOiBib29sZWFuIHtcbiAgICAvLyB0b2RvIHdoYXJnYXJibCBpbXBsZW1lbnQgaG9va3NcbiAgICAvLyB0b2RvIHdoYXJnYXJibCBpbXBsZW1lbnQgZGF0YSBzdHVmZlxuICAgIC8vIHRvZG8gbWFqb3IgaW5jb21wbGV0ZSB3aGFyZ2FyYmwgY29tZWJhY2tcbiAgICBpZiAodGhpcy52YWxpZF9mb3JjZV90cmFuc2l0aW9uKG5ld1N0YXRlLCBuZXdEYXRhKSkge1xuICAgICAgdGhpcy5fc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cblxuXG4gIGN1cnJlbnRfYWN0aW9uX2ZvcihhY3Rpb24gOiBtTlQpIDogbnVtYmVyIHwgdm9pZCB7XG4gICAgY29uc3QgYWN0aW9uX2Jhc2UgOiA/TWFwPG1OVCwgbnVtYmVyPiA9IHRoaXMuX2FjdGlvbnMuZ2V0KGFjdGlvbik7XG4gICAgcmV0dXJuIGFjdGlvbl9iYXNlPyBhY3Rpb25fYmFzZS5nZXQodGhpcy5zdGF0ZSgpKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGN1cnJlbnRfYWN0aW9uX2VkZ2VfZm9yKGFjdGlvbiA6IG1OVCkgOiBKc3NtVHJhbnNpdGlvbjxtTlQsIG1EVD4ge1xuICAgIGNvbnN0IGlkeCA6ID9udW1iZXIgPSB0aGlzLmN1cnJlbnRfYWN0aW9uX2ZvcihhY3Rpb24pO1xuICAgIGlmICgoaWR4ID09PSB1bmRlZmluZWQpIHx8IChpZHggPT09IG51bGwpKSB7IHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBhY3Rpb24gJHtKU09OLnN0cmluZ2lmeShhY3Rpb24pfWApOyB9XG4gICAgcmV0dXJuIHRoaXMuX2VkZ2VzW2lkeF07XG4gIH1cblxuICB2YWxpZF9hY3Rpb24oYWN0aW9uIDogbU5ULCBfbmV3RGF0YT8gOiBtRFQpIDogYm9vbGVhbiB7ICAvLyB0b2RvIGNvbWViYWNrIHVuaWdub3JlIG5ld0RhdGFcbiAgICAvLyB0b2RvIHdoYXJnYXJibCBpbXBsZW1lbnQgaG9va3NcbiAgICAvLyB0b2RvIHdoYXJnYXJibCBpbXBsZW1lbnQgZGF0YSBzdHVmZlxuICAgIC8vIHRvZG8gbWFqb3IgaW5jb21wbGV0ZSB3aGFyZ2FyYmwgY29tZWJhY2tcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50X2FjdGlvbl9mb3IoYWN0aW9uKSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFsaWRfdHJhbnNpdGlvbihuZXdTdGF0ZSA6IG1OVCwgX25ld0RhdGE/IDogbURUKSA6IGJvb2xlYW4geyAgLy8gdG9kbyBjb21lYmFjayB1bmlnbm9yZSBuZXdEYXRhXG4gICAgLy8gdG9kbyB3aGFyZ2FyYmwgaW1wbGVtZW50IGhvb2tzXG4gICAgLy8gdG9kbyB3aGFyZ2FyYmwgaW1wbGVtZW50IGRhdGEgc3R1ZmZcbiAgICAvLyB0b2RvIG1ham9yIGluY29tcGxldGUgd2hhcmdhcmJsIGNvbWViYWNrXG4gICAgY29uc3QgdHJhbnNpdGlvbl9mb3IgOiA/SnNzbVRyYW5zaXRpb248bU5ULCBtRFQ+ID0gdGhpcy5sb29rdXBfdHJhbnNpdGlvbl9mb3IodGhpcy5zdGF0ZSgpLCBuZXdTdGF0ZSk7XG5cbiAgICBpZiAoISh0cmFuc2l0aW9uX2ZvcikpICAgICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaWYgKHRyYW5zaXRpb25fZm9yLmZvcmNlZF9vbmx5KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfVxuXG4gIHZhbGlkX2ZvcmNlX3RyYW5zaXRpb24obmV3U3RhdGUgOiBtTlQsIF9uZXdEYXRhPyA6IG1EVCkgOiBib29sZWFuIHsgIC8vIHRvZG8gY29tZWJhY2sgdW5pZ25vcmUgbmV3RGF0YVxuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBob29rc1xuICAgIC8vIHRvZG8gd2hhcmdhcmJsIGltcGxlbWVudCBkYXRhIHN0dWZmXG4gICAgLy8gdG9kbyBtYWpvciBpbmNvbXBsZXRlIHdoYXJnYXJibCBjb21lYmFja1xuICAgIHJldHVybiAodGhpcy5sb29rdXBfdHJhbnNpdGlvbl9mb3IodGhpcy5zdGF0ZSgpLCBuZXdTdGF0ZSkgIT09IHVuZGVmaW5lZCk7XG4gIH1cblxuXG59XG5cblxuXG5cblxuZnVuY3Rpb24gc208bU5ULCBtRFQ+KHRlbXBsYXRlX3N0cmluZ3MgOiBBcnJheTxzdHJpbmc+IC8qICwgYXJndW1lbnRzICovKSA6IE1hY2hpbmU8bU5ULCBtRFQ+IHtcblxuICAgIC8vIGZvb2BhJHsxfWIkezJ9Y2Agd2lsbCBjb21lIGluIGFzIChbJ2EnLCdiJywnYyddLDEsMilcbiAgICAvLyB0aGlzIGluY2x1ZGVzIHdoZW4gYSBhbmQgYyBhcmUgZW1wdHkgc3RyaW5nc1xuICAgIC8vIHRoZXJlZm9yZSB0ZW1wbGF0ZV9zdHJpbmdzIHdpbGwgYWx3YXlzIGhhdmUgb25lIG1vcmUgZWwgdGhhbiB0ZW1wbGF0ZV9hcmdzXG4gICAgLy8gdGhlcmVmb3JlIG1hcCB0aGUgc21hbGxlciBjb250YWluZXIgYW5kIHRvc3MgdGhlIGxhc3Qgb25lIG9uIG9uIHRoZSB3YXkgb3V0XG5cbiAgICByZXR1cm4gbmV3IE1hY2hpbmUobWFrZSh0ZW1wbGF0ZV9zdHJpbmdzLnJlZHVjZShcblxuICAgICAgLy8gaW4gZ2VuZXJhbCBhdm9pZGluZyBgYXJndW1lbnRzYCBpcyBzbWFydC4gIGhvd2V2ZXIgd2l0aCB0aGUgdGVtcGxhdGVcbiAgICAgIC8vIHN0cmluZyBub3RhdGlvbiwgYXMgZGVzaWduZWQsIGl0J3Mgbm90IHJlYWxseSB3b3J0aCB0aGUgaGFzc2xlXG5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIGZwL25vLWFyZ3VtZW50cyAqL1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLXJlc3QtcGFyYW1zICovXG4gICAgICAoYWNjLCB2YWwsIGlkeCkgOiBzdHJpbmcgPT4gYCR7YWNjfSR7YXJndW1lbnRzW2lkeF19JHt2YWx9YCAgLy8gYXJndW1lbnRzWzBdIGlzIG5ldmVyIGxvYWRlZCwgc28gYXJncyBkb2Vzbid0IG5lZWQgdG8gYmUgZ2F0ZWRcbiAgICAgIC8qIGVzbGludC1lbmFibGUgIHByZWZlci1yZXN0LXBhcmFtcyAqL1xuICAgICAgLyogZXNsaW50LWVuYWJsZSAgZnAvbm8tYXJndW1lbnRzICovXG5cbiAgICApKSk7XG5cbn1cblxuXG5cblxuXG5leHBvcnQge1xuXG4gIHZlcnNpb24sXG5cbiAgTWFjaGluZSxcblxuICBtYWtlLFxuICAgIHBhcnNlLFxuICAgIGNvbXBpbGUsXG5cbiAgc20sXG5cbiAgYXJyb3dfZGlyZWN0aW9uLFxuICBhcnJvd19sZWZ0X2tpbmQsXG4gIGFycm93X3JpZ2h0X2tpbmQsXG5cbiAgLy8gdG9kbyB3aGFyZ2FyYmwgdGhlc2Ugc2hvdWxkIGJlIGV4cG9ydGVkIHRvIGEgdXRpbGl0eSBsaWJyYXJ5XG4gIHNlcSwgd2VpZ2h0ZWRfcmFuZF9zZWxlY3QsIGhpc3RvZ3JhcGgsIHdlaWdodGVkX3NhbXBsZV9zZWxlY3QsIHdlaWdodGVkX2hpc3RvX2tleVxuXG59O1xuIl19 \ No newline at end of file diff --git a/dist/jssm.es5.cjs.js b/dist/jssm.es5.cjs.js index 8f9ce554..6b78dcba 100644 --- a/dist/jssm.es5.cjs.js +++ b/dist/jssm.es5.cjs.js @@ -578,7 +578,8 @@ var Machine = function () { } var wstate_to = wstate.to, - wtf = wstate_to.map(function (ws) { + wtf // wstate_to_filtered -> wtf + = wstate_to.map(function (ws) { return _this2.lookup_transition_for(_this2.state(), ws); }).filter(Boolean); diff --git a/src/js/jssm.js b/src/js/jssm.js index 206dea39..31888b8c 100644 --- a/src/js/jssm.js +++ b/src/js/jssm.js @@ -287,6 +287,8 @@ class Machine { _actions : Map>; _reverse_actions : Map>; _reverse_action_targets : Map>; + _author : Array; + _contributor : Array; _graph_layout : JssmLayout; @@ -543,7 +545,7 @@ class Machine { const wstate_to : Array< mNT > = wstate.to, - wtf : Array< JssmTransition > + wtf : Array< JssmTransition > // wstate_to_filtered -> wtf = wstate_to .map( (ws) : ?JssmTransition => this.lookup_transition_for(this.state(), ws)) .filter(Boolean);