From 4761db65410a5e38d576b8c2211714b98febcbe8 Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Mon, 22 Jan 2024 11:14:53 +0000 Subject: [PATCH] Updated & Isolated PerfectScrollbar JS/CSS --- .../{scrollbar.css => perfectscrollbar.css} | 27 +- apps/static/js/index.js | 1288 +---------------- apps/static/js/perfectscrollbar.js | 36 + apps/templates/includes/scripts.html | 2 + apps/templates/layouts/base.html | 2 +- 5 files changed, 54 insertions(+), 1301 deletions(-) rename apps/static/css/{scrollbar.css => perfectscrollbar.css} (73%) create mode 100644 apps/static/js/perfectscrollbar.js diff --git a/apps/static/css/scrollbar.css b/apps/static/css/perfectscrollbar.css similarity index 73% rename from apps/static/css/scrollbar.css rename to apps/static/css/perfectscrollbar.css index e384276..3de6f2c 100644 --- a/apps/static/css/scrollbar.css +++ b/apps/static/css/perfectscrollbar.css @@ -1,7 +1,7 @@ -* +/* * Container style */ -.ps { + .ps { overflow: hidden !important; overflow-anchor: none; -ms-overflow-style: none; @@ -15,8 +15,8 @@ .ps__rail-x { display: none; opacity: 0; - transition: background-color 0.2s linear, opacity 0.2s linear; - -webkit-transition: background-color 0.2s linear, opacity 0.2s linear; + transition: background-color .2s linear, opacity .2s linear; + -webkit-transition: background-color .2s linear, opacity .2s linear; height: 15px; /* there must be 'bottom' or 'top' for ps__rail-x */ bottom: 0px; @@ -27,8 +27,8 @@ .ps__rail-y { display: none; opacity: 0; - transition: background-color 0.2s linear, opacity 0.2s linear; - -webkit-transition: background-color 0.2s linear, opacity 0.2s linear; + transition: background-color .2s linear, opacity .2s linear; + -webkit-transition: background-color .2s linear, opacity .2s linear; width: 15px; /* there must be 'right' or 'left' for ps__rail-y */ right: 0; @@ -57,8 +57,7 @@ .ps .ps__rail-y:focus, .ps .ps__rail-x.ps--clicking, .ps .ps__rail-y.ps--clicking { - /* background-color: #eee; */ - background-color: var(--bs-tertiary-bg); /* Custom Change */ + background-color: #eee; opacity: 0.9; } @@ -68,8 +67,8 @@ .ps__thumb-x { background-color: #aaa; border-radius: 6px; - transition: background-color 0.2s linear, height 0.2s ease-in-out; - -webkit-transition: background-color 0.2s linear, height 0.2s ease-in-out; + transition: background-color .2s linear, height .2s ease-in-out; + -webkit-transition: background-color .2s linear, height .2s ease-in-out; height: 6px; /* there must be 'bottom' for ps__thumb-x */ bottom: 2px; @@ -80,8 +79,8 @@ .ps__thumb-y { background-color: #aaa; border-radius: 6px; - transition: background-color 0.2s linear, width 0.2s ease-in-out; - -webkit-transition: background-color 0.2s linear, width 0.2s ease-in-out; + transition: background-color .2s linear, width .2s ease-in-out; + -webkit-transition: background-color .2s linear, width .2s ease-in-out; width: 6px; /* there must be 'right' for ps__thumb-y */ right: 2px; @@ -100,7 +99,6 @@ .ps__rail-y:focus > .ps__thumb-y, .ps__rail-y.ps--clicking .ps__thumb-y { background-color: #999; - /* background-color: var(--bs-body); */ width: 11px; } @@ -110,8 +108,9 @@ overflow: auto !important; } } + @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { .ps { overflow: auto !important; } -} +} \ No newline at end of file diff --git a/apps/static/js/index.js b/apps/static/js/index.js index d6f6555..ffc9f8b 100644 --- a/apps/static/js/index.js +++ b/apps/static/js/index.js @@ -83638,1281 +83638,8 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" = }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ3aW5kb3ciLCJmYWN0b3J5IiwiZGVmaW5lIiwiYW1kIiwiRXZFbWl0dGVyIiwiZ2V0U2l6ZSIsInV0aWxzIiwiSXRlbSIsIm1vZHVsZSIsImV4cG9ydHMiLCJyZXF1aXJlIiwiT3V0bGF5ZXIiLCJmaXp6eVVJVXRpbHMiLCJjb25zb2xlIiwialF1ZXJ5Iiwibm9vcCIsIkdVSUQiLCJpbnN0YW5jZXMiLCJlbGVtZW50Iiwib3B0aW9ucyIsInF1ZXJ5RWxlbWVudCIsImdldFF1ZXJ5RWxlbWVudCIsImVycm9yIiwiY29uc3RydWN0b3IiLCJuYW1lc3BhY2UiLCIkZWxlbWVudCIsImV4dGVuZCIsImRlZmF1bHRzIiwib3B0aW9uIiwiaWQiLCJvdXRsYXllckdVSUQiLCJfY3JlYXRlIiwiaXNJbml0TGF5b3V0IiwiX2dldE9wdGlvbiIsImxheW91dCIsImNvbnRhaW5lclN0eWxlIiwicG9zaXRpb24iLCJpbml0TGF5b3V0Iiwib3JpZ2luTGVmdCIsIm9yaWdpblRvcCIsInJlc2l6ZSIsInJlc2l6ZUNvbnRhaW5lciIsInRyYW5zaXRpb25EdXJhdGlvbiIsImhpZGRlblN0eWxlIiwib3BhY2l0eSIsInRyYW5zZm9ybSIsInZpc2libGVTdHlsZSIsInByb3RvIiwicHJvdG90eXBlIiwib3B0cyIsIm9sZE9wdGlvbiIsImNvbXBhdE9wdGlvbnMiLCJ1bmRlZmluZWQiLCJob3Jpem9udGFsIiwibGF5b3V0SW5zdGFudCIsInJlbG9hZEl0ZW1zIiwic3RhbXBzIiwic3RhbXAiLCJzdHlsZSIsImNhbkJpbmRSZXNpemUiLCJiaW5kUmVzaXplIiwiaXRlbXMiLCJfaXRlbWl6ZSIsImNoaWxkcmVuIiwiZWxlbXMiLCJpdGVtRWxlbXMiLCJfZmlsdGVyRmluZEl0ZW1FbGVtZW50cyIsImkiLCJsZW5ndGgiLCJlbGVtIiwiaXRlbSIsInB1c2giLCJmaWx0ZXJGaW5kRWxlbWVudHMiLCJpdGVtU2VsZWN0b3IiLCJnZXRJdGVtRWxlbWVudHMiLCJtYXAiLCJfcmVzZXRMYXlvdXQiLCJfbWFuYWdlU3RhbXBzIiwiaXNJbnN0YW50IiwiX2lzTGF5b3V0SW5pdGVkIiwibGF5b3V0SXRlbXMiLCJfaW5pdCIsInNpemUiLCJfZ2V0TWVhc3VyZW1lbnQiLCJtZWFzdXJlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJIVE1MRWxlbWVudCIsIl9nZXRJdGVtc0ZvckxheW91dCIsIl9sYXlvdXRJdGVtcyIsIl9wb3N0TGF5b3V0IiwiZmlsdGVyIiwiaXNJZ25vcmVkIiwiX2VtaXRDb21wbGV0ZU9uSXRlbXMiLCJxdWV1ZSIsImZvckVhY2giLCJfZ2V0SXRlbUxheW91dFBvc2l0aW9uIiwiaXNMYXlvdXRJbnN0YW50IiwiX3Byb2Nlc3NMYXlvdXRRdWV1ZSIsIngiLCJ5IiwidXBkYXRlU3RhZ2dlciIsIm9iaiIsIl9wb3NpdGlvbkl0ZW0iLCJzdGFnZ2VyIiwiZ2V0TWlsbGlzZWNvbmRzIiwiZ29UbyIsIm1vdmVUbyIsImlzUmVzaXppbmdDb250YWluZXIiLCJfZ2V0Q29udGFpbmVyU2l6ZSIsIl9zZXRDb250YWluZXJNZWFzdXJlIiwid2lkdGgiLCJoZWlnaHQiLCJtZWFzdXJlIiwiaXNXaWR0aCIsImVsZW1TaXplIiwiaXNCb3JkZXJCb3giLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCIsImJvcmRlckxlZnRXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJwYWRkaW5nQm90dG9tIiwicGFkZGluZ1RvcCIsImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJNYXRoIiwibWF4IiwiZXZlbnROYW1lIiwiX3RoaXMiLCJvbkNvbXBsZXRlIiwiZGlzcGF0Y2hFdmVudCIsImNvdW50IiwiZG9uZUNvdW50IiwidGljayIsIm9uY2UiLCJ0eXBlIiwiZXZlbnQiLCJhcmdzIiwiZW1pdEFyZ3MiLCJjb25jYXQiLCJlbWl0RXZlbnQiLCIkZXZlbnQiLCJFdmVudCIsInRyaWdnZXIiLCJpZ25vcmUiLCJnZXRJdGVtIiwidW5pZ25vcmUiLCJfZmluZCIsInVuc3RhbXAiLCJyZW1vdmVGcm9tIiwicXVlcnlTZWxlY3RvckFsbCIsIm1ha2VBcnJheSIsIl9nZXRCb3VuZGluZ1JlY3QiLCJfbWFuYWdlU3RhbXAiLCJib3VuZGluZ1JlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJfYm91bmRpbmdSZWN0IiwibGVmdCIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwiX2dldEVsZW1lbnRPZmZzZXQiLCJ0aGlzUmVjdCIsIm9mZnNldCIsIm1hcmdpbkxlZnQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5SaWdodCIsIm1hcmdpbkJvdHRvbSIsImhhbmRsZUV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsImlzUmVzaXplQm91bmQiLCJ1bmJpbmRSZXNpemUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25yZXNpemUiLCJkZWJvdW5jZU1ldGhvZCIsIm5lZWRzUmVzaXplTGF5b3V0IiwiaGFzU2l6ZXMiLCJpbm5lcldpZHRoIiwiYWRkSXRlbXMiLCJhcHBlbmRlZCIsInJldmVhbCIsInByZXBlbmRlZCIsInByZXZpb3VzSXRlbXMiLCJzbGljZSIsImhpZGUiLCJyZXZlYWxJdGVtRWxlbWVudHMiLCJnZXRJdGVtcyIsImhpZGVJdGVtRWxlbWVudHMiLCJyZW1vdmUiLCJyZW1vdmVJdGVtcyIsImRlc3Ryb3kiLCJyZW1vdmVEYXRhIiwiZGF0YSIsImNyZWF0ZSIsIkxheW91dCIsInN1YmNsYXNzIiwiaHRtbEluaXQiLCJicmlkZ2V0IiwiUGFyZW50IiwiU3ViQ2xhc3MiLCJhcHBseSIsImFyZ3VtZW50cyIsIk9iamVjdCIsIm1zVW5pdHMiLCJtcyIsInMiLCJ0aW1lIiwibWF0Y2hlcyIsIm1hdGNoIiwibnVtIiwidW5pdCIsInBhcnNlRmxvYXQiLCJtdWx0Il0sInNvdXJjZXMiOlsib3V0bGF5ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBPdXRsYXllciB2Mi4xLjFcbiAqIHRoZSBicmFpbnMgYW5kIGd1dHMgb2YgYSBsYXlvdXQgbGlicmFyeVxuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTUQgLSBSZXF1aXJlSlNcbiAgICBkZWZpbmUoIFtcbiAgICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcicsXG4gICAgICAgICdnZXQtc2l6ZS9nZXQtc2l6ZScsXG4gICAgICAgICdmaXp6eS11aS11dGlscy91dGlscycsXG4gICAgICAgICcuL2l0ZW0nXG4gICAgICBdLFxuICAgICAgZnVuY3Rpb24oIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIEl0ZW0gKSB7XG4gICAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIEl0ZW0pO1xuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnZXYtZW1pdHRlcicpLFxuICAgICAgcmVxdWlyZSgnZ2V0LXNpemUnKSxcbiAgICAgIHJlcXVpcmUoJ2Zpenp5LXVpLXV0aWxzJyksXG4gICAgICByZXF1aXJlKCcuL2l0ZW0nKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuT3V0bGF5ZXIgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkV2RW1pdHRlcixcbiAgICAgIHdpbmRvdy5nZXRTaXplLFxuICAgICAgd2luZG93LmZpenp5VUlVdGlscyxcbiAgICAgIHdpbmRvdy5PdXRsYXllci5JdGVtXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyLCBnZXRTaXplLCB1dGlscywgSXRlbSApIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0gdmFycyAtLS0tLSAvL1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xudmFyIGpRdWVyeSA9IHdpbmRvdy5qUXVlcnk7XG52YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE91dGxheWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyc1xudmFyIEdVSUQgPSAwO1xuLy8gaW50ZXJuYWwgc3RvcmUgb2YgYWxsIE91dGxheWVyIGludGFuY2VzXG52YXIgaW5zdGFuY2VzID0ge307XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnQsIFN0cmluZ30gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBPdXRsYXllciggZWxlbWVudCwgb3B0aW9ucyApIHtcbiAgdmFyIHF1ZXJ5RWxlbWVudCA9IHV0aWxzLmdldFF1ZXJ5RWxlbWVudCggZWxlbWVudCApO1xuICBpZiAoICFxdWVyeUVsZW1lbnQgKSB7XG4gICAgaWYgKCBjb25zb2xlICkge1xuICAgICAgY29uc29sZS5lcnJvciggJ0JhZCBlbGVtZW50IGZvciAnICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lc3BhY2UgK1xuICAgICAgICAnOiAnICsgKCBxdWVyeUVsZW1lbnQgfHwgZWxlbWVudCApICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQgPSBxdWVyeUVsZW1lbnQ7XG4gIC8vIGFkZCBqUXVlcnlcbiAgaWYgKCBqUXVlcnkgKSB7XG4gICAgdGhpcy4kZWxlbWVudCA9IGpRdWVyeSggdGhpcy5lbGVtZW50ICk7XG4gIH1cblxuICAvLyBvcHRpb25zXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmV4dGVuZCgge30sIHRoaXMuY29uc3RydWN0b3IuZGVmYXVsdHMgKTtcbiAgdGhpcy5vcHRpb24oIG9wdGlvbnMgKTtcblxuICAvLyBhZGQgaWQgZm9yIE91dGxheWVyLmdldEZyb21FbGVtZW50XG4gIHZhciBpZCA9ICsrR1VJRDtcbiAgdGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRCA9IGlkOyAvLyBleHBhbmRvXG4gIGluc3RhbmNlc1sgaWQgXSA9IHRoaXM7IC8vIGFzc29jaWF0ZSB2aWEgaWRcblxuICAvLyBraWNrIGl0IG9mZlxuICB0aGlzLl9jcmVhdGUoKTtcblxuICB2YXIgaXNJbml0TGF5b3V0ID0gdGhpcy5fZ2V0T3B0aW9uKCdpbml0TGF5b3V0Jyk7XG4gIGlmICggaXNJbml0TGF5b3V0ICkge1xuICAgIHRoaXMubGF5b3V0KCk7XG4gIH1cbn1cblxuLy8gc2V0dGluZ3MgYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seVxuT3V0bGF5ZXIubmFtZXNwYWNlID0gJ291dGxheWVyJztcbk91dGxheWVyLkl0ZW0gPSBJdGVtO1xuXG4vLyBkZWZhdWx0IG9wdGlvbnNcbk91dGxheWVyLmRlZmF1bHRzID0ge1xuICBjb250YWluZXJTdHlsZToge1xuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gIH0sXG4gIGluaXRMYXlvdXQ6IHRydWUsXG4gIG9yaWdpbkxlZnQ6IHRydWUsXG4gIG9yaWdpblRvcDogdHJ1ZSxcbiAgcmVzaXplOiB0cnVlLFxuICByZXNpemVDb250YWluZXI6IHRydWUsXG4gIC8vIGl0ZW0gb3B0aW9uc1xuICB0cmFuc2l0aW9uRHVyYXRpb246ICcwLjRzJyxcbiAgaGlkZGVuU3R5bGU6IHtcbiAgICBvcGFjaXR5OiAwLFxuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuMDAxKSdcbiAgfSxcbiAgdmlzaWJsZVN0eWxlOiB7XG4gICAgb3BhY2l0eTogMSxcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgfVxufTtcblxudmFyIHByb3RvID0gT3V0bGF5ZXIucHJvdG90eXBlO1xuLy8gaW5oZXJpdCBFdkVtaXR0ZXJcbnV0aWxzLmV4dGVuZCggcHJvdG8sIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcblxuLyoqXG4gKiBzZXQgb3B0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqL1xucHJvdG8ub3B0aW9uID0gZnVuY3Rpb24oIG9wdHMgKSB7XG4gIHV0aWxzLmV4dGVuZCggdGhpcy5vcHRpb25zLCBvcHRzICk7XG59O1xuXG4vKipcbiAqIGdldCBiYWNrd2FyZHMgY29tcGF0aWJsZSBvcHRpb24gdmFsdWUsIGNoZWNrIG9sZCBuYW1lXG4gKi9cbnByb3RvLl9nZXRPcHRpb24gPSBmdW5jdGlvbiggb3B0aW9uICkge1xuICB2YXIgb2xkT3B0aW9uID0gdGhpcy5jb25zdHJ1Y3Rvci5jb21wYXRPcHRpb25zWyBvcHRpb24gXTtcbiAgcmV0dXJuIG9sZE9wdGlvbiAmJiB0aGlzLm9wdGlvbnNbIG9sZE9wdGlvbiBdICE9PSB1bmRlZmluZWQgP1xuICAgIHRoaXMub3B0aW9uc1sgb2xkT3B0aW9uIF0gOiB0aGlzLm9wdGlvbnNbIG9wdGlvbiBdO1xufTtcblxuT3V0bGF5ZXIuY29tcGF0T3B0aW9ucyA9IHtcbiAgLy8gY3VycmVudE5hbWU6IG9sZE5hbWVcbiAgaW5pdExheW91dDogJ2lzSW5pdExheW91dCcsXG4gIGhvcml6b250YWw6ICdpc0hvcml6b250YWwnLFxuICBsYXlvdXRJbnN0YW50OiAnaXNMYXlvdXRJbnN0YW50JyxcbiAgb3JpZ2luTGVmdDogJ2lzT3JpZ2luTGVmdCcsXG4gIG9yaWdpblRvcDogJ2lzT3JpZ2luVG9wJyxcbiAgcmVzaXplOiAnaXNSZXNpemVCb3VuZCcsXG4gIHJlc2l6ZUNvbnRhaW5lcjogJ2lzUmVzaXppbmdDb250YWluZXInXG59O1xuXG5wcm90by5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGdldCBpdGVtcyBmcm9tIGNoaWxkcmVuXG4gIHRoaXMucmVsb2FkSXRlbXMoKTtcbiAgLy8gZWxlbWVudHMgdGhhdCBhZmZlY3QgbGF5b3V0LCBidXQgYXJlIG5vdCBsYWlkIG91dFxuICB0aGlzLnN0YW1wcyA9IFtdO1xuICB0aGlzLnN0YW1wKCB0aGlzLm9wdGlvbnMuc3RhbXAgKTtcbiAgLy8gc2V0IGNvbnRhaW5lciBzdHlsZVxuICB1dGlscy5leHRlbmQoIHRoaXMuZWxlbWVudC5zdHlsZSwgdGhpcy5vcHRpb25zLmNvbnRhaW5lclN0eWxlICk7XG5cbiAgLy8gYmluZCByZXNpemUgbWV0aG9kXG4gIHZhciBjYW5CaW5kUmVzaXplID0gdGhpcy5fZ2V0T3B0aW9uKCdyZXNpemUnKTtcbiAgaWYgKCBjYW5CaW5kUmVzaXplICkge1xuICAgIHRoaXMuYmluZFJlc2l6ZSgpO1xuICB9XG59O1xuXG4vLyBnb2VzIHRocm91Z2ggYWxsIGNoaWxkcmVuIGFnYWluIGFuZCBnZXRzIGJyaWNrcyBpbiBwcm9wZXIgb3JkZXJcbnByb3RvLnJlbG9hZEl0ZW1zID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICB0aGlzLml0ZW1zID0gdGhpcy5faXRlbWl6ZSggdGhpcy5lbGVtZW50LmNoaWxkcmVuICk7XG59O1xuXG5cbi8qKlxuICogdHVybiBlbGVtZW50cyBpbnRvIE91dGxheWVyLkl0ZW1zIHRvIGJlIHVzZWQgaW4gbGF5b3V0XG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEhUTUxFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGNvbGxlY3Rpb24gb2YgbmV3IE91dGxheWVyIEl0ZW1zXG4gKi9cbnByb3RvLl9pdGVtaXplID0gZnVuY3Rpb24oIGVsZW1zICkge1xuXG4gIHZhciBpdGVtRWxlbXMgPSB0aGlzLl9maWx0ZXJGaW5kSXRlbUVsZW1lbnRzKCBlbGVtcyApO1xuICB2YXIgSXRlbSA9IHRoaXMuY29uc3RydWN0b3IuSXRlbTtcblxuICAvLyBjcmVhdGUgbmV3IE91dGxheWVyIEl0ZW1zIGZvciBjb2xsZWN0aW9uXG4gIHZhciBpdGVtcyA9IFtdO1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgaXRlbUVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBlbGVtID0gaXRlbUVsZW1zW2ldO1xuICAgIHZhciBpdGVtID0gbmV3IEl0ZW0oIGVsZW0sIHRoaXMgKTtcbiAgICBpdGVtcy5wdXNoKCBpdGVtICk7XG4gIH1cblxuICByZXR1cm4gaXRlbXM7XG59O1xuXG4vKipcbiAqIGdldCBpdGVtIGVsZW1lbnRzIHRvIGJlIHVzZWQgaW4gbGF5b3V0XG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEhUTUxFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIGl0ZW0gZWxlbWVudHNcbiAqL1xucHJvdG8uX2ZpbHRlckZpbmRJdGVtRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHJldHVybiB1dGlscy5maWx0ZXJGaW5kRWxlbWVudHMoIGVsZW1zLCB0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yICk7XG59O1xuXG4vKipcbiAqIGdldHRlciBtZXRob2QgZm9yIGdldHRpbmcgaXRlbSBlbGVtZW50c1xuICogQHJldHVybnMge0FycmF5fSBlbGVtcyAtIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICovXG5wcm90by5nZXRJdGVtRWxlbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuaXRlbXMubWFwKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICByZXR1cm4gaXRlbS5lbGVtZW50O1xuICB9KTtcbn07XG5cbi8vIC0tLS0tIGluaXQgJiBsYXlvdXQgLS0tLS0gLy9cblxuLyoqXG4gKiBsYXlzIG91dCBhbGwgaXRlbXNcbiAqL1xucHJvdG8ubGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3Jlc2V0TGF5b3V0KCk7XG4gIHRoaXMuX21hbmFnZVN0YW1wcygpO1xuXG4gIC8vIGRvbid0IGFuaW1hdGUgZmlyc3QgbGF5b3V0XG4gIHZhciBsYXlvdXRJbnN0YW50ID0gdGhpcy5fZ2V0T3B0aW9uKCdsYXlvdXRJbnN0YW50Jyk7XG4gIHZhciBpc0luc3RhbnQgPSBsYXlvdXRJbnN0YW50ICE9PSB1bmRlZmluZWQgP1xuICAgIGxheW91dEluc3RhbnQgOiAhdGhpcy5faXNMYXlvdXRJbml0ZWQ7XG4gIHRoaXMubGF5b3V0SXRlbXMoIHRoaXMuaXRlbXMsIGlzSW5zdGFudCApO1xuXG4gIC8vIGZsYWcgZm9yIGluaXRhbGl6ZWRcbiAgdGhpcy5faXNMYXlvdXRJbml0ZWQgPSB0cnVlO1xufTtcblxuLy8gX2luaXQgaXMgYWxpYXMgZm9yIGxheW91dFxucHJvdG8uX2luaXQgPSBwcm90by5sYXlvdXQ7XG5cbi8qKlxuICogbG9naWMgYmVmb3JlIGFueSBuZXcgbGF5b3V0XG4gKi9cbnByb3RvLl9yZXNldExheW91dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmdldFNpemUoKTtcbn07XG5cblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbi8qKlxuICogZ2V0IG1lYXN1cmVtZW50IGZyb20gb3B0aW9uLCBmb3IgY29sdW1uV2lkdGgsIHJvd0hlaWdodCwgZ3V0dGVyXG4gKiBpZiBvcHRpb24gaXMgU3RyaW5nIC0+IGdldCBlbGVtZW50IGZyb20gc2VsZWN0b3Igc3RyaW5nLCAmIGdldCBzaXplIG9mIGVsZW1lbnRcbiAqIGlmIG9wdGlvbiBpcyBFbGVtZW50IC0+IGdldCBzaXplIG9mIGVsZW1lbnRcbiAqIGVsc2UgdXNlIG9wdGlvbiBhcyBhIG51bWJlclxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZWFzdXJlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IHNpemUgLSB3aWR0aCBvciBoZWlnaHRcbiAqIEBwcml2YXRlXG4gKi9cbnByb3RvLl9nZXRNZWFzdXJlbWVudCA9IGZ1bmN0aW9uKCBtZWFzdXJlbWVudCwgc2l6ZSApIHtcbiAgdmFyIG9wdGlvbiA9IHRoaXMub3B0aW9uc1sgbWVhc3VyZW1lbnQgXTtcbiAgdmFyIGVsZW07XG4gIGlmICggIW9wdGlvbiApIHtcbiAgICAvLyBkZWZhdWx0IHRvIDBcbiAgICB0aGlzWyBtZWFzdXJlbWVudCBdID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyB1c2Ugb3B0aW9uIGFzIGFuIGVsZW1lbnRcbiAgICBpZiAoIHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycgKSB7XG4gICAgICBlbGVtID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIG9wdGlvbiApO1xuICAgIH0gZWxzZSBpZiAoIG9wdGlvbiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICkge1xuICAgICAgZWxlbSA9IG9wdGlvbjtcbiAgICB9XG4gICAgLy8gdXNlIHNpemUgb2YgZWxlbWVudCwgaWYgZWxlbWVudFxuICAgIHRoaXNbIG1lYXN1cmVtZW50IF0gPSBlbGVtID8gZ2V0U2l6ZSggZWxlbSApWyBzaXplIF0gOiBvcHRpb247XG4gIH1cbn07XG5cbi8qKlxuICogbGF5b3V0IGEgY29sbGVjdGlvbiBvZiBpdGVtIGVsZW1lbnRzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5wcm90by5sYXlvdXRJdGVtcyA9IGZ1bmN0aW9uKCBpdGVtcywgaXNJbnN0YW50ICkge1xuICBpdGVtcyA9IHRoaXMuX2dldEl0ZW1zRm9yTGF5b3V0KCBpdGVtcyApO1xuXG4gIHRoaXMuX2xheW91dEl0ZW1zKCBpdGVtcywgaXNJbnN0YW50ICk7XG5cbiAgdGhpcy5fcG9zdExheW91dCgpO1xufTtcblxuLyoqXG4gKiBnZXQgdGhlIGl0ZW1zIHRvIGJlIGxhaWQgb3V0XG4gKiB5b3UgbWF5IHdhbnQgdG8gc2tpcCBvdmVyIHNvbWUgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXl9IGl0ZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zXG4gKi9cbnByb3RvLl9nZXRJdGVtc0ZvckxheW91dCA9IGZ1bmN0aW9uKCBpdGVtcyApIHtcbiAgcmV0dXJuIGl0ZW1zLmZpbHRlciggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgcmV0dXJuICFpdGVtLmlzSWdub3JlZDtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGxheW91dCBpdGVtc1xuICogQHBhcmFtIHtBcnJheX0gaXRlbXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50XG4gKi9cbnByb3RvLl9sYXlvdXRJdGVtcyA9IGZ1bmN0aW9uKCBpdGVtcywgaXNJbnN0YW50ICkge1xuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAnbGF5b3V0JywgaXRlbXMgKTtcblxuICBpZiAoICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoICkge1xuICAgIC8vIG5vIGl0ZW1zLCBlbWl0IGV2ZW50IHdpdGggZW1wdHkgYXJyYXlcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcXVldWUgPSBbXTtcblxuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICAvLyBnZXQgeC95IG9iamVjdCBmcm9tIG1ldGhvZFxuICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuX2dldEl0ZW1MYXlvdXRQb3NpdGlvbiggaXRlbSApO1xuICAgIC8vIGVucXVldWVcbiAgICBwb3NpdGlvbi5pdGVtID0gaXRlbTtcbiAgICBwb3NpdGlvbi5pc0luc3RhbnQgPSBpc0luc3RhbnQgfHwgaXRlbS5pc0xheW91dEluc3RhbnQ7XG4gICAgcXVldWUucHVzaCggcG9zaXRpb24gKTtcbiAgfSwgdGhpcyApO1xuXG4gIHRoaXMuX3Byb2Nlc3NMYXlvdXRRdWV1ZSggcXVldWUgKTtcbn07XG5cbi8qKlxuICogZ2V0IGl0ZW0gbGF5b3V0IHBvc2l0aW9uXG4gKiBAcGFyYW0ge091dGxheWVyLkl0ZW19IGl0ZW1cbiAqIEByZXR1cm5zIHtPYmplY3R9IHggYW5kIHkgcG9zaXRpb25cbiAqL1xucHJvdG8uX2dldEl0ZW1MYXlvdXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCAvKiBpdGVtICovICkge1xuICByZXR1cm4ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuLyoqXG4gKiBpdGVyYXRlIG92ZXIgYXJyYXkgYW5kIHBvc2l0aW9uIGVhY2ggaXRlbVxuICogUmVhc29uIGJlaW5nIC0gc2VwYXJhdGluZyB0aGlzIGxvZ2ljIHByZXZlbnRzICdsYXlvdXQgaW52YWxpZGF0aW9uJ1xuICogdGh4IEBwYXVsX2lyaXNoXG4gKiBAcGFyYW0ge0FycmF5fSBxdWV1ZVxuICovXG5wcm90by5fcHJvY2Vzc0xheW91dFF1ZXVlID0gZnVuY3Rpb24oIHF1ZXVlICkge1xuICB0aGlzLnVwZGF0ZVN0YWdnZXIoKTtcbiAgcXVldWUuZm9yRWFjaCggZnVuY3Rpb24oIG9iaiwgaSApIHtcbiAgICB0aGlzLl9wb3NpdGlvbkl0ZW0oIG9iai5pdGVtLCBvYmoueCwgb2JqLnksIG9iai5pc0luc3RhbnQsIGkgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuLy8gc2V0IHN0YWdnZXIgZnJvbSBvcHRpb24gaW4gbWlsbGlzZWNvbmRzIG51bWJlclxucHJvdG8udXBkYXRlU3RhZ2dlciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3RhZ2dlciA9IHRoaXMub3B0aW9ucy5zdGFnZ2VyO1xuICBpZiAoIHN0YWdnZXIgPT09IG51bGwgfHwgc3RhZ2dlciA9PT0gdW5kZWZpbmVkICkge1xuICAgIHRoaXMuc3RhZ2dlciA9IDA7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc3RhZ2dlciA9IGdldE1pbGxpc2Vjb25kcyggc3RhZ2dlciApO1xuICByZXR1cm4gdGhpcy5zdGFnZ2VyO1xufTtcblxuLyoqXG4gKiBTZXRzIHBvc2l0aW9uIG9mIGl0ZW0gaW4gRE9NXG4gKiBAcGFyYW0ge091dGxheWVyLkl0ZW19IGl0ZW1cbiAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gaG9yaXpvbnRhbCBwb3NpdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHkgLSB2ZXJ0aWNhbCBwb3NpdGlvblxuICogQHBhcmFtIHtCb29sZWFufSBpc0luc3RhbnQgLSBkaXNhYmxlcyB0cmFuc2l0aW9uc1xuICovXG5wcm90by5fcG9zaXRpb25JdGVtID0gZnVuY3Rpb24oIGl0ZW0sIHgsIHksIGlzSW5zdGFudCwgaSApIHtcbiAgaWYgKCBpc0luc3RhbnQgKSB7XG4gICAgLy8gaWYgbm90IHRyYW5zaXRpb24sIGp1c3Qgc2V0IENTU1xuICAgIGl0ZW0uZ29UbyggeCwgeSApO1xuICB9IGVsc2Uge1xuICAgIGl0ZW0uc3RhZ2dlciggaSAqIHRoaXMuc3RhZ2dlciApO1xuICAgIGl0ZW0ubW92ZVRvKCB4LCB5ICk7XG4gIH1cbn07XG5cbi8qKlxuICogQW55IGxvZ2ljIHlvdSB3YW50IHRvIGRvIGFmdGVyIGVhY2ggbGF5b3V0LFxuICogaS5lLiBzaXplIHRoZSBjb250YWluZXJcbiAqL1xucHJvdG8uX3Bvc3RMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZXNpemVDb250YWluZXIoKTtcbn07XG5cbnByb3RvLnJlc2l6ZUNvbnRhaW5lciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaXNSZXNpemluZ0NvbnRhaW5lciA9IHRoaXMuX2dldE9wdGlvbigncmVzaXplQ29udGFpbmVyJyk7XG4gIGlmICggIWlzUmVzaXppbmdDb250YWluZXIgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBzaXplID0gdGhpcy5fZ2V0Q29udGFpbmVyU2l6ZSgpO1xuICBpZiAoIHNpemUgKSB7XG4gICAgdGhpcy5fc2V0Q29udGFpbmVyTWVhc3VyZSggc2l6ZS53aWR0aCwgdHJ1ZSApO1xuICAgIHRoaXMuX3NldENvbnRhaW5lck1lYXN1cmUoIHNpemUuaGVpZ2h0LCBmYWxzZSApO1xuICB9XG59O1xuXG4vKipcbiAqIFNldHMgd2lkdGggb3IgaGVpZ2h0IG9mIGNvbnRhaW5lciBpZiByZXR1cm5lZFxuICogQHJldHVybnMge09iamVjdH0gc2l6ZVxuICogICBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqICAgQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICovXG5wcm90by5fZ2V0Q29udGFpbmVyU2l6ZSA9IG5vb3A7XG5cbi8qKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1lYXN1cmUgLSBzaXplIG9mIHdpZHRoIG9yIGhlaWdodFxuICogQHBhcmFtIHtCb29sZWFufSBpc1dpZHRoXG4gKi9cbnByb3RvLl9zZXRDb250YWluZXJNZWFzdXJlID0gZnVuY3Rpb24oIG1lYXN1cmUsIGlzV2lkdGggKSB7XG4gIGlmICggbWVhc3VyZSA9PT0gdW5kZWZpbmVkICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBlbGVtU2l6ZSA9IHRoaXMuc2l6ZTtcbiAgLy8gYWRkIHBhZGRpbmcgYW5kIGJvcmRlciB3aWR0aCBpZiBib3JkZXIgYm94XG4gIGlmICggZWxlbVNpemUuaXNCb3JkZXJCb3ggKSB7XG4gICAgbWVhc3VyZSArPSBpc1dpZHRoID8gZWxlbVNpemUucGFkZGluZ0xlZnQgKyBlbGVtU2l6ZS5wYWRkaW5nUmlnaHQgK1xuICAgICAgZWxlbVNpemUuYm9yZGVyTGVmdFdpZHRoICsgZWxlbVNpemUuYm9yZGVyUmlnaHRXaWR0aCA6XG4gICAgICBlbGVtU2l6ZS5wYWRkaW5nQm90dG9tICsgZWxlbVNpemUucGFkZGluZ1RvcCArXG4gICAgICBlbGVtU2l6ZS5ib3JkZXJUb3BXaWR0aCArIGVsZW1TaXplLmJvcmRlckJvdHRvbVdpZHRoO1xuICB9XG5cbiAgbWVhc3VyZSA9IE1hdGgubWF4KCBtZWFzdXJlLCAwICk7XG4gIHRoaXMuZWxlbWVudC5zdHlsZVsgaXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0JyBdID0gbWVhc3VyZSArICdweCc7XG59O1xuXG4vKipcbiAqIGVtaXQgZXZlbnRDb21wbGV0ZSBvbiBhIGNvbGxlY3Rpb24gb2YgaXRlbXMgZXZlbnRzXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtcyAtIE91dGxheWVyLkl0ZW1zXG4gKi9cbnByb3RvLl9lbWl0Q29tcGxldGVPbkl0ZW1zID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgaXRlbXMgKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG4gIGZ1bmN0aW9uIG9uQ29tcGxldGUoKSB7XG4gICAgX3RoaXMuZGlzcGF0Y2hFdmVudCggZXZlbnROYW1lICsgJ0NvbXBsZXRlJywgbnVsbCwgWyBpdGVtcyBdICk7XG4gIH1cblxuICB2YXIgY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gIGlmICggIWl0ZW1zIHx8ICFjb3VudCApIHtcbiAgICBvbkNvbXBsZXRlKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGRvbmVDb3VudCA9IDA7XG4gIGZ1bmN0aW9uIHRpY2soKSB7XG4gICAgZG9uZUNvdW50Kys7XG4gICAgaWYgKCBkb25lQ291bnQgPT0gY291bnQgKSB7XG4gICAgICBvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYmluZCBjYWxsYmFja1xuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICBpdGVtLm9uY2UoIGV2ZW50TmFtZSwgdGljayApO1xuICB9KTtcbn07XG5cbi8qKlxuICogZW1pdHMgZXZlbnRzIHZpYSBFdkVtaXR0ZXIgYW5kIGpRdWVyeSBldmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gbmFtZSBvZiBldmVudFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBvcmlnaW5hbCBldmVudFxuICogQHBhcmFtIHtBcnJheX0gYXJncyAtIGV4dHJhIGFyZ3VtZW50c1xuICovXG5wcm90by5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24oIHR5cGUsIGV2ZW50LCBhcmdzICkge1xuICAvLyBhZGQgb3JpZ2luYWwgZXZlbnQgdG8gYXJndW1lbnRzXG4gIHZhciBlbWl0QXJncyA9IGV2ZW50ID8gWyBldmVudCBdLmNvbmNhdCggYXJncyApIDogYXJncztcbiAgdGhpcy5lbWl0RXZlbnQoIHR5cGUsIGVtaXRBcmdzICk7XG5cbiAgaWYgKCBqUXVlcnkgKSB7XG4gICAgLy8gc2V0IHRoaXMuJGVsZW1lbnRcbiAgICB0aGlzLiRlbGVtZW50ID0gdGhpcy4kZWxlbWVudCB8fCBqUXVlcnkoIHRoaXMuZWxlbWVudCApO1xuICAgIGlmICggZXZlbnQgKSB7XG4gICAgICAvLyBjcmVhdGUgalF1ZXJ5IGV2ZW50XG4gICAgICB2YXIgJGV2ZW50ID0galF1ZXJ5LkV2ZW50KCBldmVudCApO1xuICAgICAgJGV2ZW50LnR5cGUgPSB0eXBlO1xuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCAkZXZlbnQsIGFyZ3MgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8ganVzdCB0cmlnZ2VyIHdpdGggdHlwZSBpZiBubyBldmVudCBhdmFpbGFibGVcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggdHlwZSwgYXJncyApO1xuICAgIH1cbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaWdub3JlICYgc3RhbXBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cblxuLyoqXG4gKiBrZWVwIGl0ZW0gaW4gY29sbGVjdGlvbiwgYnV0IGRvIG5vdCBsYXkgaXQgb3V0XG4gKiBpZ25vcmVkIGl0ZW1zIGRvIG5vdCBnZXQgc2tpcHBlZCBpbiBsYXlvdXRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICovXG5wcm90by5pZ25vcmUgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW0oIGVsZW0gKTtcbiAgaWYgKCBpdGVtICkge1xuICAgIGl0ZW0uaXNJZ25vcmVkID0gdHJ1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiByZXR1cm4gaXRlbSB0byBsYXlvdXQgY29sbGVjdGlvblxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKi9cbnByb3RvLnVuaWdub3JlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtKCBlbGVtICk7XG4gIGlmICggaXRlbSApIHtcbiAgICBkZWxldGUgaXRlbS5pc0lnbm9yZWQ7XG4gIH1cbn07XG5cbi8qKlxuICogYWRkcyBlbGVtZW50cyB0byBzdGFtcHNcbiAqIEBwYXJhbSB7Tm9kZUxpc3QsIEFycmF5LCBFbGVtZW50LCBvciBTdHJpbmd9IGVsZW1zXG4gKi9cbnByb3RvLnN0YW1wID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHRoaXMuX2ZpbmQoIGVsZW1zICk7XG4gIGlmICggIWVsZW1zICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuc3RhbXBzID0gdGhpcy5zdGFtcHMuY29uY2F0KCBlbGVtcyApO1xuICAvLyBpZ25vcmVcbiAgZWxlbXMuZm9yRWFjaCggdGhpcy5pZ25vcmUsIHRoaXMgKTtcbn07XG5cbi8qKlxuICogcmVtb3ZlcyBlbGVtZW50cyB0byBzdGFtcHNcbiAqIEBwYXJhbSB7Tm9kZUxpc3QsIEFycmF5LCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by51bnN0YW1wID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHRoaXMuX2ZpbmQoIGVsZW1zICk7XG4gIGlmICggIWVsZW1zICl7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gZmlsdGVyIG91dCByZW1vdmVkIHN0YW1wIGVsZW1lbnRzXG4gICAgdXRpbHMucmVtb3ZlRnJvbSggdGhpcy5zdGFtcHMsIGVsZW0gKTtcbiAgICB0aGlzLnVuaWdub3JlKCBlbGVtICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cbi8qKlxuICogZmluZHMgY2hpbGQgZWxlbWVudHNcbiAqIEBwYXJhbSB7Tm9kZUxpc3QsIEFycmF5LCBFbGVtZW50LCBvciBTdHJpbmd9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGVsZW1zXG4gKi9cbnByb3RvLl9maW5kID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBpZiAoICFlbGVtcyApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gaWYgc3RyaW5nLCB1c2UgYXJndW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG4gIGlmICggdHlwZW9mIGVsZW1zID09ICdzdHJpbmcnICkge1xuICAgIGVsZW1zID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGVsZW1zICk7XG4gIH1cbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHJldHVybiBlbGVtcztcbn07XG5cbnByb3RvLl9tYW5hZ2VTdGFtcHMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5zdGFtcHMgfHwgIXRoaXMuc3RhbXBzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLl9nZXRCb3VuZGluZ1JlY3QoKTtcblxuICB0aGlzLnN0YW1wcy5mb3JFYWNoKCB0aGlzLl9tYW5hZ2VTdGFtcCwgdGhpcyApO1xufTtcblxuLy8gdXBkYXRlIGJvdW5kaW5nTGVmdCAvIFRvcFxucHJvdG8uX2dldEJvdW5kaW5nUmVjdCA9IGZ1bmN0aW9uKCkge1xuICAvLyBnZXQgYm91bmRpbmcgcmVjdCBmb3IgY29udGFpbmVyIGVsZW1lbnRcbiAgdmFyIGJvdW5kaW5nUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gIHRoaXMuX2JvdW5kaW5nUmVjdCA9IHtcbiAgICBsZWZ0OiBib3VuZGluZ1JlY3QubGVmdCArIHNpemUucGFkZGluZ0xlZnQgKyBzaXplLmJvcmRlckxlZnRXaWR0aCxcbiAgICB0b3A6IGJvdW5kaW5nUmVjdC50b3AgKyBzaXplLnBhZGRpbmdUb3AgKyBzaXplLmJvcmRlclRvcFdpZHRoLFxuICAgIHJpZ2h0OiBib3VuZGluZ1JlY3QucmlnaHQgLSAoIHNpemUucGFkZGluZ1JpZ2h0ICsgc2l6ZS5ib3JkZXJSaWdodFdpZHRoICksXG4gICAgYm90dG9tOiBib3VuZGluZ1JlY3QuYm90dG9tIC0gKCBzaXplLnBhZGRpbmdCb3R0b20gKyBzaXplLmJvcmRlckJvdHRvbVdpZHRoIClcbiAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBzdGFtcFxuKiovXG5wcm90by5fbWFuYWdlU3RhbXAgPSBub29wO1xuXG4vKipcbiAqIGdldCB4L3kgcG9zaXRpb24gb2YgZWxlbWVudCByZWxhdGl2ZSB0byBjb250YWluZXIgZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBvZmZzZXQgLSBoYXMgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tXG4gKi9cbnByb3RvLl9nZXRFbGVtZW50T2Zmc2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBib3VuZGluZ1JlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgdGhpc1JlY3QgPSB0aGlzLl9ib3VuZGluZ1JlY3Q7XG4gIHZhciBzaXplID0gZ2V0U2l6ZSggZWxlbSApO1xuICB2YXIgb2Zmc2V0ID0ge1xuICAgIGxlZnQ6IGJvdW5kaW5nUmVjdC5sZWZ0IC0gdGhpc1JlY3QubGVmdCAtIHNpemUubWFyZ2luTGVmdCxcbiAgICB0b3A6IGJvdW5kaW5nUmVjdC50b3AgLSB0aGlzUmVjdC50b3AgLSBzaXplLm1hcmdpblRvcCxcbiAgICByaWdodDogdGhpc1JlY3QucmlnaHQgLSBib3VuZGluZ1JlY3QucmlnaHQgLSBzaXplLm1hcmdpblJpZ2h0LFxuICAgIGJvdHRvbTogdGhpc1JlY3QuYm90dG9tIC0gYm91bmRpbmdSZWN0LmJvdHRvbSAtIHNpemUubWFyZ2luQm90dG9tXG4gIH07XG4gIHJldHVybiBvZmZzZXQ7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZW5hYmxlIGV2ZW50IGhhbmRsZXJzIGZvciBsaXN0ZW5lcnNcbi8vIGkuZS4gcmVzaXplIC0+IG9ucmVzaXplXG5wcm90by5oYW5kbGVFdmVudCA9IHV0aWxzLmhhbmRsZUV2ZW50O1xuXG4vKipcbiAqIEJpbmQgbGF5b3V0IHRvIHdpbmRvdyByZXNpemluZ1xuICovXG5wcm90by5iaW5kUmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB0aGlzLmlzUmVzaXplQm91bmQgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBVbmJpbmQgbGF5b3V0IHRvIHdpbmRvdyByZXNpemluZ1xuICovXG5wcm90by51bmJpbmRSZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCB0aGlzICk7XG4gIHRoaXMuaXNSZXNpemVCb3VuZCA9IGZhbHNlO1xufTtcblxucHJvdG8ub25yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZXNpemUoKTtcbn07XG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kKCBPdXRsYXllciwgJ29ucmVzaXplJywgMTAwICk7XG5cbnByb3RvLnJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBkb24ndCB0cmlnZ2VyIGlmIHNpemUgZGlkIG5vdCBjaGFuZ2VcbiAgLy8gb3IgaWYgcmVzaXplIHdhcyB1bmJvdW5kLiBTZWUgIzlcbiAgaWYgKCAhdGhpcy5pc1Jlc2l6ZUJvdW5kIHx8ICF0aGlzLm5lZWRzUmVzaXplTGF5b3V0KCkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5sYXlvdXQoKTtcbn07XG5cbi8qKlxuICogY2hlY2sgaWYgbGF5b3V0IGlzIG5lZWRlZCBwb3N0IGxheW91dFxuICogQHJldHVybnMgQm9vbGVhblxuICovXG5wcm90by5uZWVkc1Jlc2l6ZUxheW91dCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2l6ZSA9IGdldFNpemUoIHRoaXMuZWxlbWVudCApO1xuICAvLyBjaGVjayB0aGF0IHRoaXMuc2l6ZSBhbmQgc2l6ZSBhcmUgdGhlcmVcbiAgLy8gSUU4IHRyaWdnZXJzIHJlc2l6ZSBvbiBib2R5IHNpemUgY2hhbmdlLCBzbyB0aGV5IG1pZ2h0IG5vdCBiZVxuICB2YXIgaGFzU2l6ZXMgPSB0aGlzLnNpemUgJiYgc2l6ZTtcbiAgcmV0dXJuIGhhc1NpemVzICYmIHNpemUuaW5uZXJXaWR0aCAhPT0gdGhpcy5zaXplLmlubmVyV2lkdGg7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogYWRkIGl0ZW1zIHRvIE91dGxheWVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zIC0gT3V0bGF5ZXIuSXRlbXNcbioqL1xucHJvdG8uYWRkSXRlbXMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1pemUoIGVsZW1zICk7XG4gIC8vIGFkZCBpdGVtcyB0byBjb2xsZWN0aW9uXG4gIGlmICggaXRlbXMubGVuZ3RoICkge1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLmNvbmNhdCggaXRlbXMgKTtcbiAgfVxuICByZXR1cm4gaXRlbXM7XG59O1xuXG4vKipcbiAqIExheW91dCBuZXdseS1hcHBlbmRlZCBpdGVtIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKi9cbnByb3RvLmFwcGVuZGVkID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLmFkZEl0ZW1zKCBlbGVtcyApO1xuICBpZiAoICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGxheW91dCBhbmQgcmV2ZWFsIGp1c3QgdGhlIG5ldyBpdGVtc1xuICB0aGlzLmxheW91dEl0ZW1zKCBpdGVtcywgdHJ1ZSApO1xuICB0aGlzLnJldmVhbCggaXRlbXMgKTtcbn07XG5cbi8qKlxuICogTGF5b3V0IHByZXBlbmRlZCBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by5wcmVwZW5kZWQgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuX2l0ZW1pemUoIGVsZW1zICk7XG4gIGlmICggIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gYWRkIGl0ZW1zIHRvIGJlZ2lubmluZyBvZiBjb2xsZWN0aW9uXG4gIHZhciBwcmV2aW91c0l0ZW1zID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcbiAgdGhpcy5pdGVtcyA9IGl0ZW1zLmNvbmNhdCggcHJldmlvdXNJdGVtcyApO1xuICAvLyBzdGFydCBuZXcgbGF5b3V0XG4gIHRoaXMuX3Jlc2V0TGF5b3V0KCk7XG4gIHRoaXMuX21hbmFnZVN0YW1wcygpO1xuICAvLyBsYXlvdXQgbmV3IHN0dWZmIHdpdGhvdXQgdHJhbnNpdGlvblxuICB0aGlzLmxheW91dEl0ZW1zKCBpdGVtcywgdHJ1ZSApO1xuICB0aGlzLnJldmVhbCggaXRlbXMgKTtcbiAgLy8gbGF5b3V0IHByZXZpb3VzIGl0ZW1zXG4gIHRoaXMubGF5b3V0SXRlbXMoIHByZXZpb3VzSXRlbXMgKTtcbn07XG5cbi8qKlxuICogcmV2ZWFsIGEgY29sbGVjdGlvbiBvZiBpdGVtc1xuICogQHBhcmFtIHtBcnJheSBvZiBPdXRsYXllci5JdGVtc30gaXRlbXNcbiAqL1xucHJvdG8ucmV2ZWFsID0gZnVuY3Rpb24oIGl0ZW1zICkge1xuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAncmV2ZWFsJywgaXRlbXMgKTtcbiAgaWYgKCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHN0YWdnZXIgPSB0aGlzLnVwZGF0ZVN0YWdnZXIoKTtcbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0sIGkgKSB7XG4gICAgaXRlbS5zdGFnZ2VyKCBpICogc3RhZ2dlciApO1xuICAgIGl0ZW0ucmV2ZWFsKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBoaWRlIGEgY29sbGVjdGlvbiBvZiBpdGVtc1xuICogQHBhcmFtIHtBcnJheSBvZiBPdXRsYXllci5JdGVtc30gaXRlbXNcbiAqL1xucHJvdG8uaGlkZSA9IGZ1bmN0aW9uKCBpdGVtcyApIHtcbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ2hpZGUnLCBpdGVtcyApO1xuICBpZiAoICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc3RhZ2dlciA9IHRoaXMudXBkYXRlU3RhZ2dlcigpO1xuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSwgaSApIHtcbiAgICBpdGVtLnN0YWdnZXIoIGkgKiBzdGFnZ2VyICk7XG4gICAgaXRlbS5oaWRlKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiByZXZlYWwgaXRlbSBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheX0sIHtFbGVtZW50fSwge05vZGVMaXN0fSBpdGVtc1xuICovXG5wcm90by5yZXZlYWxJdGVtRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoIGVsZW1zICk7XG4gIHRoaXMucmV2ZWFsKCBpdGVtcyApO1xufTtcblxuLyoqXG4gKiBoaWRlIGl0ZW0gZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXl9LCB7RWxlbWVudH0sIHtOb2RlTGlzdH0gaXRlbXNcbiAqL1xucHJvdG8uaGlkZUl0ZW1FbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGl0ZW1zID0gdGhpcy5nZXRJdGVtcyggZWxlbXMgKTtcbiAgdGhpcy5oaWRlKCBpdGVtcyApO1xufTtcblxuLyoqXG4gKiBnZXQgT3V0bGF5ZXIuSXRlbSwgZ2l2ZW4gYW4gRWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge091dGxheWVyLkl0ZW19IGl0ZW1cbiAqL1xucHJvdG8uZ2V0SXRlbSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAvLyBsb29wIHRocm91Z2ggaXRlbXMgdG8gZ2V0IHRoZSBvbmUgdGhhdCBtYXRjaGVzXG4gIGZvciAoIHZhciBpPTA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICBpZiAoIGl0ZW0uZWxlbWVudCA9PSBlbGVtICkge1xuICAgICAgLy8gcmV0dXJuIGl0ZW1cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBnZXQgY29sbGVjdGlvbiBvZiBPdXRsYXllci5JdGVtcywgZ2l2ZW4gRWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXl9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zIC0gT3V0bGF5ZXIuSXRlbXNcbiAqL1xucHJvdG8uZ2V0SXRlbXMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICB2YXIgaXRlbXMgPSBbXTtcbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW0oIGVsZW0gKTtcbiAgICBpZiAoIGl0ZW0gKSB7XG4gICAgICBpdGVtcy5wdXNoKCBpdGVtICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG5cbiAgcmV0dXJuIGl0ZW1zO1xufTtcblxuLyoqXG4gKiByZW1vdmUgZWxlbWVudChzKSBmcm9tIGluc3RhbmNlIGFuZCBET01cbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgcmVtb3ZlSXRlbXMgPSB0aGlzLmdldEl0ZW1zKCBlbGVtcyApO1xuXG4gIHRoaXMuX2VtaXRDb21wbGV0ZU9uSXRlbXMoICdyZW1vdmUnLCByZW1vdmVJdGVtcyApO1xuXG4gIC8vIGJhaWwgaWYgbm8gaXRlbXMgdG8gcmVtb3ZlXG4gIGlmICggIXJlbW92ZUl0ZW1zIHx8ICFyZW1vdmVJdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVtb3ZlSXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5yZW1vdmUoKTtcbiAgICAvLyByZW1vdmUgaXRlbSBmcm9tIGNvbGxlY3Rpb25cbiAgICB1dGlscy5yZW1vdmVGcm9tKCB0aGlzLml0ZW1zLCBpdGVtICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cbi8vIC0tLS0tIGRlc3Ryb3kgLS0tLS0gLy9cblxuLy8gcmVtb3ZlIGFuZCBkaXNhYmxlIE91dGxheWVyIGluc3RhbmNlXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNsZWFuIHVwIGR5bmFtaWMgc3R5bGVzXG4gIHZhciBzdHlsZSA9IHRoaXMuZWxlbWVudC5zdHlsZTtcbiAgc3R5bGUuaGVpZ2h0ID0gJyc7XG4gIHN0eWxlLnBvc2l0aW9uID0gJyc7XG4gIHN0eWxlLndpZHRoID0gJyc7XG4gIC8vIGRlc3Ryb3kgaXRlbXNcbiAgdGhpcy5pdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICBpdGVtLmRlc3Ryb3koKTtcbiAgfSk7XG5cbiAgdGhpcy51bmJpbmRSZXNpemUoKTtcblxuICB2YXIgaWQgPSB0aGlzLmVsZW1lbnQub3V0bGF5ZXJHVUlEO1xuICBkZWxldGUgaW5zdGFuY2VzWyBpZCBdOyAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIGluc3RhbmNlIGJ5IGlkXG4gIGRlbGV0ZSB0aGlzLmVsZW1lbnQub3V0bGF5ZXJHVUlEO1xuICAvLyByZW1vdmUgZGF0YSBmb3IgalF1ZXJ5XG4gIGlmICggalF1ZXJ5ICkge1xuICAgIGpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLmVsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IubmFtZXNwYWNlICk7XG4gIH1cblxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGdldCBPdXRsYXllciBpbnN0YW5jZSBmcm9tIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge091dGxheWVyfVxuICovXG5PdXRsYXllci5kYXRhID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIGVsZW0gPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW0gKTtcbiAgdmFyIGlkID0gZWxlbSAmJiBlbGVtLm91dGxheWVyR1VJRDtcbiAgcmV0dXJuIGlkICYmIGluc3RhbmNlc1sgaWQgXTtcbn07XG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY3JlYXRlIE91dGxheWVyIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogY3JlYXRlIGEgbGF5b3V0IGNsYXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKi9cbk91dGxheWVyLmNyZWF0ZSA9IGZ1bmN0aW9uKCBuYW1lc3BhY2UsIG9wdGlvbnMgKSB7XG4gIC8vIHN1Yi1jbGFzcyBPdXRsYXllclxuICB2YXIgTGF5b3V0ID0gc3ViY2xhc3MoIE91dGxheWVyICk7XG4gIC8vIGFwcGx5IG5ldyBvcHRpb25zIGFuZCBjb21wYXRPcHRpb25zXG4gIExheW91dC5kZWZhdWx0cyA9IHV0aWxzLmV4dGVuZCgge30sIE91dGxheWVyLmRlZmF1bHRzICk7XG4gIHV0aWxzLmV4dGVuZCggTGF5b3V0LmRlZmF1bHRzLCBvcHRpb25zICk7XG4gIExheW91dC5jb21wYXRPcHRpb25zID0gdXRpbHMuZXh0ZW5kKCB7fSwgT3V0bGF5ZXIuY29tcGF0T3B0aW9ucyAgKTtcblxuICBMYXlvdXQubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXG4gIExheW91dC5kYXRhID0gT3V0bGF5ZXIuZGF0YTtcblxuICAvLyBzdWItY2xhc3MgSXRlbVxuICBMYXlvdXQuSXRlbSA9IHN1YmNsYXNzKCBJdGVtICk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVjbGFyYXRpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICB1dGlscy5odG1sSW5pdCggTGF5b3V0LCBuYW1lc3BhY2UgKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBqUXVlcnkgYnJpZGdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLy8gbWFrZSBpbnRvIGpRdWVyeSBwbHVnaW5cbiAgaWYgKCBqUXVlcnkgJiYgalF1ZXJ5LmJyaWRnZXQgKSB7XG4gICAgalF1ZXJ5LmJyaWRnZXQoIG5hbWVzcGFjZSwgTGF5b3V0ICk7XG4gIH1cblxuICByZXR1cm4gTGF5b3V0O1xufTtcblxuZnVuY3Rpb24gc3ViY2xhc3MoIFBhcmVudCApIHtcbiAgZnVuY3Rpb24gU3ViQ2xhc3MoKSB7XG4gICAgUGFyZW50LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcbiAgfVxuXG4gIFN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBhcmVudC5wcm90b3R5cGUgKTtcbiAgU3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViQ2xhc3M7XG5cbiAgcmV0dXJuIFN1YkNsYXNzO1xufVxuXG4vLyAtLS0tLSBoZWxwZXJzIC0tLS0tIC8vXG5cbi8vIGhvdyBtYW55IG1pbGxpc2Vjb25kcyBhcmUgaW4gZWFjaCB1bml0XG52YXIgbXNVbml0cyA9IHtcbiAgbXM6IDEsXG4gIHM6IDEwMDBcbn07XG5cbi8vIG11bmdlIHRpbWUtbGlrZSBwYXJhbWV0ZXIgaW50byBtaWxsaXNlY29uZCBudW1iZXJcbi8vICcwLjRzJyAtPiA0MFxuZnVuY3Rpb24gZ2V0TWlsbGlzZWNvbmRzKCB0aW1lICkge1xuICBpZiAoIHR5cGVvZiB0aW1lID09ICdudW1iZXInICkge1xuICAgIHJldHVybiB0aW1lO1xuICB9XG4gIHZhciBtYXRjaGVzID0gdGltZS5tYXRjaCggLyheXFxkKlxcLj9cXGQqKShcXHcqKS8gKTtcbiAgdmFyIG51bSA9IG1hdGNoZXMgJiYgbWF0Y2hlc1sxXTtcbiAgdmFyIHVuaXQgPSBtYXRjaGVzICYmIG1hdGNoZXNbMl07XG4gIGlmICggIW51bS5sZW5ndGggKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbnVtID0gcGFyc2VGbG9hdCggbnVtICk7XG4gIHZhciBtdWx0ID0gbXNVbml0c1sgdW5pdCBdIHx8IDE7XG4gIHJldHVybiBudW0gKiBtdWx0O1xufVxuXG4vLyAtLS0tLSBmaW4gLS0tLS0gLy9cblxuLy8gYmFjayBpbiBnbG9iYWxcbk91dGxheWVyLkl0ZW0gPSBJdGVtO1xuXG5yZXR1cm4gT3V0bGF5ZXI7XG5cbn0pKTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFRSxXQUFVQSxNQUFWLEVBQWtCQyxPQUFsQixFQUE0QjtFQUM1QixhQUQ0QixDQUU1Qjs7RUFDQTs7RUFBMkI7O0VBQzNCLElBQUssT0FBT0MsTUFBUCxJQUFpQixVQUFqQixJQUErQkEsTUFBTSxDQUFDQyxHQUEzQyxFQUFpRDtJQUMvQztJQUNBRCxNQUFNLENBQUUsQ0FDSix1QkFESSxFQUVKLG1CQUZJLEVBR0osc0JBSEksRUFJSixRQUpJLENBQUYsRUFNSixVQUFVRSxTQUFWLEVBQXFCQyxPQUFyQixFQUE4QkMsS0FBOUIsRUFBcUNDLElBQXJDLEVBQTRDO01BQzFDLE9BQU9OLE9BQU8sQ0FBRUQsTUFBRixFQUFVSSxTQUFWLEVBQXFCQyxPQUFyQixFQUE4QkMsS0FBOUIsRUFBcUNDLElBQXJDLENBQWQ7SUFDRCxDQVJHLENBQU47RUFVRCxDQVpELE1BWU8sSUFBSyxRQUFPQyxNQUFQLHlDQUFPQSxNQUFQLE1BQWlCLFFBQWpCLElBQTZCQSxNQUFNLENBQUNDLE9BQXpDLEVBQW1EO0lBQ3hEO0lBQ0FELE1BQU0sQ0FBQ0MsT0FBUCxHQUFp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 },{"./item":25,"ev-emitter":16,"fizzy-ui-utils":17,"get-size":18}],27:[function(require,module,exports){ -/*! - * perfect-scrollbar v1.5.3 - * Copyright 2021 Hyunje Jun, MDBootstrap and Contributors - * Licensed under MIT - */ -'use strict'; -function get(element) { - return getComputedStyle(element); -} - -function set(element, obj) { - for (var key in obj) { - var val = obj[key]; - - if (typeof val === 'number') { - val = val + "px"; - } - - element.style[key] = val; - } - - return element; -} - -function div(className) { - var div = document.createElement('div'); - div.className = className; - return div; -} - -var elMatches = typeof Element !== 'undefined' && (Element.prototype.matches || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector); - -function matches(element, query) { - if (!elMatches) { - throw new Error('No element matching method supported'); - } - - return elMatches.call(element, query); -} - -function remove(element) { - if (element.remove) { - element.remove(); - } else { - if (element.parentNode) { - element.parentNode.removeChild(element); - } - } -} - -function queryChildren(element, selector) { - return Array.prototype.filter.call(element.children, function (child) { - return matches(child, selector); - }); -} - -var cls = { - main: 'ps', - rtl: 'ps__rtl', - element: { - thumb: function thumb(x) { - return "ps__thumb-" + x; - }, - rail: function rail(x) { - return "ps__rail-" + x; - }, - consuming: 'ps__child--consume' - }, - state: { - focus: 'ps--focus', - clicking: 'ps--clicking', - active: function active(x) { - return "ps--active-" + x; - }, - scrolling: function scrolling(x) { - return "ps--scrolling-" + x; - } - } -}; -/* - * Helper methods - */ - -var scrollingClassTimeout = { - x: null, - y: null -}; - -function addScrollingClass(i, x) { - var classList = i.element.classList; - var className = cls.state.scrolling(x); - - if (classList.contains(className)) { - clearTimeout(scrollingClassTimeout[x]); - } else { - classList.add(className); - } -} - -function removeScrollingClass(i, x) { - scrollingClassTimeout[x] = setTimeout(function () { - return i.isAlive && i.element.classList.remove(cls.state.scrolling(x)); - }, i.settings.scrollingThreshold); -} - -function setScrollingClassInstantly(i, x) { - addScrollingClass(i, x); - removeScrollingClass(i, x); -} - -var EventElement = function EventElement(element) { - this.element = element; - this.handlers = {}; -}; - -var prototypeAccessors = { - isEmpty: { - configurable: true - } -}; - -EventElement.prototype.bind = function bind(eventName, handler) { - if (typeof this.handlers[eventName] === 'undefined') { - this.handlers[eventName] = []; - } - - this.handlers[eventName].push(handler); - this.element.addEventListener(eventName, handler, false); -}; - -EventElement.prototype.unbind = function unbind(eventName, target) { - var this$1 = this; - this.handlers[eventName] = this.handlers[eventName].filter(function (handler) { - if (target && handler !== target) { - return true; - } - - this$1.element.removeEventListener(eventName, handler, false); - return false; - }); -}; - -EventElement.prototype.unbindAll = function unbindAll() { - for (var name in this.handlers) { - this.unbind(name); - } -}; - -prototypeAccessors.isEmpty.get = function () { - var this$1 = this; - return Object.keys(this.handlers).every(function (key) { - return this$1.handlers[key].length === 0; - }); -}; - -Object.defineProperties(EventElement.prototype, prototypeAccessors); - -var EventManager = function EventManager() { - this.eventElements = []; -}; - -EventManager.prototype.eventElement = function eventElement(element) { - var ee = this.eventElements.filter(function (ee) { - return ee.element === element; - })[0]; - - if (!ee) { - ee = new EventElement(element); - this.eventElements.push(ee); - } - - return ee; -}; - -EventManager.prototype.bind = function bind(element, eventName, handler) { - this.eventElement(element).bind(eventName, handler); -}; - -EventManager.prototype.unbind = function unbind(element, eventName, handler) { - var ee = this.eventElement(element); - ee.unbind(eventName, handler); - - if (ee.isEmpty) { - // remove - this.eventElements.splice(this.eventElements.indexOf(ee), 1); - } -}; - -EventManager.prototype.unbindAll = function unbindAll() { - this.eventElements.forEach(function (e) { - return e.unbindAll(); - }); - this.eventElements = []; -}; - -EventManager.prototype.once = function once(element, eventName, handler) { - var ee = this.eventElement(element); - - var onceHandler = function onceHandler(evt) { - ee.unbind(eventName, onceHandler); - handler(evt); - }; - - ee.bind(eventName, onceHandler); -}; - -function createEvent(name) { - if (typeof window.CustomEvent === 'function') { - return new CustomEvent(name); - } else { - var evt = document.createEvent('CustomEvent'); - evt.initCustomEvent(name, false, false, undefined); - return evt; - } -} - -function processScrollDiff(i, axis, diff, useScrollingClass, forceFireReachEvent) { - if (useScrollingClass === void 0) useScrollingClass = true; - if (forceFireReachEvent === void 0) forceFireReachEvent = false; - var fields; - - if (axis === 'top') { - fields = ['contentHeight', 'containerHeight', 'scrollTop', 'y', 'up', 'down']; - } else if (axis === 'left') { - fields = ['contentWidth', 'containerWidth', 'scrollLeft', 'x', 'left', 'right']; - } else { - throw new Error('A proper axis should be provided'); - } - - processScrollDiff$1(i, diff, fields, useScrollingClass, forceFireReachEvent); -} - -function processScrollDiff$1(i, diff, ref, useScrollingClass, forceFireReachEvent) { - var contentHeight = ref[0]; - var containerHeight = ref[1]; - var scrollTop = ref[2]; - var y = ref[3]; - var up = ref[4]; - var down = ref[5]; - if (useScrollingClass === void 0) useScrollingClass = true; - if (forceFireReachEvent === void 0) forceFireReachEvent = false; - var element = i.element; // reset reach - - i.reach[y] = null; // 1 for subpixel rounding - - if (element[scrollTop] < 1) { - i.reach[y] = 'start'; - } // 1 for subpixel rounding - - - if (element[scrollTop] > i[contentHeight] - i[containerHeight] - 1) { - i.reach[y] = 'end'; - } - - if (diff) { - element.dispatchEvent(createEvent("ps-scroll-" + y)); - - if (diff < 0) { - element.dispatchEvent(createEvent("ps-scroll-" + up)); - } else if (diff > 0) { - element.dispatchEvent(createEvent("ps-scroll-" + down)); - } - - if (useScrollingClass) { - setScrollingClassInstantly(i, y); - } - } - - if (i.reach[y] && (diff || forceFireReachEvent)) { - element.dispatchEvent(createEvent("ps-" + y + "-reach-" + i.reach[y])); - } -} - -function toInt(x) { - return parseInt(x, 10) || 0; -} - -function isEditable(el) { - return matches(el, 'input,[contenteditable]') || matches(el, 'select,[contenteditable]') || matches(el, 'textarea,[contenteditable]') || matches(el, 'button,[contenteditable]'); -} - -function outerWidth(element) { - var styles = get(element); - return toInt(styles.width) + toInt(styles.paddingLeft) + toInt(styles.paddingRight) + toInt(styles.borderLeftWidth) + toInt(styles.borderRightWidth); -} - -var env = { - isWebKit: typeof document !== 'undefined' && 'WebkitAppearance' in document.documentElement.style, - supportsTouch: typeof window !== 'undefined' && ('ontouchstart' in window || 'maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints > 0 || window.DocumentTouch && document instanceof window.DocumentTouch), - supportsIePointer: typeof navigator !== 'undefined' && navigator.msMaxTouchPoints, - isChrome: typeof navigator !== 'undefined' && /Chrome/i.test(navigator && navigator.userAgent) -}; - -function updateGeometry(i) { - var element = i.element; - var roundedScrollTop = Math.floor(element.scrollTop); - var rect = element.getBoundingClientRect(); - i.containerWidth = Math.round(rect.width); - i.containerHeight = Math.round(rect.height); - i.contentWidth = element.scrollWidth; - i.contentHeight = element.scrollHeight; - - if (!element.contains(i.scrollbarXRail)) { - // clean up and append - queryChildren(element, cls.element.rail('x')).forEach(function (el) { - return remove(el); - }); - element.appendChild(i.scrollbarXRail); - } - - if (!element.contains(i.scrollbarYRail)) { - // clean up and append - queryChildren(element, cls.element.rail('y')).forEach(function (el) { - return remove(el); - }); - element.appendChild(i.scrollbarYRail); - } - - if (!i.settings.suppressScrollX && i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth) { - i.scrollbarXActive = true; - i.railXWidth = i.containerWidth - i.railXMarginWidth; - i.railXRatio = i.containerWidth / i.railXWidth; - i.scrollbarXWidth = getThumbSize(i, toInt(i.railXWidth * i.containerWidth / i.contentWidth)); - i.scrollbarXLeft = toInt((i.negativeScrollAdjustment + element.scrollLeft) * (i.railXWidth - i.scrollbarXWidth) / (i.contentWidth - i.containerWidth)); - } else { - i.scrollbarXActive = false; - } - - if (!i.settings.suppressScrollY && i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight) { - i.scrollbarYActive = true; - i.railYHeight = i.containerHeight - i.railYMarginHeight; - i.railYRatio = i.containerHeight / i.railYHeight; - i.scrollbarYHeight = getThumbSize(i, toInt(i.railYHeight * i.containerHeight / i.contentHeight)); - i.scrollbarYTop = toInt(roundedScrollTop * (i.railYHeight - i.scrollbarYHeight) / (i.contentHeight - i.containerHeight)); - } else { - i.scrollbarYActive = false; - } - - if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) { - i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth; - } - - if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) { - i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight; - } - - updateCss(element, i); - - if (i.scrollbarXActive) { - element.classList.add(cls.state.active('x')); - } else { - element.classList.remove(cls.state.active('x')); - i.scrollbarXWidth = 0; - i.scrollbarXLeft = 0; - element.scrollLeft = i.isRtl === true ? i.contentWidth : 0; - } - - if (i.scrollbarYActive) { - element.classList.add(cls.state.active('y')); - } else { - element.classList.remove(cls.state.active('y')); - i.scrollbarYHeight = 0; - i.scrollbarYTop = 0; - element.scrollTop = 0; - } -} - -function getThumbSize(i, thumbSize) { - if (i.settings.minScrollbarLength) { - thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength); - } - - if (i.settings.maxScrollbarLength) { - thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength); - } - - return thumbSize; -} - -function updateCss(element, i) { - var xRailOffset = { - width: i.railXWidth - }; - var roundedScrollTop = Math.floor(element.scrollTop); - - if (i.isRtl) { - xRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth - i.contentWidth; - } else { - xRailOffset.left = element.scrollLeft; - } - - if (i.isScrollbarXUsingBottom) { - xRailOffset.bottom = i.scrollbarXBottom - roundedScrollTop; - } else { - xRailOffset.top = i.scrollbarXTop + roundedScrollTop; - } - - set(i.scrollbarXRail, xRailOffset); - var yRailOffset = { - top: roundedScrollTop, - height: i.railYHeight - }; - - if (i.isScrollbarYUsingRight) { - if (i.isRtl) { - yRailOffset.right = i.contentWidth - (i.negativeScrollAdjustment + element.scrollLeft) - i.scrollbarYRight - i.scrollbarYOuterWidth - 9; - } else { - yRailOffset.right = i.scrollbarYRight - element.scrollLeft; - } - } else { - if (i.isRtl) { - yRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth * 2 - i.contentWidth - i.scrollbarYLeft - i.scrollbarYOuterWidth; - } else { - yRailOffset.left = i.scrollbarYLeft + element.scrollLeft; - } - } - - set(i.scrollbarYRail, yRailOffset); - set(i.scrollbarX, { - left: i.scrollbarXLeft, - width: i.scrollbarXWidth - i.railBorderXWidth - }); - set(i.scrollbarY, { - top: i.scrollbarYTop, - height: i.scrollbarYHeight - i.railBorderYWidth - }); -} - -function clickRail(i) { - var element = i.element; - i.event.bind(i.scrollbarY, 'mousedown', function (e) { - return e.stopPropagation(); - }); - i.event.bind(i.scrollbarYRail, 'mousedown', function (e) { - var positionTop = e.pageY - window.pageYOffset - i.scrollbarYRail.getBoundingClientRect().top; - var direction = positionTop > i.scrollbarYTop ? 1 : -1; - i.element.scrollTop += direction * i.containerHeight; - updateGeometry(i); - e.stopPropagation(); - }); - i.event.bind(i.scrollbarX, 'mousedown', function (e) { - return e.stopPropagation(); - }); - i.event.bind(i.scrollbarXRail, 'mousedown', function (e) { - var positionLeft = e.pageX - window.pageXOffset - i.scrollbarXRail.getBoundingClientRect().left; - var direction = positionLeft > i.scrollbarXLeft ? 1 : -1; - i.element.scrollLeft += direction * i.containerWidth; - updateGeometry(i); - e.stopPropagation(); - }); -} - -function dragThumb(i) { - bindMouseScrollHandler(i, ['containerWidth', 'contentWidth', 'pageX', 'railXWidth', 'scrollbarX', 'scrollbarXWidth', 'scrollLeft', 'x', 'scrollbarXRail']); - bindMouseScrollHandler(i, ['containerHeight', 'contentHeight', 'pageY', 'railYHeight', 'scrollbarY', 'scrollbarYHeight', 'scrollTop', 'y', 'scrollbarYRail']); -} - -function bindMouseScrollHandler(i, ref) { - var containerHeight = ref[0]; - var contentHeight = ref[1]; - var pageY = ref[2]; - var railYHeight = ref[3]; - var scrollbarY = ref[4]; - var scrollbarYHeight = ref[5]; - var scrollTop = ref[6]; - var y = ref[7]; - var scrollbarYRail = ref[8]; - var element = i.element; - var startingScrollTop = null; - var startingMousePageY = null; - var scrollBy = null; - - function mouseMoveHandler(e) { - if (e.touches && e.touches[0]) { - e[pageY] = e.touches[0].pageY; - } - - element[scrollTop] = startingScrollTop + scrollBy * (e[pageY] - startingMousePageY); - addScrollingClass(i, y); - updateGeometry(i); - e.stopPropagation(); - - if (e.type.startsWith('touch') && e.changedTouches.length > 1) { - e.preventDefault(); - } - } - - function mouseUpHandler() { - removeScrollingClass(i, y); - i[scrollbarYRail].classList.remove(cls.state.clicking); - i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler); - } - - function bindMoves(e, touchMode) { - startingScrollTop = element[scrollTop]; - - if (touchMode && e.touches) { - e[pageY] = e.touches[0].pageY; - } - - startingMousePageY = e[pageY]; - scrollBy = (i[contentHeight] - i[containerHeight]) / (i[railYHeight] - i[scrollbarYHeight]); - - if (!touchMode) { - i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler); - i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler); - e.preventDefault(); - } else { - i.event.bind(i.ownerDocument, 'touchmove', mouseMoveHandler); - } - - i[scrollbarYRail].classList.add(cls.state.clicking); - e.stopPropagation(); - } - - i.event.bind(i[scrollbarY], 'mousedown', function (e) { - bindMoves(e); - }); - i.event.bind(i[scrollbarY], 'touchstart', function (e) { - bindMoves(e, true); - }); -} - -function keyboard(i) { - var element = i.element; - - var elementHovered = function elementHovered() { - return matches(element, ':hover'); - }; - - var scrollbarFocused = function scrollbarFocused() { - return matches(i.scrollbarX, ':focus') || matches(i.scrollbarY, ':focus'); - }; - - function shouldPreventDefault(deltaX, deltaY) { - var scrollTop = Math.floor(element.scrollTop); - - if (deltaX === 0) { - if (!i.scrollbarYActive) { - return false; - } - - if (scrollTop === 0 && deltaY > 0 || scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0) { - return !i.settings.wheelPropagation; - } - } - - var scrollLeft = element.scrollLeft; - - if (deltaY === 0) { - if (!i.scrollbarXActive) { - return false; - } - - if (scrollLeft === 0 && deltaX < 0 || scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0) { - return !i.settings.wheelPropagation; - } - } - - return true; - } - - i.event.bind(i.ownerDocument, 'keydown', function (e) { - if (e.isDefaultPrevented && e.isDefaultPrevented() || e.defaultPrevented) { - return; - } - - if (!elementHovered() && !scrollbarFocused()) { - return; - } - - var activeElement = document.activeElement ? document.activeElement : i.ownerDocument.activeElement; - - if (activeElement) { - if (activeElement.tagName === 'IFRAME') { - activeElement = activeElement.contentDocument.activeElement; - } else { - // go deeper if element is a webcomponent - while (activeElement.shadowRoot) { - activeElement = activeElement.shadowRoot.activeElement; - } - } - - if (isEditable(activeElement)) { - return; - } - } - - var deltaX = 0; - var deltaY = 0; - - switch (e.which) { - case 37: - // left - if (e.metaKey) { - deltaX = -i.contentWidth; - } else if (e.altKey) { - deltaX = -i.containerWidth; - } else { - deltaX = -30; - } - - break; - - case 38: - // up - if (e.metaKey) { - deltaY = i.contentHeight; - } else if (e.altKey) { - deltaY = i.containerHeight; - } else { - deltaY = 30; - } - - break; - - case 39: - // right - if (e.metaKey) { - deltaX = i.contentWidth; - } else if (e.altKey) { - deltaX = i.containerWidth; - } else { - deltaX = 30; - } - - break; - - case 40: - // down - if (e.metaKey) { - deltaY = -i.contentHeight; - } else if (e.altKey) { - deltaY = -i.containerHeight; - } else { - deltaY = -30; - } - - break; - - case 32: - // space bar - if (e.shiftKey) { - deltaY = i.containerHeight; - } else { - deltaY = -i.containerHeight; - } - - break; - - case 33: - // page up - deltaY = i.containerHeight; - break; - - case 34: - // page down - deltaY = -i.containerHeight; - break; - - case 36: - // home - deltaY = i.contentHeight; - break; - - case 35: - // end - deltaY = -i.contentHeight; - break; - - default: - return; - } - - if (i.settings.suppressScrollX && deltaX !== 0) { - return; - } - - if (i.settings.suppressScrollY && deltaY !== 0) { - return; - } - - element.scrollTop -= deltaY; - element.scrollLeft += deltaX; - updateGeometry(i); - - if (shouldPreventDefault(deltaX, deltaY)) { - e.preventDefault(); - } - }); -} - -function wheel(i) { - var element = i.element; - - function shouldPreventDefault(deltaX, deltaY) { - var roundedScrollTop = Math.floor(element.scrollTop); - var isTop = element.scrollTop === 0; - var isBottom = roundedScrollTop + element.offsetHeight === element.scrollHeight; - var isLeft = element.scrollLeft === 0; - var isRight = element.scrollLeft + element.offsetWidth === element.scrollWidth; - var hitsBound; // pick axis with primary direction - - if (Math.abs(deltaY) > Math.abs(deltaX)) { - hitsBound = isTop || isBottom; - } else { - hitsBound = isLeft || isRight; - } - - return hitsBound ? !i.settings.wheelPropagation : true; - } - - function getDeltaFromEvent(e) { - var deltaX = e.deltaX; - var deltaY = -1 * e.deltaY; - - if (typeof deltaX === 'undefined' || typeof deltaY === 'undefined') { - // OS X Safari - deltaX = -1 * e.wheelDeltaX / 6; - deltaY = e.wheelDeltaY / 6; - } - - if (e.deltaMode && e.deltaMode === 1) { - // Firefox in deltaMode 1: Line scrolling - deltaX *= 10; - deltaY *= 10; - } - - if (deltaX !== deltaX && deltaY !== deltaY - /* NaN checks */ - ) { - // IE in some mouse drivers - deltaX = 0; - deltaY = e.wheelDelta; - } - - if (e.shiftKey) { - // reverse axis with shift key - return [-deltaY, -deltaX]; - } - - return [deltaX, deltaY]; - } - - function shouldBeConsumedByChild(target, deltaX, deltaY) { - // FIXME: this is a workaround for issue in FF and IE #571 + if(!E.isWebKit&&h.querySelector("select:focus"))return!0;if(!h.contains(b))return!1;for(var e=b;e&&e!==h;){if(e.classList.contains(z.element.consuming))return!0;var f=a(e);// if deltaY && vertical scrollable + if(d&&f.overflowY.match(/(scroll|auto)/)){var g=e.scrollHeight-e.clientHeight;if(0d||e.scrollTopc||e.scrollLeftf){// user is perhaps trying to swipe up/down the page + if(0>c&&d===b.contentHeight-b.containerHeight||0g&&(0>a&&e===b.contentWidth-b.containerWidth||0d||e.scrollTopc||e.scrollLeftu(o.x)&&.01>u(o.y)?void clearInterval(p):b.element?void(d(30*o.x,30*o.y),o.x*=.8,o.y*=.8):void clearInterval(p):void clearInterval(p)},10))}if(E.supportsTouch||E.supportsIePointer){var l=b.element,m={},n=0,o={},p=null;E.supportsTouch?(b.event.bind(l,"touchstart",h),b.event.bind(l,"touchmove",j),b.event.bind(l,"touchend",k)):E.supportsIePointer&&(window.PointerEvent?(b.event.bind(l,"pointerdown",h),b.event.bind(l,"pointermove",j),b.event.bind(l,"pointerup",k)):window.MSPointerEvent&&(b.event.bind(l,"MSPointerDown",h),b.event.bind(l,"MSPointerMove",j),b.event.bind(l,"MSPointerUp",k)))}}},H=function(d,e){var f=this;if(void 0===e&&(e={}),"string"==typeof d&&(d=document.querySelector(d)),!d||!d.nodeName)throw new Error("no element is specified to initialize PerfectScrollbar");for(var g in this.element=d,d.classList.add(z.main),this.settings=F(),e)this.settings[g]=e[g];this.containerWidth=null,this.containerHeight=null,this.contentWidth=null,this.contentHeight=null;var h=function(){return d.classList.add(z.state.focus)},i=function(){return d.classList.remove(z.state.focus)};this.isRtl="rtl"===a(d).direction,!0===this.isRtl&&d.classList.add(z.rtl),this.isNegativeScroll=function(){var a=d.scrollLeft,b=null;return d.scrollLeft=-1,b=0>d.scrollLeft,d.scrollLeft=a,b}(),this.negativeScrollAdjustment=this.isNegativeScroll?d.scrollWidth-d.clientWidth:0,this.event=new D,this.ownerDocument=d.ownerDocument||document,this.scrollbarXRail=c(z.element.rail("x")),d.appendChild(this.scrollbarXRail),this.scrollbarX=c(z.element.thumb("x")),this.scrollbarXRail.appendChild(this.scrollbarX),this.scrollbarX.setAttribute("tabindex",0),this.event.bind(this.scrollbarX,"focus",h),this.event.bind(this.scrollbarX,"blur",i),this.scrollbarXActive=null,this.scrollbarXWidth=null,this.scrollbarXLeft=null;var j=a(this.scrollbarXRail);this.scrollbarXBottom=parseInt(j.bottom,10),isNaN(this.scrollbarXBottom)?(this.isScrollbarXUsingBottom=!1,this.scrollbarXTop=n(j.top)):this.isScrollbarXUsingBottom=!0,this.railBorderXWidth=n(j.borderLeftWidth)+n(j.borderRightWidth),b(this.scrollbarXRail,{display:"block"}),this.railXMarginWidth=n(j.marginLeft)+n(j.marginRight),b(this.scrollbarXRail,{display:""}),this.railXWidth=null,this.railXRatio=null,this.scrollbarYRail=c(z.element.rail("y")),d.appendChild(this.scrollbarYRail),this.scrollbarY=c(z.element.thumb("y")),this.scrollbarYRail.appendChild(this.scrollbarY),this.scrollbarY.setAttribute("tabindex",0),this.event.bind(this.scrollbarY,"focus",h),this.event.bind(this.scrollbarY,"blur",i),this.scrollbarYActive=null,this.scrollbarYHeight=null,this.scrollbarYTop=null;var k=a(this.scrollbarYRail);this.scrollbarYRight=parseInt(k.right,10),isNaN(this.scrollbarYRight)?(this.isScrollbarYUsingRight=!1,this.scrollbarYLeft=n(k.left)):this.isScrollbarYUsingRight=!0,this.scrollbarYOuterWidth=this.isRtl?p(this.scrollbarY):null,this.railBorderYWidth=n(k.borderTopWidth)+n(k.borderBottomWidth),b(this.scrollbarYRail,{display:"block"}),this.railYMarginHeight=n(k.marginTop)+n(k.marginBottom),b(this.scrollbarYRail,{display:""}),this.railYHeight=null,this.railYRatio=null,this.reach={x:0>=d.scrollLeft?"start":d.scrollLeft>=this.contentWidth-this.containerWidth?"end":null,y:0>=d.scrollTop?"start":d.scrollTop>=this.contentHeight-this.containerHeight?"end":null},this.isAlive=!0,this.settings.handlers.forEach(function(a){return G[a](f)}),this.lastScrollTop=v(d.scrollTop),this.lastScrollLeft=d.scrollLeft,this.event.bind(this.element,"scroll",function(a){return f.onScroll(a)}),q(this)};return H.prototype.update=function(){this.isAlive&&(// Recalcuate negative scrollLeft adjustment + // Recalculate rail margins + // Hide scrollbars not to affect scrollWidth and scrollHeight + this.negativeScrollAdjustment=this.isNegativeScroll?this.element.scrollWidth-this.element.clientWidth:0,b(this.scrollbarXRail,{display:"block"}),b(this.scrollbarYRail,{display:"block"}),this.railXMarginWidth=n(a(this.scrollbarXRail).marginLeft)+n(a(this.scrollbarXRail).marginRight),this.railYMarginHeight=n(a(this.scrollbarYRail).marginTop)+n(a(this.scrollbarYRail).marginBottom),b(this.scrollbarXRail,{display:"none"}),b(this.scrollbarYRail,{display:"none"}),q(this),l(this,"top",0,!1,!0),l(this,"left",0,!1,!0),b(this.scrollbarXRail,{display:""}),b(this.scrollbarYRail,{display:""}))},H.prototype.onScroll=function(){this.isAlive&&(q(this),l(this,"top",this.element.scrollTop-this.lastScrollTop),l(this,"left",this.element.scrollLeft-this.lastScrollLeft),this.lastScrollTop=v(this.element.scrollTop),this.lastScrollLeft=this.element.scrollLeft)},H.prototype.destroy=function(){this.isAlive&&(// unset elements + this.event.unbindAll(),e(this.scrollbarX),e(this.scrollbarY),e(this.scrollbarXRail),e(this.scrollbarYRail),this.removePsClasses(),this.element=null,this.scrollbarX=null,this.scrollbarY=null,this.scrollbarXRail=null,this.scrollbarYRail=null,this.isAlive=!1)},H.prototype.removePsClasses=function(){this.element.className=this.element.className.split(" ").filter(function(a){return!a.match(/^ps([-_].+|)$/)}).join(" ")},H}); + //# sourceMappingURL=perfect-scrollbar.min.js.map + + + // + // Custom code to activate scrollbars + // + // - Corbz + // + + (function() { + var scrollables = $(".scrollable"); + if (scrollables.length > 0) { + scrollables.each(function(index, el) { + new PerfectScrollbar(el); + }); + } + })(); \ No newline at end of file diff --git a/apps/templates/includes/scripts.html b/apps/templates/includes/scripts.html index 066432e..e50a58b 100644 --- a/apps/templates/includes/scripts.html +++ b/apps/templates/includes/scripts.html @@ -8,4 +8,6 @@ + + diff --git a/apps/templates/layouts/base.html b/apps/templates/layouts/base.html index abb60db..7b314e0 100644 --- a/apps/templates/layouts/base.html +++ b/apps/templates/layouts/base.html @@ -14,7 +14,7 @@ - +