Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/news.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml13
-rw-r--r--css/news.min.css2
-rw-r--r--css/news.min.css.map1
-rw-r--r--db/newsmapper.php2
-rw-r--r--js/.jshintignore3
-rw-r--r--js/.jshintrc3
-rw-r--r--js/Gruntfile.js241
-rw-r--r--js/README.md43
-rw-r--r--js/app/App.js2
-rw-r--r--js/app/Config.js3
-rw-r--r--js/build/app.js3178
-rw-r--r--js/build/app.min.js6
-rw-r--r--js/build/app.min.js.map1
-rw-r--r--js/controller/AppController.js2
-rw-r--r--js/gui/ExternSubscription.js2
-rw-r--r--js/gulpfile.js93
-rw-r--r--js/karma.conf.js5
-rw-r--r--js/package.json24
-rw-r--r--js/tests/unit/controller/AppControllerSpec.js2
-rw-r--r--phpunit.integration.xml2
-rw-r--r--phpunit.xml2
-rw-r--r--templates/index.php11
22 files changed, 146 insertions, 3495 deletions
diff --git a/.travis.yml b/.travis.yml
index 04ff6422c..a857a6c44 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -61,18 +61,19 @@ before_script:
- cd apps/news/js
# install test deps
- npm install --deps # npm install needs to run before sudo npm install because otherwise it fails because a tmp file exists in the home dir
- - sudo npm -g install grunt-cli protractor
+ - sudo npm -g install gulp-cli protractor
+ - cd ..
- wget https://scrutinizer-ci.com/ocular.phar
script:
# unit tests
- - grunt php-unit
+ - phpunit
- php ocular.phar code-coverage:upload --format=php-clover ../coverage.clover
- - grunt js-unit
- # integration tests
- - grunt php-integration
+ - phpunit -c phpunit.integration.xml
+ - cd js
+ - gulp karma
# acceptance tests
- - webdriver-manager update
+ # - webdriver-manager update
- sudo chown -R www-data:www-data ../../../data
- sudo chmod -R a+rwx ../../../data
#- grunt acceptance --verbose
diff --git a/css/news.min.css b/css/news.min.css
deleted file mode 100644
index 42615b5a5..000000000
--- a/css/news.min.css
+++ /dev/null
@@ -1,2 +0,0 @@
-#app-content #searchresults,#undo{display:none}#app-content .body a,#app-content .body h3,#app-content .heading a:hover,#app-content .subtitle a:hover,#app-settings-content a,#explore .explore-footer a,#explore h1 a:hover,#notification a,#undo a:hover{text-decoration:underline}#global-loading{width:100%;height:100%}#undo-container{position:fixed;top:0;width:100%;text-align:center;z-index:101;line-height:1.2}#undo{z-index:101;background-color:#fc4;border:0;padding:0 .7em .3em;position:relative;top:0;border-bottom-left-radius:1em;border-bottom-right-radius:1em}#undo a{font-weight:700}#searchbox{display:block!important}#app-content .no-feeds-available{text-align:center;color:#333;font-size:16pt;min-height:100%;height:100%;width:100%;display:table}#app-content .no-feeds-available p{vertical-align:middle;display:table-cell}#app-content-wrapper,#articles{height:100%}#app-content .podcast{height:30px;z-index:10000;background-color:#111}#app-content .podcast audio{display:block;float:left;width:calc(100% - 60px);height:30px;border-radius:0}#app-content .podcast a,#app-content .podcast button{display:block;float:left;height:30px;width:30px;border:0;border-radius:0;margin:0;background-color:transparent;background-repeat:no-repeat;background-position:center}#app-content .podcast-close{background-size:25px;background-image:url(../img/close.svg)}#app-content .podcast-download{transform:rotate(270deg);background-size:20px;background-image:url(../img/arrow-white.svg)}#app-content .podcast audio::-webkit-media-controls-enclosure{max-width:inherit}#app-content .podcast.fixed{position:absolute;right:0;left:0}#notification a{color:#00f}#notification li{display:block}#app-content.loading-content{background:url(../img/loading.gif) calc(50% - 16px) calc(50% - 16px) no-repeat;transition:none!important;-webkit-transition:none!important;-moz-webkit-transition:none!important}#app-content.loading-content #app-content-wrapper{display:none}#app-content:not(.explore) #articles:after{content:'';display:block;height:100%;background-repeat:no-repeat}#app-content .autopaging: #articles:after{content:'';background-image:url(../img/loading.gif);background-position:calc(50% - 16px) calc(50% - 16px);transition:none!important;-webkit-transition:none!important;-moz-webkit-transition:none!important}#app-content .finished-auto-paging #articles:after{background-image:-o-linear-gradient(top,#eee 0,#FEFEFE 100%);background-image:-moz-linear-gradient(top,#eee 0,#FEFEFE 100%);background-image:-webkit-linear-gradient(top,#eee 0,#FEFEFE 100%);background-image:-ms-linear-gradient(top,#eee 0,#FEFEFE 100%);background-image:linear-gradient(to top,#eee 0,#FEFEFE 100%)}.pull-to-refresh{height:0;overflow:hidden;text-align:center;background-image:-moz-linear-gradient(top,#eee 0,#fefefe 100%);background-image:-webkit-linear-gradient(top,#eee 0,#fefefe 100%);background-image:-ms-linear-gradient(top,#eee 0,#fefefe 100%);background-image:linear-gradient(top,#eee 0,#fefefe 100%)}.pull-to-refresh.show-pull-to-refresh{transition:all .5s ease;padding-top:10px;height:44px}#app-content .only-in-expanded{display:block}#app-content .compact .only-in-expanded,#app-content .only-in-compact{display:none}#app-content .compact .only-in-compact{display:block}#app-content .item{cursor:default;border-bottom:1px solid #eee;background-image:linear-gradient(top,#f8f8f8 0,#fff 84px)}#app-content .item:last-child{border-bottom:0}#app-content .utils{width:100%;line-height:52px;box-sizing:border-box;padding:15px 50px 0 15px}#app-content .compact .utils{cursor:pointer;padding-top:0}#app-content .utils ul{height:40px;list-style-type:none;display:flex;margin:0;padding:0}#app-content .open .utils ul{height:auto}#app-content .utils ul>li{min-width:0}#app-content .util-spacer{width:20px}#app-content .compact .util-spacer{width:19px}#app-content .utils li{line-height:40px;vertical-align:middle}#app-content .utils>ul>li:last-child{padding-right:0}#app-content .utils>ul>li:first-child{padding-left:0}#app-content .utils .util{padding:0 6px}#app-content .utils .external,#app-content .utils button{padding:0;margin:0;height:40px;width:40px;border:0;float:left;background-color:transparent;background-repeat:no-repeat;background-size:25px;background-position:center}#app-content .utils .external,#app-content .utils .icon-toggle,#app-content .utils .menu button{display:inline-block;opacity:.3}#app-content .utils .external:hover,#app-content .utils .icon-toggle.keep-unread,#app-content .utils .icon-toggle:hover,#app-content .utils .menu button:hover{opacity:1}#app-content .utils .star{background-image:url(../img/inactive_star.svg)}#app-content .utils .star:hover,#app-content .utils .starred{background-image:url(../img/active_star.svg)}#app-content .utils .more button{opacity:.3}#app-content .utils .more button:hover{opacity:1}#app-content .utils .more{position:relative}#app-content .article-actions{display:none;filter:drop-shadow(0 0 5px rgba(150, 150, 150, .75));-webkit-filter:drop-shadow(0 0 5px rgba(150, 150, 150, .75));-moz-filter:drop-shadow(0 0 5px rgba(150, 150, 150, .75));position:absolute;top:40px;border-radius:3px;z-index:1000;border:1px solid transparent;background-color:#fff;margin:0;padding:0}#app-content .article-actions ul{display:flex;float:left}#app-content .article-actions li{float:left;width:52px!important}#app-content #articles:not(.compact) .article-actions{left:6px}#app-content #articles:not(.compact) .article-actions:after,#app-content #articles:not(.compact) .article-actions:before{left:20px}#app-content #articles.compact .article-actions{right:-10px}#app-content #articles.compact .article-actions:after,#app-content #articles.compact .article-actions:before{right:9px}#app-content .article-actions:after,#app-content .article-actions:before{bottom:100%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#app-content .article-actions:after{border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:5px;margin-left:-5px}#app-content .article-actions:before{border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:9px;margin-left:-9px}#app-content .utils .title{width:100%;padding-left:45px;background-position:10px 10px;background-size:20px 20px;background-repeat:no-repeat}#app-content .feed-view .utils .title{background:0 0!important;padding-left:10px}#app-content .utils .title h1 a{white-space:nowrap;overflow:hidden;width:100%;display:inline-block;color:#222;font-weight:700;font-size:16px;line-height:1.5;padding-top:8px;min-height:40px}#app-content .read .utils .title h1 a,#app-content .title .intro{font-weight:400;color:#777}#app-content .open .title .intro{display:none}#app-content .title .intro{font-size:10pt;margin-left:20px}#app-content .open .utils .title h1 a{overflow:auto;white-space:normal}#app-content .utils .date{padding:0 15px;margin-right:25px}#app-content .heading{padding:25px 0 10px}#app-content .heading h1{font-size:19px;max-width:770px;word-wrap:break-word}#app-content .heading a{font-weight:700;color:#222}#app-content .heading .date{float:right;display:inline-block;font-size:15px;padding:0 10px}#app-content .compact .article,#app-content .feed-view .source{display:none}#app-content .read .heading a{font-weight:400!important;color:#777}#app-content .article{min-height:69px;padding:0 50px 50px}#app-content .open .article{display:block}#app-content .subtitle{color:#777;font-size:15px;max-width:770px;padding-bottom:25px}#app-content .subtitle a{color:#777}#app-content .date{color:#777;white-space:nowrap}#app-content .author{color:#777;font-size:15px}#app-content .author a{color:inherit}#app-content .author a:hover{text-decoration:underline}#app-content .enclosure{padding:20px 0;max-width:770px;margin-bottom:15px}#app-content .enclosure audio,#app-content .enclosure img,#app-content .enclosure video{width:100%}#app-content .enclosure video{background-color:#000;margin-bottom:20px}#app-content .enclosure-error{line-height:1.5;height:40px}#app-content .body{max-width:770px;font-size:14px;clear:both;overflow-x:auto}#app-content .body p{line-height:1.5;margin:7px 0 14px}#app-content .body img,#app-content .body table{max-width:100%;height:auto;overflow:auto;word-wrap:break-word;white-space:normal}#app-content .body>div>:first-child>img:first-child,#app-content .body>div>img:first-child{padding:0 14px 0 0;float:left}#app-content .body h1,#app-content .body h2{font-size:17px;font-weight:700;color:#222;margin:21px 0 0}#app-content .body h3{font-size:15px;font-weight:700;color:#222;margin:21px 0 0}#app-content .body h4,#app-content .body h5,#app-content .body h6{font-weight:700}#app-content .body>div{margin:7px 0}#app-content .body a{color:#00f}#app-content .body ul{margin:7px 0;padding-left:14px;list-style-type:disc}#app-content .body ol{margin:7px 0;padding-left:21px}#app-content .body ul li{cursor:default;line-height:21px}#app-content .body pre{padding:7px 7px 7px 14px;background-color:#dadada;border:1px solid #ccc;margin:7px 0 14px;overflow-y:auto}#app-content .body pre::-webkit-scrollbar{height:10px}#app-content .body pre::-webkit-scrollbar-thumb{background:#333}#app-content .body pre::-webkit-scrollbar-track-piece{background:#ddd}#app-content .body code,#app-content .body pre{font-family:monospace;font-size:16px}#app-content .body blockquote{border-left:1px solid #d2d2d2;margin:25px 0;padding:0 0 0 15px;font-style:italic}#app-content .body em{font-style:italic;opacity:1}#app-content [dir=rtl]{text-align:right}#app-content .custom-heise-de .body p>span:first-child{display:inline-block;float:left;margin-right:10px;padding:6px 0}#app-content .custom-slashdot-org .body div>i{display:block;border-left:1px solid #d2d2d2;margin:25px 0;padding:0 0 0 15px}#app-content .custom-sueddeutsche-de .body img{float:none!important}#app-shortcuts table{border-collapse:collapse;width:100%;white-space:normal}#app-shortcuts tr:first-child{background-color:#f5f5f5}#app-shortcuts td,#app-shortcuts th{padding:10px}#app-shortcuts td{padding-right:15px}#app-shortcuts th{font-weight:700}#app-shortcuts td:first-child,#app-shortcuts th:first-child{text-align:right;font-weight:700;width:140px;-moz-box-sizing:content-box;box-sizing:content-box}@media (max-width:770px){#app-content .utils .date{display:none}#app-shortcuts th:first-child{padding-left:44px}}@media (max-width:600px){#app-content .article-actions ul{max-width:164px}#app-content .heading .date{display:none}#app-content .heading h1{margin-right:0}#app-content .utils{padding-right:15px}#app-content .article{padding-right:15px;padding-left:44px}}@media (max-width:340px){#app-content .article-actions{max-width:82px}}- #app-navigation .add-new .heading{height:44px;width:100%}#app-navigation .add-new .heading:hover{background-color:#ccc}#app-navigation .add-new .heading button{padding:0 0 0 44px;line-height:44px;width:100%;border:0;margin:0;text-align:left;font-weight:400;background-color:transparent;background-position:14px center}#app-navigation .add-new-popup{display:none;padding:10px;box-shadow:inset 0 0 10px #dedede;border-top:1px solid #dedede;border-bottom:1px solid #dedede}#app-navigation input.ng-invalid{border:1px solid #d14}#app-navigation .add-new-popup input,#app-navigation .add-new-popup select{width:100%;height:36px;padding:5px;margin-right:0}#app-navigation #new-feed [name=folderName],#app-navigation .add-new-popup select{width:calc(100% - 36px);border-right:0;border-top-right-radius:0;border-bottom-right-radius:0;float:left}#app-navigation .add-new-popup .add-new-folder-primary{float:right;border-bottom-left-radius:0;border-top-left-radius:0;width:36px;height:36px;margin-left:0;margin-right:0}#app-navigation .add-new-popup .error{padding:0 0 10px}#app-navigation .icon-starred{background-image:url(../img/starred.png)}.icon-rss{background-image:url(../img/rss.svg)!important}.icon-full-text-enabled{background-image:url(../img/fulltext.svg);background-size:50%;opacity:.5}.icon-full-text-disabled{background-image:url(../img/nonfulltext.svg);background-size:50%;opacity:.5}#app-navigation .unread>a{font-weight:700}#app-navigation .entry-loading{background-image:url(../img/loading.gif)!important}#app-navigation input.entry-loading{background-size:20px}#app-navigation p.error{line-height:25px}#app-navigation .folder-rename-error{height:auto}#app-navigation .error-message{padding:15px;background-color:#DE1212;color:#fff;position:relative}#app-navigation .ui-state-disabled{opacity:1}#app-navigation .error-message .title{font-weight:700;padding-right:30px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#app-navigation .error-message button{top:0;right:0;position:absolute;margin:0;height:44px;width:44px;padding:15px;border:0;background-size:25px;background-color:transparent;background-image:url(../img/close.svg);background-repeat:no-repeat;background-position:right 5px top 5px;opacity:.9}#app-navigation .animate-show,#app-navigation .error-message button:hover{opacity:1}#app-navigation .animate-show.ng-hide-add,#app-navigation .animate-show.ng-hide-remove{transition:0s linear opacity}#app-navigation .animate-show.ng-hide-add-active,#app-navigation .animate-show.ng-hide-remove-active{transition:.2s linear opacity}#app-navigation .animate-show.ng-hide{opacity:0}#app-navigation .feed-no-ordering{transform:rotate(270deg)}#app-navigation .feed-reverse-ordering{transform:rotate(180deg)}#app-navigation .icon-pinned{background-image:url(../img/pinned.svg)}#app-navigation .icon-unpinned{background-image:url(../img/unpinned.svg)}#app-navigation .icon-updatemode-default{background-image:url(../img/updatemodedefault.svg)}#app-navigation .icon-updatemode-unread{background-image:url(../img/updatemodeunread.svg)}#app-navigation .updateerror a{background-color:orange!important}#app-navigation .add-new button,#app-navigation li a{opacity:1!important;color:#000!important}#app-navigation .active,#app-navigation .active a,#app-navigation li>a:hover{background-color:#ddd}#app-settings input[type=file]{position:absolute;left:-30000px}#app-settings .opened:hover{background-color:transparent!important}#app-settings-content{padding-bottom:25px}#app-settings-content h3{padding:5px 0;font-weight:700}#app-settings-content a{color:#00F}#app-settings-content p{padding:2px 2px 2px 10px}#app-settings-content label{display:block;padding-left:18px}#app-settings-content label input[type=checkbox]{margin-left:-18px;max-width:16px}.button-icon-label{background-position:10px center;background-size:16px;padding-left:25px}#app-settings .import-export h3{padding-top:15px;padding-bottom:5px}#app-settings .import-export a,#app-settings .import-export button{width:113px;height:30px;margin:0;vertical-align:middle;background-position:center}#explore,.explore #app-content-wrapper{height:100%}#app-settings .import-export a{display:inline-block}#app-settings .disabled{color:#aaa}#explore{width:100%;padding:45px 0 45px 45px}#explore .grid-item{float:left;width:300px;border-collapse:collapse;border:1px solid #ccc;margin:0 25px 25px 0}#explore h1{font-size:13pt;background-repeat:no-repeat;background-size:24px 24px;padding:5px 0 0 35px;background-position:0 center}#explore h1 a{word-wrap:break-word}#explore .category-wrapper{text-align:center}#explore .category{font-size:10pt;color:#fff;background-color:#1d2d44;padding:10px;font-weight:700}#explore .grid-item-content{padding:30px}#explore .explore-logo{text-align:center;margin-top:25px}#explore .explore-logo img{width:100%}#explore .explore-subscribe{padding-top:15px;text-align:right}#explore .explore-content{padding-top:25px}#explore .explore-filter{text-align:right;padding:0 30px 30px}#explore .explore-filter input,#explore .explore-filter select{margin-left:10px;display:inline-block}#explore .explore-filter input{width:200px}#explore .explore-footer{clear:both;margin:75px 0;text-align:center}#explore .explore-footer a{font-size:11pt;color:#00A}
-/*# sourceMappingURL=news.min.css.map */ \ No newline at end of file
diff --git a/css/news.min.css.map b/css/news.min.css.map
deleted file mode 100644
index cdd407c15..000000000
--- a/css/news.min.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../css/content.css","../css/app.css","../css/settings.css","../css/explore.css","../css/custom.css","../css/shortcuts.css","../css/mobile.css","../css/navigation.css"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/db/newsmapper.php b/db/newsmapper.php
index fd0408f77..feef949e8 100644
--- a/db/newsmapper.php
+++ b/db/newsmapper.php
@@ -69,4 +69,4 @@ abstract class NewsMapper extends Mapper {
return $this->findEntities($sql, $search, $limit, $offset);
}
-} \ No newline at end of file
+}
diff --git a/js/.jshintignore b/js/.jshintignore
new file mode 100644
index 000000000..eb5a16ccc
--- /dev/null
+++ b/js/.jshintignore
@@ -0,0 +1,3 @@
+build/
+node_modules/
+vendor/
diff --git a/js/.jshintrc b/js/.jshintrc
index 7835a8760..19894c5ea 100644
--- a/js/.jshintrc
+++ b/js/.jshintrc
@@ -47,6 +47,7 @@
"News": true,
"t": true,
"url": true,
- "navigator": true
+ "navigator": true,
+ "oc_requesttoken": true
}
}
diff --git a/js/Gruntfile.js b/js/Gruntfile.js
deleted file mode 100644
index 19a2967d8..000000000
--- a/js/Gruntfile.js
+++ /dev/null
@@ -1,241 +0,0 @@
-/**
- * ownCloud - News
- *
- * This file is licensed under the Affero General Public License version 3 or
- * later. See the COPYING file.
- *
- * @author Bernhard Posselt <dev@bernhard-posselt.com>
- * @copyright Bernhard Posselt 2012, 2014
- */
-module.exports = function (grunt) {
- 'use strict';
-
- // load needed modules
- grunt.loadNpmTasks('grunt-php');
- grunt.loadNpmTasks('grunt-contrib-concat');
- grunt.loadNpmTasks('grunt-contrib-watch');
- grunt.loadNpmTasks('grunt-contrib-connect');
- grunt.loadNpmTasks('grunt-contrib-jshint');
- grunt.loadNpmTasks('grunt-contrib-uglify');
- grunt.loadNpmTasks('grunt-contrib-cssmin');
- grunt.loadNpmTasks('grunt-phpunit');
- grunt.loadNpmTasks('grunt-wrap');
- grunt.loadNpmTasks('grunt-karma');
- grunt.loadNpmTasks('grunt-ng-annotate');
- grunt.loadNpmTasks('grunt-protractor-runner');
- grunt.loadNpmTasks('grunt-protractor-webdriver');
-
- grunt.initConfig({
- meta: {
- pkg: grunt.file.readJSON('package.json'),
- version: '<%= meta.pkg.version %>',
- production: 'build/'
- },
- concat: {
- options: {
- // remove license headers
- stripBanners: true
- },
- dist: {
- src: [
- 'app/App.js',
- 'app/Config.js',
- 'app/Run.js',
- 'controller/**/*.js',
- 'filter/**/*.js',
- 'service/**/*.js',
- 'gui/**/*.js',
- 'plugin/**/*.js',
- 'utility/**/*.js',
- 'directive/**/*.js'
- ],
- dest: '<%= meta.production %>app.js'
- }
- },
- ngAnnotate: {
- app: {
- src: ['<%= meta.production %>app.js'],
- dest: '<%= meta.production %>app.js'
- }
- },
- uglify: {
- app: {
- files: {
- '<%= meta.production %>app.min.js': [
- '<%= meta.production %>app.js'
- ]
- }
- },
- options: {
- sourceMap: true
- }
- },
- cssmin: {
- options: {
- sourceMap: true
- },
- news: {
- files: {
- '../css/news.min.css': [
- '../css/app.css',
- '../css/content.css',
- '../css/custom.css',
- '../css/shortcuts.css',
- '../css/mobile.css',
- '../css/navigation.css',
- '../css/settings.css',
- '../css/explore.css'
- ]
- }
- }
- },
- wrap: {
- basic: {
- src: ['<%= meta.production %>app.js'],
- dest: '<%= meta.production %>app.js',
- options: {
- wrapper: [
- '(function(navigator, window, document, angular, $, ' +
- 'OC, csrfToken, url, undefined){' +
- '\n\n\'use strict\';\n\n',
-
- '\n})(navigator, window, document, angular, jQuery, ' +
- ' OC, oc_requesttoken, url);'
- ]
- }
- }
- },
- jshint: {
- app: {
- src: [
- 'Gruntfile.js',
- 'app/App.js',
- 'app/Config.js',
- 'app/Run.js',
- 'filter/**/*.js',
- 'service/**/*.js',
- 'controller/**/*.js',
- 'directive/**/*.js',
- 'tests/**/*.js',
- 'gui/**/*.js',
- 'plugin/**/*.js',
- 'admin/**/*.js'
- ]
- },
- options: {
- jshintrc: true
- }
- },
- watch: {
- concat: {
- files: [
- '../css/*.css',
- '!../css/*.min.css',
- 'admin/**/*.js',
- 'tests/**/*.js',
- 'app/**/*.js',
- 'controller/**/*.js',
- 'utility/**/*.js',
- 'directive/**/*.js',
- 'filter/**/*.js',
- 'service/**/*.js',
- 'gui/**/*.js',
- 'plugin/**/*.js',
- '../templates/**/*.php'
- ],
- tasks: ['default'],
- options: {
- livereload: true
- }
- },
- phpunit: {
- files: [
- '../**/*.php'
- ],
- tasks: ['phpunit:unit']
- },
- phpintegration: {
- files: [
- '../**/*.php'
- ],
- tasks: ['phpunit:integration']
- }
- },
- karma: {
- unit: {
- configFile: 'karma.conf.js',
- autoWatch: true
- },
- continuous: {
- configFile: 'karma.conf.js',
- browsers: ['Firefox'],
- singleRun: true,
- }
- },
- phpunit: {
- unit: {
- options: {
- colors: true,
- configuration: '../phpunit.xml'
- }
- },
- coverage: {
- options: {
- colors: true,
- configuration: '../phpunit.xml',
- coverageClover: '../coverage.clover'
- }
- },
- integration: {
- options: {
- colors: true,
- configuration: '../phpunit.integration.xml'
- }
- },
- },
- /* jshint camelcase: false */
- protractor_webdriver: {
- app: {}
- },
- protractor: {
- firefox: {
- options: {
- configFile: 'protractor.conf.js'
- }
- },
- },
- connect: {
- server: {
- options: {
- base: 'tests/static/'
- }
- }
- },
- php: {
- dist: {
- options: {
- port: 8080,
- keepalive: true,
- open: true,
- base: '../../../'
- }
- }
- }
- });
-
- // make tasks available under simpler commands
- grunt.registerTask('default', ['jshint', 'concat', 'wrap', 'ngAnnotate',
- 'uglify', 'cssmin']);
- grunt.registerTask('dev', ['watch:concat']);
- grunt.registerTask('dev-js-unit', ['karma:unit']);
- grunt.registerTask('dev-php-unit', ['watch:phpunit']);
- grunt.registerTask('dev-php-integration', ['watch:phpintegration']);
-
- grunt.registerTask('js-unit', ['karma:continuous']);
- grunt.registerTask('php-unit', ['phpunit:coverage']);
- grunt.registerTask('php-integration', ['phpunit:integration']);
-
- grunt.registerTask('acceptance', ['protractor_webdriver', 'connect',
- 'protractor']);
-
-};
diff --git a/js/README.md b/js/README.md
index c03621fdc..2c25ce4ed 100644
--- a/js/README.md
+++ b/js/README.md
@@ -1,40 +1,17 @@
-# JavaScript && CSS Development
-Before starting, install nodejs and grunt-cli:
+# JavaScript
+Before starting, install nodejs and gulp-cli:
- sudo npm -g install grunt-cli
+ sudo npm -g install gulp-cli
then run:
npm install
+## Tasks
+The following tasks are available:
-## Building
-This sets up a watcher on file change and compiles CSS and JS:
-
- grunt dev
-
-If you don't want a watcher, just run:
-
- grunt
-
-## Testing
-Watch mode:
-
- grunt php
- grunt test
-
-Single run mode:
-
- grunt phpunit
- grunt ci-unit
-
-### Running e2e tests
-Install protractor and set up selenium:
-
- sudo npm install -g protractor
- sudo webdriver-manager update
-
-then the tests can be started with:
-
- grunt e2e
-
+* **Build the JavaScript**: gulp
+* **Watch for changes and build JavaScript**: gulp watch
+* **Run JavaScript unit tests**: gulp karma
+* **Watch for changes and run JavaScript unit tests**: gulp watch-karma
+* **Watch for changes and run PHP unit tests**: gulp watch-phpuni
diff --git a/js/app/App.js b/js/app/App.js
index 2c8e71419..37266a438 100644
--- a/js/app/App.js
+++ b/js/app/App.js
@@ -9,4 +9,4 @@
*/
/* jshint unused: false */
-var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']); \ No newline at end of file
+var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']);
diff --git a/js/app/Config.js b/js/app/Config.js
index df7cc60e5..8c9c09290 100644
--- a/js/app/Config.js
+++ b/js/app/Config.js
@@ -37,7 +37,8 @@ app.config(function ($routeProvider, $provide, $httpProvider) {
$window.location.href.split($window.location.pathname)[0];
if (config.url.indexOf(BASE_URL) === 0 ||
config.url.indexOf(domain) === 0) {
- config.headers.requesttoken = csrfToken;
+ /*jshint camelcase: false */
+ config.headers.requesttoken = oc_requesttoken;
}
return config || $q.when(config);
diff --git a/js/build/app.js b/js/build/app.js
deleted file mode 100644
index 1520622d5..000000000
--- a/js/build/app.js
+++ /dev/null
@@ -1,3178 +0,0 @@
-(function(navigator, window, document, angular, $, OC, csrfToken, url, undefined){
-
-'use strict';
-
-
-/* jshint unused: false */
-var app = angular.module('News', ['ngRoute', 'ngSanitize', 'ngAnimate']);
-app.config(["$routeProvider", "$provide", "$httpProvider", function ($routeProvider, $provide, $httpProvider) {
- 'use strict';
-
- var feedType = {
- FEED: 0,
- FOLDER: 1,
- STARRED: 2,
- SUBSCRIPTIONS: 3,
- SHARED: 4,
- EXPLORE: 5
- };
-
- // constants
- $provide.constant('REFRESH_RATE', 60); // seconds
- $provide.constant('ITEM_BATCH_SIZE', 40); // how many items should be
- // fetched initially
- $provide.constant('ITEM_AUTO_PAGE_SIZE', 20);
- $provide.constant('BASE_URL', OC.generateUrl('/apps/news'));
- $provide.constant('FEED_TYPE', feedType);
- $provide.constant('MARK_READ_TIMEOUT', 0.5);
- $provide.constant('SCROLL_TIMEOUT', 0.1);
-
- // make sure that the CSRF header is only sent to the ownCloud domain
- $provide.factory('CSRFInterceptor', ["$q", "BASE_URL", "$window", function ($q, BASE_URL, $window) {
- return {
- request: function (config) {
- var domain =
- $window.location.href.split($window.location.pathname)[0];
- if (config.url.indexOf(BASE_URL) === 0 ||
- config.url.indexOf(domain) === 0) {
- config.headers.requesttoken = csrfToken;
- }
-
- return config || $q.when(config);
- }
- };
- }]);
- var errorMessages = {
- 0: t('news', 'Request failed, network connection unavailable!'),
- 401: t('news', 'Request unauthorized. Are you logged in?'),
- 403: t('news', 'Request forbidden. Are you an admin?'),
- 412: t('news', 'Token expired or app not enabled! Reload the page!'),
- 500: t('news', 'Internal server error! Please check your ' +
- 'data/owncloud.log file for additional ' +
- 'information!'),
- 503: t('news', 'Request failed, ownCloud is in currently ' +
- 'in maintenance mode!'),
- };
- $provide.factory('ConnectionErrorInterceptor', ["$q", "$timeout", function ($q, $timeout) {
- var timer;
- return {
- responseError: function (response) {
- // status 0 is a network error
- if (response.status in errorMessages) {
- if (timer) {
- $timeout.cancel(timer);
- }
- OC.Notification.hide();
- OC.Notification.showHtml(errorMessages[response.status]);
- timer = $timeout(function () {
- OC.Notification.hide();
- }, 5000);
- }
- return $q.reject(response);
- }
- };
- }]);
- $httpProvider.interceptors.push('CSRFInterceptor');
- $httpProvider.interceptors.push('ConnectionErrorInterceptor');
-
- // routing
- var getItemResolve = function (type) {
- return {
- // request to items also returns feeds
- data: /* @ngInject */ ["$http", "$route", "$q", "$location", "BASE_URL", "ITEM_BATCH_SIZE", "FEED_TYPE", "SettingsResource", "FeedResource", function (
- $http, $route, $q, $location, BASE_URL, ITEM_BATCH_SIZE, FEED_TYPE,
- SettingsResource, FeedResource) {
-
- var showAll = SettingsResource.get('showAll');
- var oldestFirst = SettingsResource.get('oldestFirst');
- var search = $location.search().search || '';
-
- var deferred = $q.defer();
-
- // if those two values are null it means we did not receive
- // the settings request from the server so dont query the server
- if (showAll === null || oldestFirst === null) {
- deferred.resolve({});
- } else {
- var parameters = {
- type: type,
- limit: ITEM_BATCH_SIZE,
- showAll: showAll,
- oldestFirst: oldestFirst,
- search: search
- };
-
- if ($route.current.params.id !== undefined) {
- parameters.id = $route.current.params.id;
- }
-
- // check if a custom ordering is set
- if (type === FEED_TYPE.FEED) {
- var feed = FeedResource.getById(parameters.id);
-
- // on intial load, the feed ordering is undefined
- if (feed === undefined || feed.ordering === 2) {
- parameters.oldestFirst = false;
- } else if (feed.ordering === 1) {
- parameters.oldestFirst = true;
- }
- }
-
- $http({
- url: BASE_URL + '/items',
- method: 'GET',
- params: parameters
- }).success(function (data) {
- deferred.resolve(data);
- });
- }
-
- return deferred.promise;
- }]
- };
- };
-
- var getExploreResolve = function () {
- return {
- sites: /* @ngInject */ ["$http", "$q", "BASE_URL", "$location", "Publisher", "SettingsResource", function (
- $http, $q, BASE_URL, $location, Publisher, SettingsResource) {
- var deferred = $q.defer();
-
- // always use the code from the url
- var language = $location.search().lang;
- if (!language) {
- language = SettingsResource.get('language');
- }
-
- $http.get(BASE_URL + '/settings').then(function (data) {
- Publisher.publishAll(data);
-
- // get url and strip trailing slashes
- var url = SettingsResource.get('exploreUrl')
- .replace(/\/+$/, '');
-
- var exploreUrl = url + '/feeds.' + language + '.json';
- var defaultExploreUrl = url + '/feeds.en.json';
- return $http
- .get(exploreUrl)
- .catch(function () {
- return $http.get(defaultExploreUrl);
- });
-
- }).then(function (data) {
- deferred.resolve(data.data);
- }).catch(function () {
- deferred.reject();
- });
-
- return deferred.promise;
- }]
- };
- };
-
- $routeProvider
- .when('/items', {
- controller: 'ContentController as Content',
- templateUrl: 'content.html',
- resolve: getItemResolve(feedType.SUBSCRIPTIONS),
- type: feedType.SUBSCRIPTIONS
- })
- .when('/items/starred', {
- controller: 'ContentController as Content',
- templateUrl: 'content.html',
- resolve: getItemResolve(feedType.STARRED),
- type: feedType.STARRED
- })
- .when('/items/feeds/:id', {
- controller: 'ContentController as Content',
- templateUrl: 'content.html',
- resolve: getItemResolve(feedType.FEED),
- type: feedType.FEED
- })
- .when('/items/folders/:id', {
- controller: 'ContentController as Content',
- templateUrl: 'content.html',
- resolve: getItemResolve(feedType.FOLDER),
- type: feedType.FOLDER
- }).when('/explore', {
- controller: 'ExploreController as Explore',
- templateUrl: 'explore.html',
- resolve: getExploreResolve(),
- type: feedType.EXPLORE
- }).when('/shortcuts', {
- templateUrl: 'shortcuts.html',
- type: -1
- });
-
-}]);
-
-app.run(["$rootScope", "$location", "$http", "$q", "$interval", "$route", "Loading", "ItemResource", "FeedResource", "FolderResource", "SettingsResource", "Publisher", "BASE_URL", "FEED_TYPE", "REFRESH_RATE", function ($rootScope, $location, $http, $q, $interval, $route, Loading,
- ItemResource, FeedResource, FolderResource, SettingsResource,
- Publisher, BASE_URL, FEED_TYPE, REFRESH_RATE) {
- 'use strict';
-
- // show Loading screen
- Loading.setLoading('global', true);
-
- // listen to keys in returned queries to automatically distribute the
- // incoming values to models
- Publisher.subscribe(ItemResource).toChannels(['items', 'newestItemId',
- 'starred']);
- Publisher.subscribe(FolderResource).toChannels(['folders']);
- Publisher.subscribe(FeedResource).toChannels(['feeds']);
- Publisher.subscribe(SettingsResource).toChannels(['settings']);
-
- // load feeds, settings and last read feed
- var settingsDeferred = $q.defer();
- $http.get(BASE_URL + '/settings').success(function (data) {
- Publisher.publishAll(data);
- settingsDeferred.resolve();
- });
-
- var activeFeedDeferred = $q.defer();
- var path = $location.path();
- $http.get(BASE_URL + '/feeds/active').success(function (data) {
- var url;
-
- switch (data.activeFeed.type) {
-
- case FEED_TYPE.FEED:
- url = '/items/feeds/' + data.activeFeed.id;
- break;
-
- case FEED_TYPE.FOLDER:
- url = '/items/folders/' + data.activeFeed.id;
- break;
-
- case FEED_TYPE.STARRED:
- url = '/items/starred';
- break;
-
- case FEED_TYPE.EXPLORE:
- url = '/explore';
- break;
-
- default:
- url = '/items';
- }
-
- // only redirect if url is empty or faulty
- if (!/^\/items(\/(starred|explore|feeds\/\d+|folders\/\d+))?\/?$/
- .test(path)) {
- $location.path(url);
- }
-
- activeFeedDeferred.resolve();
- });
-
- var feedDeferred = $q.defer();
- var feeds;
- $http.get(BASE_URL + '/feeds').success(function (data) {
- feeds = data;
- feedDeferred.resolve();
- });
-
- var folderDeferred = $q.defer();
- var folders;
- $http.get(BASE_URL + '/folders').success(function (data) {
- folders = data;
- folderDeferred.resolve();
- });
-
- $q.all([
- feedDeferred.promise,
- folderDeferred.promise
- ]).then(function () {
- // first publish feeds to correctly update the folder resource unread
- // cache
- Publisher.publishAll(feeds);
- Publisher.publishAll(folders);
- if (feeds.feeds.length === 0 && folders.folders.length === 0) {
- $location.path('/explore');
- }
- });
-
- // disable loading if all initial requests finished
- $q.all(
- [
- settingsDeferred.promise,
- activeFeedDeferred.promise,
- feedDeferred.promise,
- folderDeferred.promise
- ]
- )
- .then(function () {
- $route.reload();
- Loading.setLoading('global', false);
- });
-
- // refresh feeds and folders
- $interval(function () {
- $http.get(BASE_URL + '/feeds').success(function (data) {
- Publisher.publishAll(data);
- });
- $http.get(BASE_URL + '/folders').success(function (data) {
- Publisher.publishAll(data);
- });
- }, REFRESH_RATE * 1000);
-
-
- $rootScope.$on('$routeChangeStart', function () {
- Loading.setLoading('content', true);
- });
-
- $rootScope.$on('$routeChangeSuccess', function () {
- Loading.setLoading('content', false);
- });
-
- // in case of wrong id etc show all items
- $rootScope.$on('$routeChangeError', function () {
- $location.path('/items');
- });
-
-}]);
-app.controller('AppController',
-["Loading", "FeedResource", "FolderResource", function (Loading, FeedResource, FolderResource) {
- 'use strict';
-
- this.loading = Loading;
-
- this.isFirstRun = function () {
- return FeedResource.size() === 0 && FolderResource.size() === 0;
- };
-
- this.play = function (item) {
- this.playingItem = item;
- };
-}]);
-app.controller('ContentController',
-["Publisher", "FeedResource", "ItemResource", "SettingsResource", "data", "$route", "$routeParams", "$location", "FEED_TYPE", "ITEM_AUTO_PAGE_SIZE", "Loading", function (Publisher, FeedResource, ItemResource, SettingsResource, data,
- $route, $routeParams, $location, FEED_TYPE, ITEM_AUTO_PAGE_SIZE, Loading) {
- 'use strict';
-
- ItemResource.clear();
-
- // distribute data to models based on key
- Publisher.publishAll(data);
-
-
- this.isAutoPagingEnabled = true;
-
- // the interface should show a hint if there are not enough items sent so
- // it's assumed that theres nothing to autpage
- if (ItemResource.size() >= ITEM_AUTO_PAGE_SIZE) {
- this.isNothingMoreToAutoPage = false;
- } else {
- this.isNothingMoreToAutoPage = true;
- }
-
- this.getItems = function () {
- return ItemResource.getAll();
- };
-
- this.toggleStar = function (itemId) {
- ItemResource.toggleStar(itemId);
- };
-
- this.toggleItem = function (item) {
- // TODO: unittest
- if (this.isCompactView()) {
- item.show = !item.show;
- }
- };
-
- this.isShowAll = function () {
- return SettingsResource.get('showAll');
- };
-
- this.markRead = function (itemId) {
- var item = ItemResource.get(itemId);
-
- if (!item.keepUnread && item.unread === true) {
- ItemResource.markItemRead(itemId);
- FeedResource.markItemOfFeedRead(item.feedId);
- }
- };
-
- this.getFeed = function (feedId) {
- return FeedResource.getById(feedId);
- };
-
- this.toggleKeepUnread = function (itemId) {
- var item = ItemResource.get(itemId);
- if (!item.unread) {
- FeedResource.markItemOfFeedUnread(item.feedId);
- ItemResource.markItemRead(itemId, false);
- }
-
- item.keepUnread = !item.keepUnread;
- };
-
- var self = this;
- var getOrdering = function () {
- var ordering = SettingsResource.get('oldestFirst');
-
- if (self.isFeed()) {
- var feed = FeedResource.getById($routeParams.id);
- if (feed && feed.ordering === 1) {
- ordering = true;
- } else if (feed && feed.ordering === 2) {
- ordering = false;
- }
- }
-
- return ordering;
- };
-
- this.orderBy = function () {
- if (getOrdering()) {
- return 'id';
- } else {
- return '-id';
- }
- };
-
- this.isCompactView = function () {
- return SettingsResource.get('compact');
- };
-
- this.isCompactExpand = function () {
- return SettingsResource.get('compactExpand');
- };
-
- this.autoPagingEnabled = function () {
- return this.isAutoPagingEnabled;
- };
-
- this.markReadEnabled = function () {
- return !SettingsResource.get('preventReadOnScroll');
- };
-
- this.scrollRead = function (itemIds) {
- var ids = [];
- var feedIds = [];
-
- itemIds.forEach(function (itemId) {
- var item = ItemResource.get(itemId);
- if (!item.keepUnread) {
- ids.push(itemId);
- feedIds.push(item.feedId);
- }
- });
-
- if (ids.length > 0) {
- FeedResource.markItemsOfFeedsRead(feedIds);
- ItemResource.markItemsRead(ids);
- }
- };
-
- this.isFeed = function () {
- return $route.current.$$route.type === FEED_TYPE.FEED;
- };
-
- this.autoPage = function () {
- if (this.isNothingMoreToAutoPage) {
- return;
- }
-
- // in case a subsequent autopage request comes in wait until
- // the current one finished and execute a request immediately afterwards
- if (!this.isAutoPagingEnabled) {
- this.autoPageAgain = true;
- return;
- }
-
- this.isAutoPagingEnabled = false;
- this.autoPageAgain = false;
-
- var type = $route.current.$$route.type;
- var id = $routeParams.id;
- var oldestFirst = getOrdering();
- var showAll = SettingsResource.get('showAll');
- var self = this;
- var search = $location.search().search;
-
- Loading.setLoading('autopaging', true);
-
- ItemResource.autoPage(type, id, oldestFirst, showAll, search)
- .success(function (data) {
- Publisher.publishAll(data);
-
- if (data.items.length >= ITEM_AUTO_PAGE_SIZE) {
- self.isAutoPagingEnabled = true;
- } else {
- self.isNothingMoreToAutoPage = true;
- }
-
- if (self.isAutoPagingEnabled && self.autoPageAgain) {
- self.autoPage();
- }
- }).error(function () {
- self.isAutoPagingEnabled = true;
- }).finally(function () {
- Loading.setLoading('autopaging', false);
- });
- };
-
- this.getRelativeDate = function (timestamp) {
- if (timestamp !== undefined && timestamp !== '') {
- var languageCode = SettingsResource.get('language');
- var date =
- moment.unix(timestamp).locale(languageCode).fromNow() + '';
- return date;
- } else {
- return '';
- }
- };
-
- this.refresh = function () {
- $route.reload();
- };
-
- this.getMediaType = function (type) {
- if (type && type.indexOf('audio') === 0) {
- return 'audio';
- } else if (type && type.indexOf('video') === 0) {
- return 'video';
- } else {
- return undefined;
- }
- };
-
-}]);
-app.controller('ExploreController',
-["sites", "$rootScope", "FeedResource", "SettingsResource", "$location", function (sites, $rootScope, FeedResource, SettingsResource, $location) {
- 'use strict';
-
- this.sites = sites;
- // join all sites
- this.feeds = Object.keys(sites).map(function (key) {
- return [key, sites[key]];
- }).reduce(function (xs, x) {
- var category = x[0];
- var feedList = x[1];
- feedList.forEach(function (feed) {
- feed.category = category;
- });
- return xs.concat(feedList);
- }, []);
-
- this.feedExists = function (location) {
- return FeedResource.getByLocation(location) !== undefined;
- };
-
- this.subscribeTo = function (location) {
- $rootScope.$broadcast('addFeed', location);
- };
-
- this.isCategoryShown = function (data) {
- return data.filter(function (element) {
- return FeedResource.getByLocation(element.feed) === undefined;
- }).length > 0;
- };
-
- this.getSupportedLanguageCodes = function () {
- return SettingsResource.getSupportedLanguageCodes();
- };
-
- this.getCurrentLanguageCode = function () {
- var language = $location.search().lang;
- if (!language) {
- language = SettingsResource.get('language');
- }
- return language;
- };
-
- this.showLanguage = function (languageCode) {
- $location.url('/explore/?lang=' + languageCode);
- };
-
- this.selectedLanguageCode = this.getCurrentLanguageCode();
-}]);
-
-app.controller('NavigationController',
-["$route", "FEED_TYPE", "FeedResource", "FolderResource", "ItemResource", "SettingsResource", "Publisher", "$rootScope", "$location", "$q", function ($route, FEED_TYPE, FeedResource, FolderResource, ItemResource,
- SettingsResource, Publisher, $rootScope, $location, $q) {
- 'use strict';
-
- this.feedError = '';
- this.showNewFolder = false;
- this.renamingFolder = false;
- this.addingFeed = false;
- this.addingFolder = false;
- this.folderError = '';
- this.renameError = '';
- this.feed = {};
-
- var getRouteId = function () {
- return parseInt($route.current.params.id, 10);
- };
-
- this.getLanguageCode = function () {
- return SettingsResource.get('language');
- };
-
- this.getFeeds = function () {
- return FeedResource.getAll();
- };
-
- this.getFolders = function () {
- return FolderResource.getAll();
- };
-
- this.markFolderRead = function (folderId) {
- FeedResource.markFolderRead(folderId);
-
- FeedResource.getByFolderId(folderId).forEach(function (feed) {
- ItemResource.markFeedRead(feed.id);
- });
- };
-
- this.markFeedRead = function (feedId) {
- ItemResource.markFeedRead(feedId);
- FeedResource.markFeedRead(feedId);
- };
-
- this.markRead = function () {
- ItemResource.markRead();
- FeedResource.markRead();
- };
-
- this.isShowAll = function () {
- return SettingsResource.get('showAll');
- };
-
- this.getFeedsOfFolder = function (folderId) {
- return FeedResource.getByFolderId(folderId);
- };
-
- this.getUnreadCount = function () {
- return FeedResource.getUnreadCount();
- };
-
- this.isUnread = function () {
- return this.getUnreadCount() > 0;
- };
-
- this.getFeedUnreadCount = function (feedId) {
- var feed = FeedResource.getById(feedId);
- if (feed !== undefined) {
- return feed.unreadCount;
- } else {
- return 0;
- }
- };
-
- this.isFeedUnread = function (feedId) {
- return this.getFeedUnreadCount(feedId) > 0;
- };
-
- this.getFolderUnreadCount= function (folderId) {
- return FeedResource.getFolderUnreadCount(folderId);
- };
-
- this.isFolderUnread = function (folderId) {
- return this.getFolderUnreadCount(folderId) > 0;
- };
-
- this.getStarredCount = function () {
- return ItemResource.getStarredCount();
- };
-
- this.isStarredUnread = function () {
- return this.getStarredCount() > 0;
- };
-
- this.toggleFolder = function (folderName) {
- FolderResource.toggleOpen(folderName);
- };
-
- this.hasFeeds = function (folderId) {
- return FeedResource.getFolderUnreadCount(folderId) !== undefined;
- };
-
- this.subFeedActive = function (folderId) {
- var type = $route.current.$$route.type;
-
- if (type === FEED_TYPE.FEED) {
- var feed = FeedResource.getById(getRouteId());
-
- if (feed !== undefined && feed.folderId === folderId) {
- return true;
- }
- }
-
- return false;
- };
-
- this.isSubscriptionsActive = function () {
- return $route.current &&
- $route.current.$$route.type === FEED_TYPE.SUBSCRIPTIONS;
- };
-
- this.isStarredActive = function () {
- return $route.current &&
- $route.current.$$route.type === FEED_TYPE.STARRED;
- };
-
- this.isExploreActive = function () {
- return $route.current &&
- $route.current.$$route.type === FEED_TYPE.EXPLORE;
- };
-
- this.isFolderActive = function (folderId) {
- return $route.current &&
- $route.current.$$route.type === FEED_TYPE.FOLDER &&
- getRouteId() === folderId;
- };
-
- this.isFeedActive = function (feedId) {
- return $route.current &&
- $route.current.$$route.type === FEED_TYPE.FEED &&
- getRouteId() === feedId;
- };
-
- this.folderNameExists = function (folderName) {
- folderName = folderName || '';
- return FolderResource.get(folderName.trim()) !== undefined;
- };
-
- this.feedUrlExists = function (url) {
- url = url || '';
- url = url.trim();
- return FeedResource.get(url) !== undefined ||
- FeedResource.get('http://' + url) !== undefined;
- };
-
- this.createFeed = function (feed) {
- var self = this;
- this.showNewFolder = false;
- this.addingFeed = true;
-
- var newFolder = feed.newFolder;
- var existingFolder = feed.existingFolder || {id: 0};
-
- // we dont need to create a new folder
- if (newFolder === undefined || newFolder === '') {
- // this is set to display the feed in any folder, even if the folder
- // is closed or has no unread articles
- existingFolder.getsFeed = true;
-
- FeedResource.create(feed.url, existingFolder.id, undefined)
- .then(function (data) {
-
- Publisher.publishAll(data);
-
- // set folder as default
- $location.path('/items/feeds/' + data.feeds[0].id + '/');
-
- }).finally(function () {
- existingFolder.getsFeed = undefined;
- feed.url = '';
- self.addingFeed = false;
- });
-
- } else {
- // create folder first and then the feed
- FolderResource.create(newFolder).then(function (data) {
-
- Publisher.publishAll(data);
-
- // set the created folder on scope so its preselected for the
- // next addition
- feed.existingFolder = FolderResource.get(data.folders[0].name);
- feed.newFolder = undefined;
- self.createFeed(feed);
- });
- }
- };
-
- this.createFolder = function (folder) {
- var self = this;
- this.addingFolder = true;
- FolderResource.create(folder.name).then(function (data) {
- Publisher.publishAll(data);
- }).finally(function () {
- self.addingFolder = false;
- folder.name = '';
- });
- };
-
- this.moveFeed = function (feedId, folderId) {
- var reload = false;
- var feed = FeedResource.getById(feedId);
-
- if (feed.folderId === folderId) {
- return;
- }
-
- if (this.isFolderActive(feed.folderId) ||
- this.isFolderActive(folderId)) {
- reload = true;
- }
-
- FeedResource.move(feedId, folderId);
-
- if (reload) {
- $route.reload();
- }
- };
-
- this.renameFeed = function (feed) {
- FeedResource.patch(feed.id, {title: feed.title});
- feed.editing = false;
- };
-
- this.renameFolder = function (folder, name) {
- folder.renameError = '';
- this.renamingFolder = true;
- var self = this;
-
- if (folder.name === name) {
- folder.renameError = '';
- folder.editing = false;
- this.renamingFolder = false;
- } else {
- FolderResource.rename(folder.name, name).then(function () {
- folder.renameError = '';
- folder.editing = false;
- }, function (message) {
- folder.renameError = message;
- }).finally(function () {
- self.renamingFolder = false;
- });
- }
- };
-
- this.reversiblyDeleteFeed = function (feed) {
- FeedResource.reversiblyDelete(feed.id).finally(function () {
- $route.reload();
- });
- };
-
- this.undoDeleteFeed = function (feed) {
- FeedResource.undoDelete(feed.id).finally(function () {
- $route.reload();
- });
- };
-
- this.deleteFeed = function (feed) {
- FeedResource.delete(feed.url);
- };
-
-
- this.reversiblyDeleteFolder = function (folder) {
- $q.all(
- FeedResource.reversiblyDeleteFolder(folder.id),
- FolderResource.reversiblyDelete(folder.name)
- ).finally(function () {
- $route.reload();
- });
- };
-
- this.undoDeleteFolder = function (folder) {
- $q.all(
- FeedResource.undoDeleteFolder(folder.id),
- FolderResource.undoDelete(folder.name)
- ).finally(function () {
- $route.reload();
- });
- };
-
- this.deleteFolder = function (folder) {
- FeedResource.deleteFolder(folder.id);
- FolderResource.delete(folder.name);
- };
-
- this.setOrdering = function (feed, ordering) {
- FeedResource.patch(feed.id, {ordering: ordering});
- $route.reload();
- };
-
- this.togglePinned = function (feedId) {
- var feed = FeedResource.getById(feedId);
- if (feed) {
- return FeedResource.patch(feedId, {pinned: !feed.pinned});
- }
- };
-
- this.setUpdateMode = function (feedId, updateMode) {
- return FeedResource.patch(feedId, {updateMode: updateMode});
- };
-
- this.toggleFullText = function (feed) {
- $rootScope.$broadcast('$routeChangeStart');
- FeedResource.toggleFullText(feed.id).finally(function () {
- $rootScope.$broadcast('$routeChangeSuccess');
- $route.reload();
- });
- };
-
- this.search = function (value) {
- if (value === '') {
- $location.search('search', null);
- } else {
- $location.search('search', value);
- }
- };
-
- var self = this;
-
- $rootScope.$on('moveFeedToFolder', function (scope, data) {
- self.moveFeed(data.feedId, data.folderId);
- });
-
- // based on the route we want to preselect a folder in the add new feed
- // drop down
- var setSelectedFolderForRoute = function () {
- var type;
- if ($route.current) {
- type = $route.current.$$route.type;
- }
-
- var folderId = 0;
-
- if (type === FEED_TYPE.FOLDER) {
- folderId = getRouteId();
- } else if (type === FEED_TYPE.FEED) {
- var feed = FeedResource.getById(getRouteId());
-
- if (feed) {
- folderId = feed.folderId;
- }
- }
-
- var folder;
- if (folderId !== 0) {
- folder = FolderResource.getById(folderId);
- }
-
- self.feed.existingFolder = folder;
- };
-
- $rootScope.$on('$routeChangeSuccess', function () {
- setSelectedFolderForRoute();
- });
-
-}]);
-
-app.controller('SettingsController',
-["$route", "$q", "SettingsResource", "ItemResource", "OPMLParser", "OPMLImporter", "Publisher", function ($route, $q, SettingsResource, ItemResource, OPMLParser,
- OPMLImporter, Publisher) {
- 'use strict';
-
- this.isOPMLImporting = false;
- this.isArticlesImporting = false;
- this.opmlImportError = false;
- this.articleImportError = false;
-
- var set = function (key, value) {
- SettingsResource.set(key, value);
-
- if (['showAll', 'oldestFirst', 'compact'].indexOf(key) >= 0) {
- $route.reload();
- }
- };
-
- this.toggleSetting = function (key) {
- set(key, !this.getSetting(key));
- };
-
- this.getSetting = function (key) {
- return SettingsResource.get(key);
- };
-
- this.importOPML = function (content) {
- this.opmlImportError = false;
- this.articleImportError = false;
-
- try {
- this.isOPMLImporting = false;
- var parsedContent = OPMLParser.parse(content);
-
- var self = this;
- var jobSize = 5;
-
- OPMLImporter.importFolders(parsedContent)
- .then(function (feedQueue) {
- return OPMLImporter.importFeedQueue(feedQueue, jobSize);
- }).finally(function () {
- self.isOPMLImporting = false;
- });
-
- } catch (error) {
- console.error(error);
- this.isOPMLImporting = false;
- this.opmlImportError = true;
- }
- };
-
- this.importArticles = function (content) {
- this.opmlImportError = false;
- this.articleImportError = false;
-
- try {
- this.isArticlesImporting = true;
- var articles = JSON.parse(content);
-
- var self = this;
- ItemResource.importArticles(articles).success(function (data) {
- Publisher.publishAll(data);
- }).finally(function () {
- self.isArticlesImporting = false;
- });
-
- } catch (error) {
- console.error(error);
- this.articleImportError = true;
- this.isArticlesImporting = false;
- }
- };
-
-}]);
-app.filter('trustUrl', ["$sce", function ($sce) {
- 'use strict';
-
- return function (url) {
- return $sce.trustAsResourceUrl(url);
- };
-}]);
-app.filter('unreadCountFormatter', function () {
- 'use strict';
-
- return function (unreadCount) {
- if (unreadCount > 999) {
- return '999+';
- }
- return unreadCount;
- };
-});
-app.factory('FeedResource', ["Resource", "$http", "BASE_URL", "$q", function (Resource, $http, BASE_URL, $q) {
- 'use strict';
-
- var FeedResource = function ($http, BASE_URL, $q) {
- Resource.call(this, $http, BASE_URL, 'url');
- this.ids = {};
- this.locations = {};
- this.unreadCount = 0;
- this.folderUnreadCount = {};
- this.folderIds = {};
- this.$q = $q;
- };
-
- FeedResource.prototype = Object.create(Resource.prototype);
-
- FeedResource.prototype.receive = function (data) {
- Resource.prototype.receive.call(this, data);
- this.updateUnreadCache();
- this.updateFolderCache();
- };
-
- FeedResource.prototype.clear = function () {
- Resource.prototype.clear.call(this);
- this.unreadCount = 0;
- this.folderUnreadCount = {};
- this.folderIds = {};
- this.ids = {};
- this.locations = {};
- };
-
- FeedResource.prototype.updateUnreadCache = function () {
- this.unreadCount = 0;
- this.folderUnreadCount = {};
-
- var self = this;
- this.values.forEach(function (feed) {
- if (feed.unreadCount) {
- self.unreadCount += feed.unreadCount;
- }
- if (feed.folderId !== undefined) {
- self.folderUnreadCount[feed.folderId] =
- self.folderUnreadCount[feed.folderId] || 0;
- self.folderUnreadCount[feed.folderId] += feed.unreadCount;
- }
- });
- };
-
-
- FeedResource.prototype.updateFolderCache = function () {
- this.folderIds = {};
-
- var self = this;
- this.values.forEach(function (feed) {
- self.folderIds[feed.folderId] =
- self.folderIds[feed.folderId] || [];
- self.folderIds[feed.folderId].push(feed);
- });
- };
-
-
- FeedResource.prototype.add = function (value) {
- Resource.prototype.add.call(this, value);
- if (value.id !== undefined) {
- this.ids[value.id] = this.hashMap[value.url];
- }
- if (value.location !== undefined) {
- this.locations[value.location] = this.hashMap[value.url];
- }
- };
-
-
- FeedResource.prototype.markRead = function () {
- this.values.forEach(function (feed) {
- feed.unreadCount = 0;
- });
-
- this.updateUnreadCache();
- };
-
-
- FeedResource.prototype.markFeedRead = function (feedId) {
- this.ids[feedId].unreadCount = 0;
- this.updateUnreadCache();
- };
-
-
- FeedResource.prototype.markFolderRead = function (folderId) {
- this.values.forEach(function (feed) {
- if (feed.folderId === folderId) {
- feed.unreadCount = 0;
- }
- });
-
- this.updateUnreadCache();
- };
-
-
- FeedResource.prototype.markItemOfFeedRead = function (feedId) {
- this.ids[feedId].unreadCount -= 1;
- this.updateUnreadCache();
- };
-
-
- FeedResource.prototype.markItemsOfFeedsRead = function (feedIds) {
- var self = this;
- feedIds.forEach(function (feedId) {
- self.ids[feedId].unreadCount -= 1;
- });
-
- this.updateUnreadCache();
- };
-
-
- FeedResource.prototype.markItemOfFeedUnread = function (feedId) {
- this.ids[feedId].unreadCount += 1;
- this.updateUnreadCache();
- };
-
-
- FeedResource.prototype.getUnreadCount = function () {
- return this.unreadCount;
- };
-
-
- FeedResource.prototype.getFolderUnreadCount = function (folderId) {
- return this.folderUnreadCount[folderId];
- };
-
-
- FeedResource.prototype.getByFolderId = function (folderId) {
- return this.folderIds[folderId] || [];
- };
-
-
- FeedResource.prototype.getById = function (feedId) {
- return this.ids[feedId];
- };
-
-
- FeedResource.prototype.getByLocation = function (location) {
- return this.locations[location];
- };
-
-
- FeedResource.prototype.move = function (feedId, folderId) {
- var feed = this.getById(feedId);
- feed.folderId = folderId;
-
- this.updateFolderCache();
- this.updateUnreadCache();
-
- return this.patch(feedId, {folderId: folderId});
-
- };
-
-
- FeedResource.prototype.create = function (url, folderId, title) {
- url = url.trim();
- if (!url.startsWith('http')) {
- url = 'https://' + url;
- }
-
- if (title !== undefined) {
- title = title.trim();
- }
-
- var feed = {
- url: url,
- folderId: folderId || 0,
- title: title || url,
- unreadCount: 0
- };
-
- this.add(feed);
- this.updateFolderCache();
-
- var deferred = this.$q.defer();
-
- this.http({
- method: 'POST',
- url: this.BASE_URL + '/feeds',
- data: {
- url: url,
- parentFolderId: folderId || 0,
- title: title
- }
- }).success(function (data) {
- deferred.resolve(data);
- }).error(function (data) {
- feed.faviconLink = '';
- feed.error = data.message;
- deferred.reject();
- });
-
- return deferred.promise;
- };
-
-
- FeedResource.prototype.reversiblyDelete = function (id, updateCache,
- isFolder) {
- var feed = this.getById(id);
-
- // if a folder is deleted it does not have to trigger the delete
- // attribute for the feed because the feed is not deleted, its just not
- // displayed. Otherwise this causes the feed to also be deleted again
- // because the folder destroys the feed's scope
- if (feed && isFolder !== true) {
- feed.deleted = true;
- }
-
- if (updateCache !== false) {
- this.updateUnreadCache();
- }
-
- return this.http.delete(this.BASE_URL + '/feeds/' + id);
- };
-
-
- FeedResource.prototype.reversiblyDeleteFolder = function (folderId) {
- var self = this;
- var promises = [];
- this.getByFolderId(folderId).forEach(function (feed) {
- promises.push(self.reversiblyDelete(feed.id, false, true));
- });
-
- this.updateUnreadCache();
-
- var deferred = this.$q.all(promises);
- return deferred.promise;
- };
-
-
- FeedResource.prototype.delete = function (url, updateCache) {
- var feed = this.get(url);
- if (feed !== undefined && feed.id) {
- delete this.ids[feed.id];
- }
-
- if (feed !== undefined && feed.location) {
- delete this.locations[feed.location];
- }
-
- Resource.prototype.delete.call(this, url);
-
- if (updateCache !== false) {
- this.updateUnreadCache();
- this.updateFolderCache();
- }
-
- return feed;
- };
-
-
- FeedResource.prototype.deleteFolder = function (folderId) {
- var self = this;
- this.getByFolderId(folderId).forEach(function (feed) {
- self.delete(feed.url, false);
- });
-
- this.updateUnreadCache();
- this.updateFolderCache();
- };
-
-
- FeedResource.prototype.undoDelete = function (id, updateCache) {
- var feed = this.getById(id);
-
- if (feed) {
- feed.deleted = false;
- }
-
- if (updateCache !== false) {
- this.updateUnreadCache();
- }
-
- return this.http.post(this.BASE_URL + '/feeds/' + id + '/restore');
- };
-
-
- FeedResource.prototype.undoDeleteFolder = function (folderId) {
- var self = this;
- var promises = [];
-
- this.getByFolderId(folderId).forEach(function (feed) {
- promises.push(self.undoDelete(feed.id, false));
- });
-
- this.updateUnreadCache();
-
- var deferred = this.$q.all(promises);
- return deferred.promise;
- };
-
-
- FeedResource.prototype.setOrdering = function (feedId, ordering) {
- var feed = this.getById(feedId);
-
- if (feed) {
- feed.ordering = ordering;
- var url = this.BASE_URL + '/feeds/' + feedId;
- return this.http.patch(url, {
- ordering: ordering
- });
- }
- };
-
-
- FeedResource.prototype.setPinned = function (feedId, isPinned) {
- var feed = this.getById(feedId);
-
- if (feed) {
- feed.pinned = isPinned;
- var url = this.BASE_URL + '/feeds/' + feedId;
- return this.http.patch(url, {
- pinned: isPinned
- });
- }
- };
-
-
- FeedResource.prototype.patch = function (feedId, diff) {
- var feed = this.getById(feedId);
-
- if (feed) {
- Object.keys(diff).forEach(function(key) {
- feed[key] = diff[key];
- });
- var url = this.BASE_URL + '/feeds/' + feedId;
- return this.http.patch(url, diff);
- }
- };
-
-
- FeedResource.prototype.toggleFullText = function (feedId) {
- var feed = this.getById(feedId);
-
- return this.patch(feedId, {fullTextEnabled: !feed.fullTextEnabled});
- };
-
-
- return new FeedResource($http, BASE_URL, $q);
-}]);
-
-app.factory('FolderResource', ["Resource", "$http", "BASE_URL", "$q", function (Resource, $http, BASE_URL, $q) {
- 'use strict';
-
- var FolderResource = function ($http, BASE_URL, $q) {
- Resource.call(this, $http, BASE_URL, 'name');
- this.deleted = null;
- this.$q = $q;
- this.ids = {};
- };
-
- FolderResource.prototype = Object.create(Resource.prototype);
-
-
- FolderResource.prototype.add = function (value) {
- Resource.prototype.add.call(this, value);
- if (value.id !== undefined) {
- this.ids[value.id] = this.hashMap[value.name];
- }
- };
-
- FolderResource.prototype.clear = function () {
- Resource.prototype.clear.call(this);
- this.ids = {};
- };
-
- FolderResource.prototype.delete = function (name) {
- var folder = this.get(name);
- if (folder !== undefined && folder.id) {
- delete this.ids[folder.id];
- }
-
- Resource.prototype.delete.call(this, name);
-
- return folder;
- };
-
- FolderResource.prototype.toggleOpen = function (folderName) {
- var folder = this.get(folderName);
- folder.opened = !folder.opened;
-
- return this.http({
- url: this.BASE_URL + '/folders/' + folder.id + '/open',
- method: 'POST',
- data: {
- folderId: folder.id,
- open: folder.opened
- }
- });
- };
-
-
- FolderResource.prototype.rename = function (folderName, toFolderName) {
- var folder = this.get(folderName);
- var deferred = this.$q.defer();
- var self = this;
-
- this.http({
- url: this.BASE_URL + '/folders/' + folder.id + '/rename',
- method: 'POST',
- data: {
- folderName: toFolderName
- }
- }).success(function () {
- folder.name = toFolderName;
- delete self.hashMap[folderName];
- self.hashMap[toFolderName] = folder;
-
- deferred.resolve();
- }).error(function (data) {
- deferred.reject(data.message);
- });
-
- return deferred.promise;
- };
-
- FolderResource.prototype.getById = function (id) {
- return this.ids[id];
- };
-
- FolderResource.prototype.create = function (folderName) {
- folderName = folderName.trim();
- var folder = {
- name: folderName
- };
-
- this.add(folder);
-
- var deferred = this.$q.defer();
-
- this.http({
- url: this.BASE_URL + '/folders',
- method: 'POST',
- data: {
- folderName: folderName
- }
- }).success(function (data) {
- deferred.resolve(data);
- }).error(function (data) {
- folder.error = data.message;
- });
-
- return deferred.promise;
- };
-
-
- FolderResource.prototype.reversiblyDelete = function (name) {
- var folder = this.get(name);
- var id = folder.id;
- folder.deleted = true;
- return this.http.delete(this.BASE_URL + '/folders/' + id);
- };
-
-
- FolderResource.prototype.undoDelete = function (name) {
- var folder = this.get(name);
- var id = folder.id;
- folder.deleted = false;
- return this.http.post(this.BASE_URL + '/folders/' + id + '/restore');
- };
-
-
- return new FolderResource($http, BASE_URL, $q);
-}]);
-app.factory('ItemResource', ["Resource", "$http", "BASE_URL", "ITEM_BATCH_SIZE", function (Resource, $http, BASE_URL,
- ITEM_BATCH_SIZE) {
- 'use strict';
-
- var ItemResource = function ($http, BASE_URL, ITEM_BATCH_SIZE) {
- Resource.call(this, $http, BASE_URL);
- this.batchSize = ITEM_BATCH_SIZE;
- this.clear();
- };
-
- ItemResource.prototype = Object.create(Resource.prototype);
-
- ItemResource.prototype.clear = function () {
- this.starredCount = 0;
- this.lowestId = 0;
- this.highestId = 0;
- Resource.prototype.clear.call(this);
- };
-
- ItemResource.prototype.receive = function (value, channel) {
- switch (channel) {
-
- case 'newestItemId':
- this.newestItemId = value;
- break;
-
- case 'starred':
- this.starredCount = value;
- break;
-
- default:
- var self = this;
- value.forEach(function (item) {
- // initialize lowest and highest id
- if (self.lowestId === 0) {
- self.lowestId = item.id;
- }
- if (self.highestId === 0) {
- self.highestId = item.id;
- }
-
- if (item.id > self.highestId) {
- self.highestId = item.id;
- }
- if (item.id < self.lowestId) {
- self.lowestId = item.id;
- }
- });
-
- Resource.prototype.receive.call(this, value, channel);
- }
- };
-
-
- ItemResource.prototype.getNewestItemId = function () {
- return this.newestItemId;
- };
-
-
- ItemResource.prototype.getStarredCount = function () {
- return this.starredCount;
- };
-
-
- ItemResource.prototype.star = function (itemId, isStarred) {
- if (isStarred === undefined) {
- isStarred = true;
- }
-
- var it = this.get(itemId);
- var url = this.BASE_URL +
- '/items/' + it.feedId + '/' + it.guidHash + '/star';
-
- it.starred = isStarred;
-
- if (isStarred) {
- this.starredCount += 1;
- } else {
- this.starredCount -= 1;
- }
-
- return this.http({
- url: url,
- method: 'POST',
- data: {
- isStarred: isStarred
- }
- });
- };
-
-
- ItemResource.prototype.toggleStar = function (itemId) {
- if (this.get(itemId).starred) {
- this.star(itemId, false);
- } else {
- this.star(itemId, true);
- }
- };
-
-
- ItemResource.prototype.markItemRead = function (itemId, isRead) {
- if (isRead === undefined) {
- isRead = true;
- }
-
- this.get(itemId).unread = !isRead;
-
- return this.http({
- url: this.BASE_URL + '/items/' + itemId + '/read',
- method: 'POST',
- data: {
- isRead: isRead
- }
- });
- };
-
-
- ItemResource.prototype.markItemsRead = function (itemIds) {
- var self = this;
-
- itemIds.forEach(function(itemId) {
- self.get(itemId).unread = false;
- });
-
- return this.http({
- url: this.BASE_URL + '/items/read/multiple',
- method: 'POST',
- data: {
- itemIds: itemIds
- }
- });
- };
-
-
- ItemResource.prototype.markFeedRead = function (feedId, read) {
- if (read === undefined) {
- read = true;
- }
-
- var items = this.values.filter(function (element) {
- return element.feedId === feedId;
- });
-
- items.forEach(function (item) {
- item.unread = !read;
- });
-
- return this.http.post(this.BASE_URL + '/feeds/' + feedId + '/read', {
- highestItemId: this.getNewestItemId()
- });
- };
-
-
- ItemResource.prototype.markRead = function () {
- this.values.forEach(function (item) {
- item.unread = false;
- });
-
- return this.http({
- url: this.BASE_URL + '/items/read',
- method: 'POST',
- data: {
- highestItemId: this.getNewestItemId()
- }
- });
- };
-
-
- ItemResource.prototype.autoPage = function (type, id, oldestFirst,
- showAll, search) {
- var offset;
-
- if (oldestFirst) {
- offset = this.highestId;
- } else {
- offset = this.lowestId;
- }
-
- return this.http({
- url: this.BASE_URL + '/items',
- method: 'GET',
- params: {
- type: type,
- id: id,
- offset: offset,
- limit: this.batchSize,
- oldestFirst: oldestFirst,
- showAll: showAll,
- search: search
- }
- });
- };
-
-
- ItemResource.prototype.importArticles = function (json) {
- return this.http({
- url: this.BASE_URL + '/feeds/import/articles',
- method: 'POST',
- data: {
- json: json
- }
- });
- };
-
-
- return new ItemResource($http, BASE_URL, ITEM_BATCH_SIZE);
-}]);
-app.service('Loading', function () {
- 'use strict';
-
- this.loading = {
- global: false,
- content: false,
- autopaging: false
- };
-
- this.setLoading = function (area, isLoading) {
- this.loading[area] = isLoading;
- };
-
- this.isLoading = function (area) {
- return this.loading[area];
- };
-
-});
-app.service('OPMLImporter', ["FeedResource", "FolderResource", "Publisher", "$q", function (FeedResource, FolderResource, Publisher,
- $q) {
- 'use strict';
- var startFeedJob = function (queue) {
- var deferred = $q.defer();
-
- if (queue.length > 0) {
- var feed = queue.pop();
- var url = feed.url;
- var title = feed.title;
- var folderId = 0;
- var folderName = feed.folderName;
-
- if (folderName !== undefined &&
- FolderResource.get(folderName) !== undefined) {
- var folder = FolderResource.get(folderName);
- folder.opened = true;
- folderId = folder.id;
-
- // display folder while adding the feed
- folder.getsFeed = true;
- folder.getsFeedCounter = folder.getsFeedCounter || 0;
- folder.getsFeedCounter += 1;
- }
-
- // make sure to not add already existing feeds
- if (url !== undefined && FeedResource.get(url) === undefined) {
- FeedResource.create(url, folderId, title)
- .then(function (data) {
- Publisher.publishAll(data);
- })
- .finally(function () {
- if (folderId !== 0) {
- folder.getsFeedCounter -= 1;
-
- if (folder.getsFeedCounter === 0) {
- folder.getsFeed = false;
- }
- }
- startFeedJob(queue);
- });
- }
- } else {
- deferred.resolve();
- }
-
- return deferred.promise;
- };
-
- this.importFolders = function (content) {
- // assumption: folders are fast to create and we dont need a queue for
- // them
- var feedQueue = [];
- var folderPromises = [];
- content.folders.forEach(function (folder) {
- if (folder.name !== undefined) {
- // skip already created folders
- if (FolderResource.get(folder.name) === undefined) {
- var promise = FolderResource.create(folder.name)
- .then(function (data) {
- Publisher.publishAll(data);
- });
- folderPromises.push(promise);
- }
-
- folder.feeds.forEach(function (feed) {
- feed.folderName = folder.name;
- feedQueue.push(feed);
- });
- }
- });
- feedQueue = feedQueue.concat(content.feeds);
-
- var deferred = $q.defer();
-
- $q.all(folderPromises).finally(function () {
- deferred.resolve(feedQueue);
- });
-
- return deferred.promise;
- };
-
- this.importFeedQueue = function (feedQueue, jobSize) {
- // queue feeds to prevent server slowdown
- var deferred = $q.defer();
-
- var jobPromises = [];
- for (var i=0; i<jobSize; i+=1) {
- jobPromises.push(startFeedJob(feedQueue));
- }
-
- $q.all(jobPromises).then(function () {
- deferred.resolve();
- });
-
- return deferred.promise;
- };
-
-}]);
-app.service('OPMLParser', function () {
- 'use strict';
-
- var parseOutline = function (outline) {
- var url = outline.attr('xmlUrl') || outline.attr('htmlUrl');
- var name = outline.attr('title') || outline.attr('text') || url;
-
- // folder
- if (url === undefined) {
- return {
- type: 'folder',
- name: name,
- feeds: []
- };
-
- // feed
- } else {
- return {
- type: 'feed',
- name: name,
- url: url
- };
- }
- };
-
- // there is only one level, so feeds in a folder in a folder should be
- // attached to the root folder
- var recursivelyParse = function (level, root, firstLevel) {
- for (var i=0; i<level.length; i+=1) {
- var outline = $(level[i]);
-
- var entry = parseOutline(outline);
-
- if (entry.type === 'feed') {
- root.feeds.push(entry);
- } else {
-
- // only first level should append folders
- if (firstLevel) {
- recursivelyParse(outline.children('outline'), entry, false);
- root.folders.push(entry);
- } else {
- recursivelyParse(outline.children('outline'), root, false);
- }
- }
- }
-
- return root;
- };
-
- this.parse = function (xml) {
- xml = $.parseXML(xml);
- var firstLevel = $(xml).find('body > outline');
-
- var root = {
- 'feeds': [],
- 'folders': []
- };
-
- return recursivelyParse(firstLevel, root, true);
- };
-
-});
-/*jshint undef:false*/
-app.service('Publisher', function () {
- 'use strict';
-
- this.channels = {};
-
- this.subscribe = function (obj) {
- var self = this;
-
- return {
- toChannels: function (channels) {
- channels.forEach(function (channel) {
- self.channels[channel] = self.channels[channel] || [];
- self.channels[channel].push(obj);
- });
- }
- };
-
- };
-
- this.publishAll = function (data) {
- var self = this;
-
- Object.keys(data).forEach(function (channel) {
- var listeners = self.channels[channel];
- if (listeners !== undefined) {
- listeners.forEach(function (listener) {
- listener.receive(data[channel], channel);
- });
- }
- });
- };
-
-});
-app.factory('Resource', function () {
- 'use strict';
-
- var Resource = function (http, BASE_URL, id) {
- this.id = id || 'id';
- this.values = [];
- this.hashMap = {};
- this.http = http;
- this.BASE_URL = BASE_URL;
- };
-
-
- Resource.prototype.receive = function (objs) {
- var self = this;
- objs.forEach(function (obj) {
- self.add(obj);
- });
- };
-
-
- Resource.prototype.add = function (obj) {
- var existing = this.hashMap[obj[this.id]];
-
- if (existing === undefined) {
- this.values.push(obj);
- this.hashMap[obj[this.id]] = obj;
- } else {
- // copy values from new to old object if it exists already
- Object.keys(obj).forEach(function (key) {
- existing[key] = obj[key];
- });
- }
- };
-
-
- Resource.prototype.size = function () {
- return this.values.length;
- };
-
-
- Resource.prototype.get = function (id) {
- return this.hashMap[id];
- };
-
-
- Resource.prototype.delete = function (id) {
- // find index of object that should be deleted
- var self = this;
- var deleteAtIndex = this.values.findIndex(function(element) {
- return element[self.id] === id;
- });
-
- if (deleteAtIndex !== undefined) {
- this.values.splice(deleteAtIndex, 1);
- }
-
- if (this.hashMap[id] !== undefined) {
- delete this.hashMap[id];
- }
- };
-
-
- Resource.prototype.clear = function () {
- this.hashMap = {};
-
- // http://stackoverflow.com/questions/1232040
- // this is the fastes way to empty an array when you want to keep
- // the reference around
- while (this.values.length > 0) {
- this.values.pop();
- }
- };
-
-
- Resource.prototype.getAll = function () {
- return this.values;
- };
-
-
- return Resource;
-});
-/*jshint unused:false*/
-app.service('SettingsResource', ["$http", "BASE_URL", function ($http, BASE_URL) {
- 'use strict';
-
- this.settings = {
- language: 'en',
- showAll: null,
- compact: false,
- oldestFirst: null,
- preventReadOnScroll: false,
- compactExpand: false,
- exploreUrl: ''
- };
- this.defaultLanguageCode = 'en';
- this.supportedLanguageCodes = [
- 'ar-ma', 'ar', 'bg', 'ca', 'cs', 'cv', 'da', 'de', 'el', 'en', 'en-ca',
- 'en-gb', 'eo', 'es', 'et', 'eu', 'fi', 'fr-ca', 'fr', 'gl', 'he', 'hi',
- 'hu', 'id', 'is', 'it', 'ja', 'ka', 'ko', 'lv', 'ms-my', 'nb', 'ne',
- 'nl', 'pl', 'pt-br', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'th', 'tr',
- 'tzm-la', 'tzm', 'uk', 'zh-cn', 'zh-tw'
- ];
-
- this.getSupportedLanguageCodes = function () {
- return this.supportedLanguageCodes;
- };
-
- this.receive = function (data) {
- var self = this;
- Object.keys(data).forEach(function (key) {
- var value = data[key];
-
- if (key === 'language') {
- value = self.processLanguageCode(value);
- }
-
- self.settings[key] = value;
- });
- };
-
- this.get = function (key) {
- return this.settings[key];
- };
-
- this.set = function (key, value) {
- this.settings[key] = value;
-
- return $http({
- url: BASE_URL + '/settings',
- method: 'PUT',
- data: {
- language: this.settings.language,
- showAll: this.settings.showAll,
- compact: this.settings.compact,
- oldestFirst: this.settings.oldestFirst,
- compactExpand: this.settings.compactExpand,
- preventReadOnScroll: this.settings.preventReadOnScroll
- }
- });
- };
-
- this.processLanguageCode = function (languageCode) {
- languageCode = languageCode.replace('_', '-').toLowerCase();
-
- if (this.supportedLanguageCodes.indexOf(languageCode) < 0) {
- languageCode = languageCode.split('-')[0];
- }
-
- if (this.supportedLanguageCodes.indexOf(languageCode) < 0) {
- languageCode = this.defaultLanguageCode;
- }
-
- return languageCode;
- };
-
-}]);
-
-/**
- * This prefills the add feed section if an external link has ?subsribe_to
- * filled out
- */
-(function (window, document, navigator, url, $, undefined) {
- 'use strict';
-
- // register reader as feed reader in firefox
- var location = window.location;
- var storage = window.localStorage;
-
- // if isContentHandlerRegistered is not implemented (Firefox I'm looking
- // at you) we use localstorage to prevent registering the feed reader twice
- var registerHandler = function (mime, url, title) {
- var registered = navigator.isContentHandlerRegistered;
-
- var isRegistered = function (mime, url) {
- if (registered) {
- return registered(mime, url) !== 'new';
- } else {
- return storage.getItem('registeredHandler') === url;
- }
- };
-
- if (navigator.registerContentHandler && !isRegistered(mime, url)) {
- navigator.registerContentHandler(mime, subscribeUrl, title);
- if (!registered) {
- storage.setItem('registeredHandler', url);
- }
- }
- };
-
- var cleanUrl = location.protocol + '//' + location.host + location.pathname;
-
- var subscribeUrl = cleanUrl + '?subscribe_to=%s';
- var mimeType = 'application/vnd.mozilla.maybe.feed';
- var title = 'ownCloud News @ ' + cleanUrl;
-
- registerHandler(mimeType, subscribeUrl, title);
-
-
- $(document).ready(function () {
- var subscription = url('?subscribe_to');
- if (subscription && subscription !== 'undefined') {
- $('#new-feed').show();
-
- var input = $('input[ng-model="Navigation.feed.url"]');
- input.val(subscription);
- input.trigger('input');
-
- // hacky way to focus because initial loading of a feed
- // steals the focus
- setTimeout(function() {
- input.focus();
- }, 1000);
- }
- });
-
-})(window, document, navigator, url, $);
-
-/**
- * Various fixes
- */
-(function (window, document) {
- 'use strict';
-
- // If F5 is used to reload the page in Firefox, the content will sometimes
- // be scrolled back to the position where it was before the reload which
- // will cause new articles being marked as read
- window.addEventListener('beforeunload', function () {
- var content = document.querySelector('#app-content');
- content.scrollTo(0, 0);
- });
-
-})(window, document);
-/**
- * Code in here acts only as a click shortcut mechanism. That's why its not
- * being put into a directive since it has to be tested with protractor
- * anyways and theres no benefit from wiring it into the angular app
- */
-(function (window, document, $) {
- 'use strict';
-
- var noInputFocused = function (element) {
- return !(
- element.is('input') ||
- element.is('select') ||
- element.is('textarea') ||
- element.is('checkbox')
- );
- };
-
- var noModifierKey = function (event) {
- return !(
- event.shiftKey ||
- event.altKey ||
- event.ctrlKey ||
- event.metaKey
- );
- };
-
- var markAllRead = function (navigationArea) {
- var selector = '.active > .app-navigation-entry-menu .mark-read button';
- var button = navigationArea.find(selector);
- if (button.length > 0) {
- button.trigger('click');
- }
- };
-
- var isInScrollView = function (elem, scrollArea) {
- // offset().top adds the navigation bar too so we have to subract it
- var elemTop = elem.offset().top - scrollArea.offset().top;
- var elemBottom = elemTop + elem.height();
-
- var areaBottom = scrollArea.height();
-
- return elemTop >= 0 && elemBottom < areaBottom;
- };
-
- var scrollToNavigationElement = function (elem, scrollArea, toTop) {
- if (elem.length === 0 || (!toTop && isInScrollView(elem, scrollArea))) {
- return;
- }
- scrollArea.scrollTop(
- elem.offset().top - scrollArea.offset().top + scrollArea.scrollTop()
- );
- };
-
- var scrollToActiveNavigationEntry = function (navigationArea) {
- var element = navigationArea.find('.active');
- scrollToNavigationElement(element, navigationArea.children('ul'), true);
- };
-
- var reloadFeed = function (navigationArea) {
- navigationArea.find('.active > a:visible').trigger('click');
- };
-
- var tryReload = function (navigationArea, scrollArea) {
- if (scrollArea.scrollTop() === 0) {
- var pullToRefresh = scrollArea.find('.pull-to-refresh');
- if (!pullToRefresh.hasClass('show-pull-to-refresh')) {
- pullToRefresh.addClass('show-pull-to-refresh');
- } else if (pullToRefresh.hasClass('done')) {
- reloadFeed(navigationArea);
- }
- }
- };
-
- var activateNavigationEntry = function (element, navigationArea) {
- element.children('a:visible').trigger('click');
- scrollToNavigationElement(element, navigationArea.children('ul'));
- };
-
- var nextFeed = function (navigationArea) {
- var current = navigationArea.find('.active');
- var elements = navigationArea.find('.explore-feed,' +
- '.subscriptions-feed:visible,' +
- '.starred-feed:visible,' +
- '.feed:visible');
-
- if (current.hasClass('folder')) {
- while (current.length > 0) {
- var subfeeds = current.find('.feed:visible');
- if (subfeeds.length > 0) {
- activateNavigationEntry($(subfeeds[0]), navigationArea);
- return;
- }
- current = current.next('.folder');
- }
-
- // no subfeed found
- return;
- }
-
- // FIXME: O(n) runtime. If someone creates a nice and not fugly solution
- // please create a PR
- for (var i=0; i<elements.length-1; i+=1) {
- var element = elements[i];
-
- if (element === current[0]) {
- var next = elements[i+1];
- activateNavigationEntry($(next), navigationArea);
- break;
- }
- }
- };
-
- var getParentFolder = function (current) {
- return current.parent().parent('.folder');
- };
-
- var selectFirstOrLastFolder = function (navigationArea, isLast) {
- var folders = navigationArea.find('.folder:visible');
-
- var index;
- if (isLast) {
- index = folders.length - 1;
- } else {
- index = 0;
- }
-
- if (folders.length > 0) {
- activateNavigationEntry($(folders[index]), navigationArea);
- }
- };
-
- var previousFolder = function (navigationArea) {
- var current = navigationArea.find('.active');
-
- // cases: folder active, subfeed active, feed active, none active
- if (current.hasClass('folder')) {
- activateNavigationEntry(current.prevAll('.folder:visible').first(),
- navigationArea);
- } else if (current.hasClass('feed')) {
- var parentFolder = getParentFolder(current);
- if (parentFolder.length > 0) {
- // first go to previous folder should select the parent folder
- activateNavigationEntry(parentFolder, navigationArea);
- } else {
- selectFirstOrLastFolder(navigationArea, true);
- }
- } else {
- selectFirstOrLastFolder(navigationArea, true);
- }
- };
-
- var nextFolder = function (navigationArea) {
- var current = navigationArea.find('.active');
-
- // cases: folder active, subfeed active, feed active, none active
- if (current.hasClass('folder')) {
- activateNavigationEntry(current.nextAll('.folder:visible').first(),
- navigationArea);
- } else if (current.hasClass('feed')) {
- var parentFolder = getParentFolder(current);
- if (parentFolder.length > 0) {
- activateNavigationEntry(
- parentFolder.nextAll('.folder:visible').first(),
- navigationArea
- );
- } else {
- selectFirstOrLastFolder(navigationArea);
- }
- } else {
- selectFirstOrLastFolder(navigationArea);
- }
- };
-
- var previousFeed = function (navigationArea) {
- var current = navigationArea.find('.active');
- var elements = navigationArea.find('.explore-feed,' +
- '.subscriptions-feed:visible,' +
- '.starred-feed:visible,' +
- '.feed:visible');
-
- // special case: folder selected
- if (current.hasClass('folder')) {
- var previousFolder = current.prev('.folder');
-
- while (previousFolder.length > 0) {
- var subfeeds = previousFolder.find('.feed:visible');
- if (subfeeds.length > 0) {
- activateNavigationEntry($(subfeeds[subfeeds.length-1]),
- navigationArea);
- return;
- }
- previousFolder = previousFolder.prev('.folder');
- }
-
- // no subfeed found try visible feeds
- var feeds = current.siblings('.feed');
-
- if (feeds.length > 0) {
- activateNavigationEntry($(feeds[feeds.length-1]),
- navigationArea);
- return;
- }
-
-
- // no feed found, go to starred
- var starred = $('.starred-feed:visible');
- if (starred.length > 0) {
- activateNavigationEntry(starred, navigationArea);
- }
-
- return;
- }
-
- // FIXME: O(n) runtime. If someone creates a nice and not fugly solution
- // please create a PR
- for (var i=elements.length-1; i>0; i-=1) {
- var element = elements[i];
-
- if (element === current[0]) {
- var previous = elements[i-1];
- activateNavigationEntry($(previous), navigationArea);
- break;
- }
- }
- };
-
- var onActiveItem = function (scrollArea, callback) {
- var items = scrollArea.find('.item');
-
- items.each(function (index, item) {
- item = $(item);
-
- // 130px of the item should be visible
- if ((item.height() + item.position().top) > 30) {
- callback(item);
-
- return false;
- }
- });
-
- };
-
- var toggleUnread = function (scrollArea) {
- onActiveItem(scrollArea, function (item) {
- item.find('.toggle-keep-unread').trigger('click');
- });
- };
-
- var toggleStar = function (scrollArea) {
- onActiveItem(scrollArea, function (item) {
- item.find('.star').trigger('click');
- });
- };
-
- var expandItem = function (scrollArea) {
- onActiveItem(scrollArea, function (item) {
- item.find('.utils').trigger('click');
- });
- };
-
- var openLink = function (scrollArea) {
- onActiveItem(scrollArea, function (item) {
- item.trigger('click'); // mark read
- window.open(item.find('.external:visible').attr('href'), '_blank');
- });
- };
-
- var scrollToItem = function (scrollArea, item, expandItemInCompact) {
- // if you go to the next article in compact view, it should
- // expand the current one
- scrollArea.scrollTop(
- item.offset().top - scrollArea.offset().top + scrollArea.scrollTop()
- );
-
- if (expandItemInCompact) {
- onActiveItem(scrollArea, function (item) {
- if (!item.hasClass('open')) {
- item.find('.utils').trigger('click');
- }
- });
- }
- };
-
- var scrollToNextItem = function (scrollArea, expandItemInCompact) {
- var items = scrollArea.find('.item');
- var jumped = false;
-
- items.each(function (index, item) {
- item = $(item);
-
- // special treatment for items that have expand enabled:
- // if you click next and the first item has not been expaned and
- // is on the top, it should be expanded instead of the next one
- if ((item.position().top === 0 && expandItemInCompact &&
- !item.hasClass('open')) ||
- item.position().top > 10) {
- scrollToItem(scrollArea, item, expandItemInCompact);
-
- jumped = true;
-
- return false;
- }
- });
-
- // in case this is the last item it should still scroll below the top
- if (!jumped) {
- scrollArea.scrollTop(scrollArea.prop('scrollHeight'));
- }
-
- };
-
- var scrollToPreviousItem = function (navigationArea, scrollArea,
- expandItemInCompact) {
- var items = scrollArea.find('.item');
- var jumped = false;
-
- items.each(function (index, item) {
- item = $(item);
-
- if ((item.position().top + 10) >= 0) {
- var previous = item.prev();
-
- // if there are no items before the current one
- if (previous.length > 0) {
- scrollToItem(scrollArea, previous, expandItemInCompact);
- } else {
- tryReload(navigationArea, scrollArea);
- scrollArea.scrollTop(0);
- }
-
- jumped = true;
-
- return false;
- }
- });
-
- // if there was no jump jump to the last element
- if (!jumped && items.length > 0) {
- scrollToItem(scrollArea, items.last());
- }
- };
-
-
- $(document).keyup(function (event) {
- var keyCode = event.keyCode;
- var scrollArea = $('#app-content');
- var navigationArea = $('#app-navigation');
- var isCompactView = $('#articles.compact').length > 0;
- var isExpandItem = $('#articles')
- .attr('news-compact-expand') === 'true';
- var expandItemInCompact = isCompactView && isExpandItem;
-
- if (noInputFocused($(':focus')) && noModifierKey(event)) {
- // j, n, right arrow
- if ([74, 78, 39].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- scrollToNextItem(scrollArea, expandItemInCompact);
-
- // k, p, left arrow
- } else if ([75, 80, 37].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- scrollToPreviousItem(navigationArea, scrollArea,
- expandItemInCompact);
-
- // u
- } else if ([85].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- toggleUnread(scrollArea);
-
- // e
- } else if ([69].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- expandItem(scrollArea);
-
- // s, i, l
- } else if ([73, 83, 76].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- toggleStar(scrollArea);
-
- // h
- } else if ([72].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- toggleStar(scrollArea);
- scrollToNextItem(scrollArea);
-
- // o
- } else if ([79].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- openLink(scrollArea);
-
- // r
- } else if ([82].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- reloadFeed(navigationArea);
-
- // f
- } else if ([70].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- nextFeed(navigationArea);
-
- // d
- } else if ([68].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- previousFeed(navigationArea);
-
- // c
- } else if ([67].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- previousFolder(navigationArea);
-
- // a
- } else if ([65].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- scrollToActiveNavigationEntry(navigationArea);
-
- // v
- } else if ([86].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- nextFolder(navigationArea);
-
- // q
- } else if ([81].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- $('#searchbox').focus();
-
- // page up
- } else if ([33].indexOf(keyCode) >= 0) {
-
- tryReload(navigationArea, scrollArea);
-
- }
-
- // everything with shift
- } else if (noInputFocused($(':focus')) && event.shiftKey) {
-
- // shift + a
- if ([65].indexOf(keyCode) >= 0) {
-
- event.preventDefault();
- markAllRead(navigationArea);
-
- }
- }
- });
-
-}(window, document, $));
-
-window.News = window.News || {};
-
-
-(function (window, document, $, exports, undefined) {
- 'use strict';
-
- var articleActionPlugins = [];
-
- exports.addArticleAction = function (action) {
- articleActionPlugins.push(action);
- };
-
- exports.getArticleActionPlugins = function () {
- return articleActionPlugins;
- };
-
-})(window, document, jQuery, window.News);
-
-
-app.run(["$document", "$rootScope", function ($document, $rootScope) {
- 'use strict';
- $document.click(function (event) {
- $rootScope.$broadcast('documentClicked', event);
- });
-}]);
-
-app.directive('appNavigationEntryUtils', function () {
- 'use strict';
- return {
- restrict: 'C',
- link: function (scope, elm) {
- var menu = elm.siblings('.app-navigation-entry-menu');
- var button = $(elm)
- .find('.app-navigation-entry-utils-menu-button button');
-
- button.click(function () {
- menu.toggleClass('open');
- });
-
- scope.$on('documentClicked', function (scope, event) {
- if (event.target !== button[0]) {
- menu.removeClass('open');
- }
- });
- }
- };
-});
-app.directive('newsAddFeed', ["$rootScope", "$timeout", function ($rootScope, $timeout) {
- 'use strict';
-
- return {
- restrict: 'A',
- link: function (scope, elem) {
- $rootScope.$on('addFeed', function (_, url) {
-
- $timeout(function () {
- if (elem.is(':animated')) {
- elem.stop(true, true);
- elem.show();
- } else if (!elem.is(':visible')) {
- elem.slideDown();
- }
- elem.find('[ng-model="Navigation.feed.url"]').focus();
- });
-
- scope.Navigation.feed.url = url;
- });
- }
- };
-}]);
-app.directive('newsArticleActions', function () {
- 'use strict';
- return {
- restrict: 'A',
- scope: {
- newsArticleActions: '=',
- noPlugins: '='
- },
- link: function (scope, elem) {
- var plugins = News.getArticleActionPlugins();
-
- for (var i=0; i<plugins.length; i+=1) {
- plugins[i](elem, scope.newsArticleActions);
- }
-
- scope.noPlugins = plugins.length === 0;
- }
- };
-});
-
-app.directive('newsAutoFocus', ["$timeout", function ($timeout) {
- 'use strict';
- return function (scope, elem, attrs) {
- var toFocus = elem;
-
- if (attrs.newsAutoFocus) {
- toFocus = $(attrs.newsAutoFocus);
- }
-
- // to combat $digest already in process error when route changes
- $timeout(function () {
- toFocus.focus();
- }, 0);
- };
-}]);
-app.directive('newsBindHtmlUnsafe', function () {
- 'use strict';
-
- return function (scope, elem, attr) {
- scope.$watch(attr.newsBindHtmlUnsafe, function () {
- elem.html(scope.$eval(attr.newsBindHtmlUnsafe));
- });
- };
-});
-app.directive('newsDraggable', function () {
- 'use strict';
-
- return function (scope, elem, attr) {
- var options = scope.$eval(attr.newsDraggable);
-
- if (angular.isDefined(options)) {
- elem.draggable(options);
- } else {
- elem.draggable();
- }
-
- attr.$observe('newsDraggableDisable', function (value) {
- if (value === 'true') {
- elem.draggable('disable');
- } else {
- elem.draggable('enable');
- }
- });
- };
-});
-app.directive('newsDroppable', ["$rootScope", function ($rootScope) {
- 'use strict';
-
- return function (scope, elem, attr) {
- var details = {
- accept: '.feed',
- hoverClass: 'drag-and-drop',
- greedy: true,
- drop: function (event, ui) {
-
- $('.drag-and-drop').removeClass('drag-and-drop');
-
- var data = {
- folderId: parseInt(elem.data('id'), 10),
- feedId: parseInt($(ui.draggable).data('id'), 10)
- };
-
- $rootScope.$broadcast('moveFeedToFolder', data);
- scope.$apply(attr.droppable);
- }
- };
-
- elem.droppable(details);
- };
-}]);
-app.directive('newsFinishedTransition', function () {
- 'use strict';
-
- return function (scope, elem, attrs) {
- elem.on('transitionend', function () {
- elem.addClass(attrs.newsFinishedTransition);
- });
- };
-
-});
-app.directive('newsFocus', ["$timeout", "$interpolate", function ($timeout, $interpolate) {
- 'use strict';
-
- return function (scope, elem, attrs) {
- elem.click(function () {
- var toReadd = $($interpolate(attrs.newsFocus)(scope));
- $timeout(function () {
- toReadd.focus();
- }, 500);
- });
- };
-
-}]);
-app.directive('newsInstantNotification', function () {
- 'use strict';
-
- return {
- restrict: 'E',
- link: function (scope, elem) {
- elem.hide();
-
- var notification = elem.html();
- OC.Notification.showHtml(notification);
- }
- };
-
-});
-/**
- * Pause playback on elements other than the current one
- */
-app.directive('newsPlayOne', ["$rootScope", function ($rootScope) {
- 'use strict';
- return {
- restrict: 'A',
- link: function (scope, elem) {
- elem.on('play', function () {
- $rootScope.$broadcast('playing', elem);
- });
-
- $rootScope.$on('playing', function (scope, args) {
- if (args[0] !== elem[0]) {
- elem[0].pause();
- }
- });
- }
- };
-}]);
-app.directive('newsPullToRefresh', ["$rootScope", function ($rootScope) {
- 'use strict';
-
- var scrolled = false;
-
- return {
- restrict: 'A',
- scope: {
- newsPullToRefresh: '='
- },
- link: function (scope, element) {
-
- // change in the route means the content is refreshed
- // so reset the var
- $rootScope.$on('$routeChangeStart', function () {
- scrolled = false;
- scope.newsPullToRefresh = false;
- });
-
- element.on('scroll', function () {
- if (element.scrollTop() === 0 && scrolled) {
- scope.newsPullToRefresh = true;
- }
- scrolled = true;
- });
- }
- };
-}]);
-app.directive('newsReadFile', function () {
- 'use strict';
-
- return function (scope, elem, attr) {
-
- elem.change(function () {
-
- var file = elem[0].files[0];
- var reader = new FileReader();
-
- reader.onload = function (event) {
- // FIXME: is there a more flexible solution where we dont have
- // to bind the file to scope?
- scope.$fileContent = event.target.result;
- scope.$apply(attr.newsReadFile);
- };
-
- reader.readAsText(file);
- });
- };
-});
-app.directive('newsRefreshMasonry', ["$timeout", function ($timeout) {
- 'use strict';
- var refresh = function (elem) {
- $timeout(function () {
- $timeout(function () {
- elem.parent().masonry({
- itemSelector: '.grid-item',
- gutter: 25,
- columnWidth: 300
- });
- });
- });
- };
-
- return function (scope, elem) {
- if (scope.$last) {
- refresh(elem);
- }
- };
-}]);
-app.directive('newsScroll', ["$timeout", "ITEM_AUTO_PAGE_SIZE", "MARK_READ_TIMEOUT", "SCROLL_TIMEOUT", function ($timeout, ITEM_AUTO_PAGE_SIZE,
- MARK_READ_TIMEOUT, SCROLL_TIMEOUT) {
- 'use strict';
- var timer;
-
- // autopaging
- var autoPage = function (limit, elem, scope) {
- var counter = 0;
- var articles = elem.find('.item');
-
- for (var i = articles.length - 1; i >= 0; i -= 1) {
- var item = $(articles[i]);
-
-
- // if the counter is higher than the size it means
- // that it didnt break to auto page yet and that
- // there are more items, so break
- if (counter >= limit) {
- break;
- }
-
- // this is only reached when the item is not is
- // below the top and we didnt hit the factor yet so
- // autopage and break
- if (item.position().top < 0) {
- scope.$apply(scope.newsScrollAutoPage);
- break;
- }
-
- counter += 1;
- }
- };
-
- // mark read
- var markRead = function (enabled, elem, scope) {
- if (enabled) {
- var ids = [];
- var articles = elem.find('.item:not(.read)');
-
- articles.each(function(index, article) {
- var item = $(article);
-
- if (item.position().top <= -10) {
- ids.push(parseInt(item.data('id'), 10));
- } else {
- return false;
- }
- });
-
- scope.itemIds = ids;
- scope.$apply(scope.newsScrollMarkRead);
- }
- };
-
- return {
- restrict: 'A',
- scope: {
- 'newsScroll': '@',
- 'newsScrollAutoPage': '&',
- 'newsScrollMarkRead': '&',
- 'newsScrollEnabledMarkRead': '=',
- },
- link: function (scope, elem) {
- var allowScroll = true;
- var scrollArea = elem;
-
- if (scope.newsScroll) {
- scrollArea = $(scope.newsScroll);
- }
-
- var scrollHandler = function () {
- // allow only one scroll event to trigger every 300ms
- if (allowScroll) {
- allowScroll = false;
-
- $timeout(function () {
- allowScroll = true;
- }, SCROLL_TIMEOUT*1000);
-
- autoPage(ITEM_AUTO_PAGE_SIZE, elem, scope);
-
- // dont stack mark read requests
- if (timer) {
- $timeout.cancel(timer);
- }
-
- // allow user to undo accidental scroll
- timer = $timeout(function () {
- markRead(scope.newsScrollEnabledMarkRead,
- elem,
- scope);
- timer = undefined;
- }, MARK_READ_TIMEOUT*1000);
- }
- };
-
- scrollArea.on('scroll', scrollHandler);
-
- // remove scroll handler if element is destroyed
- scope.$on('$destroy', function () {
- scrollArea.off('scroll', scrollHandler);
- });
- }
- };
-}]);
-app.directive('newsSearch', ["$document", "$location", function ($document, $location) {
- 'use strict';
-
- return {
- restrict: 'E',
- scope: {
- 'onSearch': '='
- },
- link: function (scope) {
- var box = $('#searchbox');
- box.val($location.search().search);
-
- var doSearch = function () {
- var value = box.val();
- scope.$apply(function () {
- scope.onSearch(value);
- });
- };
-
- box.on('search keyup', function (event) {
- if (event.type === 'search' || event.keyCode === 13) {
- doSearch();
- }
- });
-
- // carry over search on route change
- scope.$watch(function () {
- return $location.search();
- }, function (search) {
- if (search && search.search) {
- box.val(search.search);
- } else {
- box.val('');
- }
- });
- }
- };
-}]);
-
-app.directive('newsStickyMenu', function () {
- 'use strict';
-
- return function (scope, elem, attr) {
- var height = 40;
-
- $(attr.newsStickyMenu).scroll(function () {
- var scrollHeight = $(this).scrollTop();
-
- if (scrollHeight > height) {
- elem.addClass('fixed');
- elem.css('top', scrollHeight);
- } else {
- elem.removeClass('fixed');
- }
- });
- };
-});
-app.directive('newsStopPropagation', function () {
- 'use strict';
- return {
- restrict: 'A',
- link: function (scope, element) {
- element.bind('click', function (event) {
- event.stopPropagation();
- });
- }
- };
-});
-app.directive('newsTimeout', ["$timeout", "$rootScope", function ($timeout, $rootScope) {
- 'use strict';
-
- return {
- restrict: 'A',
- scope: {
- 'newsTimeout': '&'
- },
- link: function (scope, element) {
- var destroyed = false;
- var seconds = 7;
- var timer = $timeout(scope.newsTimeout, seconds * 1000);
-
- // remove timeout if element is being removed by
- // for instance clicking on the x button
- scope.$on('$destroy', function () {
- destroyed = true;
- $timeout.cancel(timer);
- });
-
- // also delete the entry if undo is ignored and the url
- // is changed
- $rootScope.$on('$locationChangeStart', function () {
- // $locationChangeStart triggers twice because of the trailing
- // slash on the link which is kinda a hack to reload the route
- // if you click on the link when the route is the same
- $timeout.cancel(timer);
- if (!destroyed) {
- destroyed = true;
- element.remove();
- scope.newsTimeout();
- }
- });
- }
- };
-}]);
-app.directive('newsTitleUnreadCount', ["$window", function ($window) {
- 'use strict';
-
- var baseTitle = $window.document.title;
- var titles = baseTitle.split('-');
- var appName = titles[0] || 'News';
- var ownCloudName = titles[1] || 'ownCloud';
-
- return {
- restrict: 'E',
- scope: {
- unreadCount: '@'
- },
- link: function (scope, elem, attrs) {
- attrs.$observe('unreadCount', function (value) {
- if (value !== '0') {
- $window.document.title = appName +
- '(' + value + ') - ' + ownCloudName;
- } else {
- $window.document.title = appName + ' - ' + ownCloudName;
- }
- });
- }
- };
-
-}]);
-app.directive('newsToggleShow', function () {
- 'use strict';
- return {
- restrict: 'A',
- scope: {
- 'newsToggleShow': '@'
- },
- link: function (scope, elem) {
- elem.click(function () {
- var target = $(scope.newsToggleShow);
- target.toggle();
- });
- }
- };
-});
-
-app.directive('newsTriggerClick', function () {
- 'use strict';
-
- return function (scope, elm, attr) {
- elm.click(function () {
- $(attr.newsTriggerClick).trigger('click');
- });
- };
-
-});
-
-})(navigator, window, document, angular, jQuery, OC, oc_requesttoken, url); \ No newline at end of file
diff --git a/js/build/app.min.js b/js/build/app.min.js
index cd25ac495..b37202c7f 100644
--- a/js/build/app.min.js
+++ b/js/build/app.min.js
@@ -1,3 +1,3 @@
-!function(a,b,c,d,e,f,g,h,i){"use strict";var j=d.module("News",["ngRoute","ngSanitize","ngAnimate"]);j.config(["$routeProvider","$provide","$httpProvider",function(a,b,c){var d={FEED:0,FOLDER:1,STARRED:2,SUBSCRIPTIONS:3,SHARED:4,EXPLORE:5};b.constant("REFRESH_RATE",60),b.constant("ITEM_BATCH_SIZE",40),b.constant("ITEM_AUTO_PAGE_SIZE",20),b.constant("BASE_URL",f.generateUrl("/apps/news")),b.constant("FEED_TYPE",d),b.constant("MARK_READ_TIMEOUT",.5),b.constant("SCROLL_TIMEOUT",.1),b.factory("CSRFInterceptor",["$q","BASE_URL","$window",function(a,b,c){return{request:function(d){var e=c.location.href.split(c.location.pathname)[0];return(0===d.url.indexOf(b)||0===d.url.indexOf(e))&&(d.headers.requesttoken=g),d||a.when(d)}}}]);var e={0:t("news","Request failed, network connection unavailable!"),401:t("news","Request unauthorized. Are you logged in?"),403:t("news","Request forbidden. Are you an admin?"),412:t("news","Token expired or app not enabled! Reload the page!"),500:t("news","Internal server error! Please check your data/owncloud.log file for additional information!"),503:t("news","Request failed, ownCloud is in currently in maintenance mode!")};b.factory("ConnectionErrorInterceptor",["$q","$timeout",function(a,b){var c;return{responseError:function(d){return d.status in e&&(c&&b.cancel(c),f.Notification.hide(),f.Notification.showHtml(e[d.status]),c=b(function(){f.Notification.hide()},5e3)),a.reject(d)}}}]),c.interceptors.push("CSRFInterceptor"),c.interceptors.push("ConnectionErrorInterceptor");var h=function(a){return{data:["$http","$route","$q","$location","BASE_URL","ITEM_BATCH_SIZE","FEED_TYPE","SettingsResource","FeedResource",function(b,c,d,e,f,g,h,j,k){var l=j.get("showAll"),m=j.get("oldestFirst"),n=e.search().search||"",o=d.defer();if(null===l||null===m)o.resolve({});else{var p={type:a,limit:g,showAll:l,oldestFirst:m,search:n};if(c.current.params.id!==i&&(p.id=c.current.params.id),a===h.FEED){var q=k.getById(p.id);q===i||2===q.ordering?p.oldestFirst=!1:1===q.ordering&&(p.oldestFirst=!0)}b({url:f+"/items",method:"GET",params:p}).success(function(a){o.resolve(a)})}return o.promise}]}},j=function(){return{sites:["$http","$q","BASE_URL","$location","Publisher","SettingsResource",function(a,b,c,d,e,f){var g=b.defer(),h=d.search().lang;return h||(h=f.get("language")),a.get(c+"/settings").then(function(b){e.publishAll(b);var c=f.get("exploreUrl").replace(/\/+$/,""),d=c+"/feeds."+h+".json",g=c+"/feeds.en.json";return a.get(d)["catch"](function(){return a.get(g)})}).then(function(a){g.resolve(a.data)})["catch"](function(){g.reject()}),g.promise}]}};a.when("/items",{controller:"ContentController as Content",templateUrl:"content.html",resolve:h(d.SUBSCRIPTIONS),type:d.SUBSCRIPTIONS}).when("/items/starred",{controller:"ContentController as Content",templateUrl:"content.html",resolve:h(d.STARRED),type:d.STARRED}).when("/items/feeds/:id",{controller:"ContentController as Content",templateUrl:"content.html",resolve:h(d.FEED),type:d.FEED}).when("/items/folders/:id",{controller:"ContentController as Content",templateUrl:"content.html",resolve:h(d.FOLDER),type:d.FOLDER}).when("/explore",{controller:"ExploreController as Explore",templateUrl:"explore.html",resolve:j(),type:d.EXPLORE}).when("/shortcuts",{templateUrl:"shortcuts.html",type:-1})}]),j.run(["$rootScope","$location","$http","$q","$interval","$route","Loading","ItemResource","FeedResource","FolderResource","SettingsResource","Publisher","BASE_URL","FEED_TYPE","REFRESH_RATE",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){g.setLoading("global",!0),l.subscribe(h).toChannels(["items","newestItemId","starred"]),l.subscribe(j).toChannels(["folders"]),l.subscribe(i).toChannels(["feeds"]),l.subscribe(k).toChannels(["settings"]);var p=d.defer();c.get(m+"/settings").success(function(a){l.publishAll(a),p.resolve()});var q=d.defer(),r=b.path();c.get(m+"/feeds/active").success(function(a){var c;switch(a.activeFeed.type){case n.FEED:c="/items/feeds/"+a.activeFeed.id;break;case n.FOLDER:c="/items/folders/"+a.activeFeed.id;break;case n.STARRED:c="/items/starred";break;case n.EXPLORE:c="/explore";break;default:c="/items"}/^\/items(\/(starred|explore|feeds\/\d+|folders\/\d+))?\/?$/.test(r)||b.path(c),q.resolve()});var s,t=d.defer();c.get(m+"/feeds").success(function(a){s=a,t.resolve()});var u,v=d.defer();c.get(m+"/folders").success(function(a){u=a,v.resolve()}),d.all([t.promise,v.promise]).then(function(){l.publishAll(s),l.publishAll(u),0===s.feeds.length&&0===u.folders.length&&b.path("/explore")}),d.all([p.promise,q.promise,t.promise,v.promise]).then(function(){f.reload(),g.setLoading("global",!1)}),e(function(){c.get(m+"/feeds").success(function(a){l.publishAll(a)}),c.get(m+"/folders").success(function(a){l.publishAll(a)})},1e3*o),a.$on("$routeChangeStart",function(){g.setLoading("content",!0)}),a.$on("$routeChangeSuccess",function(){g.setLoading("content",!1)}),a.$on("$routeChangeError",function(){b.path("/items")})}]),j.controller("AppController",["Loading","FeedResource","FolderResource",function(a,b,c){this.loading=a,this.isFirstRun=function(){return 0===b.size()&&0===c.size()},this.play=function(a){this.playingItem=a}}]),j.controller("ContentController",["Publisher","FeedResource","ItemResource","SettingsResource","data","$route","$routeParams","$location","FEED_TYPE","ITEM_AUTO_PAGE_SIZE","Loading",function(a,b,c,d,e,f,g,h,j,k,l){c.clear(),a.publishAll(e),this.isAutoPagingEnabled=!0,c.size()>=k?this.isNothingMoreToAutoPage=!1:this.isNothingMoreToAutoPage=!0,this.getItems=function(){return c.getAll()},this.toggleStar=function(a){c.toggleStar(a)},this.toggleItem=function(a){this.isCompactView()&&(a.show=!a.show)},this.isShowAll=function(){return d.get("showAll")},this.markRead=function(a){var d=c.get(a);d.keepUnread||d.unread!==!0||(c.markItemRead(a),b.markItemOfFeedRead(d.feedId))},this.getFeed=function(a){return b.getById(a)},this.toggleKeepUnread=function(a){var d=c.get(a);d.unread||(b.markItemOfFeedUnread(d.feedId),c.markItemRead(a,!1)),d.keepUnread=!d.keepUnread};var m=this,n=function(){var a=d.get("oldestFirst");if(m.isFeed()){var c=b.getById(g.id);c&&1===c.ordering?a=!0:c&&2===c.ordering&&(a=!1)}return a};this.orderBy=function(){return n()?"id":"-id"},this.isCompactView=function(){return d.get("compact")},this.isCompactExpand=function(){return d.get("compactExpand")},this.autoPagingEnabled=function(){return this.isAutoPagingEnabled},this.markReadEnabled=function(){return!d.get("preventReadOnScroll")},this.scrollRead=function(a){var d=[],e=[];a.forEach(function(a){var b=c.get(a);b.keepUnread||(d.push(a),e.push(b.feedId))}),d.length>0&&(b.markItemsOfFeedsRead(e),c.markItemsRead(d))},this.isFeed=function(){return f.current.$$route.type===j.FEED},this.autoPage=function(){if(!this.isNothingMoreToAutoPage){if(!this.isAutoPagingEnabled)return void(this.autoPageAgain=!0);this.isAutoPagingEnabled=!1,this.autoPageAgain=!1;var b=f.current.$$route.type,e=g.id,i=n(),j=d.get("showAll"),m=this,o=h.search().search;l.setLoading("autopaging",!0),c.autoPage(b,e,i,j,o).success(function(b){a.publishAll(b),b.items.length>=k?m.isAutoPagingEnabled=!0:m.isNothingMoreToAutoPage=!0,m.isAutoPagingEnabled&&m.autoPageAgain&&m.autoPage()}).error(function(){m.isAutoPagingEnabled=!0})["finally"](function(){l.setLoading("autopaging",!1)})}},this.getRelativeDate=function(a){if(a!==i&&""!==a){var b=d.get("language"),c=moment.unix(a).locale(b).fromNow()+"";return c}return""},this.refresh=function(){f.reload()},this.getMediaType=function(a){return a&&0===a.indexOf("audio")?"audio":a&&0===a.indexOf("video")?"video":i}}]),j.controller("ExploreController",["sites","$rootScope","FeedResource","SettingsResource","$location",function(a,b,c,d,e){this.sites=a,this.feeds=Object.keys(a).map(function(b){return[b,a[b]]}).reduce(function(a,b){var c=b[0],d=b[1];return d.forEach(function(a){a.category=c}),a.concat(d)},[]),this.feedExists=function(a){return c.getByLocation(a)!==i},this.subscribeTo=function(a){b.$broadcast("addFeed",a)},this.isCategoryShown=function(a){return a.filter(function(a){return c.getByLocation(a.feed)===i}).length>0},this.getSupportedLanguageCodes=function(){return d.getSupportedLanguageCodes()},this.getCurrentLanguageCode=function(){var a=e.search().lang;return a||(a=d.get("language")),a},this.showLanguage=function(a){e.url("/explore/?lang="+a)},this.selectedLanguageCode=this.getCurrentLanguageCode()}]),j.controller("NavigationController",["$route","FEED_TYPE","FeedResource","FolderResource","ItemResource","SettingsResource","Publisher","$rootScope","$location","$q",function(a,b,c,d,e,f,g,h,j,k){this.feedError="",this.showNewFolder=!1,this.renamingFolder=!1,this.addingFeed=!1,this.addingFolder=!1,this.folderError="",this.renameError="",this.feed={};var l=function(){return parseInt(a.current.params.id,10)};this.getLanguageCode=function(){return f.get("language")},this.getFeeds=function(){return c.getAll()},this.getFolders=function(){return d.getAll()},this.markFolderRead=function(a){c.markFolderRead(a),c.getByFolderId(a).forEach(function(a){e.markFeedRead(a.id)})},this.markFeedRead=function(a){e.markFeedRead(a),c.markFeedRead(a)},this.markRead=function(){e.markRead(),c.markRead()},this.isShowAll=function(){return f.get("showAll")},this.getFeedsOfFolder=function(a){return c.getByFolderId(a)},this.getUnreadCount=function(){return c.getUnreadCount()},this.isUnread=function(){return this.getUnreadCount()>0},this.getFeedUnreadCount=function(a){var b=c.getById(a);return b!==i?b.unreadCount:0},this.isFeedUnread=function(a){return this.getFeedUnreadCount(a)>0},this.getFolderUnreadCount=function(a){return c.getFolderUnreadCount(a)},this.isFolderUnread=function(a){return this.getFolderUnreadCount(a)>0},this.getStarredCount=function(){return e.getStarredCount()},this.isStarredUnread=function(){return this.getStarredCount()>0},this.toggleFolder=function(a){d.toggleOpen(a)},this.hasFeeds=function(a){return c.getFolderUnreadCount(a)!==i},this.subFeedActive=function(d){var e=a.current.$$route.type;if(e===b.FEED){var f=c.getById(l());if(f!==i&&f.folderId===d)return!0}return!1},this.isSubscriptionsActive=function(){return a.current&&a.current.$$route.type===b.SUBSCRIPTIONS},this.isStarredActive=function(){return a.current&&a.current.$$route.type===b.STARRED},this.isExploreActive=function(){return a.current&&a.current.$$route.type===b.EXPLORE},this.isFolderActive=function(c){return a.current&&a.current.$$route.type===b.FOLDER&&l()===c},this.isFeedActive=function(c){return a.current&&a.current.$$route.type===b.FEED&&l()===c},this.folderNameExists=function(a){return a=a||"",d.get(a.trim())!==i},this.feedUrlExists=function(a){return a=a||"",a=a.trim(),c.get(a)!==i||c.get("http://"+a)!==i},this.createFeed=function(a){var b=this;this.showNewFolder=!1,this.addingFeed=!0;var e=a.newFolder,f=a.existingFolder||{id:0};e===i||""===e?(f.getsFeed=!0,c.create(a.url,f.id,i).then(function(a){g.publishAll(a),j.path("/items/feeds/"+a.feeds[0].id+"/")})["finally"](function(){f.getsFeed=i,a.url="",b.addingFeed=!1})):d.create(e).then(function(c){g.publishAll(c),a.existingFolder=d.get(c.folders[0].name),a.newFolder=i,b.createFeed(a)})},this.createFolder=function(a){var b=this;this.addingFolder=!0,d.create(a.name).then(function(a){g.publishAll(a)})["finally"](function(){b.addingFolder=!1,a.name=""})},this.moveFeed=function(b,d){var e=!1,f=c.getById(b);f.folderId!==d&&((this.isFolderActive(f.folderId)||this.isFolderActive(d))&&(e=!0),c.move(b,d),e&&a.reload())},this.renameFeed=function(a){c.patch(a.id,{title:a.title}),a.editing=!1},this.renameFolder=function(a,b){a.renameError="",this.renamingFolder=!0;var c=this;a.name===b?(a.renameError="",a.editing=!1,this.renamingFolder=!1):d.rename(a.name,b).then(function(){a.renameError="",a.editing=!1},function(b){a.renameError=b})["finally"](function(){c.renamingFolder=!1})},this.reversiblyDeleteFeed=function(b){c.reversiblyDelete(b.id)["finally"](function(){a.reload()})},this.undoDeleteFeed=function(b){c.undoDelete(b.id)["finally"](function(){a.reload()})},this.deleteFeed=function(a){c["delete"](a.url)},this.reversiblyDeleteFolder=function(b){k.all(c.reversiblyDeleteFolder(b.id),d.reversiblyDelete(b.name))["finally"](function(){a.reload()})},this.undoDeleteFolder=function(b){k.all(c.undoDeleteFolder(b.id),d.undoDelete(b.name))["finally"](function(){a.reload()})},this.deleteFolder=function(a){c.deleteFolder(a.id),d["delete"](a.name)},this.setOrdering=function(b,d){c.patch(b.id,{ordering:d}),a.reload()},this.togglePinned=function(a){var b=c.getById(a);return b?c.patch(a,{pinned:!b.pinned}):void 0},this.setUpdateMode=function(a,b){return c.patch(a,{updateMode:b})},this.toggleFullText=function(b){h.$broadcast("$routeChangeStart"),c.toggleFullText(b.id)["finally"](function(){h.$broadcast("$routeChangeSuccess"),a.reload()})},this.search=function(a){""===a?j.search("search",null):j.search("search",a)};var m=this;h.$on("moveFeedToFolder",function(a,b){m.moveFeed(b.feedId,b.folderId)});var n=function(){var e;a.current&&(e=a.current.$$route.type);var f=0;if(e===b.FOLDER)f=l();else if(e===b.FEED){var g=c.getById(l());g&&(f=g.folderId)}var h;0!==f&&(h=d.getById(f)),m.feed.existingFolder=h};h.$on("$routeChangeSuccess",function(){n()})}]),j.controller("SettingsController",["$route","$q","SettingsResource","ItemResource","OPMLParser","OPMLImporter","Publisher",function(a,b,c,d,e,f,g){this.isOPMLImporting=!1,this.isArticlesImporting=!1,this.opmlImportError=!1,this.articleImportError=!1;var h=function(b,d){c.set(b,d),["showAll","oldestFirst","compact"].indexOf(b)>=0&&a.reload()};this.toggleSetting=function(a){h(a,!this.getSetting(a))},this.getSetting=function(a){return c.get(a)},this.importOPML=function(a){this.opmlImportError=!1,this.articleImportError=!1;try{this.isOPMLImporting=!1;var b=e.parse(a),c=this,d=5;f.importFolders(b).then(function(a){return f.importFeedQueue(a,d)})["finally"](function(){c.isOPMLImporting=!1})}catch(g){console.error(g),this.isOPMLImporting=!1,this.opmlImportError=!0}},this.importArticles=function(a){this.opmlImportError=!1,this.articleImportError=!1;try{this.isArticlesImporting=!0;var b=JSON.parse(a),c=this;d.importArticles(b).success(function(a){g.publishAll(a)})["finally"](function(){c.isArticlesImporting=!1})}catch(e){console.error(e),this.articleImportError=!0,this.isArticlesImporting=!1}}}]),j.filter("trustUrl",["$sce",function(a){return function(b){return a.trustAsResourceUrl(b)}}]),j.filter("unreadCountFormatter",function(){return function(a){return a>999?"999+":a}}),j.factory("FeedResource",["Resource","$http","BASE_URL","$q",function(a,b,c,d){var e=function(b,c,d){a.call(this,b,c,"url"),this.ids={},this.locations={},this.unreadCount=0,this.folderUnreadCount={},this.folderIds={},this.$q=d};return e.prototype=Object.create(a.prototype),e.prototype.receive=function(b){a.prototype.receive.call(this,b),this.updateUnreadCache(),this.updateFolderCache()},e.prototype.clear=function(){a.prototype.clear.call(this),this.unreadCount=0,this.folderUnreadCount={},this.folderIds={},this.ids={},this.locations={}},e.prototype.updateUnreadCache=function(){this.unreadCount=0,this.folderUnreadCount={};var a=this;this.values.forEach(function(b){b.unreadCount&&(a.unreadCount+=b.unreadCount),b.folderId!==i&&(a.folderUnreadCount[b.folderId]=a.folderUnreadCount[b.folderId]||0,a.folderUnreadCount[b.folderId]+=b.unreadCount)})},e.prototype.updateFolderCache=function(){this.folderIds={};var a=this;this.values.forEach(function(b){a.folderIds[b.folderId]=a.folderIds[b.folderId]||[],a.folderIds[b.folderId].push(b)})},e.prototype.add=function(b){a.prototype.add.call(this,b),b.id!==i&&(this.ids[b.id]=this.hashMap[b.url]),b.location!==i&&(this.locations[b.location]=this.hashMap[b.url])},e.prototype.markRead=function(){this.values.forEach(function(a){a.unreadCount=0}),this.updateUnreadCache()},e.prototype.markFeedRead=function(a){this.ids[a].unreadCount=0,this.updateUnreadCache()},e.prototype.markFolderRead=function(a){this.values.forEach(function(b){b.folderId===a&&(b.unreadCount=0)}),this.updateUnreadCache()},e.prototype.markItemOfFeedRead=function(a){this.ids[a].unreadCount-=1,this.updateUnreadCache()},e.prototype.markItemsOfFeedsRead=function(a){var b=this;a.forEach(function(a){b.ids[a].unreadCount-=1}),this.updateUnreadCache()},e.prototype.markItemOfFeedUnread=function(a){this.ids[a].unreadCount+=1,this.updateUnreadCache()},e.prototype.getUnreadCount=function(){return this.unreadCount},e.prototype.getFolderUnreadCount=function(a){return this.folderUnreadCount[a]},e.prototype.getByFolderId=function(a){return this.folderIds[a]||[]},e.prototype.getById=function(a){return this.ids[a]},e.prototype.getByLocation=function(a){return this.locations[a]},e.prototype.move=function(a,b){var c=this.getById(a);return c.folderId=b,this.updateFolderCache(),this.updateUnreadCache(),this.patch(a,{folderId:b})},e.prototype.create=function(a,b,c){a=a.trim(),a.startsWith("http")||(a="https://"+a),c!==i&&(c=c.trim());var d={url:a,folderId:b||0,title:c||a,unreadCount:0};this.add(d),this.updateFolderCache();var e=this.$q.defer();return this.http({method:"POST",url:this.BASE_URL+"/feeds",data:{url:a,parentFolderId:b||0,title:c}}).success(function(a){e.resolve(a)}).error(function(a){d.faviconLink="",d.error=a.message,e.reject()}),e.promise},e.prototype.reversiblyDelete=function(a,b,c){var d=this.getById(a);return d&&c!==!0&&(d.deleted=!0),b!==!1&&this.updateUnreadCache(),this.http["delete"](this.BASE_URL+"/feeds/"+a)},e.prototype.reversiblyDeleteFolder=function(a){var b=this,c=[];this.getByFolderId(a).forEach(function(a){c.push(b.reversiblyDelete(a.id,!1,!0))}),this.updateUnreadCache();var d=this.$q.all(c);return d.promise},e.prototype["delete"]=function(b,c){var d=this.get(b);return d!==i&&d.id&&delete this.ids[d.id],d!==i&&d.location&&delete this.locations[d.location],a.prototype["delete"].call(this,b),c!==!1&&(this.updateUnreadCache(),this.updateFolderCache()),d},e.prototype.deleteFolder=function(a){var b=this;this.getByFolderId(a).forEach(function(a){b["delete"](a.url,!1)}),this.updateUnreadCache(),this.updateFolderCache()},e.prototype.undoDelete=function(a,b){var c=this.getById(a);return c&&(c.deleted=!1),b!==!1&&this.updateUnreadCache(),this.http.post(this.BASE_URL+"/feeds/"+a+"/restore")},e.prototype.undoDeleteFolder=function(a){var b=this,c=[];this.getByFolderId(a).forEach(function(a){c.push(b.undoDelete(a.id,!1))}),this.updateUnreadCache();var d=this.$q.all(c);return d.promise},e.prototype.setOrdering=function(a,b){var c=this.getById(a);if(c){c.ordering=b;var d=this.BASE_URL+"/feeds/"+a;return this.http.patch(d,{ordering:b})}},e.prototype.setPinned=function(a,b){var c=this.getById(a);if(c){c.pinned=b;var d=this.BASE_URL+"/feeds/"+a;return this.http.patch(d,{pinned:b})}},e.prototype.patch=function(a,b){var c=this.getById(a);if(c){Object.keys(b).forEach(function(a){c[a]=b[a]});var d=this.BASE_URL+"/feeds/"+a;return this.http.patch(d,b)}},e.prototype.toggleFullText=function(a){var b=this.getById(a);return this.patch(a,{fullTextEnabled:!b.fullTextEnabled})},new e(b,c,d)}]),j.factory("FolderResource",["Resource","$http","BASE_URL","$q",function(a,b,c,d){var e=function(b,c,d){a.call(this,b,c,"name"),this.deleted=null,this.$q=d,this.ids={}};return e.prototype=Object.create(a.prototype),e.prototype.add=function(b){a.prototype.add.call(this,b),b.id!==i&&(this.ids[b.id]=this.hashMap[b.name])},e.prototype.clear=function(){a.prototype.clear.call(this),this.ids={}},e.prototype["delete"]=function(b){var c=this.get(b);return c!==i&&c.id&&delete this.ids[c.id],a.prototype["delete"].call(this,b),c},e.prototype.toggleOpen=function(a){var b=this.get(a);return b.opened=!b.opened,this.http({url:this.BASE_URL+"/folders/"+b.id+"/open",method:"POST",data:{folderId:b.id,open:b.opened}})},e.prototype.rename=function(a,b){var c=this.get(a),d=this.$q.defer(),e=this;return this.http({url:this.BASE_URL+"/folders/"+c.id+"/rename",method:"POST",data:{folderName:b}}).success(function(){c.name=b,delete e.hashMap[a],e.hashMap[b]=c,d.resolve()}).error(function(a){d.reject(a.message)}),d.promise},e.prototype.getById=function(a){return this.ids[a]},e.prototype.create=function(a){a=a.trim();var b={name:a};this.add(b);var c=this.$q.defer();return this.http({url:this.BASE_URL+"/folders",method:"POST",data:{folderName:a}}).success(function(a){c.resolve(a)}).error(function(a){b.error=a.message}),c.promise},e.prototype.reversiblyDelete=function(a){var b=this.get(a),c=b.id;return b.deleted=!0,this.http["delete"](this.BASE_URL+"/folders/"+c)},e.prototype.undoDelete=function(a){var b=this.get(a),c=b.id;return b.deleted=!1,this.http.post(this.BASE_URL+"/folders/"+c+"/restore")},new e(b,c,d)}]),j.factory("ItemResource",["Resource","$http","BASE_URL","ITEM_BATCH_SIZE",function(a,b,c,d){var e=function(b,c,d){a.call(this,b,c),this.batchSize=d,this.clear()};return e.prototype=Object.create(a.prototype),e.prototype.clear=function(){this.starredCount=0,this.lowestId=0,this.highestId=0,a.prototype.clear.call(this)},e.prototype.receive=function(b,c){switch(c){case"newestItemId":this.newestItemId=b;break;case"starred":this.starredCount=b;break;default:var d=this;b.forEach(function(a){0===d.lowestId&&(d.lowestId=a.id),0===d.highestId&&(d.highestId=a.id),a.id>d.highestId&&(d.highestId=a.id),a.id<d.lowestId&&(d.lowestId=a.id)}),a.prototype.receive.call(this,b,c)}},e.prototype.getNewestItemId=function(){return this.newestItemId},e.prototype.getStarredCount=function(){return this.starredCount},e.prototype.star=function(a,b){b===i&&(b=!0);var c=this.get(a),d=this.BASE_URL+"/items/"+c.feedId+"/"+c.guidHash+"/star";return c.starred=b,b?this.starredCount+=1:this.starredCount-=1,this.http({url:d,method:"POST",data:{isStarred:b}})},e.prototype.toggleStar=function(a){this.get(a).starred?this.star(a,!1):this.star(a,!0)},e.prototype.markItemRead=function(a,b){return b===i&&(b=!0),this.get(a).unread=!b,this.http({url:this.BASE_URL+"/items/"+a+"/read",method:"POST",data:{isRead:b}})},e.prototype.markItemsRead=function(a){var b=this;return a.forEach(function(a){b.get(a).unread=!1}),this.http({url:this.BASE_URL+"/items/read/multiple",method:"POST",data:{itemIds:a}})},e.prototype.markFeedRead=function(a,b){b===i&&(b=!0);var c=this.values.filter(function(b){return b.feedId===a});return c.forEach(function(a){a.unread=!b}),this.http.post(this.BASE_URL+"/feeds/"+a+"/read",{highestItemId:this.getNewestItemId()})},e.prototype.markRead=function(){return this.values.forEach(function(a){a.unread=!1}),this.http({url:this.BASE_URL+"/items/read",method:"POST",data:{highestItemId:this.getNewestItemId()}})},e.prototype.autoPage=function(a,b,c,d,e){var f;return f=c?this.highestId:this.lowestId,this.http({url:this.BASE_URL+"/items",method:"GET",params:{type:a,id:b,offset:f,limit:this.batchSize,oldestFirst:c,showAll:d,search:e}})},e.prototype.importArticles=function(a){return this.http({url:this.BASE_URL+"/feeds/import/articles",method:"POST",data:{json:a}})},new e(b,c,d)}]),j.service("Loading",function(){this.loading={global:!1,content:!1,autopaging:!1},this.setLoading=function(a,b){this.loading[a]=b},this.isLoading=function(a){return this.loading[a]}}),j.service("OPMLImporter",["FeedResource","FolderResource","Publisher","$q",function(a,b,c,d){var e=function(f){var g=d.defer();if(f.length>0){var h=f.pop(),j=h.url,k=h.title,l=0,m=h.folderName;if(m!==i&&b.get(m)!==i){var n=b.get(m);n.opened=!0,l=n.id,n.getsFeed=!0,n.getsFeedCounter=n.getsFeedCounter||0,n.getsFeedCounter+=1}j!==i&&a.get(j)===i&&a.create(j,l,k).then(function(a){c.publishAll(a)})["finally"](function(){0!==l&&(n.getsFeedCounter-=1,0===n.getsFeedCounter&&(n.getsFeed=!1)),e(f)})}else g.resolve();return g.promise};this.importFolders=function(a){var e=[],f=[];a.folders.forEach(function(a){if(a.name!==i){if(b.get(a.name)===i){var d=b.create(a.name).then(function(a){c.publishAll(a)});f.push(d)}a.feeds.forEach(function(b){b.folderName=a.name,e.push(b)})}}),e=e.concat(a.feeds);var g=d.defer();return d.all(f)["finally"](function(){g.resolve(e)}),g.promise},this.importFeedQueue=function(a,b){for(var c=d.defer(),f=[],g=0;b>g;g+=1)f.push(e(a));return d.all(f).then(function(){c.resolve()}),c.promise}}]),j.service("OPMLParser",function(){var a=function(a){var b=a.attr("xmlUrl")||a.attr("htmlUrl"),c=a.attr("title")||a.attr("text")||b;return b===i?{type:"folder",name:c,feeds:[]}:{type:"feed",name:c,url:b}},b=function(c,d,f){for(var g=0;g<c.length;g+=1){var h=e(c[g]),i=a(h);"feed"===i.type?d.feeds.push(i):f?(b(h.children("outline"),i,!1),d.folders.push(i)):b(h.children("outline"),d,!1)}return d};this.parse=function(a){a=e.parseXML(a);var c=e(a).find("body > outline"),d={feeds:[],folders:[]};return b(c,d,!0)}}),j.service("Publisher",function(){this.channels={},this.subscribe=function(a){var b=this;return{toChannels:function(c){c.forEach(function(c){b.channels[c]=b.channels[c]||[],b.channels[c].push(a)})}}},this.publishAll=function(a){var b=this;Object.keys(a).forEach(function(c){var d=b.channels[c];d!==i&&d.forEach(function(b){b.receive(a[c],c)})})}}),j.factory("Resource",function(){var a=function(a,b,c){this.id=c||"id",this.values=[],this.hashMap={},this.http=a,this.BASE_URL=b};return a.prototype.receive=function(a){var b=this;a.forEach(function(a){b.add(a)})},a.prototype.add=function(a){var b=this.hashMap[a[this.id]];b===i?(this.values.push(a),this.hashMap[a[this.id]]=a):Object.keys(a).forEach(function(c){b[c]=a[c]})},a.prototype.size=function(){return this.values.length},a.prototype.get=function(a){return this.hashMap[a]},a.prototype["delete"]=function(a){var b=this,c=this.values.findIndex(function(c){return c[b.id]===a});c!==i&&this.values.splice(c,1),this.hashMap[a]!==i&&delete this.hashMap[a]},a.prototype.clear=function(){for(this.hashMap={};this.values.length>0;)this.values.pop()},a.prototype.getAll=function(){return this.values},a}),j.service("SettingsResource",["$http","BASE_URL",function(a,b){this.settings={language:"en",showAll:null,compact:!1,oldestFirst:null,preventReadOnScroll:!1,compactExpand:!1,exploreUrl:""},this.defaultLanguageCode="en",this.supportedLanguageCodes=["ar-ma","ar","bg","ca","cs","cv","da","de","el","en","en-ca","en-gb","eo","es","et","eu","fi","fr-ca","fr","gl","he","hi","hu","id","is","it","ja","ka","ko","lv","ms-my","nb","ne","nl","pl","pt-br","pt","ro","ru","sk","sl","sv","th","tr","tzm-la","tzm","uk","zh-cn","zh-tw"],this.getSupportedLanguageCodes=function(){return this.supportedLanguageCodes},this.receive=function(a){var b=this;Object.keys(a).forEach(function(c){var d=a[c];"language"===c&&(d=b.processLanguageCode(d)),b.settings[c]=d})},this.get=function(a){return this.settings[a]},this.set=function(c,d){return this.settings[c]=d,a({url:b+"/settings",method:"PUT",data:{language:this.settings.language,showAll:this.settings.showAll,compact:this.settings.compact,oldestFirst:this.settings.oldestFirst,compactExpand:this.settings.compactExpand,preventReadOnScroll:this.settings.preventReadOnScroll}})},this.processLanguageCode=function(a){return a=a.replace("_","-").toLowerCase(),this.supportedLanguageCodes.indexOf(a)<0&&(a=a.split("-")[0]),this.supportedLanguageCodes.indexOf(a)<0&&(a=this.defaultLanguageCode),a}}]),function(a,b,c,d,e,f){var g=a.location,h=a.localStorage,i=function(a,b,d){var e=c.isContentHandlerRegistered,f=function(a,b){return e?"new"!==e(a,b):h.getItem("registeredHandler")===b};c.registerContentHandler&&!f(a,b)&&(c.registerContentHandler(a,k,d),e||h.setItem("registeredHandler",b))},j=g.protocol+"//"+g.host+g.pathname,k=j+"?subscribe_to=%s",l="application/vnd.mozilla.maybe.feed",m="ownCloud News @ "+j;i(l,k,m),e(b).ready(function(){var a=d("?subscribe_to");if(a&&"undefined"!==a){e("#new-feed").show();var b=e('input[ng-model="Navigation.feed.url"]');b.val(a),b.trigger("input"),setTimeout(function(){b.focus()},1e3)}})}(b,c,a,h,e),function(a,b){a.addEventListener("beforeunload",function(){var a=b.querySelector("#app-content");a.scrollTo(0,0)})}(b,c),function(a,b,c){var d=function(a){return!(a.is("input")||a.is("select")||a.is("textarea")||a.is("checkbox"))},e=function(a){return!(a.shiftKey||a.altKey||a.ctrlKey||a.metaKey)},f=function(a){var b=".active > .app-navigation-entry-menu .mark-read button",c=a.find(b);c.length>0&&c.trigger("click")},g=function(a,b){var c=a.offset().top-b.offset().top,d=c+a.height(),e=b.height();return c>=0&&e>d},h=function(a,b,c){0===a.length||!c&&g(a,b)||b.scrollTop(a.offset().top-b.offset().top+b.scrollTop())},i=function(a){var b=a.find(".active");h(b,a.children("ul"),!0)},j=function(a){a.find(".active > a:visible").trigger("click")},k=function(a,b){if(0===b.scrollTop()){var c=b.find(".pull-to-refresh");c.hasClass("show-pull-to-refresh")?c.hasClass("done")&&j(a):c.addClass("show-pull-to-refresh")}},l=function(a,b){a.children("a:visible").trigger("click"),h(a,b.children("ul"))},m=function(a){var b=a.find(".active"),d=a.find(".explore-feed,.subscriptions-feed:visible,.starred-feed:visible,.feed:visible");if(b.hasClass("folder"))for(;b.length>0;){var e=b.find(".feed:visible");if(e.length>0)return void l(c(e[0]),a);b=b.next(".folder")}else for(var f=0;f<d.length-1;f+=1){var g=d[f];if(g===b[0]){var h=d[f+1];l(c(h),a);break}}},n=function(a){return a.parent().parent(".folder")},o=function(a,b){var d,e=a.find(".folder:visible");d=b?e.length-1:0,e.length>0&&l(c(e[d]),a)},p=function(a){var b=a.find(".active");if(b.hasClass("folder"))l(b.prevAll(".folder:visible").first(),a);else if(b.hasClass("feed")){var c=n(b);c.length>0?l(c,a):o(a,!0)}else o(a,!0)},q=function(a){var b=a.find(".active");if(b.hasClass("folder"))l(b.nextAll(".folder:visible").first(),a);else if(b.hasClass("feed")){var c=n(b);c.length>0?l(c.nextAll(".folder:visible").first(),a):o(a)}else o(a)},r=function(a){var b=a.find(".active"),d=a.find(".explore-feed,.subscriptions-feed:visible,.starred-feed:visible,.feed:visible");if(b.hasClass("folder")){for(var e=b.prev(".folder");e.length>0;){var f=e.find(".feed:visible");if(f.length>0)return void l(c(f[f.length-1]),a);e=e.prev(".folder")}var g=b.siblings(".feed");if(g.length>0)return void l(c(g[g.length-1]),a);var h=c(".starred-feed:visible");return void(h.length>0&&l(h,a))}for(var i=d.length-1;i>0;i-=1){var j=d[i];if(j===b[0]){var k=d[i-1];l(c(k),a);break}}},s=function(a,b){var d=a.find(".item");d.each(function(a,d){return d=c(d),d.height()+d.position().top>30?(b(d),!1):void 0})},t=function(a){s(a,function(a){a.find(".toggle-keep-unread").trigger("click")})},u=function(a){s(a,function(a){a.find(".star").trigger("click")})},v=function(a){s(a,function(a){a.find(".utils").trigger("click")})},w=function(b){s(b,function(b){b.trigger("click"),a.open(b.find(".external:visible").attr("href"),"_blank")})},x=function(a,b,c){a.scrollTop(b.offset().top-a.offset().top+a.scrollTop()),c&&s(a,function(a){a.hasClass("open")||a.find(".utils").trigger("click")})},y=function(a,b){var d=a.find(".item"),e=!1;d.each(function(d,f){return f=c(f),0===f.position().top&&b&&!f.hasClass("open")||f.position().top>10?(x(a,f,b),e=!0,!1):void 0}),e||a.scrollTop(a.prop("scrollHeight"))},z=function(a,b,d){var e=b.find(".item"),f=!1;e.each(function(e,g){if(g=c(g),g.position().top+10>=0){var h=g.prev();return h.length>0?x(b,h,d):(k(a,b),b.scrollTop(0)),f=!0,!1}}),!f&&e.length>0&&x(b,e.last())};c(b).keyup(function(a){var b=a.keyCode,g=c("#app-content"),h=c("#app-navigation"),l=c("#articles.compact").length>0,n="true"===c("#articles").attr("news-compact-expand"),o=l&&n;d(c(":focus"))&&e(a)?[74,78,39].indexOf(b)>=0?(a.preventDefault(),y(g,o)):[75,80,37].indexOf(b)>=0?(a.preventDefault(),z(h,g,o)):[85].indexOf(b)>=0?(a.preventDefault(),t(g)):[69].indexOf(b)>=0?(a.preventDefault(),v(g)):[73,83,76].indexOf(b)>=0?(a.preventDefault(),u(g)):[72].indexOf(b)>=0?(a.preventDefault(),u(g),y(g)):[79].indexOf(b)>=0?(a.preventDefault(),w(g)):[82].indexOf(b)>=0?(a.preventDefault(),j(h)):[70].indexOf(b)>=0?(a.preventDefault(),m(h)):[68].indexOf(b)>=0?(a.preventDefault(),r(h)):[67].indexOf(b)>=0?(a.preventDefault(),p(h)):[65].indexOf(b)>=0?(a.preventDefault(),i(h)):[86].indexOf(b)>=0?(a.preventDefault(),q(h)):[81].indexOf(b)>=0?(a.preventDefault(),
-c("#searchbox").focus()):[33].indexOf(b)>=0&&k(h,g):d(c(":focus"))&&a.shiftKey&&[65].indexOf(b)>=0&&(a.preventDefault(),f(h))})}(b,c,e),b.News=b.News||{},function(a,b,c,d,e){var f=[];d.addArticleAction=function(a){f.push(a)},d.getArticleActionPlugins=function(){return f}}(b,c,jQuery,b.News),j.run(["$document","$rootScope",function(a,b){a.click(function(a){b.$broadcast("documentClicked",a)})}]),j.directive("appNavigationEntryUtils",function(){return{restrict:"C",link:function(a,b){var c=b.siblings(".app-navigation-entry-menu"),d=e(b).find(".app-navigation-entry-utils-menu-button button");d.click(function(){c.toggleClass("open")}),a.$on("documentClicked",function(a,b){b.target!==d[0]&&c.removeClass("open")})}}}),j.directive("newsAddFeed",["$rootScope","$timeout",function(a,b){return{restrict:"A",link:function(c,d){a.$on("addFeed",function(a,e){b(function(){d.is(":animated")?(d.stop(!0,!0),d.show()):d.is(":visible")||d.slideDown(),d.find('[ng-model="Navigation.feed.url"]').focus()}),c.Navigation.feed.url=e})}}}]),j.directive("newsArticleActions",function(){return{restrict:"A",scope:{newsArticleActions:"=",noPlugins:"="},link:function(a,b){for(var c=News.getArticleActionPlugins(),d=0;d<c.length;d+=1)c[d](b,a.newsArticleActions);a.noPlugins=0===c.length}}}),j.directive("newsAutoFocus",["$timeout",function(a){return function(b,c,d){var f=c;d.newsAutoFocus&&(f=e(d.newsAutoFocus)),a(function(){f.focus()},0)}}]),j.directive("newsBindHtmlUnsafe",function(){return function(a,b,c){a.$watch(c.newsBindHtmlUnsafe,function(){b.html(a.$eval(c.newsBindHtmlUnsafe))})}}),j.directive("newsDraggable",function(){return function(a,b,c){var e=a.$eval(c.newsDraggable);d.isDefined(e)?b.draggable(e):b.draggable(),c.$observe("newsDraggableDisable",function(a){"true"===a?b.draggable("disable"):b.draggable("enable")})}}),j.directive("newsDroppable",["$rootScope",function(a){return function(b,c,d){var f={accept:".feed",hoverClass:"drag-and-drop",greedy:!0,drop:function(f,g){e(".drag-and-drop").removeClass("drag-and-drop");var h={folderId:parseInt(c.data("id"),10),feedId:parseInt(e(g.draggable).data("id"),10)};a.$broadcast("moveFeedToFolder",h),b.$apply(d.droppable)}};c.droppable(f)}}]),j.directive("newsFinishedTransition",function(){return function(a,b,c){b.on("transitionend",function(){b.addClass(c.newsFinishedTransition)})}}),j.directive("newsFocus",["$timeout","$interpolate",function(a,b){return function(c,d,f){d.click(function(){var d=e(b(f.newsFocus)(c));a(function(){d.focus()},500)})}}]),j.directive("newsInstantNotification",function(){return{restrict:"E",link:function(a,b){b.hide();var c=b.html();f.Notification.showHtml(c)}}}),j.directive("newsPlayOne",["$rootScope",function(a){return{restrict:"A",link:function(b,c){c.on("play",function(){a.$broadcast("playing",c)}),a.$on("playing",function(a,b){b[0]!==c[0]&&c[0].pause()})}}}]),j.directive("newsPullToRefresh",["$rootScope",function(a){var b=!1;return{restrict:"A",scope:{newsPullToRefresh:"="},link:function(c,d){a.$on("$routeChangeStart",function(){b=!1,c.newsPullToRefresh=!1}),d.on("scroll",function(){0===d.scrollTop()&&b&&(c.newsPullToRefresh=!0),b=!0})}}}]),j.directive("newsReadFile",function(){return function(a,b,c){b.change(function(){var d=b[0].files[0],e=new FileReader;e.onload=function(b){a.$fileContent=b.target.result,a.$apply(c.newsReadFile)},e.readAsText(d)})}}),j.directive("newsRefreshMasonry",["$timeout",function(a){var b=function(b){a(function(){a(function(){b.parent().masonry({itemSelector:".grid-item",gutter:25,columnWidth:300})})})};return function(a,c){a.$last&&b(c)}}]),j.directive("newsScroll",["$timeout","ITEM_AUTO_PAGE_SIZE","MARK_READ_TIMEOUT","SCROLL_TIMEOUT",function(a,b,c,d){var f,g=function(a,b,c){for(var d=0,f=b.find(".item"),g=f.length-1;g>=0;g-=1){var h=e(f[g]);if(d>=a)break;if(h.position().top<0){c.$apply(c.newsScrollAutoPage);break}d+=1}},h=function(a,b,c){if(a){var d=[],f=b.find(".item:not(.read)");f.each(function(a,b){var c=e(b);return c.position().top<=-10?void d.push(parseInt(c.data("id"),10)):!1}),c.itemIds=d,c.$apply(c.newsScrollMarkRead)}};return{restrict:"A",scope:{newsScroll:"@",newsScrollAutoPage:"&",newsScrollMarkRead:"&",newsScrollEnabledMarkRead:"="},link:function(j,k){var l=!0,m=k;j.newsScroll&&(m=e(j.newsScroll));var n=function(){l&&(l=!1,a(function(){l=!0},1e3*d),g(b,k,j),f&&a.cancel(f),f=a(function(){h(j.newsScrollEnabledMarkRead,k,j),f=i},1e3*c))};m.on("scroll",n),j.$on("$destroy",function(){m.off("scroll",n)})}}}]),j.directive("newsSearch",["$document","$location",function(a,b){return{restrict:"E",scope:{onSearch:"="},link:function(a){var c=e("#searchbox");c.val(b.search().search);var d=function(){var b=c.val();a.$apply(function(){a.onSearch(b)})};c.on("search keyup",function(a){("search"===a.type||13===a.keyCode)&&d()}),a.$watch(function(){return b.search()},function(a){a&&a.search?c.val(a.search):c.val("")})}}}]),j.directive("newsStickyMenu",function(){return function(a,b,c){var d=40;e(c.newsStickyMenu).scroll(function(){var a=e(this).scrollTop();a>d?(b.addClass("fixed"),b.css("top",a)):b.removeClass("fixed")})}}),j.directive("newsStopPropagation",function(){return{restrict:"A",link:function(a,b){b.bind("click",function(a){a.stopPropagation()})}}}),j.directive("newsTimeout",["$timeout","$rootScope",function(a,b){return{restrict:"A",scope:{newsTimeout:"&"},link:function(c,d){var e=!1,f=7,g=a(c.newsTimeout,1e3*f);c.$on("$destroy",function(){e=!0,a.cancel(g)}),b.$on("$locationChangeStart",function(){a.cancel(g),e||(e=!0,d.remove(),c.newsTimeout())})}}}]),j.directive("newsTitleUnreadCount",["$window",function(a){var b=a.document.title,c=b.split("-"),d=c[0]||"News",e=c[1]||"ownCloud";return{restrict:"E",scope:{unreadCount:"@"},link:function(b,c,f){f.$observe("unreadCount",function(b){"0"!==b?a.document.title=d+"("+b+") - "+e:a.document.title=d+" - "+e})}}}]),j.directive("newsToggleShow",function(){return{restrict:"A",scope:{newsToggleShow:"@"},link:function(a,b){b.click(function(){var b=e(a.newsToggleShow);b.toggle()})}}}),j.directive("newsTriggerClick",function(){return function(a,b,c){b.click(function(){e(c.newsTriggerClick).trigger("click")})}})}(navigator,window,document,angular,jQuery,OC,oc_requesttoken,url);
-//# sourceMappingURL=app.min.js.map \ No newline at end of file
+var app=angular.module("News",["ngRoute","ngSanitize","ngAnimate"]);app.config(["$routeProvider","$provide","$httpProvider",function(e,n,r){"use strict";var i={FEED:0,FOLDER:1,STARRED:2,SUBSCRIPTIONS:3,SHARED:4,EXPLORE:5};n.constant("REFRESH_RATE",60),n.constant("ITEM_BATCH_SIZE",40),n.constant("ITEM_AUTO_PAGE_SIZE",20),n.constant("BASE_URL",OC.generateUrl("/apps/news")),n.constant("FEED_TYPE",i),n.constant("MARK_READ_TIMEOUT",.5),n.constant("SCROLL_TIMEOUT",.1),n.factory("CSRFInterceptor",["$q","BASE_URL","$window",function(e,t,n){return{request:function(r){var i=n.location.href.split(n.location.pathname)[0];return(0===r.url.indexOf(t)||0===r.url.indexOf(i))&&(r.headers.requesttoken=oc_requesttoken),r||e.when(r)}}}]);var o={0:t("news","Request failed, network connection unavailable!"),401:t("news","Request unauthorized. Are you logged in?"),403:t("news","Request forbidden. Are you an admin?"),412:t("news","Token expired or app not enabled! Reload the page!"),500:t("news","Internal server error! Please check your data/owncloud.log file for additional information!"),503:t("news","Request failed, ownCloud is in currently in maintenance mode!")};n.factory("ConnectionErrorInterceptor",["$q","$timeout",function(e,t){var n;return{responseError:function(r){return r.status in o&&(n&&t.cancel(n),OC.Notification.hide(),OC.Notification.showHtml(o[r.status]),n=t(function(){OC.Notification.hide()},5e3)),e.reject(r)}}}]),r.interceptors.push("CSRFInterceptor"),r.interceptors.push("ConnectionErrorInterceptor");var s=function(e){return{data:["$http","$route","$q","$location","BASE_URL","ITEM_BATCH_SIZE","FEED_TYPE","SettingsResource","FeedResource",function(t,n,r,i,o,s,a,u,d){var c=u.get("showAll"),l=u.get("oldestFirst"),f=i.search().search||"",h=r.defer();if(null===c||null===l)h.resolve({});else{var p={type:e,limit:s,showAll:c,oldestFirst:l,search:f};if(void 0!==n.current.params.id&&(p.id=n.current.params.id),e===a.FEED){var g=d.getById(p.id);void 0===g||2===g.ordering?p.oldestFirst=!1:1===g.ordering&&(p.oldestFirst=!0)}t({url:o+"/items",method:"GET",params:p}).success(function(e){h.resolve(e)})}return h.promise}]}},a=function(){return{sites:["$http","$q","BASE_URL","$location","Publisher","SettingsResource",function(e,t,n,r,i,o){var s=t.defer(),a=r.search().lang;return a||(a=o.get("language")),e.get(n+"/settings").then(function(t){i.publishAll(t);var n=o.get("exploreUrl").replace(/\/+$/,""),r=n+"/feeds."+a+".json",s=n+"/feeds.en.json";return e.get(r)["catch"](function(){return e.get(s)})}).then(function(e){s.resolve(e.data)})["catch"](function(){s.reject()}),s.promise}]}};e.when("/items",{controller:"ContentController as Content",templateUrl:"content.html",resolve:s(i.SUBSCRIPTIONS),type:i.SUBSCRIPTIONS}).when("/items/starred",{controller:"ContentController as Content",templateUrl:"content.html",resolve:s(i.STARRED),type:i.STARRED}).when("/items/feeds/:id",{controller:"ContentController as Content",templateUrl:"content.html",resolve:s(i.FEED),type:i.FEED}).when("/items/folders/:id",{controller:"ContentController as Content",templateUrl:"content.html",resolve:s(i.FOLDER),type:i.FOLDER}).when("/explore",{controller:"ExploreController as Explore",templateUrl:"explore.html",resolve:a(),type:i.EXPLORE}).when("/shortcuts",{templateUrl:"shortcuts.html",type:-1})}]),app.run(["$rootScope","$location","$http","$q","$interval","$route","Loading","ItemResource","FeedResource","FolderResource","SettingsResource","Publisher","BASE_URL","FEED_TYPE","REFRESH_RATE",function(e,t,n,r,i,o,s,a,u,d,c,l,f,h,p){"use strict";s.setLoading("global",!0),l.subscribe(a).toChannels(["items","newestItemId","starred"]),l.subscribe(d).toChannels(["folders"]),l.subscribe(u).toChannels(["feeds"]),l.subscribe(c).toChannels(["settings"]);var g=r.defer();n.get(f+"/settings").success(function(e){l.publishAll(e),g.resolve()});var v=r.defer(),m=t.path();n.get(f+"/feeds/active").success(function(e){var n;switch(e.activeFeed.type){case h.FEED:n="/items/feeds/"+e.activeFeed.id;break;case h.FOLDER:n="/items/folders/"+e.activeFeed.id;break;case h.STARRED:n="/items/starred";break;case h.EXPLORE:n="/explore";break;default:n="/items"}/^\/items(\/(starred|explore|feeds\/\d+|folders\/\d+))?\/?$/.test(m)||t.path(n),v.resolve()});var y,E=r.defer();n.get(f+"/feeds").success(function(e){y=e,E.resolve()});var C,F=r.defer();n.get(f+"/folders").success(function(e){C=e,F.resolve()}),r.all([E.promise,F.promise]).then(function(){l.publishAll(y),l.publishAll(C),0===y.feeds.length&&0===C.folders.length&&t.path("/explore")}),r.all([g.promise,v.promise,E.promise,F.promise]).then(function(){o.reload(),s.setLoading("global",!1)}),i(function(){n.get(f+"/feeds").success(function(e){l.publishAll(e)}),n.get(f+"/folders").success(function(e){l.publishAll(e)})},1e3*p),e.$on("$routeChangeStart",function(){s.setLoading("content",!0)}),e.$on("$routeChangeSuccess",function(){s.setLoading("content",!1)}),e.$on("$routeChangeError",function(){t.path("/items")})}]),app.controller("AppController",["Loading","FeedResource","FolderResource",function(e,t,n){"use strict";this.loading=e,this.isFirstRun=function(){return 0===t.size()&&0===n.size()},this.play=function(e){this.playingItem=e}}]),app.controller("ContentController",["Publisher","FeedResource","ItemResource","SettingsResource","data","$route","$routeParams","$location","FEED_TYPE","ITEM_AUTO_PAGE_SIZE","Loading",function(e,t,n,r,i,o,s,a,u,d,c){"use strict";n.clear(),e.publishAll(i),this.isAutoPagingEnabled=!0,n.size()>=d?this.isNothingMoreToAutoPage=!1:this.isNothingMoreToAutoPage=!0,this.getItems=function(){return n.getAll()},this.toggleStar=function(e){n.toggleStar(e)},this.toggleItem=function(e){this.isCompactView()&&(e.show=!e.show)},this.isShowAll=function(){return r.get("showAll")},this.markRead=function(e){var r=n.get(e);r.keepUnread||r.unread!==!0||(n.markItemRead(e),t.markItemOfFeedRead(r.feedId))},this.getFeed=function(e){return t.getById(e)},this.toggleKeepUnread=function(e){var r=n.get(e);r.unread||(t.markItemOfFeedUnread(r.feedId),n.markItemRead(e,!1)),r.keepUnread=!r.keepUnread};var l=this,f=function(){var e=r.get("oldestFirst");if(l.isFeed()){var n=t.getById(s.id);n&&1===n.ordering?e=!0:n&&2===n.ordering&&(e=!1)}return e};this.orderBy=function(){return f()?"id":"-id"},this.isCompactView=function(){return r.get("compact")},this.isCompactExpand=function(){return r.get("compactExpand")},this.autoPagingEnabled=function(){return this.isAutoPagingEnabled},this.markReadEnabled=function(){return!r.get("preventReadOnScroll")},this.scrollRead=function(e){var r=[],i=[];e.forEach(function(e){var t=n.get(e);t.keepUnread||(r.push(e),i.push(t.feedId))}),r.length>0&&(t.markItemsOfFeedsRead(i),n.markItemsRead(r))},this.isFeed=function(){return o.current.$$route.type===u.FEED},this.autoPage=function(){if(!this.isNothingMoreToAutoPage){if(!this.isAutoPagingEnabled)return void(this.autoPageAgain=!0);this.isAutoPagingEnabled=!1,this.autoPageAgain=!1;var t=o.current.$$route.type,i=s.id,u=f(),l=r.get("showAll"),h=this,p=a.search().search;c.setLoading("autopaging",!0),n.autoPage(t,i,u,l,p).success(function(t){e.publishAll(t),t.items.length>=d?h.isAutoPagingEnabled=!0:h.isNothingMoreToAutoPage=!0,h.isAutoPagingEnabled&&h.autoPageAgain&&h.autoPage()}).error(function(){h.isAutoPagingEnabled=!0})["finally"](function(){c.setLoading("autopaging",!1)})}},this.getRelativeDate=function(e){if(void 0!==e&&""!==e){var t=r.get("language"),n=moment.unix(e).locale(t).fromNow()+"";return n}return""},this.refresh=function(){o.reload()},this.getMediaType=function(e){return e&&0===e.indexOf("audio")?"audio":e&&0===e.indexOf("video")?"video":void 0}}]),app.controller("ExploreController",["sites","$rootScope","FeedResource","SettingsResource","$location",function(e,t,n,r,i){"use strict";this.sites=e,this.feeds=Object.keys(e).map(function(t){return[t,e[t]]}).reduce(function(e,t){var n=t[0],r=t[1];return r.forEach(function(e){e.category=n}),e.concat(r)},[]),this.feedExists=function(e){return void 0!==n.getByLocation(e)},this.subscribeTo=function(e){t.$broadcast("addFeed",e)},this.isCategoryShown=function(e){return e.filter(function(e){return void 0===n.getByLocation(e.feed)}).length>0},this.getSupportedLanguageCodes=function(){return r.getSupportedLanguageCodes()},this.getCurrentLanguageCode=function(){var e=i.search().lang;return e||(e=r.get("language")),e},this.showLanguage=function(e){i.url("/explore/?lang="+e)},this.selectedLanguageCode=this.getCurrentLanguageCode()}]),app.controller("NavigationController",["$route","FEED_TYPE","FeedResource","FolderResource","ItemResource","SettingsResource","Publisher","$rootScope","$location","$q",function(e,t,n,r,i,o,s,a,u,d){"use strict";this.feedError="",this.showNewFolder=!1,this.renamingFolder=!1,this.addingFeed=!1,this.addingFolder=!1,this.folderError="",this.renameError="",this.feed={};var c=function(){return parseInt(e.current.params.id,10)};this.getLanguageCode=function(){return o.get("language")},this.getFeeds=function(){return n.getAll()},this.getFolders=function(){return r.getAll()},this.markFolderRead=function(e){n.markFolderRead(e),n.getByFolderId(e).forEach(function(e){i.markFeedRead(e.id)})},this.markFeedRead=function(e){i.markFeedRead(e),n.markFeedRead(e)},this.markRead=function(){i.markRead(),n.markRead()},this.isShowAll=function(){return o.get("showAll")},this.getFeedsOfFolder=function(e){return n.getByFolderId(e)},this.getUnreadCount=function(){return n.getUnreadCount()},this.isUnread=function(){return this.getUnreadCount()>0},this.getFeedUnreadCount=function(e){var t=n.getById(e);return void 0!==t?t.unreadCount:0},this.isFeedUnread=function(e){return this.getFeedUnreadCount(e)>0},this.getFolderUnreadCount=function(e){return n.getFolderUnreadCount(e)},this.isFolderUnread=function(e){return this.getFolderUnreadCount(e)>0},this.getStarredCount=function(){return i.getStarredCount()},this.isStarredUnread=function(){return this.getStarredCount()>0},this.toggleFolder=function(e){r.toggleOpen(e)},this.hasFeeds=function(e){return void 0!==n.getFolderUnreadCount(e)},this.subFeedActive=function(r){var i=e.current.$$route.type;if(i===t.FEED){var o=n.getById(c());if(void 0!==o&&o.folderId===r)return!0}return!1},this.isSubscriptionsActive=function(){return e.current&&e.current.$$route.type===t.SUBSCRIPTIONS},this.isStarredActive=function(){return e.current&&e.current.$$route.type===t.STARRED},this.isExploreActive=function(){return e.current&&e.current.$$route.type===t.EXPLORE},this.isFolderActive=function(n){return e.current&&e.current.$$route.type===t.FOLDER&&c()===n},this.isFeedActive=function(n){return e.current&&e.current.$$route.type===t.FEED&&c()===n},this.folderNameExists=function(e){return e=e||"",void 0!==r.get(e.trim())},this.feedUrlExists=function(e){return e=e||"",e=e.trim(),void 0!==n.get(e)||void 0!==n.get("http://"+e)},this.createFeed=function(e){var t=this;this.showNewFolder=!1,this.addingFeed=!0;var i=e.newFolder,o=e.existingFolder||{id:0};void 0===i||""===i?(o.getsFeed=!0,n.create(e.url,o.id,void 0).then(function(e){s.publishAll(e),u.path("/items/feeds/"+e.feeds[0].id+"/")})["finally"](function(){o.getsFeed=void 0,e.url="",t.addingFeed=!1})):r.create(i).then(function(n){s.publishAll(n),e.existingFolder=r.get(n.folders[0].name),e.newFolder=void 0,t.createFeed(e)})},this.createFolder=function(e){var t=this;this.addingFolder=!0,r.create(e.name).then(function(e){s.publishAll(e)})["finally"](function(){t.addingFolder=!1,e.name=""})},this.moveFeed=function(t,r){var i=!1,o=n.getById(t);o.folderId!==r&&((this.isFolderActive(o.folderId)||this.isFolderActive(r))&&(i=!0),n.move(t,r),i&&e.reload())},this.renameFeed=function(e){n.patch(e.id,{title:e.title}),e.editing=!1},this.renameFolder=function(e,t){e.renameError="",this.renamingFolder=!0;var n=this;e.name===t?(e.renameError="",e.editing=!1,this.renamingFolder=!1):r.rename(e.name,t).then(function(){e.renameError="",e.editing=!1},function(t){e.renameError=t})["finally"](function(){n.renamingFolder=!1})},this.reversiblyDeleteFeed=function(t){n.reversiblyDelete(t.id)["finally"](function(){e.reload()})},this.undoDeleteFeed=function(t){n.undoDelete(t.id)["finally"](function(){e.reload()})},this.deleteFeed=function(e){n["delete"](e.url)},this.reversiblyDeleteFolder=function(t){d.all(n.reversiblyDeleteFolder(t.id),r.reversiblyDelete(t.name))["finally"](function(){e.reload()})},this.undoDeleteFolder=function(t){d.all(n.undoDeleteFolder(t.id),r.undoDelete(t.name))["finally"](function(){e.reload()})},this.deleteFolder=function(e){n.deleteFolder(e.id),r["delete"](e.name)},this.setOrdering=function(t,r){n.patch(t.id,{ordering:r}),e.reload()},this.togglePinned=function(e){var t=n.getById(e);return t?n.patch(e,{pinned:!t.pinned}):void 0},this.setUpdateMode=function(e,t){return n.patch(e,{updateMode:t})},this.toggleFullText=function(t){a.$broadcast("$routeChangeStart"),n.toggleFullText(t.id)["finally"](function(){a.$broadcast("$routeChangeSuccess"),e.reload()})},this.search=function(e){""===e?u.search("search",null):u.search("search",e)};var l=this;a.$on("moveFeedToFolder",function(e,t){l.moveFeed(t.feedId,t.folderId)});var f=function(){var i;e.current&&(i=e.current.$$route.type);var o=0;if(i===t.FOLDER)o=c();else if(i===t.FEED){var s=n.getById(c());s&&(o=s.folderId)}var a;0!==o&&(a=r.getById(o)),l.feed.existingFolder=a};a.$on("$routeChangeSuccess",function(){f()})}]),app.controller("SettingsController",["$route","$q","SettingsResource","ItemResource","OPMLParser","OPMLImporter","Publisher",function(e,t,n,r,i,o,s){"use strict";this.isOPMLImporting=!1,this.isArticlesImporting=!1,this.opmlImportError=!1,this.articleImportError=!1;var a=function(t,r){n.set(t,r),["showAll","oldestFirst","compact"].indexOf(t)>=0&&e.reload()};this.toggleSetting=function(e){a(e,!this.getSetting(e))},this.getSetting=function(e){return n.get(e)},this.importOPML=function(e){this.opmlImportError=!1,this.articleImportError=!1;try{this.isOPMLImporting=!1;var t=i.parse(e),n=this,r=5;o.importFolders(t).then(function(e){return o.importFeedQueue(e,r)})["finally"](function(){n.isOPMLImporting=!1})}catch(s){console.error(s),this.isOPMLImporting=!1,this.opmlImportError=!0}},this.importArticles=function(e){this.opmlImportError=!1,this.articleImportError=!1;try{this.isArticlesImporting=!0;var t=JSON.parse(e),n=this;r.importArticles(t).success(function(e){s.publishAll(e)})["finally"](function(){n.isArticlesImporting=!1})}catch(i){console.error(i),this.articleImportError=!0,this.isArticlesImporting=!1}}}]),app.filter("trustUrl",["$sce",function(e){"use strict";return function(t){return e.trustAsResourceUrl(t)}}]),app.filter("unreadCountFormatter",function(){"use strict";return function(e){return e>999?"999+":e}}),app.factory("FeedResource",["Resource","$http","BASE_URL","$q",function(e,t,n,r){"use strict";var i=function(t,n,r){e.call(this,t,n,"url"),this.ids={},this.locations={},this.unreadCount=0,this.folderUnreadCount={},this.folderIds={},this.$q=r};return i.prototype=Object.create(e.prototype),i.prototype.receive=function(t){e.prototype.receive.call(this,t),this.updateUnreadCache(),this.updateFolderCache()},i.prototype.clear=function(){e.prototype.clear.call(this),this.unreadCount=0,this.folderUnreadCount={},this.folderIds={},this.ids={},this.locations={}},i.prototype.updateUnreadCache=function(){this.unreadCount=0,this.folderUnreadCount={};var e=this;this.values.forEach(function(t){t.unreadCount&&(e.unreadCount+=t.unreadCount),void 0!==t.folderId&&(e.folderUnreadCount[t.folderId]=e.folderUnreadCount[t.folderId]||0,e.folderUnreadCount[t.folderId]+=t.unreadCount)})},i.prototype.updateFolderCache=function(){this.folderIds={};var e=this;this.values.forEach(function(t){e.folderIds[t.folderId]=e.folderIds[t.folderId]||[],e.folderIds[t.folderId].push(t)})},i.prototype.add=function(t){e.prototype.add.call(this,t),void 0!==t.id&&(this.ids[t.id]=this.hashMap[t.url]),void 0!==t.location&&(this.locations[t.location]=this.hashMap[t.url])},i.prototype.markRead=function(){this.values.forEach(function(e){e.unreadCount=0}),this.updateUnreadCache()},i.prototype.markFeedRead=function(e){this.ids[e].unreadCount=0,this.updateUnreadCache()},i.prototype.markFolderRead=function(e){this.values.forEach(function(t){t.folderId===e&&(t.unreadCount=0)}),this.updateUnreadCache()},i.prototype.markItemOfFeedRead=function(e){this.ids[e].unreadCount-=1,this.updateUnreadCache()},i.prototype.markItemsOfFeedsRead=function(e){var t=this;e.forEach(function(e){t.ids[e].unreadCount-=1}),this.updateUnreadCache()},i.prototype.markItemOfFeedUnread=function(e){this.ids[e].unreadCount+=1,this.updateUnreadCache()},i.prototype.getUnreadCount=function(){return this.unreadCount},i.prototype.getFolderUnreadCount=function(e){return this.folderUnreadCount[e]},i.prototype.getByFolderId=function(e){return this.folderIds[e]||[]},i.prototype.getById=function(e){return this.ids[e]},i.prototype.getByLocation=function(e){return this.locations[e]},i.prototype.move=function(e,t){var n=this.getById(e);return n.folderId=t,this.updateFolderCache(),this.updateUnreadCache(),this.patch(e,{folderId:t})},i.prototype.create=function(e,t,n){e=e.trim(),e.startsWith("http")||(e="https://"+e),void 0!==n&&(n=n.trim());var r={url:e,folderId:t||0,title:n||e,unreadCount:0};this.add(r),this.updateFolderCache();var i=this.$q.defer();return this.http({method:"POST",url:this.BASE_URL+"/feeds",data:{url:e,parentFolderId:t||0,title:n}}).success(function(e){i.resolve(e)}).error(function(e){r.faviconLink="",r.error=e.message,i.reject()}),i.promise},i.prototype.reversiblyDelete=function(e,t,n){var r=this.getById(e);return r&&n!==!0&&(r.deleted=!0),t!==!1&&this.updateUnreadCache(),this.http["delete"](this.BASE_URL+"/feeds/"+e)},i.prototype.reversiblyDeleteFolder=function(e){var t=this,n=[];this.getByFolderId(e).forEach(function(e){n.push(t.reversiblyDelete(e.id,!1,!0))}),this.updateUnreadCache();var r=this.$q.all(n);return r.promise},i.prototype["delete"]=function(t,n){var r=this.get(t);return void 0!==r&&r.id&&delete this.ids[r.id],void 0!==r&&r.location&&delete this.locations[r.location],e.prototype["delete"].call(this,t),n!==!1&&(this.updateUnreadCache(),this.updateFolderCache()),r},i.prototype.deleteFolder=function(e){var t=this;this.getByFolderId(e).forEach(function(e){t["delete"](e.url,!1)}),this.updateUnreadCache(),this.updateFolderCache()},i.prototype.undoDelete=function(e,t){var n=this.getById(e);return n&&(n.deleted=!1),t!==!1&&this.updateUnreadCache(),this.http.post(this.BASE_URL+"/feeds/"+e+"/restore")},i.prototype.undoDeleteFolder=function(e){var t=this,n=[];this.getByFolderId(e).forEach(function(e){n.push(t.undoDelete(e.id,!1))}),this.updateUnreadCache();var r=this.$q.all(n);return r.promise},i.prototype.setOrdering=function(e,t){var n=this.getById(e);if(n){n.ordering=t;var r=this.BASE_URL+"/feeds/"+e;return this.http.patch(r,{ordering:t})}},i.prototype.setPinned=function(e,t){var n=this.getById(e);if(n){n.pinned=t;var r=this.BASE_URL+"/feeds/"+e;return this.http.patch(r,{pinned:t})}},i.prototype.patch=function(e,t){var n=this.getById(e);if(n){Object.keys(t).forEach(function(e){n[e]=t[e]});var r=this.BASE_URL+"/feeds/"+e;return this.http.patch(r,t)}},i.prototype.toggleFullText=function(e){var t=this.getById(e);return this.patch(e,{fullTextEnabled:!t.fullTextEnabled})},new i(t,n,r)}]),app.factory("FolderResource",["Resource","$http","BASE_URL","$q",function(e,t,n,r){"use strict";var i=function(t,n,r){e.call(this,t,n,"name"),this.deleted=null,this.$q=r,this.ids={}};return i.prototype=Object.create(e.prototype),i.prototype.add=function(t){e.prototype.add.call(this,t),void 0!==t.id&&(this.ids[t.id]=this.hashMap[t.name])},i.prototype.clear=function(){e.prototype.clear.call(this),this.ids={}},i.prototype["delete"]=function(t){var n=this.get(t);return void 0!==n&&n.id&&delete this.ids[n.id],e.prototype["delete"].call(this,t),n},i.prototype.toggleOpen=function(e){var t=this.get(e);return t.opened=!t.opened,this.http({url:this.BASE_URL+"/folders/"+t.id+"/open",method:"POST",data:{folderId:t.id,open:t.opened}})},i.prototype.rename=function(e,t){var n=this.get(e),r=this.$q.defer(),i=this;return this.http({url:this.BASE_URL+"/folders/"+n.id+"/rename",method:"POST",data:{folderName:t}}).success(function(){n.name=t,delete i.hashMap[e],i.hashMap[t]=n,r.resolve()}).error(function(e){r.reject(e.message)}),r.promise},i.prototype.getById=function(e){return this.ids[e]},i.prototype.create=function(e){e=e.trim();var t={name:e};this.add(t);var n=this.$q.defer();return this.http({url:this.BASE_URL+"/folders",method:"POST",data:{folderName:e}}).success(function(e){n.resolve(e)}).error(function(e){t.error=e.message}),n.promise},i.prototype.reversiblyDelete=function(e){var t=this.get(e),n=t.id;return t.deleted=!0,this.http["delete"](this.BASE_URL+"/folders/"+n)},i.prototype.undoDelete=function(e){var t=this.get(e),n=t.id;return t.deleted=!1,this.http.post(this.BASE_URL+"/folders/"+n+"/restore")},new i(t,n,r)}]),app.factory("ItemResource",["Resource","$http","BASE_URL","ITEM_BATCH_SIZE",function(e,t,n,r){"use strict";var i=function(t,n,r){e.call(this,t,n),this.batchSize=r,this.clear()};return i.prototype=Object.create(e.prototype),i.prototype.clear=function(){this.starredCount=0,this.lowestId=0,this.highestId=0,e.prototype.clear.call(this)},i.prototype.receive=function(t,n){switch(n){case"newestItemId":this.newestItemId=t;break;case"starred":this.starredCount=t;break;default:var r=this;t.forEach(function(e){0===r.lowestId&&(r.lowestId=e.id),0===r.highestId&&(r.highestId=e.id),e.id>r.highestId&&(r.highestId=e.id),e.id<r.lowestId&&(r.lowestId=e.id)}),e.prototype.receive.call(this,t,n)}},i.prototype.getNewestItemId=function(){return this.newestItemId},i.prototype.getStarredCount=function(){return this.starredCount},i.prototype.star=function(e,t){void 0===t&&(t=!0);var n=this.get(e),r=this.BASE_URL+"/items/"+n.feedId+"/"+n.guidHash+"/star";return n.starred=t,t?this.starredCount+=1:this.starredCount-=1,this.http({url:r,method:"POST",data:{isStarred:t}})},i.prototype.toggleStar=function(e){this.get(e).starred?this.star(e,!1):this.star(e,!0)},i.prototype.markItemRead=function(e,t){return void 0===t&&(t=!0),this.get(e).unread=!t,this.http({url:this.BASE_URL+"/items/"+e+"/read",method:"POST",data:{isRead:t}})},i.prototype.markItemsRead=function(e){var t=this;return e.forEach(function(e){t.get(e).unread=!1}),this.http({url:this.BASE_URL+"/items/read/multiple",method:"POST",data:{itemIds:e}})},i.prototype.markFeedRead=function(e,t){void 0===t&&(t=!0);var n=this.values.filter(function(t){return t.feedId===e});return n.forEach(function(e){e.unread=!t}),this.http.post(this.BASE_URL+"/feeds/"+e+"/read",{highestItemId:this.getNewestItemId()})},i.prototype.markRead=function(){return this.values.forEach(function(e){e.unread=!1}),this.http({url:this.BASE_URL+"/items/read",method:"POST",data:{highestItemId:this.getNewestItemId()}})},i.prototype.autoPage=function(e,t,n,r,i){var o;return o=n?this.highestId:this.lowestId,this.http({url:this.BASE_URL+"/items",method:"GET",params:{type:e,id:t,offset:o,limit:this.batchSize,oldestFirst:n,showAll:r,search:i}})},i.prototype.importArticles=function(e){return this.http({url:this.BASE_URL+"/feeds/import/articles",method:"POST",data:{json:e}})},new i(t,n,r)}]),app.service("Loading",function(){"use strict";this.loading={global:!1,content:!1,autopaging:!1},this.setLoading=function(e,t){this.loading[e]=t},this.isLoading=function(e){return this.loading[e]}}),app.service("OPMLImporter",["FeedResource","FolderResource","Publisher","$q",function(e,t,n,r){"use strict";var i=function(o){var s=r.defer();if(o.length>0){var a=o.pop(),u=a.url,d=a.title,c=0,l=a.folderName;if(void 0!==l&&void 0!==t.get(l)){var f=t.get(l);f.opened=!0,c=f.id,f.getsFeed=!0,f.getsFeedCounter=f.getsFeedCounter||0,f.getsFeedCounter+=1}void 0!==u&&void 0===e.get(u)&&e.create(u,c,d).then(function(e){n.publishAll(e)})["finally"](function(){0!==c&&(f.getsFeedCounter-=1,0===f.getsFeedCounter&&(f.getsFeed=!1)),i(o)})}else s.resolve();return s.promise};this.importFolders=function(e){var i=[],o=[];e.folders.forEach(function(e){if(void 0!==e.name){if(void 0===t.get(e.name)){var r=t.create(e.name).then(function(e){n.publishAll(e)});o.push(r)}e.feeds.forEach(function(t){t.folderName=e.name,i.push(t)})}}),i=i.concat(e.feeds);var s=r.defer();return r.all(o)["finally"](function(){s.resolve(i)}),s.promise},this.importFeedQueue=function(e,t){for(var n=r.defer(),o=[],s=0;t>s;s+=1)o.push(i(e));return r.all(o).then(function(){n.resolve()}),n.promise}}]),app.service("OPMLParser",function(){"use strict";var e=function(e){var t=e.attr("xmlUrl")||e.attr("htmlUrl"),n=e.attr("title")||e.attr("text")||t;return void 0===t?{type:"folder",name:n,feeds:[]}:{type:"feed",name:n,url:t}},t=function(n,r,i){for(var o=0;o<n.length;o+=1){var s=$(n[o]),a=e(s);"feed"===a.type?r.feeds.push(a):i?(t(s.children("outline"),a,!1),r.folders.push(a)):t(s.children("outline"),r,!1)}return r};this.parse=function(e){e=$.parseXML(e);var n=$(e).find("body > outline"),r={feeds:[],folders:[]};return t(n,r,!0)}}),app.service("Publisher",function(){"use strict";this.channels={},this.subscribe=function(e){var t=this;return{toChannels:function(n){n.forEach(function(n){t.channels[n]=t.channels[n]||[],t.channels[n].push(e)})}}},this.publishAll=function(e){var t=this;Object.keys(e).forEach(function(n){var r=t.channels[n];void 0!==r&&r.forEach(function(t){t.receive(e[n],n)})})}}),app.factory("Resource",function(){"use strict";var e=function(e,t,n){this.id=n||"id",this.values=[],this.hashMap={},this.http=e,this.BASE_URL=t};return e.prototype.receive=function(e){var t=this;e.forEach(function(e){t.add(e)})},e.prototype.add=function(e){var t=this.hashMap[e[this.id]];void 0===t?(this.values.push(e),this.hashMap[e[this.id]]=e):Object.keys(e).forEach(function(n){t[n]=e[n]})},e.prototype.size=function(){return this.values.length},e.prototype.get=function(e){return this.hashMap[e]},e.prototype["delete"]=function(e){var t=this,n=this.values.findIndex(function(n){return n[t.id]===e});void 0!==n&&this.values.splice(n,1),void 0!==this.hashMap[e]&&delete this.hashMap[e]},e.prototype.clear=function(){for(this.hashMap={};this.values.length>0;)this.values.pop()},e.prototype.getAll=function(){return this.values},e}),app.service("SettingsResource",["$http","BASE_URL",function(e,t){"use strict";this.settings={language:"en",showAll:null,compact:!1,oldestFirst:null,preventReadOnScroll:!1,compactExpand:!1,exploreUrl:""},this.defaultLanguageCode="en",this.supportedLanguageCodes=["ar-ma","ar","bg","ca","cs","cv","da","de","el","en","en-ca","en-gb","eo","es","et","eu","fi","fr-ca","fr","gl","he","hi","hu","id","is","it","ja","ka","ko","lv","ms-my","nb","ne","nl","pl","pt-br","pt","ro","ru","sk","sl","sv","th","tr","tzm-la","tzm","uk","zh-cn","zh-tw"],this.getSupportedLanguageCodes=function(){return this.supportedLanguageCodes},this.receive=function(e){var t=this;Object.keys(e).forEach(function(n){var r=e[n];"language"===n&&(r=t.processLanguageCode(r)),t.settings[n]=r})},this.get=function(e){return this.settings[e]},this.set=function(n,r){return this.settings[n]=r,e({url:t+"/settings",method:"PUT",data:{language:this.settings.language,showAll:this.settings.showAll,compact:this.settings.compact,oldestFirst:this.settings.oldestFirst,compactExpand:this.settings.compactExpand,preventReadOnScroll:this.settings.preventReadOnScroll}})},this.processLanguageCode=function(e){return e=e.replace("_","-").toLowerCase(),this.supportedLanguageCodes.indexOf(e)<0&&(e=e.split("-")[0]),this.supportedLanguageCodes.indexOf(e)<0&&(e=this.defaultLanguageCode),e}}]),function(e,t,n,r,i,o){"use strict";var s=e.location,a=e.localStorage,u=function(e,t,r){var i=n.isContentHandlerRegistered,o=function(e,t){return i?"new"!==i(e,t):a.getItem("registeredHandler")===t};n.registerContentHandler&&!o(e,t)&&(n.registerContentHandler(e,t,r),i||a.setItem("registeredHandler",t))},d=s.protocol+"//"+s.host+s.pathname,c=d+"?subscribe_to=%s",l="application/vnd.mozilla.maybe.feed",f="ownCloud News @ "+d;u(l,c,f),i(t).ready(function(){var e=r("?subscribe_to");if(e&&"undefined"!==e){i("#new-feed").show();var t=i('input[ng-model="Navigation.feed.url"]');t.val(e),t.trigger("input"),setTimeout(function(){t.focus()},1e3)}})}(window,document,navigator,url,$),function(e,t){"use strict";e.addEventListener("beforeunload",function(){var e=t.querySelector("#app-content");e.scrollTo(0,0)})}(window,document),function(e,t,n){"use strict";var r=function(e){return!(e.is("input")||e.is("select")||e.is("textarea")||e.is("checkbox"))},i=function(e){return!(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey)},o=function(e){var t=".active > .app-navigation-entry-menu .mark-read button",n=e.find(t);n.length>0&&n.trigger("click")},s=function(e,t){var n=e.offset().top-t.offset().top,r=n+e.height(),i=t.height();return n>=0&&i>r},a=function(e,t,n){0===e.length||!n&&s(e,t)||t.scrollTop(e.offset().top-t.offset().top+t.scrollTop())},u=function(e){var t=e.find(".active");a(t,e.children("ul"),!0)},d=function(e){e.find(".active > a:visible").trigger("click")},c=function(e,t){if(0===t.scrollTop()){var n=t.find(".pull-to-refresh");n.hasClass("show-pull-to-refresh")?n.hasClass("done")&&d(e):n.addClass("show-pull-to-refresh")}},l=function(e,t){e.children("a:visible").trigger("click"),a(e,t.children("ul"))},f=function(e){var t=e.find(".active"),r=e.find(".explore-feed,.subscriptions-feed:visible,.starred-feed:visible,.feed:visible");if(t.hasClass("folder"))for(;t.length>0;){var i=t.find(".feed:visible");if(i.length>0)return void l(n(i[0]),e);t=t.next(".folder")}else for(var o=0;o<r.length-1;o+=1){var s=r[o];if(s===t[0]){var a=r[o+1];l(n(a),e);break}}},h=function(e){return e.parent().parent(".folder")},p=function(e,t){var r,i=e.find(".folder:visible");r=t?i.length-1:0,i.length>0&&l(n(i[r]),e)},g=function(e){var t=e.find(".active");if(t.hasClass("folder"))l(t.prevAll(".folder:visible").first(),e);else if(t.hasClass("feed")){var n=h(t);n.length>0?l(n,e):p(e,!0)}else p(e,!0)},v=function(e){var t=e.find(".active");if(t.hasClass("folder"))l(t.nextAll(".folder:visible").first(),e);else if(t.hasClass("feed")){var n=h(t);n.length>0?l(n.nextAll(".folder:visible").first(),e):p(e)}else p(e)},m=function(e){var t=e.find(".active"),r=e.find(".explore-feed,.subscriptions-feed:visible,.starred-feed:visible,.feed:visible");if(t.hasClass("folder")){for(var i=t.prev(".folder");i.length>0;){var o=i.find(".feed:visible");if(o.length>0)return void l(n(o[o.length-1]),e);i=i.prev(".folder")}var s=t.siblings(".feed");if(s.length>0)return void l(n(s[s.length-1]),e);var a=n(".starred-feed:visible");return void(a.length>0&&l(a,e))}for(var u=r.length-1;u>0;u-=1){var d=r[u];if(d===t[0]){var c=r[u-1];l(n(c),e);break}}},y=function(e,t){var r=e.find(".item");r.each(function(e,r){return r=n(r),r.height()+r.position().top>30?(t(r),!1):void 0})},E=function(e){y(e,function(e){e.find(".toggle-keep-unread").trigger("click")})},C=function(e){y(e,function(e){e.find(".star").trigger("click")})},F=function(e){y(e,function(e){e.find(".utils").trigger("click")})},I=function(t){y(t,function(t){t.trigger("click"),e.open(t.find(".external:visible").attr("href"),"_blank")})},w=function(e,t,n){e.scrollTop(t.offset().top-e.offset().top+e.scrollTop()),n&&y(e,function(e){e.hasClass("open")||e.find(".utils").trigger("click")})},R=function(e,t){var r=e.find(".item"),i=!1;r.each(function(r,o){return o=n(o),0===o.position().top&&t&&!o.hasClass("open")||o.position().top>10?(w(e,o,t),i=!0,!1):void 0}),i||e.scrollTop(e.prop("scrollHeight"))},b=function(e,t,r){var i=t.find(".item"),o=!1;i.each(function(i,s){if(s=n(s),s.position().top+10>=0){var a=s.prev();return a.length>0?w(t,a,r):(c(e,t),t.scrollTop(0)),o=!0,!1}}),!o&&i.length>0&&w(t,i.last())};n(t).keyup(function(e){var t=e.keyCode,s=n("#app-content"),a=n("#app-navigation"),l=n("#articles.compact").length>0,h="true"===n("#articles").attr("news-compact-expand"),p=l&&h;r(n(":focus"))&&i(e)?[74,78,39].indexOf(t)>=0?(e.preventDefault(),R(s,p)):[75,80,37].indexOf(t)>=0?(e.preventDefault(),b(a,s,p)):[85].indexOf(t)>=0?(e.preventDefault(),
+E(s)):[69].indexOf(t)>=0?(e.preventDefault(),F(s)):[73,83,76].indexOf(t)>=0?(e.preventDefault(),C(s)):[72].indexOf(t)>=0?(e.preventDefault(),C(s),R(s)):[79].indexOf(t)>=0?(e.preventDefault(),I(s)):[82].indexOf(t)>=0?(e.preventDefault(),d(a)):[70].indexOf(t)>=0?(e.preventDefault(),f(a)):[68].indexOf(t)>=0?(e.preventDefault(),m(a)):[67].indexOf(t)>=0?(e.preventDefault(),g(a)):[65].indexOf(t)>=0?(e.preventDefault(),u(a)):[86].indexOf(t)>=0?(e.preventDefault(),v(a)):[81].indexOf(t)>=0?(e.preventDefault(),n("#searchbox").focus()):[33].indexOf(t)>=0&&c(a,s):r(n(":focus"))&&e.shiftKey&&[65].indexOf(t)>=0&&(e.preventDefault(),o(a))})}(window,document,$),window.News=window.News||{},function(e,t,n,r,i){"use strict";var o=[];r.addArticleAction=function(e){o.push(e)},r.getArticleActionPlugins=function(){return o}}(window,document,jQuery,window.News),app.run(["$document","$rootScope",function(e,t){"use strict";e.click(function(e){t.$broadcast("documentClicked",e)})}]),app.directive("appNavigationEntryUtils",function(){"use strict";return{restrict:"C",link:function(e,t){var n=t.siblings(".app-navigation-entry-menu"),r=$(t).find(".app-navigation-entry-utils-menu-button button");r.click(function(){n.toggleClass("open")}),e.$on("documentClicked",function(e,t){t.target!==r[0]&&n.removeClass("open")})}}}),app.directive("newsAddFeed",["$rootScope","$timeout",function(e,t){"use strict";return{restrict:"A",link:function(n,r){e.$on("addFeed",function(e,i){t(function(){r.is(":animated")?(r.stop(!0,!0),r.show()):r.is(":visible")||r.slideDown(),r.find('[ng-model="Navigation.feed.url"]').focus()}),n.Navigation.feed.url=i})}}}]),app.directive("newsArticleActions",function(){"use strict";return{restrict:"A",scope:{newsArticleActions:"=",noPlugins:"="},link:function(e,t){for(var n=News.getArticleActionPlugins(),r=0;r<n.length;r+=1)n[r](t,e.newsArticleActions);e.noPlugins=0===n.length}}}),app.directive("newsAutoFocus",["$timeout",function(e){"use strict";return function(t,n,r){var i=n;r.newsAutoFocus&&(i=$(r.newsAutoFocus)),e(function(){i.focus()},0)}}]),app.directive("newsBindHtmlUnsafe",function(){"use strict";return function(e,t,n){e.$watch(n.newsBindHtmlUnsafe,function(){t.html(e.$eval(n.newsBindHtmlUnsafe))})}}),app.directive("newsDraggable",function(){"use strict";return function(e,t,n){var r=e.$eval(n.newsDraggable);angular.isDefined(r)?t.draggable(r):t.draggable(),n.$observe("newsDraggableDisable",function(e){"true"===e?t.draggable("disable"):t.draggable("enable")})}}),app.directive("newsDroppable",["$rootScope",function(e){"use strict";return function(t,n,r){var i={accept:".feed",hoverClass:"drag-and-drop",greedy:!0,drop:function(i,o){$(".drag-and-drop").removeClass("drag-and-drop");var s={folderId:parseInt(n.data("id"),10),feedId:parseInt($(o.draggable).data("id"),10)};e.$broadcast("moveFeedToFolder",s),t.$apply(r.droppable)}};n.droppable(i)}}]),app.directive("newsFinishedTransition",function(){"use strict";return function(e,t,n){t.on("transitionend",function(){t.addClass(n.newsFinishedTransition)})}}),app.directive("newsFocus",["$timeout","$interpolate",function(e,t){"use strict";return function(n,r,i){r.click(function(){var r=$(t(i.newsFocus)(n));e(function(){r.focus()},500)})}}]),app.directive("newsInstantNotification",function(){"use strict";return{restrict:"E",link:function(e,t){t.hide();var n=t.html();OC.Notification.showHtml(n)}}}),app.directive("newsPlayOne",["$rootScope",function(e){"use strict";return{restrict:"A",link:function(t,n){n.on("play",function(){e.$broadcast("playing",n)}),e.$on("playing",function(e,t){t[0]!==n[0]&&n[0].pause()})}}}]),app.directive("newsPullToRefresh",["$rootScope",function(e){"use strict";var t=!1;return{restrict:"A",scope:{newsPullToRefresh:"="},link:function(n,r){e.$on("$routeChangeStart",function(){t=!1,n.newsPullToRefresh=!1}),r.on("scroll",function(){0===r.scrollTop()&&t&&(n.newsPullToRefresh=!0),t=!0})}}}]),app.directive("newsReadFile",function(){"use strict";return function(e,t,n){t.change(function(){var r=t[0].files[0],i=new FileReader;i.onload=function(t){e.$fileContent=t.target.result,e.$apply(n.newsReadFile)},i.readAsText(r)})}}),app.directive("newsRefreshMasonry",["$timeout",function(e){"use strict";var t=function(t){e(function(){e(function(){t.parent().masonry({itemSelector:".grid-item",gutter:25,columnWidth:300})})})};return function(e,n){e.$last&&t(n)}}]),app.directive("newsScroll",["$timeout","ITEM_AUTO_PAGE_SIZE","MARK_READ_TIMEOUT","SCROLL_TIMEOUT",function(e,t,n,r){"use strict";var i,o=function(e,t,n){for(var r=0,i=t.find(".item"),o=i.length-1;o>=0;o-=1){var s=$(i[o]);if(r>=e)break;if(s.position().top<0){n.$apply(n.newsScrollAutoPage);break}r+=1}},s=function(e,t,n){if(e){var r=[],i=t.find(".item:not(.read)");i.each(function(e,t){var n=$(t);return n.position().top<=-10?void r.push(parseInt(n.data("id"),10)):!1}),n.itemIds=r,n.$apply(n.newsScrollMarkRead)}};return{restrict:"A",scope:{newsScroll:"@",newsScrollAutoPage:"&",newsScrollMarkRead:"&",newsScrollEnabledMarkRead:"="},link:function(a,u){var d=!0,c=u;a.newsScroll&&(c=$(a.newsScroll));var l=function(){d&&(d=!1,e(function(){d=!0},1e3*r),o(t,u,a),i&&e.cancel(i),i=e(function(){s(a.newsScrollEnabledMarkRead,u,a),i=void 0},1e3*n))};c.on("scroll",l),a.$on("$destroy",function(){c.off("scroll",l)})}}}]),app.directive("newsSearch",["$document","$location",function(e,t){"use strict";return{restrict:"E",scope:{onSearch:"="},link:function(e){var n=$("#searchbox");n.val(t.search().search);var r=function(){var t=n.val();e.$apply(function(){e.onSearch(t)})};n.on("search keyup",function(e){("search"===e.type||13===e.keyCode)&&r()}),e.$watch(function(){return t.search()},function(e){e&&e.search?n.val(e.search):n.val("")})}}}]),app.directive("newsStickyMenu",function(){"use strict";return function(e,t,n){var r=40;$(n.newsStickyMenu).scroll(function(){var e=$(this).scrollTop();e>r?(t.addClass("fixed"),t.css("top",e)):t.removeClass("fixed")})}}),app.directive("newsStopPropagation",function(){"use strict";return{restrict:"A",link:function(e,t){t.bind("click",function(e){e.stopPropagation()})}}}),app.directive("newsTimeout",["$timeout","$rootScope",function(e,t){"use strict";return{restrict:"A",scope:{newsTimeout:"&"},link:function(n,r){var i=!1,o=7,s=e(n.newsTimeout,1e3*o);n.$on("$destroy",function(){i=!0,e.cancel(s)}),t.$on("$locationChangeStart",function(){e.cancel(s),i||(i=!0,r.remove(),n.newsTimeout())})}}}]),app.directive("newsTitleUnreadCount",["$window",function(e){"use strict";var t=e.document.title,n=t.split("-"),r=n[0]||"News",i=n[1]||"ownCloud";return{restrict:"E",scope:{unreadCount:"@"},link:function(t,n,o){o.$observe("unreadCount",function(t){"0"!==t?e.document.title=r+"("+t+") - "+i:e.document.title=r+" - "+i})}}}]),app.directive("newsToggleShow",function(){"use strict";return{restrict:"A",scope:{newsToggleShow:"@"},link:function(e,t){t.click(function(){var t=$(e.newsToggleShow);t.toggle()})}}}),app.directive("newsTriggerClick",function(){"use strict";return function(e,t,n){t.click(function(){$(n.newsTriggerClick).trigger("click")})}});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFwcC5qcyIsIkNvbmZpZy5qcyIsIlJ1bi5qcyIsIkFwcENvbnRyb2xsZXIuanMiLCJDb250ZW50Q29udHJvbGxlci5qcyIsIkV4cGxvcmVDb250cm9sbGVyLmpzIiwiTmF2aWdhdGlvbkNvbnRyb2xsZXIuanMiLCJTZXR0aW5nc0NvbnRyb2xsZXIuanMiLCJUcnVzdFVybC5qcyIsIlVucmVhZENvdW50Rm9ybWF0dGVyLmpzIiwiRmVlZFJlc291cmNlLmpzIiwiRm9sZGVyUmVzb3VyY2UuanMiLCJJdGVtUmVzb3VyY2UuanMiLCJMb2FkaW5nLmpzIiwiT1BNTEltcG9ydGVyLmpzIiwiT1BNTFBhcnNlci5qcyIsIlB1Ymxpc2hlci5qcyIsIlJlc291cmNlLmpzIiwiU2V0dGluZ3NSZXNvdXJjZS5qcyIsIkV4dGVyblN1YnNjcmlwdGlvbi5qcyIsIkZpeGVzLmpzIiwiS2V5Ym9hcmRTaG9ydGN1dHMuanMiLCJBcnRpY2xlQWN0aW9uUGx1Z2luLmpzIiwiQXBwTmF2aWdhdGlvbkVudHJ5VXRpbHMuanMiLCJOZXdzQWRkRmVlZC5qcyIsIk5ld3NBcnRpY2xlQWN0aW9ucy5qcyIsIk5ld3NBdXRvRm9jdXMuanMiLCJOZXdzQmluZFVuc2FmZUh0bWwuanMiLCJOZXdzRHJhZ2dhYmxlLmpzIiwiTmV3c0Ryb3BwYWJsZS5qcyIsIk5ld3NGaW5pc2hlZFRyYW5zaXRpb24uanMiLCJOZXdzRm9jdXMuanMiLCJOZXdzSW5zdGFudE5vdGlmaWNhdGlvbi5qcyIsIk5ld3NQbGF5T25lLmpzIiwiTmV3c1B1bGxUb1JlZnJlc2guanMiLCJOZXdzUmVhZEZpbGUuanMiLCJOZXdzUmVmcmVzaE1hc29ucnkuanMiLCJOZXdzU2Nyb2xsLmpzIiwiTmV3c1NlYXJjaC5qcyIsIk5ld3NTdGlja3lNZW51LmpzIiwiTmV3c1N0b3BQcm9wYWdhdGlvbi5qcyIsIk5ld3NUaW1lb3V0LmpzIiwiTmV3c1RpdGxlVW5yZWFkQ291bnQuanMiLCJOZXdzVG9nZ2xlU2hvdy5qcyIsIk5ld3NUcmlnZ2VyQ2xpY2suanMiXSwibmFtZXMiOlsiYXBwIiwiYW5ndWxhciIsIm1vZHVsZSIsImNvbmZpZyIsIiRyb3V0ZVByb3ZpZGVyIiwiJHByb3ZpZGUiLCIkaHR0cFByb3ZpZGVyIiwiZmVlZFR5cGUiLCJGRUVEIiwiRk9MREVSIiwiU1RBUlJFRCIsIlNVQlNDUklQVElPTlMiLCJTSEFSRUQiLCJFWFBMT1JFIiwiY29uc3RhbnQiLCJPQyIsImdlbmVyYXRlVXJsIiwiZmFjdG9yeSIsIiRxIiwiQkFTRV9VUkwiLCIkd2luZG93IiwicmVxdWVzdCIsImRvbWFpbiIsImxvY2F0aW9uIiwiaHJlZiIsInNwbGl0IiwicGF0aG5hbWUiLCJ1cmwiLCJpbmRleE9mIiwiaGVhZGVycyIsInJlcXVlc3R0b2tlbiIsIm9jX3JlcXVlc3R0b2tlbiIsIndoZW4iLCJlcnJvck1lc3NhZ2VzIiwwLCJ0Iiw0MDEsNDAzLDQxMiw1MDAsNTAzLCIkdGltZW91dCIsInRpbWVyIiwicmVzcG9uc2VFcnJvciIsInJlc3BvbnNlIiwic3RhdHVzIiwiY2FuY2VsIiwiTm90aWZpY2F0aW9uIiwiaGlkZSIsInNob3dIdG1sIiwicmVqZWN0IiwiaW50ZXJjZXB0b3JzIiwicHVzaCIsImdldEl0ZW1SZXNvbHZlIiwidHlwZSIsImRhdGEiLCIkaHR0cCIsIiRyb3V0ZSIsIiRsb2NhdGlvbiIsIklURU1fQkFUQ0hfU0laRSIsIkZFRURfVFlQRSIsIlNldHRpbmdzUmVzb3VyY2UiLCJGZWVkUmVzb3VyY2UiLCJzaG93QWxsIiwiZ2V0Iiwib2xkZXN0Rmlyc3QiLCJzZWFyY2giLCJkZWZlcnJlZCIsImRlZmVyIiwicmVzb2x2ZSIsInBhcmFtZXRlcnMiLCJsaW1pdCIsInVuZGVmaW5lZCIsImN1cnJlbnQiLCJwYXJhbXMiLCJpZCIsImZlZWQiLCJnZXRCeUlkIiwib3JkZXJpbmciLCJtZXRob2QiLCJzdWNjZXNzIiwicHJvbWlzZSIsImdldEV4cGxvcmVSZXNvbHZlIiwic2l0ZXMiLCJQdWJsaXNoZXIiLCJsYW5ndWFnZSIsImxhbmciLCJ0aGVuIiwicHVibGlzaEFsbCIsInJlcGxhY2UiLCJleHBsb3JlVXJsIiwiZGVmYXVsdEV4cGxvcmVVcmwiLCJjb250cm9sbGVyIiwidGVtcGxhdGVVcmwiLCJydW4iLCIkcm9vdFNjb3BlIiwiJGludGVydmFsIiwiTG9hZGluZyIsIkl0ZW1SZXNvdXJjZSIsIkZvbGRlclJlc291cmNlIiwiUkVGUkVTSF9SQVRFIiwic2V0TG9hZGluZyIsInN1YnNjcmliZSIsInRvQ2hhbm5lbHMiLCJzZXR0aW5nc0RlZmVycmVkIiwiYWN0aXZlRmVlZERlZmVycmVkIiwicGF0aCIsImFjdGl2ZUZlZWQiLCJ0ZXN0IiwiZmVlZHMiLCJmZWVkRGVmZXJyZWQiLCJmb2xkZXJzIiwiZm9sZGVyRGVmZXJyZWQiLCJhbGwiLCJsZW5ndGgiLCJyZWxvYWQiLCIkb24iLCJ0aGlzIiwibG9hZGluZyIsImlzRmlyc3RSdW4iLCJzaXplIiwicGxheSIsIml0ZW0iLCJwbGF5aW5nSXRlbSIsIiRyb3V0ZVBhcmFtcyIsIklURU1fQVVUT19QQUdFX1NJWkUiLCJjbGVhciIsImlzQXV0b1BhZ2luZ0VuYWJsZWQiLCJpc05vdGhpbmdNb3JlVG9BdXRvUGFnZSIsImdldEl0ZW1zIiwiZ2V0QWxsIiwidG9nZ2xlU3RhciIsIml0ZW1JZCIsInRvZ2dsZUl0ZW0iLCJpc0NvbXBhY3RWaWV3Iiwic2hvdyIsImlzU2hvd0FsbCIsIm1hcmtSZWFkIiwia2VlcFVucmVhZCIsInVucmVhZCIsIm1hcmtJdGVtUmVhZCIsIm1hcmtJdGVtT2ZGZWVkUmVhZCIsImZlZWRJZCIsImdldEZlZWQiLCJ0b2dnbGVLZWVwVW5yZWFkIiwibWFya0l0ZW1PZkZlZWRVbnJlYWQiLCJzZWxmIiwiZ2V0T3JkZXJpbmciLCJpc0ZlZWQiLCJvcmRlckJ5IiwiaXNDb21wYWN0RXhwYW5kIiwiYXV0b1BhZ2luZ0VuYWJsZWQiLCJtYXJrUmVhZEVuYWJsZWQiLCJzY3JvbGxSZWFkIiwiaXRlbUlkcyIsImlkcyIsImZlZWRJZHMiLCJmb3JFYWNoIiwibWFya0l0ZW1zT2ZGZWVkc1JlYWQiLCJtYXJrSXRlbXNSZWFkIiwiJCRyb3V0ZSIsImF1dG9QYWdlIiwiYXV0b1BhZ2VBZ2FpbiIsIml0ZW1zIiwiZXJyb3IiLCJnZXRSZWxhdGl2ZURhdGUiLCJ0aW1lc3RhbXAiLCJsYW5ndWFnZUNvZGUiLCJkYXRlIiwibW9tZW50IiwidW5peCIsImxvY2FsZSIsImZyb21Ob3ciLCJyZWZyZXNoIiwiZ2V0TWVkaWFUeXBlIiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsImtleSIsInJlZHVjZSIsInhzIiwieCIsImNhdGVnb3J5IiwiZmVlZExpc3QiLCJjb25jYXQiLCJmZWVkRXhpc3RzIiwiZ2V0QnlMb2NhdGlvbiIsInN1YnNjcmliZVRvIiwiJGJyb2FkY2FzdCIsImlzQ2F0ZWdvcnlTaG93biIsImZpbHRlciIsImVsZW1lbnQiLCJnZXRTdXBwb3J0ZWRMYW5ndWFnZUNvZGVzIiwiZ2V0Q3VycmVudExhbmd1YWdlQ29kZSIsInNob3dMYW5ndWFnZSIsInNlbGVjdGVkTGFuZ3VhZ2VDb2RlIiwiZmVlZEVycm9yIiwic2hvd05ld0ZvbGRlciIsInJlbmFtaW5nRm9sZGVyIiwiYWRkaW5nRmVlZCIsImFkZGluZ0ZvbGRlciIsImZvbGRlckVycm9yIiwicmVuYW1lRXJyb3IiLCJnZXRSb3V0ZUlkIiwicGFyc2VJbnQiLCJnZXRMYW5ndWFnZUNvZGUiLCJnZXRGZWVkcyIsImdldEZvbGRlcnMiLCJtYXJrRm9sZGVyUmVhZCIsImZvbGRlcklkIiwiZ2V0QnlGb2xkZXJJZCIsIm1hcmtGZWVkUmVhZCIsImdldEZlZWRzT2ZGb2xkZXIiLCJnZXRVbnJlYWRDb3VudCIsImlzVW5yZWFkIiwiZ2V0RmVlZFVucmVhZENvdW50IiwidW5yZWFkQ291bnQiLCJpc0ZlZWRVbnJlYWQiLCJnZXRGb2xkZXJVbnJlYWRDb3VudCIsImlzRm9sZGVyVW5yZWFkIiwiZ2V0U3RhcnJlZENvdW50IiwiaXNTdGFycmVkVW5yZWFkIiwidG9nZ2xlRm9sZGVyIiwiZm9sZGVyTmFtZSIsInRvZ2dsZU9wZW4iLCJoYXNGZWVkcyIsInN1YkZlZWRBY3RpdmUiLCJpc1N1YnNjcmlwdGlvbnNBY3RpdmUiLCJpc1N0YXJyZWRBY3RpdmUiLCJpc0V4cGxvcmVBY3RpdmUiLCJpc0ZvbGRlckFjdGl2ZSIsImlzRmVlZEFjdGl2ZSIsImZvbGRlck5hbWVFeGlzdHMiLCJ0cmltIiwiZmVlZFVybEV4aXN0cyIsImNyZWF0ZUZlZWQiLCJuZXdGb2xkZXIiLCJleGlzdGluZ0ZvbGRlciIsImdldHNGZWVkIiwiY3JlYXRlIiwibmFtZSIsImNyZWF0ZUZvbGRlciIsImZvbGRlciIsIm1vdmVGZWVkIiwibW92ZSIsInJlbmFtZUZlZWQiLCJwYXRjaCIsInRpdGxlIiwiZWRpdGluZyIsInJlbmFtZUZvbGRlciIsInJlbmFtZSIsIm1lc3NhZ2UiLCJyZXZlcnNpYmx5RGVsZXRlRmVlZCIsInJldmVyc2libHlEZWxldGUiLCJ1bmRvRGVsZXRlRmVlZCIsInVuZG9EZWxldGUiLCJkZWxldGVGZWVkIiwicmV2ZXJzaWJseURlbGV0ZUZvbGRlciIsInVuZG9EZWxldGVGb2xkZXIiLCJkZWxldGVGb2xkZXIiLCJzZXRPcmRlcmluZyIsInRvZ2dsZVBpbm5lZCIsInBpbm5lZCIsInNldFVwZGF0ZU1vZGUiLCJ1cGRhdGVNb2RlIiwidG9nZ2xlRnVsbFRleHQiLCJ2YWx1ZSIsInNjb3BlIiwic2V0U2VsZWN0ZWRGb2xkZXJGb3JSb3V0ZSIsIk9QTUxQYXJzZXIiLCJPUE1MSW1wb3J0ZXIiLCJpc09QTUxJbXBvcnRpbmciLCJpc0FydGljbGVzSW1wb3J0aW5nIiwib3BtbEltcG9ydEVycm9yIiwiYXJ0aWNsZUltcG9ydEVycm9yIiwic2V0IiwidG9nZ2xlU2V0dGluZyIsImdldFNldHRpbmciLCJpbXBvcnRPUE1MIiwiY29udGVudCIsInBhcnNlZENvbnRlbnQiLCJwYXJzZSIsImpvYlNpemUiLCJpbXBvcnRGb2xkZXJzIiwiZmVlZFF1ZXVlIiwiaW1wb3J0RmVlZFF1ZXVlIiwiY29uc29sZSIsImltcG9ydEFydGljbGVzIiwiYXJ0aWNsZXMiLCJKU09OIiwiJHNjZSIsInRydXN0QXNSZXNvdXJjZVVybCIsIlJlc291cmNlIiwiY2FsbCIsImxvY2F0aW9ucyIsImZvbGRlclVucmVhZENvdW50IiwiZm9sZGVySWRzIiwicHJvdG90eXBlIiwicmVjZWl2ZSIsInVwZGF0ZVVucmVhZENhY2hlIiwidXBkYXRlRm9sZGVyQ2FjaGUiLCJ2YWx1ZXMiLCJhZGQiLCJoYXNoTWFwIiwic3RhcnRzV2l0aCIsImh0dHAiLCJwYXJlbnRGb2xkZXJJZCIsImZhdmljb25MaW5rIiwidXBkYXRlQ2FjaGUiLCJpc0ZvbGRlciIsImRlbGV0ZWQiLCJwcm9taXNlcyIsInBvc3QiLCJzZXRQaW5uZWQiLCJpc1Bpbm5lZCIsImRpZmYiLCJmdWxsVGV4dEVuYWJsZWQiLCJvcGVuZWQiLCJvcGVuIiwidG9Gb2xkZXJOYW1lIiwiYmF0Y2hTaXplIiwic3RhcnJlZENvdW50IiwibG93ZXN0SWQiLCJoaWdoZXN0SWQiLCJjaGFubmVsIiwibmV3ZXN0SXRlbUlkIiwiZ2V0TmV3ZXN0SXRlbUlkIiwic3RhciIsImlzU3RhcnJlZCIsIml0IiwiZ3VpZEhhc2giLCJzdGFycmVkIiwiaXNSZWFkIiwicmVhZCIsImhpZ2hlc3RJdGVtSWQiLCJvZmZzZXQiLCJqc29uIiwic2VydmljZSIsImdsb2JhbCIsImF1dG9wYWdpbmciLCJhcmVhIiwiaXNMb2FkaW5nIiwic3RhcnRGZWVkSm9iIiwicXVldWUiLCJwb3AiLCJnZXRzRmVlZENvdW50ZXIiLCJmb2xkZXJQcm9taXNlcyIsImpvYlByb21pc2VzIiwiaSIsInBhcnNlT3V0bGluZSIsIm91dGxpbmUiLCJhdHRyIiwicmVjdXJzaXZlbHlQYXJzZSIsImxldmVsIiwicm9vdCIsImZpcnN0TGV2ZWwiLCIkIiwiZW50cnkiLCJjaGlsZHJlbiIsInhtbCIsInBhcnNlWE1MIiwiZmluZCIsImNoYW5uZWxzIiwib2JqIiwibGlzdGVuZXJzIiwibGlzdGVuZXIiLCJvYmpzIiwiZXhpc3RpbmciLCJkZWxldGVBdEluZGV4IiwiZmluZEluZGV4Iiwic3BsaWNlIiwic2V0dGluZ3MiLCJjb21wYWN0IiwicHJldmVudFJlYWRPblNjcm9sbCIsImNvbXBhY3RFeHBhbmQiLCJkZWZhdWx0TGFuZ3VhZ2VDb2RlIiwic3VwcG9ydGVkTGFuZ3VhZ2VDb2RlcyIsInByb2Nlc3NMYW5ndWFnZUNvZGUiLCJ0b0xvd2VyQ2FzZSIsIndpbmRvdyIsImRvY3VtZW50IiwibmF2aWdhdG9yIiwic3RvcmFnZSIsImxvY2FsU3RvcmFnZSIsInJlZ2lzdGVySGFuZGxlciIsIm1pbWUiLCJyZWdpc3RlcmVkIiwiaXNDb250ZW50SGFuZGxlclJlZ2lzdGVyZWQiLCJpc1JlZ2lzdGVyZWQiLCJnZXRJdGVtIiwicmVnaXN0ZXJDb250ZW50SGFuZGxlciIsInNldEl0ZW0iLCJjbGVhblVybCIsInByb3RvY29sIiwiaG9zdCIsInN1YnNjcmliZVVybCIsIm1pbWVUeXBlIiwicmVhZHkiLCJzdWJzY3JpcHRpb24iLCJpbnB1dCIsInZhbCIsInRyaWdnZXIiLCJzZXRUaW1lb3V0IiwiZm9jdXMiLCJhZGRFdmVudExpc3RlbmVyIiwicXVlcnlTZWxlY3RvciIsInNjcm9sbFRvIiwibm9JbnB1dEZvY3VzZWQiLCJpcyIsIm5vTW9kaWZpZXJLZXkiLCJldmVudCIsInNoaWZ0S2V5IiwiYWx0S2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJtYXJrQWxsUmVhZCIsIm5hdmlnYXRpb25BcmVhIiwic2VsZWN0b3IiLCJidXR0b24iLCJpc0luU2Nyb2xsVmlldyIsImVsZW0iLCJzY3JvbGxBcmVhIiwiZWxlbVRvcCIsInRvcCIsImVsZW1Cb3R0b20iLCJoZWlnaHQiLCJhcmVhQm90dG9tIiwic2Nyb2xsVG9OYXZpZ2F0aW9uRWxlbWVudCIsInRvVG9wIiwic2Nyb2xsVG9wIiwic2Nyb2xsVG9BY3RpdmVOYXZpZ2F0aW9uRW50cnkiLCJyZWxvYWRGZWVkIiwidHJ5UmVsb2FkIiwicHVsbFRvUmVmcmVzaCIsImhhc0NsYXNzIiwiYWRkQ2xhc3MiLCJhY3RpdmF0ZU5hdmlnYXRpb25FbnRyeSIsIm5leHRGZWVkIiwiZWxlbWVudHMiLCJzdWJmZWVkcyIsIm5leHQiLCJnZXRQYXJlbnRGb2xkZXIiLCJwYXJlbnQiLCJzZWxlY3RGaXJzdE9yTGFzdEZvbGRlciIsImlzTGFzdCIsImluZGV4IiwicHJldmlvdXNGb2xkZXIiLCJwcmV2QWxsIiwiZmlyc3QiLCJwYXJlbnRGb2xkZXIiLCJuZXh0Rm9sZGVyIiwibmV4dEFsbCIsInByZXZpb3VzRmVlZCIsInByZXYiLCJzaWJsaW5ncyIsInByZXZpb3VzIiwib25BY3RpdmVJdGVtIiwiY2FsbGJhY2siLCJlYWNoIiwicG9zaXRpb24iLCJ0b2dnbGVVbnJlYWQiLCJleHBhbmRJdGVtIiwib3BlbkxpbmsiLCJzY3JvbGxUb0l0ZW0iLCJleHBhbmRJdGVtSW5Db21wYWN0Iiwic2Nyb2xsVG9OZXh0SXRlbSIsImp1bXBlZCIsInByb3AiLCJzY3JvbGxUb1ByZXZpb3VzSXRlbSIsImxhc3QiLCJrZXl1cCIsImtleUNvZGUiLCJpc0V4cGFuZEl0ZW0iLCJwcmV2ZW50RGVmYXVsdCIsIk5ld3MiLCJleHBvcnRzIiwiYXJ0aWNsZUFjdGlvblBsdWdpbnMiLCJhZGRBcnRpY2xlQWN0aW9uIiwiYWN0aW9uIiwiZ2V0QXJ0aWNsZUFjdGlvblBsdWdpbnMiLCJqUXVlcnkiLCIkZG9jdW1lbnQiLCJjbGljayIsImRpcmVjdGl2ZSIsInJlc3RyaWN0IiwibGluayIsImVsbSIsIm1lbnUiLCJ0b2dnbGVDbGFzcyIsInRhcmdldCIsInJlbW92ZUNsYXNzIiwiXyIsInN0b3AiLCJzbGlkZURvd24iLCJOYXZpZ2F0aW9uIiwibmV3c0FydGljbGVBY3Rpb25zIiwibm9QbHVnaW5zIiwicGx1Z2lucyIsImF0dHJzIiwidG9Gb2N1cyIsIm5ld3NBdXRvRm9jdXMiLCIkd2F0Y2giLCJuZXdzQmluZEh0bWxVbnNhZmUiLCJodG1sIiwiJGV2YWwiLCJvcHRpb25zIiwibmV3c0RyYWdnYWJsZSIsImlzRGVmaW5lZCIsImRyYWdnYWJsZSIsIiRvYnNlcnZlIiwiZGV0YWlscyIsImFjY2VwdCIsImhvdmVyQ2xhc3MiLCJncmVlZHkiLCJkcm9wIiwidWkiLCIkYXBwbHkiLCJkcm9wcGFibGUiLCJvbiIsIm5ld3NGaW5pc2hlZFRyYW5zaXRpb24iLCIkaW50ZXJwb2xhdGUiLCJ0b1JlYWRkIiwibmV3c0ZvY3VzIiwibm90aWZpY2F0aW9uIiwiYXJncyIsInBhdXNlIiwic2Nyb2xsZWQiLCJuZXdzUHVsbFRvUmVmcmVzaCIsImNoYW5nZSIsImZpbGUiLCJmaWxlcyIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWQiLCIkZmlsZUNvbnRlbnQiLCJyZXN1bHQiLCJuZXdzUmVhZEZpbGUiLCJyZWFkQXNUZXh0IiwibWFzb25yeSIsIml0ZW1TZWxlY3RvciIsImd1dHRlciIsImNvbHVtbldpZHRoIiwiJGxhc3QiLCJNQVJLX1JFQURfVElNRU9VVCIsIlNDUk9MTF9USU1FT1VUIiwiY291bnRlciIsIm5ld3NTY3JvbGxBdXRvUGFnZSIsImVuYWJsZWQiLCJhcnRpY2xlIiwibmV3c1Njcm9sbE1hcmtSZWFkIiwibmV3c1Njcm9sbCIsIm5ld3NTY3JvbGxFbmFibGVkTWFya1JlYWQiLCJhbGxvd1Njcm9sbCIsInNjcm9sbEhhbmRsZXIiLCJvZmYiLCJvblNlYXJjaCIsImJveCIsImRvU2VhcmNoIiwibmV3c1N0aWNreU1lbnUiLCJzY3JvbGwiLCJzY3JvbGxIZWlnaHQiLCJjc3MiLCJiaW5kIiwic3RvcFByb3BhZ2F0aW9uIiwibmV3c1RpbWVvdXQiLCJkZXN0cm95ZWQiLCJzZWNvbmRzIiwicmVtb3ZlIiwiYmFzZVRpdGxlIiwidGl0bGVzIiwiYXBwTmFtZSIsIm93bkNsb3VkTmFtZSIsIm5ld3NUb2dnbGVTaG93IiwidG9nZ2xlIiwibmV3c1RyaWdnZXJDbGljayJdLCJtYXBwaW5ncyI6IkFBV0EsR0FBQUEsS0FBQUMsUUFBQUMsT0FBQSxRQUFBLFVBQUEsYUFBQSxhQ0ZBRixLQUFBRyxRQUFBLGlCQUFBLFdBQUEsZ0JBQUEsU0FBQUMsRUFBQUMsRUFBQUMsR0FDQSxZQUVBLElBQUFDLElBQ0FDLEtBQUEsRUFDQUMsT0FBQSxF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QUFBLEVBQ0E1Z0IsRUFBQUQsRUFBQWtPLEVBQUF5UyxZQUFBLElBQUFFLEVBSUEzUyxHQUFBdkosSUFBQSxXQUFBLFdBQ0FpYyxHQUFBLEVBQ0E1Z0IsRUFBQUssT0FBQUosS0FLQXFELEVBQUFxQixJQUFBLHVCQUFBLFdBSUEzRSxFQUFBSyxPQUFBSixHQUNBMmdCLElBQ0FBLEdBQUEsRUFDQXRYLEVBQUF3WCxTQUNBNVMsRUFBQXlTLHNCQzlCQXBqQixJQUFBbWUsVUFBQSx3QkFBQSxVQUFBLFNBQUEvYyxHQUNBLFlBRUEsSUFBQW9pQixHQUFBcGlCLEVBQUF3VyxTQUFBckksTUFDQWtVLEVBQUFELEVBQUEvaEIsTUFBQSxLQUNBaWlCLEVBQUFELEVBQUEsSUFBQSxPQUNBRSxFQUFBRixFQUFBLElBQUEsVUFFQSxRQUNBckYsU0FBQSxJQUNBek4sT0FDQW5ELFlBQUEsS0FFQTZRLEtBQUEsU0FBQTFOLEVBQUF5SixFQUFBOEUsR0FDQUEsRUFBQVcsU0FBQSxjQUFBLFNBQUFuUCxHQUNBLE1BQUFBLEVBQ0F0UCxFQUFBd1csU0FBQXJJLE1BQUFtVSxFQUNBLElBQUFoVCxFQUFBLE9BQUFpVCxFQUVBdmlCLEVBQUF3VyxTQUFBckksTUFBQW1VLEVBQUEsTUFBQUMsU0NuQkEzakIsSUFBQW1lLFVBQUEsaUJBQUEsV0FDQSxZQUNBLFFBQ0FDLFNBQUEsSUFDQXpOLE9BQ0FpVCxlQUFBLEtBRUF2RixLQUFBLFNBQUExTixFQUFBeUosR0FDQUEsRUFBQThELE1BQUEsV0FDQSxHQUFBTyxHQUFBckksRUFBQXpGLEVBQUFpVCxlQUNBbkYsR0FBQW9GLGVDVkE3akIsSUFBQW1lLFVBQUEsbUJBQUEsV0FDQSxZQUVBLE9BQUEsVUFBQXhOLEVBQUEyTixFQUFBdkksR0FDQXVJLEVBQUFKLE1BQUEsV0FDQTlILEVBQUFMLEVBQUErTixrQkFBQTdLLFFBQUEiLCJmaWxlIjoiYXBwLm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cblxuLyoganNoaW50IHVudXNlZDogZmFsc2UgKi9cbnZhciBhcHAgPSBhbmd1bGFyLm1vZHVsZSgnTmV3cycsIFsnbmdSb3V0ZScsICduZ1Nhbml0aXplJywgJ25nQW5pbWF0ZSddKTtcbiIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5jb25maWcoW1wiJHJvdXRlUHJvdmlkZXJcIiwgXCIkcHJvdmlkZVwiLCBcIiRodHRwUHJvdmlkZXJcIiwgZnVuY3Rpb24gKCRyb3V0ZVByb3ZpZGVyLCAkcHJvdmlkZSwgJGh0dHBQcm92aWRlcikge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBmZWVkVHlwZSA9IHtcbiAgICAgICAgRkVFRDogMCxcbiAgICAgICAgRk9MREVSOiAxLFxuICAgICAgICBTVEFSUkVEOiAyLFxuICAgICAgICBTVUJTQ1JJUFRJT05TOiAzLFxuICAgICAgICBTSEFSRUQ6IDQsXG4gICAgICAgIEVYUExPUkU6IDVcbiAgICB9O1xuXG4gICAgLy8gY29uc3RhbnRzXG4gICAgJHByb3ZpZGUuY29uc3RhbnQoJ1JFRlJFU0hfUkFURScsIDYwKTsgIC8vIHNlY29uZHNcbiAgICAkcHJvdmlkZS5jb25zdGFudCgnSVRFTV9CQVRDSF9TSVpFJywgNDApOyAgLy8gaG93IG1hbnkgaXRlbXMgc2hvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZldGNoZWQgaW5pdGlhbGx5XG4gICAgJHByb3ZpZGUuY29uc3RhbnQoJ0lURU1fQVVUT19QQUdFX1NJWkUnLCAyMCk7XG4gICAgJHByb3ZpZGUuY29uc3RhbnQoJ0JBU0VfVVJMJywgT0MuZ2VuZXJhdGVVcmwoJy9hcHBzL25ld3MnKSk7XG4gICAgJHByb3ZpZGUuY29uc3RhbnQoJ0ZFRURfVFlQRScsIGZlZWRUeXBlKTtcbiAgICAkcHJvdmlkZS5jb25zdGFudCgnTUFSS19SRUFEX1RJTUVPVVQnLCAwLjUpO1xuICAgICRwcm92aWRlLmNvbnN0YW50KCdTQ1JPTExfVElNRU9VVCcsIDAuMSk7XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgQ1NSRiBoZWFkZXIgaXMgb25seSBzZW50IHRvIHRoZSBvd25DbG91ZCBkb21haW5cbiAgICAkcHJvdmlkZS5mYWN0b3J5KCdDU1JGSW50ZXJjZXB0b3InLCBbXCIkcVwiLCBcIkJBU0VfVVJMXCIsIFwiJHdpbmRvd1wiLCBmdW5jdGlvbiAoJHEsIEJBU0VfVVJMLCAkd2luZG93KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXF1ZXN0OiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRvbWFpbiA9XG4gICAgICAgICAgICAgICAgICAgICR3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgkd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnVybC5pbmRleE9mKEJBU0VfVVJMKSA9PT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICBjb25maWcudXJsLmluZGV4T2YoZG9tYWluKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvKmpzaGludCBjYW1lbGNhc2U6IGZhbHNlICovXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5oZWFkZXJzLnJlcXVlc3R0b2tlbiA9IG9jX3JlcXVlc3R0b2tlbjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnIHx8ICRxLndoZW4oY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XSk7XG4gICAgdmFyIGVycm9yTWVzc2FnZXMgPSB7XG4gICAgICAgIDA6IHQoJ25ld3MnLCAnUmVxdWVzdCBmYWlsZWQsIG5ldHdvcmsgY29ubmVjdGlvbiB1bmF2YWlsYWJsZSEnKSxcbiAgICAgICAgNDAxOiB0KCduZXdzJywgJ1JlcXVlc3QgdW5hdXRob3JpemVkLiBBcmUgeW91IGxvZ2dlZCBpbj8nKSxcbiAgICAgICAgNDAzOiB0KCduZXdzJywgJ1JlcXVlc3QgZm9yYmlkZGVuLiBBcmUgeW91IGFuIGFkbWluPycpLFxuICAgICAgICA0MTI6IHQoJ25ld3MnLCAnVG9rZW4gZXhwaXJlZCBvciBhcHAgbm90IGVuYWJsZWQhIFJlbG9hZCB0aGUgcGFnZSEnKSxcbiAgICAgICAgNTAwOiB0KCduZXdzJywgJ0ludGVybmFsIHNlcnZlciBlcnJvciEgUGxlYXNlIGNoZWNrIHlvdXIgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICdkYXRhL293bmNsb3VkLmxvZyBmaWxlIGZvciBhZGRpdGlvbmFsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAnaW5mb3JtYXRpb24hJyksXG4gICAgICAgIDUwMzogdCgnbmV3cycsICdSZXF1ZXN0IGZhaWxlZCwgb3duQ2xvdWQgaXMgaW4gY3VycmVudGx5ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAnaW4gbWFpbnRlbmFuY2UgbW9kZSEnKSxcbiAgICB9O1xuICAgICRwcm92aWRlLmZhY3RvcnkoJ0Nvbm5lY3Rpb25FcnJvckludGVyY2VwdG9yJywgW1wiJHFcIiwgXCIkdGltZW91dFwiLCBmdW5jdGlvbiAoJHEsICR0aW1lb3V0KSB7XG4gICAgICAgIHZhciB0aW1lcjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHN0YXR1cyAwIGlzIGEgbmV0d29yayBlcnJvclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgaW4gZXJyb3JNZXNzYWdlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgT0MuTm90aWZpY2F0aW9uLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgT0MuTm90aWZpY2F0aW9uLnNob3dIdG1sKGVycm9yTWVzc2FnZXNbcmVzcG9uc2Uuc3RhdHVzXSk7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT0MuTm90aWZpY2F0aW9uLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAkcS5yZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1dKTtcbiAgICAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9ycy5wdXNoKCdDU1JGSW50ZXJjZXB0b3InKTtcbiAgICAkaHR0cFByb3ZpZGVyLmludGVyY2VwdG9ycy5wdXNoKCdDb25uZWN0aW9uRXJyb3JJbnRlcmNlcHRvcicpO1xuXG4gICAgLy8gcm91dGluZ1xuICAgIHZhciBnZXRJdGVtUmVzb2x2ZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyByZXF1ZXN0IHRvIGl0ZW1zIGFsc28gcmV0dXJucyBmZWVkc1xuICAgICAgICAgICAgZGF0YTogLyogQG5nSW5qZWN0ICovIFtcIiRodHRwXCIsIFwiJHJvdXRlXCIsIFwiJHFcIiwgXCIkbG9jYXRpb25cIiwgXCJCQVNFX1VSTFwiLCBcIklURU1fQkFUQ0hfU0laRVwiLCBcIkZFRURfVFlQRVwiLCBcIlNldHRpbmdzUmVzb3VyY2VcIiwgXCJGZWVkUmVzb3VyY2VcIiwgZnVuY3Rpb24gKFxuICAgICAgICAgICAgJGh0dHAsICRyb3V0ZSwgJHEsICRsb2NhdGlvbiwgQkFTRV9VUkwsIElURU1fQkFUQ0hfU0laRSwgRkVFRF9UWVBFLFxuICAgICAgICAgICAgU2V0dGluZ3NSZXNvdXJjZSwgRmVlZFJlc291cmNlKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgc2hvd0FsbCA9IFNldHRpbmdzUmVzb3VyY2UuZ2V0KCdzaG93QWxsJyk7XG4gICAgICAgICAgICAgICAgdmFyIG9sZGVzdEZpcnN0ID0gU2V0dGluZ3NSZXNvdXJjZS5nZXQoJ29sZGVzdEZpcnN0Jyk7XG4gICAgICAgICAgICAgICAgdmFyIHNlYXJjaCA9ICRsb2NhdGlvbi5zZWFyY2goKS5zZWFyY2ggfHwgJyc7XG5cbiAgICAgICAgICAgICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhvc2UgdHdvIHZhbHVlcyBhcmUgbnVsbCBpdCBtZWFucyB3ZSBkaWQgbm90IHJlY2VpdmVcbiAgICAgICAgICAgICAgICAvLyB0aGUgc2V0dGluZ3MgcmVxdWVzdCBmcm9tIHRoZSBzZXJ2ZXIgc28gZG9udCBxdWVyeSB0aGUgc2VydmVyXG4gICAgICAgICAgICAgICAgaWYgKHNob3dBbGwgPT09IG51bGwgfHwgb2xkZXN0Rmlyc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh7fSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IElURU1fQkFUQ0hfU0laRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBbGw6IHNob3dBbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRlc3RGaXJzdDogb2xkZXN0Rmlyc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IHNlYXJjaFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgkcm91dGUuY3VycmVudC5wYXJhbXMuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5pZCA9ICRyb3V0ZS5jdXJyZW50LnBhcmFtcy5pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGEgY3VzdG9tIG9yZGVyaW5nIGlzIHNldFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gRkVFRF9UWVBFLkZFRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmZWVkID0gRmVlZFJlc291cmNlLmdldEJ5SWQocGFyYW1ldGVycy5pZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIGludGlhbCBsb2FkLCB0aGUgZmVlZCBvcmRlcmluZyBpcyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZWVkID09PSB1bmRlZmluZWQgfHwgZmVlZC5vcmRlcmluZyA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMub2xkZXN0Rmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVlZC5vcmRlcmluZyA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMub2xkZXN0Rmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgJGh0dHAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAgQkFTRV9VUkwgKyAnL2l0ZW1zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICAgICAgfSkuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgZ2V0RXhwbG9yZVJlc29sdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzaXRlczogLyogQG5nSW5qZWN0ICovIFtcIiRodHRwXCIsIFwiJHFcIiwgXCJCQVNFX1VSTFwiLCBcIiRsb2NhdGlvblwiLCBcIlB1Ymxpc2hlclwiLCBcIlNldHRpbmdzUmVzb3VyY2VcIiwgZnVuY3Rpb24gKFxuICAgICAgICAgICAgJGh0dHAsICRxLCBCQVNFX1VSTCwgJGxvY2F0aW9uLCBQdWJsaXNoZXIsIFNldHRpbmdzUmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuXG4gICAgICAgICAgICAgICAgLy8gYWx3YXlzIHVzZSB0aGUgY29kZSBmcm9tIHRoZSB1cmxcbiAgICAgICAgICAgICAgICB2YXIgbGFuZ3VhZ2UgPSAkbG9jYXRpb24uc2VhcmNoKCkubGFuZztcbiAgICAgICAgICAgICAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gU2V0dGluZ3NSZXNvdXJjZS5nZXQoJ2xhbmd1YWdlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJGh0dHAuZ2V0KEJBU0VfVVJMICsgJy9zZXR0aW5ncycpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgUHVibGlzaGVyLnB1Ymxpc2hBbGwoZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHVybCBhbmQgc3RyaXAgdHJhaWxpbmcgc2xhc2hlc1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gU2V0dGluZ3NSZXNvdXJjZS5nZXQoJ2V4cGxvcmVVcmwnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcLyskLywgJycpO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBleHBsb3JlVXJsID0gdXJsICsgJy9mZWVkcy4nICsgbGFuZ3VhZ2UgKyAnLmpzb24nO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVmYXVsdEV4cGxvcmVVcmwgPSB1cmwgKyAnL2ZlZWRzLmVuLmpzb24nO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGh0dHBcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoZXhwbG9yZVVybClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRodHRwLmdldChkZWZhdWx0RXhwbG9yZVVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShkYXRhLmRhdGEpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgICRyb3V0ZVByb3ZpZGVyXG4gICAgICAgIC53aGVuKCcvaXRlbXMnLCB7XG4gICAgICAgICAgICBjb250cm9sbGVyOiAnQ29udGVudENvbnRyb2xsZXIgYXMgQ29udGVudCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbnRlbnQuaHRtbCcsXG4gICAgICAgICAgICByZXNvbHZlOiBnZXRJdGVtUmVzb2x2ZShmZWVkVHlwZS5TVUJTQ1JJUFRJT05TKSxcbiAgICAgICAgICAgIHR5cGU6IGZlZWRUeXBlLlNVQlNDUklQVElPTlNcbiAgICAgICAgfSlcbiAgICAgICAgLndoZW4oJy9pdGVtcy9zdGFycmVkJywge1xuICAgICAgICAgICAgY29udHJvbGxlcjogJ0NvbnRlbnRDb250cm9sbGVyIGFzIENvbnRlbnQnLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50Lmh0bWwnLFxuICAgICAgICAgICAgcmVzb2x2ZTogZ2V0SXRlbVJlc29sdmUoZmVlZFR5cGUuU1RBUlJFRCksXG4gICAgICAgICAgICB0eXBlOiBmZWVkVHlwZS5TVEFSUkVEXG4gICAgICAgIH0pXG4gICAgICAgIC53aGVuKCcvaXRlbXMvZmVlZHMvOmlkJywge1xuICAgICAgICAgICAgY29udHJvbGxlcjogJ0NvbnRlbnRDb250cm9sbGVyIGFzIENvbnRlbnQnLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdjb250ZW50Lmh0bWwnLFxuICAgICAgICAgICAgcmVzb2x2ZTogZ2V0SXRlbVJlc29sdmUoZmVlZFR5cGUuRkVFRCksXG4gICAgICAgICAgICB0eXBlOiBmZWVkVHlwZS5GRUVEXG4gICAgICAgIH0pXG4gICAgICAgIC53aGVuKCcvaXRlbXMvZm9sZGVycy86aWQnLCB7XG4gICAgICAgICAgICBjb250cm9sbGVyOiAnQ29udGVudENvbnRyb2xsZXIgYXMgQ29udGVudCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2NvbnRlbnQuaHRtbCcsXG4gICAgICAgICAgICByZXNvbHZlOiBnZXRJdGVtUmVzb2x2ZShmZWVkVHlwZS5GT0xERVIpLFxuICAgICAgICAgICAgdHlwZTogZmVlZFR5cGUuRk9MREVSXG4gICAgICAgIH0pLndoZW4oJy9leHBsb3JlJywge1xuICAgICAgICAgICAgY29udHJvbGxlcjogJ0V4cGxvcmVDb250cm9sbGVyIGFzIEV4cGxvcmUnLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdleHBsb3JlLmh0bWwnLFxuICAgICAgICAgICAgcmVzb2x2ZTogZ2V0RXhwbG9yZVJlc29sdmUoKSxcbiAgICAgICAgICAgIHR5cGU6IGZlZWRUeXBlLkVYUExPUkVcbiAgICAgICAgfSkud2hlbignL3Nob3J0Y3V0cycsIHtcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnc2hvcnRjdXRzLmh0bWwnLFxuICAgICAgICAgICAgdHlwZTogLTFcbiAgICAgICAgfSk7XG5cbn1dKTtcbiIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5ydW4oW1wiJHJvb3RTY29wZVwiLCBcIiRsb2NhdGlvblwiLCBcIiRodHRwXCIsIFwiJHFcIiwgXCIkaW50ZXJ2YWxcIiwgXCIkcm91dGVcIiwgXCJMb2FkaW5nXCIsIFwiSXRlbVJlc291cmNlXCIsIFwiRmVlZFJlc291cmNlXCIsIFwiRm9sZGVyUmVzb3VyY2VcIiwgXCJTZXR0aW5nc1Jlc291cmNlXCIsIFwiUHVibGlzaGVyXCIsIFwiQkFTRV9VUkxcIiwgXCJGRUVEX1RZUEVcIiwgXCJSRUZSRVNIX1JBVEVcIiwgZnVuY3Rpb24gKCRyb290U2NvcGUsICRsb2NhdGlvbiwgJGh0dHAsICRxLCAkaW50ZXJ2YWwsICRyb3V0ZSwgTG9hZGluZyxcbiAgICAgICAgIEl0ZW1SZXNvdXJjZSwgRmVlZFJlc291cmNlLCBGb2xkZXJSZXNvdXJjZSwgU2V0dGluZ3NSZXNvdXJjZSxcbiAgICAgICAgICBQdWJsaXNoZXIsIEJBU0VfVVJMLCBGRUVEX1RZUEUsIFJFRlJFU0hfUkFURSkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8vIHNob3cgTG9hZGluZyBzY3JlZW5cbiAgICBMb2FkaW5nLnNldExvYWRpbmcoJ2dsb2JhbCcsIHRydWUpO1xuXG4gICAgLy8gbGlzdGVuIHRvIGtleXMgaW4gcmV0dXJuZWQgcXVlcmllcyB0byBhdXRvbWF0aWNhbGx5IGRpc3RyaWJ1dGUgdGhlXG4gICAgLy8gaW5jb21pbmcgdmFsdWVzIHRvIG1vZGVsc1xuICAgIFB1Ymxpc2hlci5zdWJzY3JpYmUoSXRlbVJlc291cmNlKS50b0NoYW5uZWxzKFsnaXRlbXMnLCAnbmV3ZXN0SXRlbUlkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXJyZWQnXSk7XG4gICAgUHVibGlzaGVyLnN1YnNjcmliZShGb2xkZXJSZXNvdXJjZSkudG9DaGFubmVscyhbJ2ZvbGRlcnMnXSk7XG4gICAgUHVibGlzaGVyLnN1YnNjcmliZShGZWVkUmVzb3VyY2UpLnRvQ2hhbm5lbHMoWydmZWVkcyddKTtcbiAgICBQdWJsaXNoZXIuc3Vic2NyaWJlKFNldHRpbmdzUmVzb3VyY2UpLnRvQ2hhbm5lbHMoWydzZXR0aW5ncyddKTtcblxuICAgIC8vIGxvYWQgZmVlZHMsIHNldHRpbmdzIGFuZCBsYXN0IHJlYWQgZmVlZFxuICAgIHZhciBzZXR0aW5nc0RlZmVycmVkID0gJHEuZGVmZXIoKTtcbiAgICAkaHR0cC5nZXQoQkFTRV9VUkwgKyAnL3NldHRpbmdzJykuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBQdWJsaXNoZXIucHVibGlzaEFsbChkYXRhKTtcbiAgICAgICAgc2V0dGluZ3NEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgfSk7XG5cbiAgICB2YXIgYWN0aXZlRmVlZERlZmVycmVkID0gJHEuZGVmZXIoKTtcbiAgICB2YXIgcGF0aCA9ICRsb2NhdGlvbi5wYXRoKCk7XG4gICAgJGh0dHAuZ2V0KEJBU0VfVVJMICsgJy9mZWVkcy9hY3RpdmUnKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciB1cmw7XG5cbiAgICAgICAgc3dpdGNoIChkYXRhLmFjdGl2ZUZlZWQudHlwZSkge1xuXG4gICAgICAgIGNhc2UgRkVFRF9UWVBFLkZFRUQ6XG4gICAgICAgICAgICB1cmwgPSAnL2l0ZW1zL2ZlZWRzLycgKyBkYXRhLmFjdGl2ZUZlZWQuaWQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIEZFRURfVFlQRS5GT0xERVI6XG4gICAgICAgICAgICB1cmwgPSAnL2l0ZW1zL2ZvbGRlcnMvJyArIGRhdGEuYWN0aXZlRmVlZC5pZDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgRkVFRF9UWVBFLlNUQVJSRUQ6XG4gICAgICAgICAgICB1cmwgPSAnL2l0ZW1zL3N0YXJyZWQnO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBGRUVEX1RZUEUuRVhQTE9SRTpcbiAgICAgICAgICAgIHVybCA9ICcvZXhwbG9yZSc7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdXJsID0gJy9pdGVtcyc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbmx5IHJlZGlyZWN0IGlmIHVybCBpcyBlbXB0eSBvciBmYXVsdHlcbiAgICAgICAgaWYgKCEvXlxcL2l0ZW1zKFxcLyhzdGFycmVkfGV4cGxvcmV8ZmVlZHNcXC9cXGQrfGZvbGRlcnNcXC9cXGQrKSk/XFwvPyQvXG4gICAgICAgICAgICAudGVzdChwYXRoKSkge1xuICAgICAgICAgICAgJGxvY2F0aW9uLnBhdGgodXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjdGl2ZUZlZWREZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgfSk7XG5cbiAgICB2YXIgZmVlZERlZmVycmVkID0gJHEuZGVmZXIoKTtcbiAgICB2YXIgZmVlZHM7XG4gICAgJGh0dHAuZ2V0KEJBU0VfVVJMICsgJy9mZWVkcycpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgZmVlZHMgPSBkYXRhO1xuICAgICAgICBmZWVkRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH0pO1xuXG4gICAgdmFyIGZvbGRlckRlZmVycmVkID0gJHEuZGVmZXIoKTtcbiAgICB2YXIgZm9sZGVycztcbiAgICAkaHR0cC5nZXQoQkFTRV9VUkwgKyAnL2ZvbGRlcnMnKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGZvbGRlcnMgPSBkYXRhO1xuICAgICAgICBmb2xkZXJEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgfSk7XG5cbiAgICAkcS5hbGwoW1xuICAgICAgICBmZWVkRGVmZXJyZWQucHJvbWlzZSxcbiAgICAgICAgZm9sZGVyRGVmZXJyZWQucHJvbWlzZVxuICAgIF0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBmaXJzdCBwdWJsaXNoIGZlZWRzIHRvIGNvcnJlY3RseSB1cGRhdGUgdGhlIGZvbGRlciByZXNvdXJjZSB1bnJlYWRcbiAgICAgICAgLy8gY2FjaGVcbiAgICAgICAgUHVibGlzaGVyLnB1Ymxpc2hBbGwoZmVlZHMpO1xuICAgICAgICBQdWJsaXNoZXIucHVibGlzaEFsbChmb2xkZXJzKTtcbiAgICAgICAgaWYgKGZlZWRzLmZlZWRzLmxlbmd0aCA9PT0gMCAmJiBmb2xkZXJzLmZvbGRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAkbG9jYXRpb24ucGF0aCgnL2V4cGxvcmUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZGlzYWJsZSBsb2FkaW5nIGlmIGFsbCBpbml0aWFsIHJlcXVlc3RzIGZpbmlzaGVkXG4gICAgJHEuYWxsKFxuICAgICAgICBbXG4gICAgICAgICAgICBzZXR0aW5nc0RlZmVycmVkLnByb21pc2UsXG4gICAgICAgICAgICBhY3RpdmVGZWVkRGVmZXJyZWQucHJvbWlzZSxcbiAgICAgICAgICAgIGZlZWREZWZlcnJlZC5wcm9taXNlLFxuICAgICAgICAgICAgZm9sZGVyRGVmZXJyZWQucHJvbWlzZVxuICAgICAgICBdXG4gICAgKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkcm91dGUucmVsb2FkKCk7XG4gICAgICAgICAgICBMb2FkaW5nLnNldExvYWRpbmcoJ2dsb2JhbCcsIGZhbHNlKTtcbiAgICAgICAgfSk7XG5cbiAgICAvLyByZWZyZXNoIGZlZWRzIGFuZCBmb2xkZXJzXG4gICAgJGludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJGh0dHAuZ2V0KEJBU0VfVVJMICsgJy9mZWVkcycpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIFB1Ymxpc2hlci5wdWJsaXNoQWxsKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgJGh0dHAuZ2V0KEJBU0VfVVJMICsgJy9mb2xkZXJzJykuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgUHVibGlzaGVyLnB1Ymxpc2hBbGwoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH0sIFJFRlJFU0hfUkFURSAqIDEwMDApO1xuXG5cbiAgICAkcm9vdFNjb3BlLiRvbignJHJvdXRlQ2hhbmdlU3RhcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIExvYWRpbmcuc2V0TG9hZGluZygnY29udGVudCcsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgJHJvb3RTY29wZS4kb24oJyRyb3V0ZUNoYW5nZVN1Y2Nlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIExvYWRpbmcuc2V0TG9hZGluZygnY29udGVudCcsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIC8vIGluIGNhc2Ugb2Ygd3JvbmcgaWQgZXRjIHNob3cgYWxsIGl0ZW1zXG4gICAgJHJvb3RTY29wZS4kb24oJyRyb3V0ZUNoYW5nZUVycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAkbG9jYXRpb24ucGF0aCgnL2l0ZW1zJyk7XG4gICAgfSk7XG5cbn1dKTsiLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuY29udHJvbGxlcignQXBwQ29udHJvbGxlcicsXG5bXCJMb2FkaW5nXCIsIFwiRmVlZFJlc291cmNlXCIsIFwiRm9sZGVyUmVzb3VyY2VcIiwgZnVuY3Rpb24gKExvYWRpbmcsIEZlZWRSZXNvdXJjZSwgRm9sZGVyUmVzb3VyY2UpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB0aGlzLmxvYWRpbmcgPSBMb2FkaW5nO1xuXG4gICAgdGhpcy5pc0ZpcnN0UnVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRmVlZFJlc291cmNlLnNpemUoKSA9PT0gMCAmJiBGb2xkZXJSZXNvdXJjZS5zaXplKCkgPT09IDA7XG4gICAgfTtcblxuICAgIHRoaXMucGxheSA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHRoaXMucGxheWluZ0l0ZW0gPSBpdGVtO1xuICAgIH07XG59XSk7XG4iLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuY29udHJvbGxlcignQ29udGVudENvbnRyb2xsZXInLFxuW1wiUHVibGlzaGVyXCIsIFwiRmVlZFJlc291cmNlXCIsIFwiSXRlbVJlc291cmNlXCIsIFwiU2V0dGluZ3NSZXNvdXJjZVwiLCBcImRhdGFcIiwgXCIkcm91dGVcIiwgXCIkcm91dGVQYXJhbXNcIiwgXCIkbG9jYXRpb25cIiwgXCJGRUVEX1RZUEVcIiwgXCJJVEVNX0FVVE9fUEFHRV9TSVpFXCIsIFwiTG9hZGluZ1wiLCBmdW5jdGlvbiAoUHVibGlzaGVyLCBGZWVkUmVzb3VyY2UsIEl0ZW1SZXNvdXJjZSwgU2V0dGluZ3NSZXNvdXJjZSwgZGF0YSxcbiAgICAkcm91dGUsICRyb3V0ZVBhcmFtcywgJGxvY2F0aW9uLCBGRUVEX1RZUEUsIElURU1fQVVUT19QQUdFX1NJWkUsIExvYWRpbmcpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBJdGVtUmVzb3VyY2UuY2xlYXIoKTtcblxuICAgIC8vIGRpc3RyaWJ1dGUgZGF0YSB0byBtb2RlbHMgYmFzZWQgb24ga2V5XG4gICAgUHVibGlzaGVyLnB1Ymxpc2hBbGwoZGF0YSk7XG5cblxuICAgIHRoaXMuaXNBdXRvUGFnaW5nRW5hYmxlZCA9IHRydWU7XG5cbiAgICAvLyB0aGUgaW50ZXJmYWNlIHNob3VsZCBzaG93IGEgaGludCBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCBpdGVtcyBzZW50IHNvXG4gICAgLy8gaXQncyBhc3N1bWVkIHRoYXQgdGhlcmVzIG5vdGhpbmcgdG8gYXV0cGFnZVxuICAgIGlmIChJdGVtUmVzb3VyY2Uuc2l6ZSgpID49IElURU1fQVVUT19QQUdFX1NJWkUpIHtcbiAgICAgICAgdGhpcy5pc05vdGhpbmdNb3JlVG9BdXRvUGFnZSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNOb3RoaW5nTW9yZVRvQXV0b1BhZ2UgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0SXRlbXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBJdGVtUmVzb3VyY2UuZ2V0QWxsKCk7XG4gICAgfTtcblxuICAgIHRoaXMudG9nZ2xlU3RhciA9IGZ1bmN0aW9uIChpdGVtSWQpIHtcbiAgICAgICAgSXRlbVJlc291cmNlLnRvZ2dsZVN0YXIoaXRlbUlkKTtcbiAgICB9O1xuXG4gICAgdGhpcy50b2dnbGVJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgLy8gVE9ETzogdW5pdHRlc3RcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wYWN0VmlldygpKSB7XG4gICAgICAgICAgICBpdGVtLnNob3cgPSAhaXRlbS5zaG93O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaXNTaG93QWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU2V0dGluZ3NSZXNvdXJjZS5nZXQoJ3Nob3dBbGwnKTtcbiAgICB9O1xuXG4gICAgdGhpcy5tYXJrUmVhZCA9IGZ1bmN0aW9uIChpdGVtSWQpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBJdGVtUmVzb3VyY2UuZ2V0KGl0ZW1JZCk7XG5cbiAgICAgICAgaWYgKCFpdGVtLmtlZXBVbnJlYWQgJiYgaXRlbS51bnJlYWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIEl0ZW1SZXNvdXJjZS5tYXJrSXRlbVJlYWQoaXRlbUlkKTtcbiAgICAgICAgICAgIEZlZWRSZXNvdXJjZS5tYXJrSXRlbU9mRmVlZFJlYWQoaXRlbS5mZWVkSWQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0RmVlZCA9IGZ1bmN0aW9uIChmZWVkSWQpIHtcbiAgICAgICAgcmV0dXJuIEZlZWRSZXNvdXJjZS5nZXRCeUlkKGZlZWRJZCk7XG4gICAgfTtcblxuICAgIHRoaXMudG9nZ2xlS2VlcFVucmVhZCA9IGZ1bmN0aW9uIChpdGVtSWQpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBJdGVtUmVzb3VyY2UuZ2V0KGl0ZW1JZCk7XG4gICAgICAgIGlmICghaXRlbS51bnJlYWQpIHtcbiAgICAgICAgICAgIEZlZWRSZXNvdXJjZS5tYXJrSXRlbU9mRmVlZFVucmVhZChpdGVtLmZlZWRJZCk7XG4gICAgICAgICAgICBJdGVtUmVzb3VyY2UubWFya0l0ZW1SZWFkKGl0ZW1JZCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5rZWVwVW5yZWFkID0gIWl0ZW0ua2VlcFVucmVhZDtcbiAgICB9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBnZXRPcmRlcmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9yZGVyaW5nID0gU2V0dGluZ3NSZXNvdXJjZS5nZXQoJ29sZGVzdEZpcnN0Jyk7XG5cbiAgICAgICAgaWYgKHNlbGYuaXNGZWVkKCkpIHtcbiAgICAgICAgICAgIHZhciBmZWVkID0gRmVlZFJlc291cmNlLmdldEJ5SWQoJHJvdXRlUGFyYW1zLmlkKTtcbiAgICAgICAgICAgIGlmIChmZWVkICYmIGZlZWQub3JkZXJpbmcgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBvcmRlcmluZyA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZlZWQgJiYgZmVlZC5vcmRlcmluZyA9PT0gMikge1xuICAgICAgICAgICAgICAgIG9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JkZXJpbmc7XG4gICAgfTtcblxuICAgIHRoaXMub3JkZXJCeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGdldE9yZGVyaW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnaWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICctaWQnO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaXNDb21wYWN0VmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFNldHRpbmdzUmVzb3VyY2UuZ2V0KCdjb21wYWN0Jyk7XG4gICAgfTtcblxuICAgIHRoaXMuaXNDb21wYWN0RXhwYW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU2V0dGluZ3NSZXNvdXJjZS5nZXQoJ2NvbXBhY3RFeHBhbmQnKTtcbiAgICB9O1xuXG4gICAgdGhpcy5hdXRvUGFnaW5nRW5hYmxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBdXRvUGFnaW5nRW5hYmxlZDtcbiAgICB9O1xuXG4gICAgdGhpcy5tYXJrUmVhZEVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhU2V0dGluZ3NSZXNvdXJjZS5nZXQoJ3ByZXZlbnRSZWFkT25TY3JvbGwnKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zY3JvbGxSZWFkID0gZnVuY3Rpb24gKGl0ZW1JZHMpIHtcbiAgICAgICAgdmFyIGlkcyA9IFtdO1xuICAgICAgICB2YXIgZmVlZElkcyA9IFtdO1xuXG4gICAgICAgIGl0ZW1JZHMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbUlkKSB7XG4gICAgICAgICAgICB2YXIgaXRlbSA9IEl0ZW1SZXNvdXJjZS5nZXQoaXRlbUlkKTtcbiAgICAgICAgICAgIGlmICghaXRlbS5rZWVwVW5yZWFkKSB7XG4gICAgICAgICAgICAgICAgaWRzLnB1c2goaXRlbUlkKTtcbiAgICAgICAgICAgICAgICBmZWVkSWRzLnB1c2goaXRlbS5mZWVkSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIEZlZWRSZXNvdXJjZS5tYXJrSXRlbXNPZkZlZWRzUmVhZChmZWVkSWRzKTtcbiAgICAgICAgICAgIEl0ZW1SZXNvdXJjZS5tYXJrSXRlbXNSZWFkKGlkcyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5pc0ZlZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAkcm91dGUuY3VycmVudC4kJHJvdXRlLnR5cGUgPT09IEZFRURfVFlQRS5GRUVEO1xuICAgIH07XG5cbiAgICB0aGlzLmF1dG9QYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc05vdGhpbmdNb3JlVG9BdXRvUGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW4gY2FzZSBhIHN1YnNlcXVlbnQgYXV0b3BhZ2UgcmVxdWVzdCBjb21lcyBpbiB3YWl0IHVudGlsXG4gICAgICAgIC8vIHRoZSBjdXJyZW50IG9uZSBmaW5pc2hlZCBhbmQgZXhlY3V0ZSBhIHJlcXVlc3QgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkc1xuICAgICAgICBpZiAoIXRoaXMuaXNBdXRvUGFnaW5nRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvUGFnZUFnYWluID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNBdXRvUGFnaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmF1dG9QYWdlQWdhaW4gPSBmYWxzZTtcblxuICAgICAgICB2YXIgdHlwZSA9ICRyb3V0ZS5jdXJyZW50LiQkcm91dGUudHlwZTtcbiAgICAgICAgdmFyIGlkID0gJHJvdXRlUGFyYW1zLmlkO1xuICAgICAgICB2YXIgb2xkZXN0Rmlyc3QgPSBnZXRPcmRlcmluZygpO1xuICAgICAgICB2YXIgc2hvd0FsbCA9IFNldHRpbmdzUmVzb3VyY2UuZ2V0KCdzaG93QWxsJyk7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHNlYXJjaCA9ICRsb2NhdGlvbi5zZWFyY2goKS5zZWFyY2g7XG5cbiAgICAgICAgTG9hZGluZy5zZXRMb2FkaW5nKCdhdXRvcGFnaW5nJywgdHJ1ZSk7XG5cbiAgICAgICAgSXRlbVJlc291cmNlLmF1dG9QYWdlKHR5cGUsIGlkLCBvbGRlc3RGaXJzdCwgc2hvd0FsbCwgc2VhcmNoKVxuICAgICAgICAuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgUHVibGlzaGVyLnB1Ymxpc2hBbGwoZGF0YSk7XG5cbiAgICAgICAgICAgIGlmIChkYXRhLml0ZW1zLmxlbmd0aCA+PSBJVEVNX0FVVE9fUEFHRV9TSVpFKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pc0F1dG9QYWdpbmdFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pc05vdGhpbmdNb3JlVG9BdXRvUGFnZSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxmLmlzQXV0b1BhZ2luZ0VuYWJsZWQgJiYgc2VsZi5hdXRvUGFnZUFnYWluKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5hdXRvUGFnZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5lcnJvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLmlzQXV0b1BhZ2luZ0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIExvYWRpbmcuc2V0TG9hZGluZygnYXV0b3BhZ2luZycsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0UmVsYXRpdmVEYXRlID0gZnVuY3Rpb24gKHRpbWVzdGFtcCkge1xuICAgICAgICBpZiAodGltZXN0YW1wICE9PSB1bmRlZmluZWQgJiYgdGltZXN0YW1wICE9PSAnJykge1xuICAgICAgICAgICAgdmFyIGxhbmd1YWdlQ29kZSA9IFNldHRpbmdzUmVzb3VyY2UuZ2V0KCdsYW5ndWFnZScpO1xuICAgICAgICAgICAgdmFyIGRhdGUgPVxuICAgICAgICAgICAgICAgIG1vbWVudC51bml4KHRpbWVzdGFtcCkubG9jYWxlKGxhbmd1YWdlQ29kZSkuZnJvbU5vdygpICsgJyc7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICRyb3V0ZS5yZWxvYWQoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRNZWRpYVR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICBpZiAodHlwZSAmJiB0eXBlLmluZGV4T2YoJ2F1ZGlvJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnYXVkaW8nO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgJiYgdHlwZS5pbmRleE9mKCd2aWRlbycpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3ZpZGVvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9O1xuXG59XSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmNvbnRyb2xsZXIoJ0V4cGxvcmVDb250cm9sbGVyJyxcbltcInNpdGVzXCIsIFwiJHJvb3RTY29wZVwiLCBcIkZlZWRSZXNvdXJjZVwiLCBcIlNldHRpbmdzUmVzb3VyY2VcIiwgXCIkbG9jYXRpb25cIiwgZnVuY3Rpb24gKHNpdGVzLCAkcm9vdFNjb3BlLCBGZWVkUmVzb3VyY2UsIFNldHRpbmdzUmVzb3VyY2UsICRsb2NhdGlvbikge1xuXHQndXNlIHN0cmljdCc7XG5cblx0dGhpcy5zaXRlcyA9IHNpdGVzO1xuXHQvLyBqb2luIGFsbCBzaXRlc1xuXHR0aGlzLmZlZWRzID0gT2JqZWN0LmtleXMoc2l0ZXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0cmV0dXJuIFtrZXksIHNpdGVzW2tleV1dO1xuXHR9KS5yZWR1Y2UoZnVuY3Rpb24gKHhzLCB4KSB7XG5cdFx0dmFyIGNhdGVnb3J5ID0geFswXTtcblx0XHR2YXIgZmVlZExpc3QgPSB4WzFdO1xuXHRcdGZlZWRMaXN0LmZvckVhY2goZnVuY3Rpb24gKGZlZWQpIHtcblx0XHRcdGZlZWQuY2F0ZWdvcnkgPSBjYXRlZ29yeTtcblx0XHR9KTtcblx0XHRyZXR1cm4geHMuY29uY2F0KGZlZWRMaXN0KTtcblx0fSwgW10pO1xuXG5cdHRoaXMuZmVlZEV4aXN0cyA9IGZ1bmN0aW9uIChsb2NhdGlvbikge1xuXHRcdHJldHVybiBGZWVkUmVzb3VyY2UuZ2V0QnlMb2NhdGlvbihsb2NhdGlvbikgIT09IHVuZGVmaW5lZDtcblx0fTtcblxuXHR0aGlzLnN1YnNjcmliZVRvID0gZnVuY3Rpb24gKGxvY2F0aW9uKSB7XG5cdFx0JHJvb3RTY29wZS4kYnJvYWRjYXN0KCdhZGRGZWVkJywgbG9jYXRpb24pO1xuXHR9O1xuXG5cdHRoaXMuaXNDYXRlZ29yeVNob3duID0gZnVuY3Rpb24gKGRhdGEpIHtcblx0XHRyZXR1cm4gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcblx0XHRcdFx0cmV0dXJuIEZlZWRSZXNvdXJjZS5nZXRCeUxvY2F0aW9uKGVsZW1lbnQuZmVlZCkgPT09IHVuZGVmaW5lZDtcblx0XHRcdH0pLmxlbmd0aCA+IDA7XG5cdH07XG5cblx0dGhpcy5nZXRTdXBwb3J0ZWRMYW5ndWFnZUNvZGVzID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBTZXR0aW5nc1Jlc291cmNlLmdldFN1cHBvcnRlZExhbmd1YWdlQ29kZXMoKTtcblx0fTtcblxuXHR0aGlzLmdldEN1cnJlbnRMYW5ndWFnZUNvZGUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIGxhbmd1YWdlID0gJGxvY2F0aW9uLnNlYXJjaCgpLmxhbmc7XG5cdFx0aWYgKCFsYW5ndWFnZSkge1xuXHRcdFx0bGFuZ3VhZ2UgPSBTZXR0aW5nc1Jlc291cmNlLmdldCgnbGFuZ3VhZ2UnKTtcblx0XHR9XG5cdFx0cmV0dXJuIGxhbmd1YWdlO1xuXHR9O1xuXG5cdHRoaXMuc2hvd0xhbmd1YWdlID0gZnVuY3Rpb24gKGxhbmd1YWdlQ29kZSkge1xuXHRcdCRsb2NhdGlvbi51cmwoJy9leHBsb3JlLz9sYW5nPScgKyBsYW5ndWFnZUNvZGUpO1xuXHR9O1xuXG5cdHRoaXMuc2VsZWN0ZWRMYW5ndWFnZUNvZGUgPSB0aGlzLmdldEN1cnJlbnRMYW5ndWFnZUNvZGUoKTtcbn1dKTtcbiIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5jb250cm9sbGVyKCdOYXZpZ2F0aW9uQ29udHJvbGxlcicsXG5bXCIkcm91dGVcIiwgXCJGRUVEX1RZUEVcIiwgXCJGZWVkUmVzb3VyY2VcIiwgXCJGb2xkZXJSZXNvdXJjZVwiLCBcIkl0ZW1SZXNvdXJjZVwiLCBcIlNldHRpbmdzUmVzb3VyY2VcIiwgXCJQdWJsaXNoZXJcIiwgXCIkcm9vdFNjb3BlXCIsIFwiJGxvY2F0aW9uXCIsIFwiJHFcIiwgZnVuY3Rpb24gKCRyb3V0ZSwgRkVFRF9UWVBFLCBGZWVkUmVzb3VyY2UsIEZvbGRlclJlc291cmNlLCBJdGVtUmVzb3VyY2UsXG4gICAgU2V0dGluZ3NSZXNvdXJjZSwgUHVibGlzaGVyLCAkcm9vdFNjb3BlLCAkbG9jYXRpb24sICRxKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdGhpcy5mZWVkRXJyb3IgPSAnJztcbiAgICB0aGlzLnNob3dOZXdGb2xkZXIgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmFtaW5nRm9sZGVyID0gZmFsc2U7XG4gICAgdGhpcy5hZGRpbmdGZWVkID0gZmFsc2U7XG4gICAgdGhpcy5hZGRpbmdGb2xkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmZvbGRlckVycm9yID0gJyc7XG4gICAgdGhpcy5yZW5hbWVFcnJvciA9ICcnO1xuICAgIHRoaXMuZmVlZCA9IHt9O1xuXG4gICAgdmFyIGdldFJvdXRlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludCgkcm91dGUuY3VycmVudC5wYXJhbXMuaWQsIDEwKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRMYW5ndWFnZUNvZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBTZXR0aW5nc1Jlc291cmNlLmdldCgnbGFuZ3VhZ2UnKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRGZWVkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEZlZWRSZXNvdXJjZS5nZXRBbGwoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRGb2xkZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRm9sZGVyUmVzb3VyY2UuZ2V0QWxsKCk7XG4gICAgfTtcblxuICAgIHRoaXMubWFya0ZvbGRlclJlYWQgPSBmdW5jdGlvbiAoZm9sZGVySWQpIHtcbiAgICAgICAgRmVlZFJlc291cmNlLm1hcmtGb2xkZXJSZWFkKGZvbGRlcklkKTtcblxuICAgICAgICBGZWVkUmVzb3VyY2UuZ2V0QnlGb2xkZXJJZChmb2xkZXJJZCkuZm9yRWFjaChmdW5jdGlvbiAoZmVlZCkge1xuICAgICAgICAgICAgSXRlbVJlc291cmNlLm1hcmtGZWVkUmVhZChmZWVkLmlkKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMubWFya0ZlZWRSZWFkID0gZnVuY3Rpb24gKGZlZWRJZCkge1xuICAgICAgICBJdGVtUmVzb3VyY2UubWFya0ZlZWRSZWFkKGZlZWRJZCk7XG4gICAgICAgIEZlZWRSZXNvdXJjZS5tYXJrRmVlZFJlYWQoZmVlZElkKTtcbiAgICB9O1xuXG4gICAgdGhpcy5tYXJrUmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgSXRlbVJlc291cmNlLm1hcmtSZWFkKCk7XG4gICAgICAgIEZlZWRSZXNvdXJjZS5tYXJrUmVhZCgpO1xuICAgIH07XG5cbiAgICB0aGlzLmlzU2hvd0FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFNldHRpbmdzUmVzb3VyY2UuZ2V0KCdzaG93QWxsJyk7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0RmVlZHNPZkZvbGRlciA9IGZ1bmN0aW9uIChmb2xkZXJJZCkge1xuICAgICAgICByZXR1cm4gRmVlZFJlc291cmNlLmdldEJ5Rm9sZGVySWQoZm9sZGVySWQpO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFVucmVhZENvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRmVlZFJlc291cmNlLmdldFVucmVhZENvdW50KCk7XG4gICAgfTtcblxuICAgIHRoaXMuaXNVbnJlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFVucmVhZENvdW50KCkgPiAwO1xuICAgIH07XG5cbiAgICB0aGlzLmdldEZlZWRVbnJlYWRDb3VudCA9IGZ1bmN0aW9uIChmZWVkSWQpIHtcbiAgICAgICAgdmFyIGZlZWQgPSBGZWVkUmVzb3VyY2UuZ2V0QnlJZChmZWVkSWQpO1xuICAgICAgICBpZiAoZmVlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmVlZC51bnJlYWRDb3VudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaXNGZWVkVW5yZWFkID0gZnVuY3Rpb24gKGZlZWRJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGZWVkVW5yZWFkQ291bnQoZmVlZElkKSA+IDA7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0Rm9sZGVyVW5yZWFkQ291bnQ9IGZ1bmN0aW9uIChmb2xkZXJJZCkge1xuICAgICAgICByZXR1cm4gRmVlZFJlc291cmNlLmdldEZvbGRlclVucmVhZENvdW50KGZvbGRlcklkKTtcbiAgICB9O1xuXG4gICAgdGhpcy5pc0ZvbGRlclVucmVhZCA9IGZ1bmN0aW9uIChmb2xkZXJJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGb2xkZXJVbnJlYWRDb3VudChmb2xkZXJJZCkgPiAwO1xuICAgIH07XG5cbiAgICB0aGlzLmdldFN0YXJyZWRDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEl0ZW1SZXNvdXJjZS5nZXRTdGFycmVkQ291bnQoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5pc1N0YXJyZWRVbnJlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0YXJyZWRDb3VudCgpID4gMDtcbiAgICB9O1xuXG4gICAgdGhpcy50b2dnbGVGb2xkZXIgPSBmdW5jdGlvbiAoZm9sZGVyTmFtZSkge1xuICAgICAgICBGb2xkZXJSZXNvdXJjZS50b2dnbGVPcGVuKGZvbGRlck5hbWUpO1xuICAgIH07XG5cbiAgICB0aGlzLmhhc0ZlZWRzID0gZnVuY3Rpb24gKGZvbGRlcklkKSB7XG4gICAgICAgIHJldHVybiBGZWVkUmVzb3VyY2UuZ2V0Rm9sZGVyVW5yZWFkQ291bnQoZm9sZGVySWQpICE9PSB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIHRoaXMuc3ViRmVlZEFjdGl2ZSA9IGZ1bmN0aW9uIChmb2xkZXJJZCkge1xuICAgICAgICB2YXIgdHlwZSA9ICRyb3V0ZS5jdXJyZW50LiQkcm91dGUudHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gRkVFRF9UWVBFLkZFRUQpIHtcbiAgICAgICAgICAgIHZhciBmZWVkID0gRmVlZFJlc291cmNlLmdldEJ5SWQoZ2V0Um91dGVJZCgpKTtcblxuICAgICAgICAgICAgaWYgKGZlZWQgIT09IHVuZGVmaW5lZCAmJiBmZWVkLmZvbGRlcklkID09PSBmb2xkZXJJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICB0aGlzLmlzU3Vic2NyaXB0aW9uc0FjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICRyb3V0ZS5jdXJyZW50ICYmXG4gICAgICAgICAgICAkcm91dGUuY3VycmVudC4kJHJvdXRlLnR5cGUgPT09IEZFRURfVFlQRS5TVUJTQ1JJUFRJT05TO1xuICAgIH07XG5cbiAgICB0aGlzLmlzU3RhcnJlZEFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICRyb3V0ZS5jdXJyZW50ICYmXG4gICAgICAgICAgICAkcm91dGUuY3VycmVudC4kJHJvdXRlLnR5cGUgPT09IEZFRURfVFlQRS5TVEFSUkVEO1xuICAgIH07XG5cbiAgICB0aGlzLmlzRXhwbG9yZUFjdGl2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICRyb3V0ZS5jdXJyZW50ICYmXG4gICAgICAgICAgICAkcm91dGUuY3VycmVudC4kJHJvdXRlLnR5cGUgPT09IEZFRURfVFlQRS5FWFBMT1JFO1xuICAgIH07XG5cbiAgICB0aGlzLmlzRm9sZGVyQWN0aXZlID0gZnVuY3Rpb24gKGZvbGRlcklkKSB7XG4gICAgICAgIHJldHVybiAkcm91dGUuY3VycmVudCAmJlxuICAgICAgICAgICAgJHJvdXRlLmN1cnJlbnQuJCRyb3V0ZS50eXBlID09PSBGRUVEX1RZUEUuRk9MREVSICYmXG4gICAgICAgICAgICBnZXRSb3V0ZUlkKCkgPT09IGZvbGRlcklkO1xuICAgIH07XG5cbiAgICB0aGlzLmlzRmVlZEFjdGl2ZSA9IGZ1bmN0aW9uIChmZWVkSWQpIHtcbiAgICAgICAgcmV0dXJuICRyb3V0ZS5jdXJyZW50ICYmXG4gICAgICAgICAgICAkcm91dGUuY3VycmVudC4kJHJvdXRlLnR5cGUgPT09IEZFRURfVFlQRS5GRUVEICYmXG4gICAgICAgICAgICBnZXRSb3V0ZUlkKCkgPT09IGZlZWRJZDtcbiAgICB9O1xuXG4gICAgdGhpcy5mb2xkZXJOYW1lRXhpc3RzID0gZnVuY3Rpb24gKGZvbGRlck5hbWUpIHtcbiAgICAgICAgZm9sZGVyTmFtZSA9IGZvbGRlck5hbWUgfHwgJyc7XG4gICAgICAgIHJldHVybiBGb2xkZXJSZXNvdXJjZS5nZXQoZm9sZGVyTmFtZS50cmltKCkpICE9PSB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIHRoaXMuZmVlZFVybEV4aXN0cyA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgdXJsID0gdXJsIHx8ICcnO1xuICAgICAgICB1cmwgPSB1cmwudHJpbSgpO1xuICAgICAgICByZXR1cm4gRmVlZFJlc291cmNlLmdldCh1cmwpICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZlZWRSZXNvdXJjZS5nZXQoJ2h0dHA6Ly8nICsgdXJsKSAhPT0gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZUZlZWQgPSBmdW5jdGlvbiAoZmVlZCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuc2hvd05ld0ZvbGRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFkZGluZ0ZlZWQgPSB0cnVlO1xuXG4gICAgICAgIHZhciBuZXdGb2xkZXIgPSBmZWVkLm5ld0ZvbGRlcjtcbiAgICAgICAgdmFyIGV4aXN0aW5nRm9sZGVyID0gZmVlZC5leGlzdGluZ0ZvbGRlciB8fCB7aWQ6IDB9O1xuXG4gICAgICAgIC8vIHdlIGRvbnQgbmVlZCB0byBjcmVhdGUgYSBuZXcgZm9sZGVyXG4gICAgICAgIGlmIChuZXdGb2xkZXIgPT09IHVuZGVmaW5lZCB8fCBuZXdGb2xkZXIgPT09ICcnKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHNldCB0byBkaXNwbGF5IHRoZSBmZWVkIGluIGFueSBmb2xkZXIsIGV2ZW4gaWYgdGhlIGZvbGRlclxuICAgICAgICAgICAgLy8gaXMgY2xvc2VkIG9yIGhhcyBubyB1bnJlYWQgYXJ0aWNsZXNcbiAgICAgICAgICAgIGV4aXN0aW5nRm9sZGVyLmdldHNGZWVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgRmVlZFJlc291cmNlLmNyZWF0ZShmZWVkLnVybCwgZXhpc3RpbmdGb2xkZXIuaWQsIHVuZGVmaW5lZClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICBQdWJsaXNoZXIucHVibGlzaEFsbChkYXRhKTtcblxuICAgICAgICAgICAgICAgIC8vIHNldCBmb2xkZXIgYXMgZGVmYXVsdFxuICAgICAgICAgICAgICAgICRsb2NhdGlvbi5wYXRoKCcvaXRlbXMvZmVlZHMvJyArIGRhdGEuZmVlZHNbMF0uaWQgKyAnLycpO1xuXG4gICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ0ZvbGRlci5nZXRzRmVlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmZWVkLnVybCA9ICcnO1xuICAgICAgICAgICAgICAgIHNlbGYuYWRkaW5nRmVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBmb2xkZXIgZmlyc3QgYW5kIHRoZW4gdGhlIGZlZWRcbiAgICAgICAgICAgIEZvbGRlclJlc291cmNlLmNyZWF0ZShuZXdGb2xkZXIpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgICAgIFB1Ymxpc2hlci5wdWJsaXNoQWxsKGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBjcmVhdGVkIGZvbGRlciBvbiBzY29wZSBzbyBpdHMgcHJlc2VsZWN0ZWQgZm9yIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5leHQgYWRkaXRpb25cbiAgICAgICAgICAgICAgICBmZWVkLmV4aXN0aW5nRm9sZGVyID0gRm9sZGVyUmVzb3VyY2UuZ2V0KGRhdGEuZm9sZGVyc1swXS5uYW1lKTtcbiAgICAgICAgICAgICAgICBmZWVkLm5ld0ZvbGRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZUZlZWQoZmVlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZUZvbGRlciA9IGZ1bmN0aW9uIChmb2xkZXIpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLmFkZGluZ0ZvbGRlciA9IHRydWU7XG4gICAgICAgIEZvbGRlclJlc291cmNlLmNyZWF0ZShmb2xkZXIubmFtZSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgUHVibGlzaGVyLnB1Ymxpc2hBbGwoZGF0YSk7XG4gICAgICAgIH0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5hZGRpbmdGb2xkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvbGRlci5uYW1lID0gJyc7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLm1vdmVGZWVkID0gZnVuY3Rpb24gKGZlZWRJZCwgZm9sZGVySWQpIHtcbiAgICAgICAgdmFyIHJlbG9hZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZmVlZCA9IEZlZWRSZXNvdXJjZS5nZXRCeUlkKGZlZWRJZCk7XG5cbiAgICAgICAgaWYgKGZlZWQuZm9sZGVySWQgPT09IGZvbGRlcklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0ZvbGRlckFjdGl2ZShmZWVkLmZvbGRlcklkKSB8fFxuICAgICAgICAgICAgdGhpcy5pc0ZvbGRlckFjdGl2ZShmb2xkZXJJZCkpIHtcbiAgICAgICAgICAgIHJlbG9hZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBGZWVkUmVzb3VyY2UubW92ZShmZWVkSWQsIGZvbGRlcklkKTtcblxuICAgICAgICBpZiAocmVsb2FkKSB7XG4gICAgICAgICAgICAkcm91dGUucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5yZW5hbWVGZWVkID0gZnVuY3Rpb24gKGZlZWQpIHtcbiAgICAgICAgRmVlZFJlc291cmNlLnBhdGNoKGZlZWQuaWQsIHt0aXRsZTogZmVlZC50aXRsZX0pO1xuICAgICAgICBmZWVkLmVkaXRpbmcgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZW5hbWVGb2xkZXIgPSBmdW5jdGlvbiAoZm9sZGVyLCBuYW1lKSB7XG4gICAgICAgIGZvbGRlci5yZW5hbWVFcnJvciA9ICcnO1xuICAgICAgICB0aGlzLnJlbmFtaW5nRm9sZGVyID0gdHJ1ZTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmIChmb2xkZXIubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgZm9sZGVyLnJlbmFtZUVycm9yID0gJyc7XG4gICAgICAgICAgICBmb2xkZXIuZWRpdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZW5hbWluZ0ZvbGRlciA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgRm9sZGVyUmVzb3VyY2UucmVuYW1lKGZvbGRlci5uYW1lLCBuYW1lKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmb2xkZXIucmVuYW1lRXJyb3IgPSAnJztcbiAgICAgICAgICAgICAgICBmb2xkZXIuZWRpdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBmb2xkZXIucmVuYW1lRXJyb3IgPSBtZXNzYWdlO1xuICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5yZW5hbWluZ0ZvbGRlciA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5yZXZlcnNpYmx5RGVsZXRlRmVlZCA9IGZ1bmN0aW9uIChmZWVkKSB7XG4gICAgICAgIEZlZWRSZXNvdXJjZS5yZXZlcnNpYmx5RGVsZXRlKGZlZWQuaWQpLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJHJvdXRlLnJlbG9hZCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy51bmRvRGVsZXRlRmVlZCA9IGZ1bmN0aW9uIChmZWVkKSB7XG4gICAgICAgIEZlZWRSZXNvdXJjZS51bmRvRGVsZXRlKGZlZWQuaWQpLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJHJvdXRlLnJlbG9hZCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5kZWxldGVGZWVkID0gZnVuY3Rpb24gKGZlZWQpIHtcbiAgICAgICAgRmVlZFJlc291cmNlLmRlbGV0ZShmZWVkLnVybCk7XG4gICAgfTtcblxuXG4gICAgdGhpcy5yZXZlcnNpYmx5RGVsZXRlRm9sZGVyID0gZnVuY3Rpb24gKGZvbGRlcikge1xuICAgICAgICAkcS5hbGwoXG4gICAgICAgICAgICBGZWVkUmVzb3VyY2UucmV2ZXJzaWJseURlbGV0ZUZvbGRlcihmb2xkZXIuaWQpLFxuICAgICAgICAgICAgRm9sZGVyUmVzb3VyY2UucmV2ZXJzaWJseURlbGV0ZShmb2xkZXIubmFtZSlcbiAgICAgICAgKS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICRyb3V0ZS5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMudW5kb0RlbGV0ZUZvbGRlciA9IGZ1bmN0aW9uIChmb2xkZXIpIHtcbiAgICAgICAgJHEuYWxsKFxuICAgICAgICAgICAgRmVlZFJlc291cmNlLnVuZG9EZWxldGVGb2xkZXIoZm9sZGVyLmlkKSxcbiAgICAgICAgICAgIEZvbGRlclJlc291cmNlLnVuZG9EZWxldGUoZm9sZGVyLm5hbWUpXG4gICAgICAgICkuZmluYWxseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkcm91dGUucmVsb2FkKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aGlzLmRlbGV0ZUZvbGRlciA9IGZ1bmN0aW9uIChmb2xkZXIpIHtcbiAgICAgICAgRmVlZFJlc291cmNlLmRlbGV0ZUZvbGRlcihmb2xkZXIuaWQpO1xuICAgICAgICBGb2xkZXJSZXNvdXJjZS5kZWxldGUoZm9sZGVyLm5hbWUpO1xuICAgIH07XG5cbiAgICB0aGlzLnNldE9yZGVyaW5nID0gZnVuY3Rpb24gKGZlZWQsIG9yZGVyaW5nKSB7XG4gICAgICAgIEZlZWRSZXNvdXJjZS5wYXRjaChmZWVkLmlkLCB7b3JkZXJpbmc6IG9yZGVyaW5nfSk7XG4gICAgICAgICRyb3V0ZS5yZWxvYWQoKTtcbiAgICB9O1xuXG4gICAgdGhpcy50b2dnbGVQaW5uZWQgPSBmdW5jdGlvbiAoZmVlZElkKSB7XG4gICAgICAgIHZhciBmZWVkID0gRmVlZFJlc291cmNlLmdldEJ5SWQoZmVlZElkKTtcbiAgICAgICAgaWYgKGZlZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBGZWVkUmVzb3VyY2UucGF0Y2goZmVlZElkLCB7cGlubmVkOiAhZmVlZC5waW5uZWR9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnNldFVwZGF0ZU1vZGUgPSBmdW5jdGlvbiAoZmVlZElkLCB1cGRhdGVNb2RlKSB7XG4gICAgICAgIHJldHVybiBGZWVkUmVzb3VyY2UucGF0Y2goZmVlZElkLCB7dXBkYXRlTW9kZTogdXBkYXRlTW9kZX0pO1xuICAgIH07XG5cbiAgICB0aGlzLnRvZ2dsZUZ1bGxUZXh0ID0gZnVuY3Rpb24gKGZlZWQpIHtcbiAgICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCckcm91dGVDaGFuZ2VTdGFydCcpO1xuICAgICAgICBGZWVkUmVzb3VyY2UudG9nZ2xlRnVsbFRleHQoZmVlZC5pZCkuZmluYWxseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJyRyb3V0ZUNoYW5nZVN1Y2Nlc3MnKTtcbiAgICAgICAgICAgICRyb3V0ZS5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuc2VhcmNoID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICRsb2NhdGlvbi5zZWFyY2goJ3NlYXJjaCcsIG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGxvY2F0aW9uLnNlYXJjaCgnc2VhcmNoJywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICRyb290U2NvcGUuJG9uKCdtb3ZlRmVlZFRvRm9sZGVyJywgZnVuY3Rpb24gKHNjb3BlLCBkYXRhKSB7XG4gICAgICAgIHNlbGYubW92ZUZlZWQoZGF0YS5mZWVkSWQsIGRhdGEuZm9sZGVySWQpO1xuICAgIH0pO1xuXG4gICAgLy8gYmFzZWQgb24gdGhlIHJvdXRlIHdlIHdhbnQgdG8gcHJlc2VsZWN0IGEgZm9sZGVyIGluIHRoZSBhZGQgbmV3IGZlZWRcbiAgICAvLyBkcm9wIGRvd25cbiAgICB2YXIgc2V0U2VsZWN0ZWRGb2xkZXJGb3JSb3V0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHR5cGU7XG4gICAgICAgIGlmICgkcm91dGUuY3VycmVudCkge1xuICAgICAgICAgICAgdHlwZSA9ICRyb3V0ZS5jdXJyZW50LiQkcm91dGUudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmb2xkZXJJZCA9IDA7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IEZFRURfVFlQRS5GT0xERVIpIHtcbiAgICAgICAgICAgIGZvbGRlcklkID0gZ2V0Um91dGVJZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEZFRURfVFlQRS5GRUVEKSB7XG4gICAgICAgICAgICB2YXIgZmVlZCA9IEZlZWRSZXNvdXJjZS5nZXRCeUlkKGdldFJvdXRlSWQoKSk7XG5cbiAgICAgICAgICAgIGlmIChmZWVkKSB7XG4gICAgICAgICAgICAgICAgZm9sZGVySWQgPSBmZWVkLmZvbGRlcklkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZvbGRlcjtcbiAgICAgICAgaWYgKGZvbGRlcklkICE9PSAwKSB7XG4gICAgICAgICAgICBmb2xkZXIgPSBGb2xkZXJSZXNvdXJjZS5nZXRCeUlkKGZvbGRlcklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuZmVlZC5leGlzdGluZ0ZvbGRlciA9IGZvbGRlcjtcbiAgICB9O1xuXG4gICAgJHJvb3RTY29wZS4kb24oJyRyb3V0ZUNoYW5nZVN1Y2Nlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldFNlbGVjdGVkRm9sZGVyRm9yUm91dGUoKTtcbiAgICB9KTtcblxufV0pO1xuIiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmNvbnRyb2xsZXIoJ1NldHRpbmdzQ29udHJvbGxlcicsXG5bXCIkcm91dGVcIiwgXCIkcVwiLCBcIlNldHRpbmdzUmVzb3VyY2VcIiwgXCJJdGVtUmVzb3VyY2VcIiwgXCJPUE1MUGFyc2VyXCIsIFwiT1BNTEltcG9ydGVyXCIsIFwiUHVibGlzaGVyXCIsIGZ1bmN0aW9uICgkcm91dGUsICRxLCBTZXR0aW5nc1Jlc291cmNlLCBJdGVtUmVzb3VyY2UsIE9QTUxQYXJzZXIsXG4gICAgICAgICAgT1BNTEltcG9ydGVyLCBQdWJsaXNoZXIpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB0aGlzLmlzT1BNTEltcG9ydGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNBcnRpY2xlc0ltcG9ydGluZyA9IGZhbHNlO1xuICAgIHRoaXMub3BtbEltcG9ydEVycm9yID0gZmFsc2U7XG4gICAgdGhpcy5hcnRpY2xlSW1wb3J0RXJyb3IgPSBmYWxzZTtcblxuICAgIHZhciBzZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICBTZXR0aW5nc1Jlc291cmNlLnNldChrZXksIHZhbHVlKTtcblxuICAgICAgICBpZiAoWydzaG93QWxsJywgJ29sZGVzdEZpcnN0JywgJ2NvbXBhY3QnXS5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgICAgICAgJHJvdXRlLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudG9nZ2xlU2V0dGluZyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgc2V0KGtleSwgIXRoaXMuZ2V0U2V0dGluZyhrZXkpKTtcbiAgICB9O1xuXG4gICAgdGhpcy5nZXRTZXR0aW5nID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gU2V0dGluZ3NSZXNvdXJjZS5nZXQoa2V5KTtcbiAgICB9O1xuXG4gICAgdGhpcy5pbXBvcnRPUE1MID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5vcG1sSW1wb3J0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hcnRpY2xlSW1wb3J0RXJyb3IgPSBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5pc09QTUxJbXBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBwYXJzZWRDb250ZW50ID0gT1BNTFBhcnNlci5wYXJzZShjb250ZW50KTtcblxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGpvYlNpemUgPSA1O1xuXG4gICAgICAgICAgICBPUE1MSW1wb3J0ZXIuaW1wb3J0Rm9sZGVycyhwYXJzZWRDb250ZW50KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZlZWRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBPUE1MSW1wb3J0ZXIuaW1wb3J0RmVlZFF1ZXVlKGZlZWRRdWV1ZSwgam9iU2l6ZSk7XG4gICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmlzT1BNTEltcG9ydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5pc09QTUxJbXBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMub3BtbEltcG9ydEVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmltcG9ydEFydGljbGVzID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5vcG1sSW1wb3J0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hcnRpY2xlSW1wb3J0RXJyb3IgPSBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5pc0FydGljbGVzSW1wb3J0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBhcnRpY2xlcyA9IEpTT04ucGFyc2UoY29udGVudCk7XG5cbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIEl0ZW1SZXNvdXJjZS5pbXBvcnRBcnRpY2xlcyhhcnRpY2xlcykuc3VjY2VzcyhmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIFB1Ymxpc2hlci5wdWJsaXNoQWxsKGRhdGEpO1xuICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5pc0FydGljbGVzSW1wb3J0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmFydGljbGVJbXBvcnRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzQXJ0aWNsZXNJbXBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbn1dKTsiLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuZmlsdGVyKCd0cnVzdFVybCcsIFtcIiRzY2VcIiwgZnVuY3Rpb24gKCRzY2UpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHVybCkge1xuICAgICAgICByZXR1cm4gJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwodXJsKTtcbiAgICB9O1xufV0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5maWx0ZXIoJ3VucmVhZENvdW50Rm9ybWF0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHJldHVybiBmdW5jdGlvbiAodW5yZWFkQ291bnQpIHtcbiAgICAgICAgaWYgKHVucmVhZENvdW50ID4gOTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gJzk5OSsnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bnJlYWRDb3VudDtcbiAgICB9O1xufSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmZhY3RvcnkoJ0ZlZWRSZXNvdXJjZScsIFtcIlJlc291cmNlXCIsIFwiJGh0dHBcIiwgXCJCQVNFX1VSTFwiLCBcIiRxXCIsIGZ1bmN0aW9uIChSZXNvdXJjZSwgJGh0dHAsIEJBU0VfVVJMLCAkcSkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBGZWVkUmVzb3VyY2UgPSBmdW5jdGlvbiAoJGh0dHAsIEJBU0VfVVJMLCAkcSkge1xuICAgICAgICBSZXNvdXJjZS5jYWxsKHRoaXMsICRodHRwLCBCQVNFX1VSTCwgJ3VybCcpO1xuICAgICAgICB0aGlzLmlkcyA9IHt9O1xuICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLnVucmVhZENvdW50ID0gMDtcbiAgICAgICAgdGhpcy5mb2xkZXJVbnJlYWRDb3VudCA9IHt9O1xuICAgICAgICB0aGlzLmZvbGRlcklkcyA9IHt9O1xuICAgICAgICB0aGlzLiRxID0gJHE7XG4gICAgfTtcblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFJlc291cmNlLnByb3RvdHlwZSk7XG5cbiAgICBGZWVkUmVzb3VyY2UucHJvdG90eXBlLnJlY2VpdmUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUucmVjZWl2ZS5jYWxsKHRoaXMsIGRhdGEpO1xuICAgICAgICB0aGlzLnVwZGF0ZVVucmVhZENhY2hlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9sZGVyQ2FjaGUoKTtcbiAgICB9O1xuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLmNsZWFyLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMudW5yZWFkQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmZvbGRlclVucmVhZENvdW50ID0ge307XG4gICAgICAgIHRoaXMuZm9sZGVySWRzID0ge307XG4gICAgICAgIHRoaXMuaWRzID0ge307XG4gICAgICAgIHRoaXMubG9jYXRpb25zID0ge307XG4gICAgfTtcblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUudXBkYXRlVW5yZWFkQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5yZWFkQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmZvbGRlclVucmVhZENvdW50ID0ge307XG5cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChmZWVkKSB7XG4gICAgICAgICAgICBpZiAoZmVlZC51bnJlYWRDb3VudCkge1xuICAgICAgICAgICAgICAgIHNlbGYudW5yZWFkQ291bnQgKz0gZmVlZC51bnJlYWRDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmZWVkLmZvbGRlcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxmLmZvbGRlclVucmVhZENvdW50W2ZlZWQuZm9sZGVySWRdID1cbiAgICAgICAgICAgICAgICAgICAgc2VsZi5mb2xkZXJVbnJlYWRDb3VudFtmZWVkLmZvbGRlcklkXSB8fCAwO1xuICAgICAgICAgICAgICAgIHNlbGYuZm9sZGVyVW5yZWFkQ291bnRbZmVlZC5mb2xkZXJJZF0gKz0gZmVlZC51bnJlYWRDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS51cGRhdGVGb2xkZXJDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5mb2xkZXJJZHMgPSB7fTtcblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMudmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKGZlZWQpIHtcbiAgICAgICAgICAgIHNlbGYuZm9sZGVySWRzW2ZlZWQuZm9sZGVySWRdID1cbiAgICAgICAgICAgICAgICBzZWxmLmZvbGRlcklkc1tmZWVkLmZvbGRlcklkXSB8fCBbXTtcbiAgICAgICAgICAgIHNlbGYuZm9sZGVySWRzW2ZlZWQuZm9sZGVySWRdLnB1c2goZmVlZCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZS5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmlkc1t2YWx1ZS5pZF0gPSB0aGlzLmhhc2hNYXBbdmFsdWUudXJsXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUubG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbnNbdmFsdWUubG9jYXRpb25dID0gdGhpcy5oYXNoTWFwW3ZhbHVlLnVybF07XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBGZWVkUmVzb3VyY2UucHJvdG90eXBlLm1hcmtSZWFkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uIChmZWVkKSB7XG4gICAgICAgICAgICBmZWVkLnVucmVhZENvdW50ID0gMDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRDYWNoZSgpO1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUubWFya0ZlZWRSZWFkID0gZnVuY3Rpb24gKGZlZWRJZCkge1xuICAgICAgICB0aGlzLmlkc1tmZWVkSWRdLnVucmVhZENvdW50ID0gMDtcbiAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRDYWNoZSgpO1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUubWFya0ZvbGRlclJlYWQgPSBmdW5jdGlvbiAoZm9sZGVySWQpIHtcbiAgICAgICAgdGhpcy52YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAoZmVlZCkge1xuICAgICAgICAgICAgaWYgKGZlZWQuZm9sZGVySWQgPT09IGZvbGRlcklkKSB7XG4gICAgICAgICAgICAgICAgZmVlZC51bnJlYWRDb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlVW5yZWFkQ2FjaGUoKTtcbiAgICB9O1xuXG5cbiAgICBGZWVkUmVzb3VyY2UucHJvdG90eXBlLm1hcmtJdGVtT2ZGZWVkUmVhZCA9IGZ1bmN0aW9uIChmZWVkSWQpIHtcbiAgICAgICAgdGhpcy5pZHNbZmVlZElkXS51bnJlYWRDb3VudCAtPSAxO1xuICAgICAgICB0aGlzLnVwZGF0ZVVucmVhZENhY2hlKCk7XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5tYXJrSXRlbXNPZkZlZWRzUmVhZCA9IGZ1bmN0aW9uIChmZWVkSWRzKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgZmVlZElkcy5mb3JFYWNoKGZ1bmN0aW9uIChmZWVkSWQpIHtcbiAgICAgICAgICAgIHNlbGYuaWRzW2ZlZWRJZF0udW5yZWFkQ291bnQgLT0gMTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRDYWNoZSgpO1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUubWFya0l0ZW1PZkZlZWRVbnJlYWQgPSBmdW5jdGlvbiAoZmVlZElkKSB7XG4gICAgICAgIHRoaXMuaWRzW2ZlZWRJZF0udW5yZWFkQ291bnQgKz0gMTtcbiAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRDYWNoZSgpO1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUuZ2V0VW5yZWFkQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVucmVhZENvdW50O1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUuZ2V0Rm9sZGVyVW5yZWFkQ291bnQgPSBmdW5jdGlvbiAoZm9sZGVySWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZGVyVW5yZWFkQ291bnRbZm9sZGVySWRdO1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUuZ2V0QnlGb2xkZXJJZCA9IGZ1bmN0aW9uIChmb2xkZXJJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb2xkZXJJZHNbZm9sZGVySWRdIHx8IFtdO1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUuZ2V0QnlJZCA9IGZ1bmN0aW9uIChmZWVkSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWRzW2ZlZWRJZF07XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5nZXRCeUxvY2F0aW9uID0gZnVuY3Rpb24gKGxvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uc1tsb2NhdGlvbl07XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKGZlZWRJZCwgZm9sZGVySWQpIHtcbiAgICAgICAgdmFyIGZlZWQgPSB0aGlzLmdldEJ5SWQoZmVlZElkKTtcbiAgICAgICAgZmVlZC5mb2xkZXJJZCA9IGZvbGRlcklkO1xuXG4gICAgICAgIHRoaXMudXBkYXRlRm9sZGVyQ2FjaGUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRDYWNoZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBhdGNoKGZlZWRJZCwge2ZvbGRlcklkOiBmb2xkZXJJZH0pO1xuXG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAodXJsLCBmb2xkZXJJZCwgdGl0bGUpIHtcbiAgICAgICAgdXJsID0gdXJsLnRyaW0oKTtcbiAgICAgICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgICAgICB1cmwgPSAnaHR0cHM6Ly8nICsgdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRpdGxlID0gdGl0bGUudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZlZWQgPSB7XG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIGZvbGRlcklkOiBmb2xkZXJJZCB8fCAwLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlIHx8IHVybCxcbiAgICAgICAgICAgIHVucmVhZENvdW50OiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5hZGQoZmVlZCk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9sZGVyQ2FjaGUoKTtcblxuICAgICAgICB2YXIgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7XG5cbiAgICAgICAgdGhpcy5odHRwKHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgdXJsOiB0aGlzLkJBU0VfVVJMICsgJy9mZWVkcycsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgcGFyZW50Rm9sZGVySWQ6IGZvbGRlcklkIHx8IDAsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pLmVycm9yKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICBmZWVkLmZhdmljb25MaW5rID0gJyc7XG4gICAgICAgICAgICBmZWVkLmVycm9yID0gZGF0YS5tZXNzYWdlO1xuICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUucmV2ZXJzaWJseURlbGV0ZSA9IGZ1bmN0aW9uIChpZCwgdXBkYXRlQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRm9sZGVyKSB7XG4gICAgICAgIHZhciBmZWVkID0gdGhpcy5nZXRCeUlkKGlkKTtcblxuICAgICAgICAvLyBpZiBhIGZvbGRlciBpcyBkZWxldGVkIGl0IGRvZXMgbm90IGhhdmUgdG8gdHJpZ2dlciB0aGUgZGVsZXRlXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBmb3IgdGhlIGZlZWQgYmVjYXVzZSB0aGUgZmVlZCBpcyBub3QgZGVsZXRlZCwgaXRzIGp1c3Qgbm90XG4gICAgICAgIC8vIGRpc3BsYXllZC4gT3RoZXJ3aXNlIHRoaXMgY2F1c2VzIHRoZSBmZWVkIHRvIGFsc28gYmUgZGVsZXRlZCBhZ2FpblxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBmb2xkZXIgZGVzdHJveXMgdGhlIGZlZWQncyBzY29wZVxuICAgICAgICBpZiAoZmVlZCAmJiBpc0ZvbGRlciAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgZmVlZC5kZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVDYWNoZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVW5yZWFkQ2FjaGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKHRoaXMuQkFTRV9VUkwgKyAnL2ZlZWRzLycgKyBpZCk7XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5yZXZlcnNpYmx5RGVsZXRlRm9sZGVyID0gZnVuY3Rpb24gKGZvbGRlcklkKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICAgIHRoaXMuZ2V0QnlGb2xkZXJJZChmb2xkZXJJZCkuZm9yRWFjaChmdW5jdGlvbiAoZmVlZCkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzZWxmLnJldmVyc2libHlEZWxldGUoZmVlZC5pZCwgZmFsc2UsIHRydWUpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRDYWNoZSgpO1xuXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IHRoaXMuJHEuYWxsKHByb21pc2VzKTtcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodXJsLCB1cGRhdGVDYWNoZSkge1xuICAgICAgICB2YXIgZmVlZCA9IHRoaXMuZ2V0KHVybCk7XG4gICAgICAgIGlmIChmZWVkICE9PSB1bmRlZmluZWQgJiYgZmVlZC5pZCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaWRzW2ZlZWQuaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZlZWQgIT09IHVuZGVmaW5lZCAmJiBmZWVkLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2NhdGlvbnNbZmVlZC5sb2NhdGlvbl07XG4gICAgICAgIH1cblxuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZGVsZXRlLmNhbGwodGhpcywgdXJsKTtcblxuICAgICAgICBpZiAodXBkYXRlQ2FjaGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVucmVhZENhY2hlKCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvbGRlckNhY2hlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmVlZDtcbiAgICB9O1xuXG5cbiAgICBGZWVkUmVzb3VyY2UucHJvdG90eXBlLmRlbGV0ZUZvbGRlciA9IGZ1bmN0aW9uIChmb2xkZXJJZCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHRoaXMuZ2V0QnlGb2xkZXJJZChmb2xkZXJJZCkuZm9yRWFjaChmdW5jdGlvbiAoZmVlZCkge1xuICAgICAgICAgICAgc2VsZi5kZWxldGUoZmVlZC51cmwsIGZhbHNlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRDYWNoZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvbGRlckNhY2hlKCk7XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS51bmRvRGVsZXRlID0gZnVuY3Rpb24gKGlkLCB1cGRhdGVDYWNoZSkge1xuICAgICAgICB2YXIgZmVlZCA9IHRoaXMuZ2V0QnlJZChpZCk7XG5cbiAgICAgICAgaWYgKGZlZWQpIHtcbiAgICAgICAgICAgIGZlZWQuZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwZGF0ZUNhY2hlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRDYWNoZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuQkFTRV9VUkwgKyAnL2ZlZWRzLycgKyBpZCArICcvcmVzdG9yZScpO1xuICAgIH07XG5cblxuICAgIEZlZWRSZXNvdXJjZS5wcm90b3R5cGUudW5kb0RlbGV0ZUZvbGRlciA9IGZ1bmN0aW9uIChmb2xkZXJJZCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuZ2V0QnlGb2xkZXJJZChmb2xkZXJJZCkuZm9yRWFjaChmdW5jdGlvbiAoZmVlZCkge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzZWxmLnVuZG9EZWxldGUoZmVlZC5pZCwgZmFsc2UpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRDYWNoZSgpO1xuXG4gICAgICAgIHZhciBkZWZlcnJlZCA9IHRoaXMuJHEuYWxsKHByb21pc2VzKTtcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5zZXRPcmRlcmluZyA9IGZ1bmN0aW9uIChmZWVkSWQsIG9yZGVyaW5nKSB7XG4gICAgICAgIHZhciBmZWVkID0gdGhpcy5nZXRCeUlkKGZlZWRJZCk7XG5cbiAgICAgICAgaWYgKGZlZWQpIHtcbiAgICAgICAgICAgIGZlZWQub3JkZXJpbmcgPSBvcmRlcmluZztcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLkJBU0VfVVJMICsgJy9mZWVkcy8nICsgZmVlZElkO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICBvcmRlcmluZzogb3JkZXJpbmdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5zZXRQaW5uZWQgPSBmdW5jdGlvbiAoZmVlZElkLCBpc1Bpbm5lZCkge1xuICAgICAgICB2YXIgZmVlZCA9IHRoaXMuZ2V0QnlJZChmZWVkSWQpO1xuXG4gICAgICAgIGlmIChmZWVkKSB7XG4gICAgICAgICAgICBmZWVkLnBpbm5lZCA9IGlzUGlubmVkO1xuICAgICAgICAgICAgdmFyIHVybCA9IHRoaXMuQkFTRV9VUkwgKyAnL2ZlZWRzLycgKyBmZWVkSWQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBhdGNoKHVybCwge1xuICAgICAgICAgICAgICAgIHBpbm5lZDogaXNQaW5uZWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS5wYXRjaCA9IGZ1bmN0aW9uIChmZWVkSWQsIGRpZmYpIHtcbiAgICAgICAgdmFyIGZlZWQgPSB0aGlzLmdldEJ5SWQoZmVlZElkKTtcblxuICAgICAgICBpZiAoZmVlZCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlmZikuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgICAgICBmZWVkW2tleV0gPSBkaWZmW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciB1cmwgPSB0aGlzLkJBU0VfVVJMICsgJy9mZWVkcy8nICsgZmVlZElkO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaCh1cmwsIGRpZmYpO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgRmVlZFJlc291cmNlLnByb3RvdHlwZS50b2dnbGVGdWxsVGV4dCA9IGZ1bmN0aW9uIChmZWVkSWQpIHtcbiAgICAgICAgdmFyIGZlZWQgPSB0aGlzLmdldEJ5SWQoZmVlZElkKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wYXRjaChmZWVkSWQsIHtmdWxsVGV4dEVuYWJsZWQ6ICFmZWVkLmZ1bGxUZXh0RW5hYmxlZH0pO1xuICAgIH07XG5cblxuICAgIHJldHVybiBuZXcgRmVlZFJlc291cmNlKCRodHRwLCBCQVNFX1VSTCwgJHEpO1xufV0pO1xuIiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmZhY3RvcnkoJ0ZvbGRlclJlc291cmNlJywgW1wiUmVzb3VyY2VcIiwgXCIkaHR0cFwiLCBcIkJBU0VfVVJMXCIsIFwiJHFcIiwgZnVuY3Rpb24gKFJlc291cmNlLCAkaHR0cCwgQkFTRV9VUkwsICRxKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIEZvbGRlclJlc291cmNlID0gZnVuY3Rpb24gKCRodHRwLCBCQVNFX1VSTCwgJHEpIHtcbiAgICAgICAgUmVzb3VyY2UuY2FsbCh0aGlzLCAkaHR0cCwgQkFTRV9VUkwsICduYW1lJyk7XG4gICAgICAgIHRoaXMuZGVsZXRlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuJHEgPSAkcTtcbiAgICAgICAgdGhpcy5pZHMgPSB7fTtcbiAgICB9O1xuXG4gICAgRm9sZGVyUmVzb3VyY2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShSZXNvdXJjZS5wcm90b3R5cGUpO1xuXG5cbiAgICBGb2xkZXJSZXNvdXJjZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIGlmICh2YWx1ZS5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmlkc1t2YWx1ZS5pZF0gPSB0aGlzLmhhc2hNYXBbdmFsdWUubmFtZV07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgRm9sZGVyUmVzb3VyY2UucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUuY2xlYXIuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5pZHMgPSB7fTtcbiAgICB9O1xuXG4gICAgRm9sZGVyUmVzb3VyY2UucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBmb2xkZXIgPSB0aGlzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGZvbGRlciAhPT0gdW5kZWZpbmVkICYmIGZvbGRlci5pZCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuaWRzW2ZvbGRlci5pZF07XG4gICAgICAgIH1cblxuICAgICAgICBSZXNvdXJjZS5wcm90b3R5cGUuZGVsZXRlLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIGZvbGRlcjtcbiAgICB9O1xuXG4gICAgRm9sZGVyUmVzb3VyY2UucHJvdG90eXBlLnRvZ2dsZU9wZW4gPSBmdW5jdGlvbiAoZm9sZGVyTmFtZSkge1xuICAgICAgICB2YXIgZm9sZGVyID0gdGhpcy5nZXQoZm9sZGVyTmFtZSk7XG4gICAgICAgIGZvbGRlci5vcGVuZWQgPSAhZm9sZGVyLm9wZW5lZDtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwKHtcbiAgICAgICAgICAgIHVybDogdGhpcy5CQVNFX1VSTCArICcvZm9sZGVycy8nICsgZm9sZGVyLmlkICsgJy9vcGVuJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZvbGRlcklkOiBmb2xkZXIuaWQsXG4gICAgICAgICAgICAgICAgb3BlbjogZm9sZGVyLm9wZW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG5cbiAgICBGb2xkZXJSZXNvdXJjZS5wcm90b3R5cGUucmVuYW1lID0gZnVuY3Rpb24gKGZvbGRlck5hbWUsIHRvRm9sZGVyTmFtZSkge1xuICAgICAgICB2YXIgZm9sZGVyID0gdGhpcy5nZXQoZm9sZGVyTmFtZSk7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IHRoaXMuJHEuZGVmZXIoKTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuaHR0cCh7XG4gICAgICAgICAgICB1cmw6IHRoaXMuQkFTRV9VUkwgKyAnL2ZvbGRlcnMvJyArIGZvbGRlci5pZCArICcvcmVuYW1lJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZvbGRlck5hbWU6IHRvRm9sZGVyTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KS5zdWNjZXNzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvbGRlci5uYW1lID0gdG9Gb2xkZXJOYW1lO1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYuaGFzaE1hcFtmb2xkZXJOYW1lXTtcbiAgICAgICAgICAgIHNlbGYuaGFzaE1hcFt0b0ZvbGRlck5hbWVdID0gZm9sZGVyO1xuXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIH0pLmVycm9yKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgfTtcblxuICAgIEZvbGRlclJlc291cmNlLnByb3RvdHlwZS5nZXRCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkc1tpZF07XG4gICAgfTtcblxuICAgIEZvbGRlclJlc291cmNlLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoZm9sZGVyTmFtZSkge1xuICAgICAgICBmb2xkZXJOYW1lID0gZm9sZGVyTmFtZS50cmltKCk7XG4gICAgICAgIHZhciBmb2xkZXIgPSB7XG4gICAgICAgICAgICBuYW1lOiBmb2xkZXJOYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5hZGQoZm9sZGVyKTtcblxuICAgICAgICB2YXIgZGVmZXJyZWQgPSB0aGlzLiRxLmRlZmVyKCk7XG5cbiAgICAgICAgdGhpcy5odHRwKHtcbiAgICAgICAgICAgIHVybDogdGhpcy5CQVNFX1VSTCArICcvZm9sZGVycycsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBmb2xkZXJOYW1lOiBmb2xkZXJOYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pLmVycm9yKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICBmb2xkZXIuZXJyb3IgPSBkYXRhLm1lc3NhZ2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG5cblxuICAgIEZvbGRlclJlc291cmNlLnByb3RvdHlwZS5yZXZlcnNpYmx5RGVsZXRlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGZvbGRlciA9IHRoaXMuZ2V0KG5hbWUpO1xuICAgICAgICB2YXIgaWQgPSBmb2xkZXIuaWQ7XG4gICAgICAgIGZvbGRlci5kZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUodGhpcy5CQVNFX1VSTCArICcvZm9sZGVycy8nICsgaWQpO1xuICAgIH07XG5cblxuICAgIEZvbGRlclJlc291cmNlLnByb3RvdHlwZS51bmRvRGVsZXRlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIGZvbGRlciA9IHRoaXMuZ2V0KG5hbWUpO1xuICAgICAgICB2YXIgaWQgPSBmb2xkZXIuaWQ7XG4gICAgICAgIGZvbGRlci5kZWxldGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLkJBU0VfVVJMICsgJy9mb2xkZXJzLycgKyBpZCArICcvcmVzdG9yZScpO1xuICAgIH07XG5cblxuICAgIHJldHVybiBuZXcgRm9sZGVyUmVzb3VyY2UoJGh0dHAsIEJBU0VfVVJMLCAkcSk7XG59XSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmZhY3RvcnkoJ0l0ZW1SZXNvdXJjZScsIFtcIlJlc291cmNlXCIsIFwiJGh0dHBcIiwgXCJCQVNFX1VSTFwiLCBcIklURU1fQkFUQ0hfU0laRVwiLCBmdW5jdGlvbiAoUmVzb3VyY2UsICRodHRwLCBCQVNFX1VSTCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRFTV9CQVRDSF9TSVpFKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIEl0ZW1SZXNvdXJjZSA9IGZ1bmN0aW9uICgkaHR0cCwgQkFTRV9VUkwsIElURU1fQkFUQ0hfU0laRSkge1xuICAgICAgICBSZXNvdXJjZS5jYWxsKHRoaXMsICRodHRwLCBCQVNFX1VSTCk7XG4gICAgICAgIHRoaXMuYmF0Y2hTaXplID0gSVRFTV9CQVRDSF9TSVpFO1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgfTtcblxuICAgIEl0ZW1SZXNvdXJjZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFJlc291cmNlLnByb3RvdHlwZSk7XG5cbiAgICBJdGVtUmVzb3VyY2UucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXJyZWRDb3VudCA9IDA7XG4gICAgICAgIHRoaXMubG93ZXN0SWQgPSAwO1xuICAgICAgICB0aGlzLmhpZ2hlc3RJZCA9IDA7XG4gICAgICAgIFJlc291cmNlLnByb3RvdHlwZS5jbGVhci5jYWxsKHRoaXMpO1xuICAgIH07XG5cbiAgICBJdGVtUmVzb3VyY2UucHJvdG90eXBlLnJlY2VpdmUgPSBmdW5jdGlvbiAodmFsdWUsIGNoYW5uZWwpIHtcbiAgICAgICAgc3dpdGNoIChjaGFubmVsKSB7XG5cbiAgICAgICAgY2FzZSAnbmV3ZXN0SXRlbUlkJzpcbiAgICAgICAgICAgIHRoaXMubmV3ZXN0SXRlbUlkID0gdmFsdWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzdGFycmVkJzpcbiAgICAgICAgICAgIHRoaXMuc3RhcnJlZENvdW50ID0gdmFsdWU7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgbG93ZXN0IGFuZCBoaWdoZXN0IGlkXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubG93ZXN0SWQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb3dlc3RJZCA9IGl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmhpZ2hlc3RJZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZ2hlc3RJZCA9IGl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uaWQgPiBzZWxmLmhpZ2hlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZ2hlc3RJZCA9IGl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmlkIDwgc2VsZi5sb3dlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmxvd2VzdElkID0gaXRlbS5pZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLnJlY2VpdmUuY2FsbCh0aGlzLCB2YWx1ZSwgY2hhbm5lbCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBJdGVtUmVzb3VyY2UucHJvdG90eXBlLmdldE5ld2VzdEl0ZW1JZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3ZXN0SXRlbUlkO1xuICAgIH07XG5cblxuICAgIEl0ZW1SZXNvdXJjZS5wcm90b3R5cGUuZ2V0U3RhcnJlZENvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFycmVkQ291bnQ7XG4gICAgfTtcblxuXG4gICAgSXRlbVJlc291cmNlLnByb3RvdHlwZS5zdGFyID0gZnVuY3Rpb24gKGl0ZW1JZCwgaXNTdGFycmVkKSB7XG4gICAgICAgIGlmIChpc1N0YXJyZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaXNTdGFycmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdCA9IHRoaXMuZ2V0KGl0ZW1JZCk7XG4gICAgICAgIHZhciB1cmwgPSB0aGlzLkJBU0VfVVJMICtcbiAgICAgICAgICAgICcvaXRlbXMvJyArIGl0LmZlZWRJZCArICcvJyArIGl0Lmd1aWRIYXNoICsgJy9zdGFyJztcblxuICAgICAgICBpdC5zdGFycmVkID0gaXNTdGFycmVkO1xuXG4gICAgICAgIGlmIChpc1N0YXJyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnJlZENvdW50ICs9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJyZWRDb3VudCAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cCh7XG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGlzU3RhcnJlZDogaXNTdGFycmVkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cblxuICAgIEl0ZW1SZXNvdXJjZS5wcm90b3R5cGUudG9nZ2xlU3RhciA9IGZ1bmN0aW9uIChpdGVtSWQpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0KGl0ZW1JZCkuc3RhcnJlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGFyKGl0ZW1JZCwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGFyKGl0ZW1JZCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBJdGVtUmVzb3VyY2UucHJvdG90eXBlLm1hcmtJdGVtUmVhZCA9IGZ1bmN0aW9uIChpdGVtSWQsIGlzUmVhZCkge1xuICAgICAgICBpZiAoaXNSZWFkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlzUmVhZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldChpdGVtSWQpLnVucmVhZCA9ICFpc1JlYWQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cCh7XG4gICAgICAgICAgICB1cmw6IHRoaXMuQkFTRV9VUkwgKyAnL2l0ZW1zLycgKyBpdGVtSWQgKyAnL3JlYWQnLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgaXNSZWFkOiBpc1JlYWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuXG4gICAgSXRlbVJlc291cmNlLnByb3RvdHlwZS5tYXJrSXRlbXNSZWFkID0gZnVuY3Rpb24gKGl0ZW1JZHMpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGl0ZW1JZHMuZm9yRWFjaChmdW5jdGlvbihpdGVtSWQpIHtcbiAgICAgICAgICAgIHNlbGYuZ2V0KGl0ZW1JZCkudW5yZWFkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAoe1xuICAgICAgICAgICAgdXJsOiB0aGlzLkJBU0VfVVJMICsgJy9pdGVtcy9yZWFkL211bHRpcGxlJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGl0ZW1JZHM6IGl0ZW1JZHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuXG4gICAgSXRlbVJlc291cmNlLnByb3RvdHlwZS5tYXJrRmVlZFJlYWQgPSBmdW5jdGlvbiAoZmVlZElkLCByZWFkKSB7XG4gICAgICAgIGlmIChyZWFkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlYWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy52YWx1ZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5mZWVkSWQgPT09IGZlZWRJZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgaXRlbS51bnJlYWQgPSAhcmVhZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuQkFTRV9VUkwgKyAnL2ZlZWRzLycgKyBmZWVkSWQgKyAnL3JlYWQnLCB7XG4gICAgICAgICAgICBoaWdoZXN0SXRlbUlkOiB0aGlzLmdldE5ld2VzdEl0ZW1JZCgpXG4gICAgICAgIH0pO1xuICAgIH07XG5cblxuICAgIEl0ZW1SZXNvdXJjZS5wcm90b3R5cGUubWFya1JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udW5yZWFkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAoe1xuICAgICAgICAgICAgdXJsOiB0aGlzLkJBU0VfVVJMICsgJy9pdGVtcy9yZWFkJyxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGhpZ2hlc3RJdGVtSWQ6IHRoaXMuZ2V0TmV3ZXN0SXRlbUlkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuXG4gICAgSXRlbVJlc291cmNlLnByb3RvdHlwZS5hdXRvUGFnZSA9IGZ1bmN0aW9uICh0eXBlLCBpZCwgb2xkZXN0Rmlyc3QsXG4gICAgc2hvd0FsbCwgc2VhcmNoKSB7XG4gICAgICAgIHZhciBvZmZzZXQ7XG5cbiAgICAgICAgaWYgKG9sZGVzdEZpcnN0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0aGlzLmhpZ2hlc3RJZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9mZnNldCA9IHRoaXMubG93ZXN0SWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwKHtcbiAgICAgICAgICAgIHVybDogdGhpcy5CQVNFX1VSTCArICcvaXRlbXMnLFxuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgICAgICAgIGxpbWl0OiB0aGlzLmJhdGNoU2l6ZSxcbiAgICAgICAgICAgICAgICBvbGRlc3RGaXJzdDogb2xkZXN0Rmlyc3QsXG4gICAgICAgICAgICAgICAgc2hvd0FsbDogc2hvd0FsbCxcbiAgICAgICAgICAgICAgICBzZWFyY2g6IHNlYXJjaFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG5cbiAgICBJdGVtUmVzb3VyY2UucHJvdG90eXBlLmltcG9ydEFydGljbGVzID0gZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cCh7XG4gICAgICAgICAgICB1cmw6IHRoaXMuQkFTRV9VUkwgKyAnL2ZlZWRzL2ltcG9ydC9hcnRpY2xlcycsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBqc29uOiBqc29uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cblxuICAgIHJldHVybiBuZXcgSXRlbVJlc291cmNlKCRodHRwLCBCQVNFX1VSTCwgSVRFTV9CQVRDSF9TSVpFKTtcbn1dKTsiLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuc2VydmljZSgnTG9hZGluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB0aGlzLmxvYWRpbmcgPSB7XG4gICAgICAgIGdsb2JhbDogZmFsc2UsXG4gICAgICAgIGNvbnRlbnQ6IGZhbHNlLFxuICAgICAgICBhdXRvcGFnaW5nOiBmYWxzZVxuICAgIH07XG5cbiAgICB0aGlzLnNldExvYWRpbmcgPSBmdW5jdGlvbiAoYXJlYSwgaXNMb2FkaW5nKSB7XG4gICAgICAgIHRoaXMubG9hZGluZ1thcmVhXSA9IGlzTG9hZGluZztcbiAgICB9O1xuXG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmdW5jdGlvbiAoYXJlYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nW2FyZWFdO1xuICAgIH07XG5cbn0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5zZXJ2aWNlKCdPUE1MSW1wb3J0ZXInLCBbXCJGZWVkUmVzb3VyY2VcIiwgXCJGb2xkZXJSZXNvdXJjZVwiLCBcIlB1Ymxpc2hlclwiLCBcIiRxXCIsIGZ1bmN0aW9uIChGZWVkUmVzb3VyY2UsIEZvbGRlclJlc291cmNlLCBQdWJsaXNoZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRxKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBzdGFydEZlZWRKb2IgPSBmdW5jdGlvbiAocXVldWUpIHtcbiAgICAgICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTtcblxuICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIGZlZWQgPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgICAgIHZhciB1cmwgPSBmZWVkLnVybDtcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IGZlZWQudGl0bGU7XG4gICAgICAgICAgICB2YXIgZm9sZGVySWQgPSAwO1xuICAgICAgICAgICAgdmFyIGZvbGRlck5hbWUgPSBmZWVkLmZvbGRlck5hbWU7XG5cbiAgICAgICAgICAgIGlmIChmb2xkZXJOYW1lICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBGb2xkZXJSZXNvdXJjZS5nZXQoZm9sZGVyTmFtZSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBmb2xkZXIgPSBGb2xkZXJSZXNvdXJjZS5nZXQoZm9sZGVyTmFtZSk7XG4gICAgICAgICAgICAgICAgZm9sZGVyLm9wZW5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9sZGVySWQgPSBmb2xkZXIuaWQ7XG5cbiAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IGZvbGRlciB3aGlsZSBhZGRpbmcgdGhlIGZlZWRcbiAgICAgICAgICAgICAgICBmb2xkZXIuZ2V0c0ZlZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvbGRlci5nZXRzRmVlZENvdW50ZXIgPSBmb2xkZXIuZ2V0c0ZlZWRDb3VudGVyIHx8IDA7XG4gICAgICAgICAgICAgICAgZm9sZGVyLmdldHNGZWVkQ291bnRlciArPSAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gbm90IGFkZCBhbHJlYWR5IGV4aXN0aW5nIGZlZWRzXG4gICAgICAgICAgICBpZiAodXJsICE9PSB1bmRlZmluZWQgJiYgRmVlZFJlc291cmNlLmdldCh1cmwpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBGZWVkUmVzb3VyY2UuY3JlYXRlKHVybCwgZm9sZGVySWQsIHRpdGxlKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIFB1Ymxpc2hlci5wdWJsaXNoQWxsKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9sZGVySWQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlci5nZXRzRmVlZENvdW50ZXIgLT0gMTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlci5nZXRzRmVlZENvdW50ZXIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXIuZ2V0c0ZlZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGFydEZlZWRKb2IocXVldWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgfTtcblxuICAgIHRoaXMuaW1wb3J0Rm9sZGVycyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gICAgICAgIC8vIGFzc3VtcHRpb246IGZvbGRlcnMgYXJlIGZhc3QgdG8gY3JlYXRlIGFuZCB3ZSBkb250IG5lZWQgYSBxdWV1ZSBmb3JcbiAgICAgICAgLy8gdGhlbVxuICAgICAgICB2YXIgZmVlZFF1ZXVlID0gW107XG4gICAgICAgIHZhciBmb2xkZXJQcm9taXNlcyA9IFtdO1xuICAgICAgICBjb250ZW50LmZvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZm9sZGVyKSB7XG4gICAgICAgICAgICBpZiAoZm9sZGVyLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgYWxyZWFkeSBjcmVhdGVkIGZvbGRlcnNcbiAgICAgICAgICAgICAgICBpZiAoRm9sZGVyUmVzb3VyY2UuZ2V0KGZvbGRlci5uYW1lKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gRm9sZGVyUmVzb3VyY2UuY3JlYXRlKGZvbGRlci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUHVibGlzaGVyLnB1Ymxpc2hBbGwoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBmb2xkZXJQcm9taXNlcy5wdXNoKHByb21pc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvbGRlci5mZWVkcy5mb3JFYWNoKGZ1bmN0aW9uIChmZWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZlZWQuZm9sZGVyTmFtZSA9IGZvbGRlci5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBmZWVkUXVldWUucHVzaChmZWVkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGZlZWRRdWV1ZSA9IGZlZWRRdWV1ZS5jb25jYXQoY29udGVudC5mZWVkcyk7XG5cbiAgICAgICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTtcblxuICAgICAgICAkcS5hbGwoZm9sZGVyUHJvbWlzZXMpLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShmZWVkUXVldWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICB9O1xuXG4gICAgdGhpcy5pbXBvcnRGZWVkUXVldWUgPSBmdW5jdGlvbiAoZmVlZFF1ZXVlLCBqb2JTaXplKSB7XG4gICAgICAgIC8vIHF1ZXVlIGZlZWRzIHRvIHByZXZlbnQgc2VydmVyIHNsb3dkb3duXG4gICAgICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG5cbiAgICAgICAgdmFyIGpvYlByb21pc2VzID0gW107XG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxqb2JTaXplOyBpKz0xKSB7XG4gICAgICAgICAgICBqb2JQcm9taXNlcy5wdXNoKHN0YXJ0RmVlZEpvYihmZWVkUXVldWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRxLmFsbChqb2JQcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG5cbn1dKTsiLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuc2VydmljZSgnT1BNTFBhcnNlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgcGFyc2VPdXRsaW5lID0gZnVuY3Rpb24gKG91dGxpbmUpIHtcbiAgICAgICAgdmFyIHVybCA9IG91dGxpbmUuYXR0cigneG1sVXJsJykgfHwgb3V0bGluZS5hdHRyKCdodG1sVXJsJyk7XG4gICAgICAgIHZhciBuYW1lID0gb3V0bGluZS5hdHRyKCd0aXRsZScpIHx8IG91dGxpbmUuYXR0cigndGV4dCcpIHx8IHVybDtcblxuICAgICAgICAvLyBmb2xkZXJcbiAgICAgICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmb2xkZXInLFxuICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgZmVlZHM6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIC8vIGZlZWRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2ZlZWQnLFxuICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgdXJsOiB1cmxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gdGhlcmUgaXMgb25seSBvbmUgbGV2ZWwsIHNvIGZlZWRzIGluIGEgZm9sZGVyIGluIGEgZm9sZGVyIHNob3VsZCBiZVxuICAgIC8vIGF0dGFjaGVkIHRvIHRoZSByb290IGZvbGRlclxuICAgIHZhciByZWN1cnNpdmVseVBhcnNlID0gZnVuY3Rpb24gKGxldmVsLCByb290LCBmaXJzdExldmVsKSB7XG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxsZXZlbC5sZW5ndGg7IGkrPTEpIHtcbiAgICAgICAgICAgIHZhciBvdXRsaW5lID0gJChsZXZlbFtpXSk7XG5cbiAgICAgICAgICAgIHZhciBlbnRyeSA9IHBhcnNlT3V0bGluZShvdXRsaW5lKTtcblxuICAgICAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdmZWVkJykge1xuICAgICAgICAgICAgICAgIHJvb3QuZmVlZHMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgLy8gb25seSBmaXJzdCBsZXZlbCBzaG91bGQgYXBwZW5kIGZvbGRlcnNcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVseVBhcnNlKG91dGxpbmUuY2hpbGRyZW4oJ291dGxpbmUnKSwgZW50cnksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5mb2xkZXJzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5UGFyc2Uob3V0bGluZS5jaGlsZHJlbignb3V0bGluZScpLCByb290LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfTtcblxuICAgIHRoaXMucGFyc2UgPSBmdW5jdGlvbiAoeG1sKSB7XG4gICAgICAgIHhtbCA9ICQucGFyc2VYTUwoeG1sKTtcbiAgICAgICAgdmFyIGZpcnN0TGV2ZWwgPSAkKHhtbCkuZmluZCgnYm9keSA+IG91dGxpbmUnKTtcblxuICAgICAgICB2YXIgcm9vdCA9IHtcbiAgICAgICAgICAgICdmZWVkcyc6IFtdLFxuICAgICAgICAgICAgJ2ZvbGRlcnMnOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiByZWN1cnNpdmVseVBhcnNlKGZpcnN0TGV2ZWwsIHJvb3QsIHRydWUpO1xuICAgIH07XG5cbn0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cblxuLypqc2hpbnQgdW5kZWY6ZmFsc2UqL1xuYXBwLnNlcnZpY2UoJ1B1Ymxpc2hlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB0aGlzLmNoYW5uZWxzID0ge307XG5cbiAgICB0aGlzLnN1YnNjcmliZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b0NoYW5uZWxzOiBmdW5jdGlvbiAoY2hhbm5lbHMpIHtcbiAgICAgICAgICAgICAgICBjaGFubmVscy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhbm5lbHNbY2hhbm5lbF0gPSBzZWxmLmNoYW5uZWxzW2NoYW5uZWxdIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYW5uZWxzW2NoYW5uZWxdLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIH07XG5cbiAgICB0aGlzLnB1Ymxpc2hBbGwgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoY2hhbm5lbCkge1xuICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHNlbGYuY2hhbm5lbHNbY2hhbm5lbF07XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIucmVjZWl2ZShkYXRhW2NoYW5uZWxdLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxufSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmZhY3RvcnkoJ1Jlc291cmNlJywgZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBSZXNvdXJjZSA9IGZ1bmN0aW9uIChodHRwLCBCQVNFX1VSTCwgaWQpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkIHx8ICdpZCc7XG4gICAgICAgIHRoaXMudmFsdWVzID0gW107XG4gICAgICAgIHRoaXMuaGFzaE1hcCA9IHt9O1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLkJBU0VfVVJMID0gQkFTRV9VUkw7XG4gICAgfTtcblxuXG4gICAgUmVzb3VyY2UucHJvdG90eXBlLnJlY2VpdmUgPSBmdW5jdGlvbiAob2Jqcykge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIG9ianMuZm9yRWFjaChmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICBzZWxmLmFkZChvYmopO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG5cbiAgICBSZXNvdXJjZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLmhhc2hNYXBbb2JqW3RoaXMuaWRdXTtcblxuICAgICAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMucHVzaChvYmopO1xuICAgICAgICAgICAgdGhpcy5oYXNoTWFwW29ialt0aGlzLmlkXV0gPSBvYmo7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb3B5IHZhbHVlcyBmcm9tIG5ldyB0byBvbGQgb2JqZWN0IGlmIGl0IGV4aXN0cyBhbHJlYWR5XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgUmVzb3VyY2UucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGg7XG4gICAgfTtcblxuXG4gICAgUmVzb3VyY2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNoTWFwW2lkXTtcbiAgICB9O1xuXG5cbiAgICBSZXNvdXJjZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIC8vIGZpbmQgaW5kZXggb2Ygb2JqZWN0IHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWRcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgZGVsZXRlQXRJbmRleCA9IHRoaXMudmFsdWVzLmZpbmRJbmRleChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudFtzZWxmLmlkXSA9PT0gaWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZWxldGVBdEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNwbGljZShkZWxldGVBdEluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc2hNYXBbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmhhc2hNYXBbaWRdO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgUmVzb3VyY2UucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmhhc2hNYXAgPSB7fTtcblxuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyMzIwNDBcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgZmFzdGVzIHdheSB0byBlbXB0eSBhbiBhcnJheSB3aGVuIHlvdSB3YW50IHRvIGtlZXBcbiAgICAgICAgLy8gdGhlIHJlZmVyZW5jZSBhcm91bmRcbiAgICAgICAgd2hpbGUgKHRoaXMudmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgUmVzb3VyY2UucHJvdG90eXBlLmdldEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzO1xuICAgIH07XG5cblxuICAgIHJldHVybiBSZXNvdXJjZTtcbn0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cblxuIC8qanNoaW50IHVudXNlZDpmYWxzZSovXG5hcHAuc2VydmljZSgnU2V0dGluZ3NSZXNvdXJjZScsIFtcIiRodHRwXCIsIFwiQkFTRV9VUkxcIiwgZnVuY3Rpb24gKCRodHRwLCBCQVNFX1VSTCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHRoaXMuc2V0dGluZ3MgPSB7XG4gICAgICAgIGxhbmd1YWdlOiAnZW4nLFxuICAgICAgICBzaG93QWxsOiBudWxsLFxuICAgICAgICBjb21wYWN0OiBmYWxzZSxcbiAgICAgICAgb2xkZXN0Rmlyc3Q6IG51bGwsXG4gICAgICAgIHByZXZlbnRSZWFkT25TY3JvbGw6IGZhbHNlLFxuICAgICAgICBjb21wYWN0RXhwYW5kOiBmYWxzZSxcbiAgICAgICAgZXhwbG9yZVVybDogJydcbiAgICB9O1xuICAgIHRoaXMuZGVmYXVsdExhbmd1YWdlQ29kZSA9ICdlbic7XG4gICAgdGhpcy5zdXBwb3J0ZWRMYW5ndWFnZUNvZGVzID0gW1xuICAgICAgICAnYXItbWEnLCAnYXInLCAnYmcnLCAnY2EnLCAnY3MnLCAnY3YnLCAnZGEnLCAnZGUnLCAnZWwnLCAnZW4nLCAnZW4tY2EnLFxuICAgICAgICAnZW4tZ2InLCAnZW8nLCAnZXMnLCAnZXQnLCAnZXUnLCAnZmknLCAnZnItY2EnLCAnZnInLCAnZ2wnLCAnaGUnLCAnaGknLFxuICAgICAgICAnaHUnLCAnaWQnLCAnaXMnLCAnaXQnLCAnamEnLCAna2EnLCAna28nLCAnbHYnLCAnbXMtbXknLCAnbmInLCAnbmUnLFxuICAgICAgICAnbmwnLCAncGwnLCAncHQtYnInLCAncHQnLCAncm8nLCAncnUnLCAnc2snLCAnc2wnLCAnc3YnLCAndGgnLCAndHInLFxuICAgICAgICAndHptLWxhJywgJ3R6bScsICd1aycsICd6aC1jbicsICd6aC10dydcbiAgICBdO1xuXG4gICAgdGhpcy5nZXRTdXBwb3J0ZWRMYW5ndWFnZUNvZGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdXBwb3J0ZWRMYW5ndWFnZUNvZGVzO1xuICAgIH07XG5cbiAgICB0aGlzLnJlY2VpdmUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gZGF0YVtrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnbGFuZ3VhZ2UnKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLnByb2Nlc3NMYW5ndWFnZUNvZGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWxmLnNldHRpbmdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1trZXldO1xuICAgIH07XG5cbiAgICB0aGlzLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xuXG4gICAgICAgIHJldHVybiAkaHR0cCh7XG4gICAgICAgICAgICB1cmw6IEJBU0VfVVJMICsgJy9zZXR0aW5ncycsXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlOiB0aGlzLnNldHRpbmdzLmxhbmd1YWdlLFxuICAgICAgICAgICAgICAgIHNob3dBbGw6IHRoaXMuc2V0dGluZ3Muc2hvd0FsbCxcbiAgICAgICAgICAgICAgICBjb21wYWN0OiB0aGlzLnNldHRpbmdzLmNvbXBhY3QsXG4gICAgICAgICAgICAgICAgb2xkZXN0Rmlyc3Q6IHRoaXMuc2V0dGluZ3Mub2xkZXN0Rmlyc3QsXG4gICAgICAgICAgICAgICAgY29tcGFjdEV4cGFuZDogdGhpcy5zZXR0aW5ncy5jb21wYWN0RXhwYW5kLFxuICAgICAgICAgICAgICAgIHByZXZlbnRSZWFkT25TY3JvbGw6IHRoaXMuc2V0dGluZ3MucHJldmVudFJlYWRPblNjcm9sbFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5wcm9jZXNzTGFuZ3VhZ2VDb2RlID0gZnVuY3Rpb24gKGxhbmd1YWdlQ29kZSkge1xuICAgICAgICBsYW5ndWFnZUNvZGUgPSBsYW5ndWFnZUNvZGUucmVwbGFjZSgnXycsICctJykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBpZiAodGhpcy5zdXBwb3J0ZWRMYW5ndWFnZUNvZGVzLmluZGV4T2YobGFuZ3VhZ2VDb2RlKSA8IDApIHtcbiAgICAgICAgICAgIGxhbmd1YWdlQ29kZSA9IGxhbmd1YWdlQ29kZS5zcGxpdCgnLScpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydGVkTGFuZ3VhZ2VDb2Rlcy5pbmRleE9mKGxhbmd1YWdlQ29kZSkgPCAwKSB7XG4gICAgICAgICAgICBsYW5ndWFnZUNvZGUgPSB0aGlzLmRlZmF1bHRMYW5ndWFnZUNvZGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFuZ3VhZ2VDb2RlO1xuICAgIH07XG5cbn1dKTtcbiIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cblxuLyoqXG4gKiBUaGlzIHByZWZpbGxzIHRoZSBhZGQgZmVlZCBzZWN0aW9uIGlmIGFuIGV4dGVybmFsIGxpbmsgaGFzID9zdWJzcmliZV90b1xuICogZmlsbGVkIG91dFxuICovXG4oZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQsIG5hdmlnYXRvciwgdXJsLCAkLCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvLyByZWdpc3RlciByZWFkZXIgYXMgZmVlZCByZWFkZXIgaW4gZmlyZWZveFxuICAgIHZhciBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICB2YXIgc3RvcmFnZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG5cbiAgICAvLyBpZiBpc0NvbnRlbnRIYW5kbGVyUmVnaXN0ZXJlZCBpcyBub3QgaW1wbGVtZW50ZWQgKEZpcmVmb3ggSSdtIGxvb2tpbmdcbiAgICAvLyBhdCB5b3UpIHdlIHVzZSBsb2NhbHN0b3JhZ2UgdG8gcHJldmVudCByZWdpc3RlcmluZyB0aGUgZmVlZCByZWFkZXIgdHdpY2VcbiAgICB2YXIgcmVnaXN0ZXJIYW5kbGVyID0gZnVuY3Rpb24gKG1pbWUsIHVybCwgdGl0bGUpIHtcbiAgICAgICAgdmFyIHJlZ2lzdGVyZWQgPSBuYXZpZ2F0b3IuaXNDb250ZW50SGFuZGxlclJlZ2lzdGVyZWQ7XG5cbiAgICAgICAgdmFyIGlzUmVnaXN0ZXJlZCA9IGZ1bmN0aW9uIChtaW1lLCB1cmwpIHtcbiAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWQobWltZSwgdXJsKSAhPT0gJ25ldyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlLmdldEl0ZW0oJ3JlZ2lzdGVyZWRIYW5kbGVyJykgPT09IHVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobmF2aWdhdG9yLnJlZ2lzdGVyQ29udGVudEhhbmRsZXIgJiYgIWlzUmVnaXN0ZXJlZChtaW1lLCB1cmwpKSB7XG4gICAgICAgICAgICBuYXZpZ2F0b3IucmVnaXN0ZXJDb250ZW50SGFuZGxlcihtaW1lLCB1cmwsIHRpdGxlKTtcbiAgICAgICAgICAgIGlmICghcmVnaXN0ZXJlZCkge1xuICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0SXRlbSgncmVnaXN0ZXJlZEhhbmRsZXInLCB1cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBjbGVhblVybCA9IGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3QgKyBsb2NhdGlvbi5wYXRobmFtZTtcblxuICAgIHZhciBzdWJzY3JpYmVVcmwgPSBjbGVhblVybCArICc/c3Vic2NyaWJlX3RvPSVzJztcbiAgICB2YXIgbWltZVR5cGUgPSAnYXBwbGljYXRpb24vdm5kLm1vemlsbGEubWF5YmUuZmVlZCc7XG4gICAgdmFyIHRpdGxlID0gJ293bkNsb3VkIE5ld3MgQCAnICsgY2xlYW5Vcmw7XG5cbiAgICByZWdpc3RlckhhbmRsZXIobWltZVR5cGUsIHN1YnNjcmliZVVybCwgdGl0bGUpO1xuXG5cbiAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB1cmwoJz9zdWJzY3JpYmVfdG8nKTtcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAmJiBzdWJzY3JpcHRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAkKCcjbmV3LWZlZWQnKS5zaG93KCk7XG5cbiAgICAgICAgICAgIHZhciBpbnB1dCA9ICQoJ2lucHV0W25nLW1vZGVsPVwiTmF2aWdhdGlvbi5mZWVkLnVybFwiXScpO1xuICAgICAgICAgICAgaW5wdXQudmFsKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICBpbnB1dC50cmlnZ2VyKCdpbnB1dCcpO1xuXG4gICAgICAgICAgICAvLyBoYWNreSB3YXkgdG8gZm9jdXMgYmVjYXVzZSBpbml0aWFsIGxvYWRpbmcgb2YgYSBmZWVkXG4gICAgICAgICAgICAvLyBzdGVhbHMgdGhlIGZvY3VzXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG59KSh3aW5kb3csIGRvY3VtZW50LCBuYXZpZ2F0b3IsIHVybCwgJCk7XG4iLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5cbi8qKlxuICogVmFyaW91cyBmaXhlc1xuICovXG4oZnVuY3Rpb24gKHdpbmRvdywgZG9jdW1lbnQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvLyBJZiBGNSBpcyB1c2VkIHRvIHJlbG9hZCB0aGUgcGFnZSBpbiBGaXJlZm94LCB0aGUgY29udGVudCB3aWxsIHNvbWV0aW1lc1xuICAgIC8vIGJlIHNjcm9sbGVkIGJhY2sgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIGl0IHdhcyBiZWZvcmUgdGhlIHJlbG9hZCB3aGljaFxuICAgIC8vIHdpbGwgY2F1c2UgbmV3IGFydGljbGVzIGJlaW5nIG1hcmtlZCBhcyByZWFkXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXBwLWNvbnRlbnQnKTtcbiAgICAgICAgY29udGVudC5zY3JvbGxUbygwLCAwKTtcbiAgICB9KTtcblxufSkod2luZG93LCBkb2N1bWVudCk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuXG4vKipcbiAqIENvZGUgaW4gaGVyZSBhY3RzIG9ubHkgYXMgYSBjbGljayBzaG9ydGN1dCBtZWNoYW5pc20uIFRoYXQncyB3aHkgaXRzIG5vdFxuICogYmVpbmcgcHV0IGludG8gYSBkaXJlY3RpdmUgc2luY2UgaXQgaGFzIHRvIGJlIHRlc3RlZCB3aXRoIHByb3RyYWN0b3JcbiAqIGFueXdheXMgYW5kIHRoZXJlcyBubyBiZW5lZml0IGZyb20gd2lyaW5nIGl0IGludG8gdGhlIGFuZ3VsYXIgYXBwXG4gKi9cbihmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCwgJCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBub0lucHV0Rm9jdXNlZCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgZWxlbWVudC5pcygnaW5wdXQnKSB8fFxuICAgICAgICAgICAgZWxlbWVudC5pcygnc2VsZWN0JykgfHxcbiAgICAgICAgICAgIGVsZW1lbnQuaXMoJ3RleHRhcmVhJykgfHxcbiAgICAgICAgICAgIGVsZW1lbnQuaXMoJ2NoZWNrYm94JylcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgdmFyIG5vTW9kaWZpZXJLZXkgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICBldmVudC5zaGlmdEtleSB8fFxuICAgICAgICAgICAgZXZlbnQuYWx0S2V5IHx8XG4gICAgICAgICAgICBldmVudC5jdHJsS2V5IHx8XG4gICAgICAgICAgICBldmVudC5tZXRhS2V5XG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIHZhciBtYXJrQWxsUmVhZCA9IGZ1bmN0aW9uIChuYXZpZ2F0aW9uQXJlYSkge1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSAnLmFjdGl2ZSA+IC5hcHAtbmF2aWdhdGlvbi1lbnRyeS1tZW51IC5tYXJrLXJlYWQgYnV0dG9uJztcbiAgICAgICAgdmFyIGJ1dHRvbiA9IG5hdmlnYXRpb25BcmVhLmZpbmQoc2VsZWN0b3IpO1xuICAgICAgICBpZiAoYnV0dG9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJ1dHRvbi50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBpc0luU2Nyb2xsVmlldyA9IGZ1bmN0aW9uIChlbGVtLCBzY3JvbGxBcmVhKSB7XG4gICAgICAgIC8vIG9mZnNldCgpLnRvcCBhZGRzIHRoZSBuYXZpZ2F0aW9uIGJhciB0b28gc28gd2UgaGF2ZSB0byBzdWJyYWN0IGl0XG4gICAgICAgIHZhciBlbGVtVG9wID0gZWxlbS5vZmZzZXQoKS50b3AgLSBzY3JvbGxBcmVhLm9mZnNldCgpLnRvcDtcbiAgICAgICAgdmFyIGVsZW1Cb3R0b20gPSBlbGVtVG9wICsgZWxlbS5oZWlnaHQoKTtcblxuICAgICAgICB2YXIgYXJlYUJvdHRvbSA9IHNjcm9sbEFyZWEuaGVpZ2h0KCk7XG5cbiAgICAgICAgcmV0dXJuIGVsZW1Ub3AgPj0gMCAmJiBlbGVtQm90dG9tIDwgYXJlYUJvdHRvbTtcbiAgICB9O1xuXG4gICAgdmFyIHNjcm9sbFRvTmF2aWdhdGlvbkVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbSwgc2Nyb2xsQXJlYSwgdG9Ub3ApIHtcbiAgICAgICAgaWYgKGVsZW0ubGVuZ3RoID09PSAwIHx8ICghdG9Ub3AgJiYgaXNJblNjcm9sbFZpZXcoZWxlbSwgc2Nyb2xsQXJlYSkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2Nyb2xsQXJlYS5zY3JvbGxUb3AoXG4gICAgICAgICAgICBlbGVtLm9mZnNldCgpLnRvcCAtIHNjcm9sbEFyZWEub2Zmc2V0KCkudG9wICsgc2Nyb2xsQXJlYS5zY3JvbGxUb3AoKVxuICAgICAgICApO1xuICAgIH07XG5cbiAgICB2YXIgc2Nyb2xsVG9BY3RpdmVOYXZpZ2F0aW9uRW50cnkgPSBmdW5jdGlvbiAobmF2aWdhdGlvbkFyZWEpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBuYXZpZ2F0aW9uQXJlYS5maW5kKCcuYWN0aXZlJyk7XG4gICAgICAgIHNjcm9sbFRvTmF2aWdhdGlvbkVsZW1lbnQoZWxlbWVudCwgbmF2aWdhdGlvbkFyZWEuY2hpbGRyZW4oJ3VsJyksIHRydWUpO1xuICAgIH07XG5cbiAgICB2YXIgcmVsb2FkRmVlZCA9IGZ1bmN0aW9uIChuYXZpZ2F0aW9uQXJlYSkge1xuICAgICAgICBuYXZpZ2F0aW9uQXJlYS5maW5kKCcuYWN0aXZlID4gYTp2aXNpYmxlJykudHJpZ2dlcignY2xpY2snKTtcbiAgICB9O1xuXG4gICAgdmFyIHRyeVJlbG9hZCA9IGZ1bmN0aW9uIChuYXZpZ2F0aW9uQXJlYSwgc2Nyb2xsQXJlYSkge1xuICAgICAgICBpZiAoc2Nyb2xsQXJlYS5zY3JvbGxUb3AoKSA9PT0gMCkge1xuICAgICAgICAgICAgdmFyIHB1bGxUb1JlZnJlc2ggPSBzY3JvbGxBcmVhLmZpbmQoJy5wdWxsLXRvLXJlZnJlc2gnKTtcbiAgICAgICAgICAgIGlmICghcHVsbFRvUmVmcmVzaC5oYXNDbGFzcygnc2hvdy1wdWxsLXRvLXJlZnJlc2gnKSkge1xuICAgICAgICAgICAgICAgIHB1bGxUb1JlZnJlc2guYWRkQ2xhc3MoJ3Nob3ctcHVsbC10by1yZWZyZXNoJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHB1bGxUb1JlZnJlc2guaGFzQ2xhc3MoJ2RvbmUnKSkge1xuICAgICAgICAgICAgICAgIHJlbG9hZEZlZWQobmF2aWdhdGlvbkFyZWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBhY3RpdmF0ZU5hdmlnYXRpb25FbnRyeSA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYXZpZ2F0aW9uQXJlYSkge1xuICAgICAgICBlbGVtZW50LmNoaWxkcmVuKCdhOnZpc2libGUnKS50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICBzY3JvbGxUb05hdmlnYXRpb25FbGVtZW50KGVsZW1lbnQsIG5hdmlnYXRpb25BcmVhLmNoaWxkcmVuKCd1bCcpKTtcbiAgICB9O1xuXG4gICAgdmFyIG5leHRGZWVkID0gZnVuY3Rpb24gKG5hdmlnYXRpb25BcmVhKSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gbmF2aWdhdGlvbkFyZWEuZmluZCgnLmFjdGl2ZScpO1xuICAgICAgICB2YXIgZWxlbWVudHMgPSBuYXZpZ2F0aW9uQXJlYS5maW5kKCcuZXhwbG9yZS1mZWVkLCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuc3Vic2NyaXB0aW9ucy1mZWVkOnZpc2libGUsJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5zdGFycmVkLWZlZWQ6dmlzaWJsZSwnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmZlZWQ6dmlzaWJsZScpO1xuXG4gICAgICAgIGlmIChjdXJyZW50Lmhhc0NsYXNzKCdmb2xkZXInKSkge1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBzdWJmZWVkcyA9IGN1cnJlbnQuZmluZCgnLmZlZWQ6dmlzaWJsZScpO1xuICAgICAgICAgICAgICAgIGlmIChzdWJmZWVkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlTmF2aWdhdGlvbkVudHJ5KCQoc3ViZmVlZHNbMF0pLCBuYXZpZ2F0aW9uQXJlYSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dCgnLmZvbGRlcicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBubyBzdWJmZWVkIGZvdW5kXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGSVhNRTogTyhuKSBydW50aW1lLiBJZiBzb21lb25lIGNyZWF0ZXMgYSBuaWNlIGFuZCBub3QgZnVnbHkgc29sdXRpb25cbiAgICAgICAgLy8gcGxlYXNlIGNyZWF0ZSBhIFBSXG4gICAgICAgIGZvciAodmFyIGk9MDsgaTxlbGVtZW50cy5sZW5ndGgtMTsgaSs9MSkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT09IGN1cnJlbnRbMF0pIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGVsZW1lbnRzW2krMV07XG4gICAgICAgICAgICAgICAgYWN0aXZhdGVOYXZpZ2F0aW9uRW50cnkoJChuZXh0KSwgbmF2aWdhdGlvbkFyZWEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBnZXRQYXJlbnRGb2xkZXIgPSBmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudC5wYXJlbnQoKS5wYXJlbnQoJy5mb2xkZXInKTtcbiAgICB9O1xuXG4gICAgdmFyIHNlbGVjdEZpcnN0T3JMYXN0Rm9sZGVyID0gZnVuY3Rpb24gKG5hdmlnYXRpb25BcmVhLCBpc0xhc3QpIHtcbiAgICAgICAgdmFyIGZvbGRlcnMgPSBuYXZpZ2F0aW9uQXJlYS5maW5kKCcuZm9sZGVyOnZpc2libGUnKTtcblxuICAgICAgICB2YXIgaW5kZXg7XG4gICAgICAgIGlmIChpc0xhc3QpIHtcbiAgICAgICAgICAgIGluZGV4ID0gZm9sZGVycy5sZW5ndGggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aXZhdGVOYXZpZ2F0aW9uRW50cnkoJChmb2xkZXJzW2luZGV4XSksIG5hdmlnYXRpb25BcmVhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcHJldmlvdXNGb2xkZXIgPSBmdW5jdGlvbiAobmF2aWdhdGlvbkFyZWEpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBuYXZpZ2F0aW9uQXJlYS5maW5kKCcuYWN0aXZlJyk7XG5cbiAgICAgICAgLy8gY2FzZXM6IGZvbGRlciBhY3RpdmUsIHN1YmZlZWQgYWN0aXZlLCBmZWVkIGFjdGl2ZSwgbm9uZSBhY3RpdmVcbiAgICAgICAgaWYgKGN1cnJlbnQuaGFzQ2xhc3MoJ2ZvbGRlcicpKSB7XG4gICAgICAgICAgICBhY3RpdmF0ZU5hdmlnYXRpb25FbnRyeShjdXJyZW50LnByZXZBbGwoJy5mb2xkZXI6dmlzaWJsZScpLmZpcnN0KCksXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbkFyZWEpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQuaGFzQ2xhc3MoJ2ZlZWQnKSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudEZvbGRlciA9IGdldFBhcmVudEZvbGRlcihjdXJyZW50KTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRGb2xkZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZpcnN0IGdvIHRvIHByZXZpb3VzIGZvbGRlciBzaG91bGQgc2VsZWN0IHRoZSBwYXJlbnQgZm9sZGVyXG4gICAgICAgICAgICAgICAgYWN0aXZhdGVOYXZpZ2F0aW9uRW50cnkocGFyZW50Rm9sZGVyLCBuYXZpZ2F0aW9uQXJlYSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGVjdEZpcnN0T3JMYXN0Rm9sZGVyKG5hdmlnYXRpb25BcmVhLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdEZpcnN0T3JMYXN0Rm9sZGVyKG5hdmlnYXRpb25BcmVhLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgbmV4dEZvbGRlciA9IGZ1bmN0aW9uIChuYXZpZ2F0aW9uQXJlYSkge1xuICAgICAgICB2YXIgY3VycmVudCA9IG5hdmlnYXRpb25BcmVhLmZpbmQoJy5hY3RpdmUnKTtcblxuICAgICAgICAvLyBjYXNlczogZm9sZGVyIGFjdGl2ZSwgc3ViZmVlZCBhY3RpdmUsIGZlZWQgYWN0aXZlLCBub25lIGFjdGl2ZVxuICAgICAgICBpZiAoY3VycmVudC5oYXNDbGFzcygnZm9sZGVyJykpIHtcbiAgICAgICAgICAgIGFjdGl2YXRlTmF2aWdhdGlvbkVudHJ5KGN1cnJlbnQubmV4dEFsbCgnLmZvbGRlcjp2aXNpYmxlJykuZmlyc3QoKSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQXJlYSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5oYXNDbGFzcygnZmVlZCcpKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50Rm9sZGVyID0gZ2V0UGFyZW50Rm9sZGVyKGN1cnJlbnQpO1xuICAgICAgICAgICAgaWYgKHBhcmVudEZvbGRlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZhdGVOYXZpZ2F0aW9uRW50cnkoXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEZvbGRlci5uZXh0QWxsKCcuZm9sZGVyOnZpc2libGUnKS5maXJzdCgpLFxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQXJlYVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGVjdEZpcnN0T3JMYXN0Rm9sZGVyKG5hdmlnYXRpb25BcmVhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdEZpcnN0T3JMYXN0Rm9sZGVyKG5hdmlnYXRpb25BcmVhKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcHJldmlvdXNGZWVkID0gZnVuY3Rpb24gKG5hdmlnYXRpb25BcmVhKSB7XG4gICAgICAgIHZhciBjdXJyZW50ID0gbmF2aWdhdGlvbkFyZWEuZmluZCgnLmFjdGl2ZScpO1xuICAgICAgICB2YXIgZWxlbWVudHMgPSBuYXZpZ2F0aW9uQXJlYS5maW5kKCcuZXhwbG9yZS1mZWVkLCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuc3Vic2NyaXB0aW9ucy1mZWVkOnZpc2libGUsJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5zdGFycmVkLWZlZWQ6dmlzaWJsZSwnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmZlZWQ6dmlzaWJsZScpO1xuXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZTogZm9sZGVyIHNlbGVjdGVkXG4gICAgICAgIGlmIChjdXJyZW50Lmhhc0NsYXNzKCdmb2xkZXInKSkge1xuICAgICAgICAgICAgdmFyIHByZXZpb3VzRm9sZGVyID0gY3VycmVudC5wcmV2KCcuZm9sZGVyJyk7XG5cbiAgICAgICAgICAgIHdoaWxlIChwcmV2aW91c0ZvbGRlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YmZlZWRzID0gcHJldmlvdXNGb2xkZXIuZmluZCgnLmZlZWQ6dmlzaWJsZScpO1xuICAgICAgICAgICAgICAgIGlmIChzdWJmZWVkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlTmF2aWdhdGlvbkVudHJ5KCQoc3ViZmVlZHNbc3ViZmVlZHMubGVuZ3RoLTFdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25BcmVhKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2aW91c0ZvbGRlciA9IHByZXZpb3VzRm9sZGVyLnByZXYoJy5mb2xkZXInKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm8gc3ViZmVlZCBmb3VuZCB0cnkgdmlzaWJsZSBmZWVkc1xuICAgICAgICAgICAgdmFyIGZlZWRzID0gY3VycmVudC5zaWJsaW5ncygnLmZlZWQnKTtcblxuICAgICAgICAgICAgaWYgKGZlZWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhY3RpdmF0ZU5hdmlnYXRpb25FbnRyeSgkKGZlZWRzW2ZlZWRzLmxlbmd0aC0xXSksXG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25BcmVhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy8gbm8gZmVlZCBmb3VuZCwgZ28gdG8gc3RhcnJlZFxuICAgICAgICAgICAgdmFyIHN0YXJyZWQgPSAkKCcuc3RhcnJlZC1mZWVkOnZpc2libGUnKTtcbiAgICAgICAgICAgIGlmIChzdGFycmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBhY3RpdmF0ZU5hdmlnYXRpb25FbnRyeShzdGFycmVkLCBuYXZpZ2F0aW9uQXJlYSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZJWE1FOiBPKG4pIHJ1bnRpbWUuIElmIHNvbWVvbmUgY3JlYXRlcyBhIG5pY2UgYW5kIG5vdCBmdWdseSBzb2x1dGlvblxuICAgICAgICAvLyBwbGVhc2UgY3JlYXRlIGEgUFJcbiAgICAgICAgZm9yICh2YXIgaT1lbGVtZW50cy5sZW5ndGgtMTsgaT4wOyBpLT0xKSB7XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gY3VycmVudFswXSkge1xuICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IGVsZW1lbnRzW2ktMV07XG4gICAgICAgICAgICAgICAgYWN0aXZhdGVOYXZpZ2F0aW9uRW50cnkoJChwcmV2aW91cyksIG5hdmlnYXRpb25BcmVhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgb25BY3RpdmVJdGVtID0gZnVuY3Rpb24gKHNjcm9sbEFyZWEsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBpdGVtcyA9IHNjcm9sbEFyZWEuZmluZCgnLml0ZW0nKTtcblxuICAgICAgICBpdGVtcy5lYWNoKGZ1bmN0aW9uIChpbmRleCwgaXRlbSkge1xuICAgICAgICAgICAgaXRlbSA9ICQoaXRlbSk7XG5cbiAgICAgICAgICAgIC8vIDEzMHB4IG9mIHRoZSBpdGVtIHNob3VsZCBiZSB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoKGl0ZW0uaGVpZ2h0KCkgKyBpdGVtLnBvc2l0aW9uKCkudG9wKSA+IDMwKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIHZhciB0b2dnbGVVbnJlYWQgPSBmdW5jdGlvbiAoc2Nyb2xsQXJlYSkge1xuICAgICAgICBvbkFjdGl2ZUl0ZW0oc2Nyb2xsQXJlYSwgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0uZmluZCgnLnRvZ2dsZS1rZWVwLXVucmVhZCcpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgdG9nZ2xlU3RhciA9IGZ1bmN0aW9uIChzY3JvbGxBcmVhKSB7XG4gICAgICAgIG9uQWN0aXZlSXRlbShzY3JvbGxBcmVhLCBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgaXRlbS5maW5kKCcuc3RhcicpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgZXhwYW5kSXRlbSA9IGZ1bmN0aW9uIChzY3JvbGxBcmVhKSB7XG4gICAgICAgIG9uQWN0aXZlSXRlbShzY3JvbGxBcmVhLCBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgaXRlbS5maW5kKCcudXRpbHMnKS50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIG9wZW5MaW5rID0gZnVuY3Rpb24gKHNjcm9sbEFyZWEpIHtcbiAgICAgICAgb25BY3RpdmVJdGVtKHNjcm9sbEFyZWEsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICBpdGVtLnRyaWdnZXIoJ2NsaWNrJyk7ICAvLyBtYXJrIHJlYWRcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKGl0ZW0uZmluZCgnLmV4dGVybmFsOnZpc2libGUnKS5hdHRyKCdocmVmJyksICdfYmxhbmsnKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciBzY3JvbGxUb0l0ZW0gPSBmdW5jdGlvbiAoc2Nyb2xsQXJlYSwgaXRlbSwgZXhwYW5kSXRlbUluQ29tcGFjdCkge1xuICAgICAgICAvLyBpZiB5b3UgZ28gdG8gdGhlIG5leHQgYXJ0aWNsZSBpbiBjb21wYWN0IHZpZXcsIGl0IHNob3VsZFxuICAgICAgICAvLyBleHBhbmQgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgIHNjcm9sbEFyZWEuc2Nyb2xsVG9wKFxuICAgICAgICAgICAgaXRlbS5vZmZzZXQoKS50b3AgLSBzY3JvbGxBcmVhLm9mZnNldCgpLnRvcCArIHNjcm9sbEFyZWEuc2Nyb2xsVG9wKClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZXhwYW5kSXRlbUluQ29tcGFjdCkge1xuICAgICAgICAgICAgb25BY3RpdmVJdGVtKHNjcm9sbEFyZWEsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpdGVtLmhhc0NsYXNzKCdvcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5maW5kKCcudXRpbHMnKS50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBzY3JvbGxUb05leHRJdGVtID0gZnVuY3Rpb24gKHNjcm9sbEFyZWEsIGV4cGFuZEl0ZW1JbkNvbXBhY3QpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gc2Nyb2xsQXJlYS5maW5kKCcuaXRlbScpO1xuICAgICAgICB2YXIganVtcGVkID0gZmFsc2U7XG5cbiAgICAgICAgaXRlbXMuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0gPSAkKGl0ZW0pO1xuXG4gICAgICAgICAgICAvLyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgaXRlbXMgdGhhdCBoYXZlIGV4cGFuZCBlbmFibGVkOlxuICAgICAgICAgICAgLy8gaWYgeW91IGNsaWNrIG5leHQgYW5kIHRoZSBmaXJzdCBpdGVtIGhhcyBub3QgYmVlbiBleHBhbmVkIGFuZFxuICAgICAgICAgICAgLy8gaXMgb24gdGhlIHRvcCwgaXQgc2hvdWxkIGJlIGV4cGFuZGVkIGluc3RlYWQgb2YgdGhlIG5leHQgb25lXG4gICAgICAgICAgICBpZiAoKGl0ZW0ucG9zaXRpb24oKS50b3AgPT09IDAgJiYgZXhwYW5kSXRlbUluQ29tcGFjdCAmJlxuICAgICAgICAgICAgICAgICAhaXRlbS5oYXNDbGFzcygnb3BlbicpKSB8fFxuICAgICAgICAgICAgICAgIGl0ZW0ucG9zaXRpb24oKS50b3AgPiAxMCkge1xuICAgICAgICAgICAgICAgIHNjcm9sbFRvSXRlbShzY3JvbGxBcmVhLCBpdGVtLCBleHBhbmRJdGVtSW5Db21wYWN0KTtcblxuICAgICAgICAgICAgICAgIGp1bXBlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCBpdGVtIGl0IHNob3VsZCBzdGlsbCBzY3JvbGwgYmVsb3cgdGhlIHRvcFxuICAgICAgICBpZiAoIWp1bXBlZCkge1xuICAgICAgICAgICAgc2Nyb2xsQXJlYS5zY3JvbGxUb3Aoc2Nyb2xsQXJlYS5wcm9wKCdzY3JvbGxIZWlnaHQnKSk7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgc2Nyb2xsVG9QcmV2aW91c0l0ZW0gPSBmdW5jdGlvbiAobmF2aWdhdGlvbkFyZWEsIHNjcm9sbEFyZWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZEl0ZW1JbkNvbXBhY3QpIHtcbiAgICAgICAgdmFyIGl0ZW1zID0gc2Nyb2xsQXJlYS5maW5kKCcuaXRlbScpO1xuICAgICAgICB2YXIganVtcGVkID0gZmFsc2U7XG5cbiAgICAgICAgaXRlbXMuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0gPSAkKGl0ZW0pO1xuXG4gICAgICAgICAgICBpZiAoKGl0ZW0ucG9zaXRpb24oKS50b3AgKyAxMCkgPj0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IGl0ZW0ucHJldigpO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGl0ZW1zIGJlZm9yZSB0aGUgY3VycmVudCBvbmVcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb0l0ZW0oc2Nyb2xsQXJlYSwgcHJldmlvdXMsIGV4cGFuZEl0ZW1JbkNvbXBhY3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeVJlbG9hZChuYXZpZ2F0aW9uQXJlYSwgc2Nyb2xsQXJlYSk7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbEFyZWEuc2Nyb2xsVG9wKDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGp1bXBlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIHRoZXJlIHdhcyBubyBqdW1wIGp1bXAgdG8gdGhlIGxhc3QgZWxlbWVudFxuICAgICAgICBpZiAoIWp1bXBlZCAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzY3JvbGxUb0l0ZW0oc2Nyb2xsQXJlYSwgaXRlbXMubGFzdCgpKTtcbiAgICAgICAgfVxuICAgIH07XG5cblxuICAgICQoZG9jdW1lbnQpLmtleXVwKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgICAgIHZhciBzY3JvbGxBcmVhID0gJCgnI2FwcC1jb250ZW50Jyk7XG4gICAgICAgIHZhciBuYXZpZ2F0aW9uQXJlYSA9ICQoJyNhcHAtbmF2aWdhdGlvbicpO1xuICAgICAgICB2YXIgaXNDb21wYWN0VmlldyA9ICQoJyNhcnRpY2xlcy5jb21wYWN0JykubGVuZ3RoID4gMDtcbiAgICAgICAgdmFyIGlzRXhwYW5kSXRlbSA9ICQoJyNhcnRpY2xlcycpXG4gICAgICAgICAgICAuYXR0cignbmV3cy1jb21wYWN0LWV4cGFuZCcpID09PSAndHJ1ZSc7XG4gICAgICAgIHZhciBleHBhbmRJdGVtSW5Db21wYWN0ID0gaXNDb21wYWN0VmlldyAmJiBpc0V4cGFuZEl0ZW07XG5cbiAgICAgICAgaWYgKG5vSW5wdXRGb2N1c2VkKCQoJzpmb2N1cycpKSAmJiBub01vZGlmaWVyS2V5KGV2ZW50KSkge1xuICAgICAgICAgICAgLy8gaiwgbiwgcmlnaHQgYXJyb3dcbiAgICAgICAgICAgIGlmIChbNzQsIDc4LCAzOV0uaW5kZXhPZihrZXlDb2RlKSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHNjcm9sbFRvTmV4dEl0ZW0oc2Nyb2xsQXJlYSwgZXhwYW5kSXRlbUluQ29tcGFjdCk7XG5cbiAgICAgICAgICAgIC8vIGssIHAsIGxlZnQgYXJyb3dcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoWzc1LCA4MCwgMzddLmluZGV4T2Yoa2V5Q29kZSkgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBzY3JvbGxUb1ByZXZpb3VzSXRlbShuYXZpZ2F0aW9uQXJlYSwgc2Nyb2xsQXJlYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRJdGVtSW5Db21wYWN0KTtcblxuICAgICAgICAgICAgLy8gdVxuICAgICAgICAgICAgfSBlbHNlIGlmIChbODVdLmluZGV4T2Yoa2V5Q29kZSkgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0b2dnbGVVbnJlYWQoc2Nyb2xsQXJlYSk7XG5cbiAgICAgICAgICAgIC8vIGVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoWzY5XS5pbmRleE9mKGtleUNvZGUpID49IDApIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXhwYW5kSXRlbShzY3JvbGxBcmVhKTtcblxuICAgICAgICAgICAgLy8gcywgaSwgbFxuICAgICAgICAgICAgfSBlbHNlIGlmIChbNzMsIDgzLCA3Nl0uaW5kZXhPZihrZXlDb2RlKSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRvZ2dsZVN0YXIoc2Nyb2xsQXJlYSk7XG5cbiAgICAgICAgICAgIC8vIGhcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoWzcyXS5pbmRleE9mKGtleUNvZGUpID49IDApIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdG9nZ2xlU3RhcihzY3JvbGxBcmVhKTtcbiAgICAgICAgICAgICAgICBzY3JvbGxUb05leHRJdGVtKHNjcm9sbEFyZWEpO1xuXG4gICAgICAgICAgICAvLyBvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFs3OV0uaW5kZXhPZihrZXlDb2RlKSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG9wZW5MaW5rKHNjcm9sbEFyZWEpO1xuXG4gICAgICAgICAgICAvLyByXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFs4Ml0uaW5kZXhPZihrZXlDb2RlKSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJlbG9hZEZlZWQobmF2aWdhdGlvbkFyZWEpO1xuXG4gICAgICAgICAgICAvLyBmXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFs3MF0uaW5kZXhPZihrZXlDb2RlKSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIG5leHRGZWVkKG5hdmlnYXRpb25BcmVhKTtcblxuICAgICAgICAgICAgLy8gZFxuICAgICAgICAgICAgfSBlbHNlIGlmIChbNjhdLmluZGV4T2Yoa2V5Q29kZSkgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0ZlZWQobmF2aWdhdGlvbkFyZWEpO1xuXG4gICAgICAgICAgICAvLyBjXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFs2N10uaW5kZXhPZihrZXlDb2RlKSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzRm9sZGVyKG5hdmlnYXRpb25BcmVhKTtcblxuICAgICAgICAgICAgLy8gYVxuICAgICAgICAgICAgfSBlbHNlIGlmIChbNjVdLmluZGV4T2Yoa2V5Q29kZSkgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBzY3JvbGxUb0FjdGl2ZU5hdmlnYXRpb25FbnRyeShuYXZpZ2F0aW9uQXJlYSk7XG5cbiAgICAgICAgICAgIC8vIHZcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoWzg2XS5pbmRleE9mKGtleUNvZGUpID49IDApIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgbmV4dEZvbGRlcihuYXZpZ2F0aW9uQXJlYSk7XG5cbiAgICAgICAgICAgIC8vIHFcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoWzgxXS5pbmRleE9mKGtleUNvZGUpID49IDApIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgJCgnI3NlYXJjaGJveCcpLmZvY3VzKCk7XG5cbiAgICAgICAgICAgIC8vIHBhZ2UgdXBcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoWzMzXS5pbmRleE9mKGtleUNvZGUpID49IDApIHtcblxuICAgICAgICAgICAgICAgIHRyeVJlbG9hZChuYXZpZ2F0aW9uQXJlYSwgc2Nyb2xsQXJlYSk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAvLyBldmVyeXRoaW5nIHdpdGggc2hpZnRcbiAgICAgICAgfSBlbHNlIGlmIChub0lucHV0Rm9jdXNlZCgkKCc6Zm9jdXMnKSkgJiYgZXZlbnQuc2hpZnRLZXkpIHtcblxuICAgICAgICAgICAgLy8gc2hpZnQgKyBhXG4gICAgICAgICAgICBpZiAoWzY1XS5pbmRleE9mKGtleUNvZGUpID49IDApIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgbWFya0FsbFJlYWQobmF2aWdhdGlvbkFyZWEpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxufSh3aW5kb3csIGRvY3VtZW50LCAkKSk7XG4iLCJ3aW5kb3cuTmV3cyA9IHdpbmRvdy5OZXdzIHx8IHt9O1xuXG5cbihmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCwgJCwgZXhwb3J0cywgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGFydGljbGVBY3Rpb25QbHVnaW5zID0gW107XG5cbiAgICBleHBvcnRzLmFkZEFydGljbGVBY3Rpb24gPSBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIGFydGljbGVBY3Rpb25QbHVnaW5zLnB1c2goYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgZXhwb3J0cy5nZXRBcnRpY2xlQWN0aW9uUGx1Z2lucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFydGljbGVBY3Rpb25QbHVnaW5zO1xuICAgIH07XG5cbn0pKHdpbmRvdywgZG9jdW1lbnQsIGpRdWVyeSwgd2luZG93Lk5ld3MpO1xuXG4iLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAucnVuKFtcIiRkb2N1bWVudFwiLCBcIiRyb290U2NvcGVcIiwgZnVuY3Rpb24gKCRkb2N1bWVudCwgJHJvb3RTY29wZSkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICAkZG9jdW1lbnQuY2xpY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICRyb290U2NvcGUuJGJyb2FkY2FzdCgnZG9jdW1lbnRDbGlja2VkJywgZXZlbnQpO1xuICAgIH0pO1xufV0pO1xuXG5hcHAuZGlyZWN0aXZlKCdhcHBOYXZpZ2F0aW9uRW50cnlVdGlscycsIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdDJyxcbiAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbG0pIHtcbiAgICAgICAgICAgIHZhciBtZW51ID0gZWxtLnNpYmxpbmdzKCcuYXBwLW5hdmlnYXRpb24tZW50cnktbWVudScpO1xuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQoZWxtKVxuICAgICAgICAgICAgICAgIC5maW5kKCcuYXBwLW5hdmlnYXRpb24tZW50cnktdXRpbHMtbWVudS1idXR0b24gYnV0dG9uJyk7XG5cbiAgICAgICAgICAgIGJ1dHRvbi5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbWVudS50b2dnbGVDbGFzcygnb3BlbicpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNjb3BlLiRvbignZG9jdW1lbnRDbGlja2VkJywgZnVuY3Rpb24gKHNjb3BlLCBldmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgIT09IGJ1dHRvblswXSkge1xuICAgICAgICAgICAgICAgICAgICBtZW51LnJlbW92ZUNsYXNzKCdvcGVuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmRpcmVjdGl2ZSgnbmV3c0FkZEZlZWQnLCBbXCIkcm9vdFNjb3BlXCIsIFwiJHRpbWVvdXRcIiwgZnVuY3Rpb24gKCRyb290U2NvcGUsICR0aW1lb3V0KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtKSB7XG4gICAgICAgICAgICAkcm9vdFNjb3BlLiRvbignYWRkRmVlZCcsIGZ1bmN0aW9uIChfLCB1cmwpIHtcblxuICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaXMoJzphbmltYXRlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnN0b3AodHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZWxlbS5pcygnOnZpc2libGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5zbGlkZURvd24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbGVtLmZpbmQoJ1tuZy1tb2RlbD1cIk5hdmlnYXRpb24uZmVlZC51cmxcIl0nKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgc2NvcGUuTmF2aWdhdGlvbi5mZWVkLnVybCA9IHVybDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1dKTsiLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuZGlyZWN0aXZlKCduZXdzQXJ0aWNsZUFjdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBuZXdzQXJ0aWNsZUFjdGlvbnM6ICc9JyxcbiAgICAgICAgICAgIG5vUGx1Z2luczogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbSkge1xuICAgICAgICAgICAgdmFyIHBsdWdpbnMgPSBOZXdzLmdldEFydGljbGVBY3Rpb25QbHVnaW5zKCk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxwbHVnaW5zLmxlbmd0aDsgaSs9MSkge1xuICAgICAgICAgICAgICAgIHBsdWdpbnNbaV0oZWxlbSwgc2NvcGUubmV3c0FydGljbGVBY3Rpb25zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2NvcGUubm9QbHVnaW5zID0gcGx1Z2lucy5sZW5ndGggPT09IDA7XG4gICAgICAgIH1cbiAgICB9O1xufSk7XG4iLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuZGlyZWN0aXZlKCduZXdzQXV0b0ZvY3VzJywgW1wiJHRpbWVvdXRcIiwgZnVuY3Rpb24gKCR0aW1lb3V0KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgIHZhciB0b0ZvY3VzID0gZWxlbTtcblxuICAgICAgICBpZiAoYXR0cnMubmV3c0F1dG9Gb2N1cykge1xuICAgICAgICAgICAgdG9Gb2N1cyA9ICQoYXR0cnMubmV3c0F1dG9Gb2N1cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBjb21iYXQgJGRpZ2VzdCBhbHJlYWR5IGluIHByb2Nlc3MgZXJyb3Igd2hlbiByb3V0ZSBjaGFuZ2VzXG4gICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRvRm9jdXMuZm9jdXMoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfTtcbn1dKTsiLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuZGlyZWN0aXZlKCduZXdzQmluZEh0bWxVbnNhZmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSwgZWxlbSwgYXR0cikge1xuICAgICAgICBzY29wZS4kd2F0Y2goYXR0ci5uZXdzQmluZEh0bWxVbnNhZmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVsZW0uaHRtbChzY29wZS4kZXZhbChhdHRyLm5ld3NCaW5kSHRtbFVuc2FmZSkpO1xuICAgICAgICB9KTtcbiAgICB9O1xufSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmRpcmVjdGl2ZSgnbmV3c0RyYWdnYWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRyKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gc2NvcGUuJGV2YWwoYXR0ci5uZXdzRHJhZ2dhYmxlKTtcblxuICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQob3B0aW9ucykpIHtcbiAgICAgICAgICAgIGVsZW0uZHJhZ2dhYmxlKG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbS5kcmFnZ2FibGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHIuJG9ic2VydmUoJ25ld3NEcmFnZ2FibGVEaXNhYmxlJywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgIGVsZW0uZHJhZ2dhYmxlKCdkaXNhYmxlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW0uZHJhZ2dhYmxlKCdlbmFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbn0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5kaXJlY3RpdmUoJ25ld3NEcm9wcGFibGUnLCBbXCIkcm9vdFNjb3BlXCIsIGZ1bmN0aW9uICgkcm9vdFNjb3BlKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSwgZWxlbSwgYXR0cikge1xuICAgICAgICB2YXIgZGV0YWlscyA9IHtcbiAgICAgICAgICAgIGFjY2VwdDogJy5mZWVkJyxcbiAgICAgICAgICAgIGhvdmVyQ2xhc3M6ICdkcmFnLWFuZC1kcm9wJyxcbiAgICAgICAgICAgIGdyZWVkeTogdHJ1ZSxcbiAgICAgICAgICAgIGRyb3A6IGZ1bmN0aW9uIChldmVudCwgdWkpIHtcblxuICAgICAgICAgICAgICAgICQoJy5kcmFnLWFuZC1kcm9wJykucmVtb3ZlQ2xhc3MoJ2RyYWctYW5kLWRyb3AnKTtcblxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICBmb2xkZXJJZDogcGFyc2VJbnQoZWxlbS5kYXRhKCdpZCcpLCAxMCksXG4gICAgICAgICAgICAgICAgICAgIGZlZWRJZDogcGFyc2VJbnQoJCh1aS5kcmFnZ2FibGUpLmRhdGEoJ2lkJyksIDEwKVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ21vdmVGZWVkVG9Gb2xkZXInLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoYXR0ci5kcm9wcGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGVsZW0uZHJvcHBhYmxlKGRldGFpbHMpO1xuICAgIH07XG59XSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuXG5hcHAuZGlyZWN0aXZlKCduZXdzRmluaXNoZWRUcmFuc2l0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgIGVsZW0ub24oJ3RyYW5zaXRpb25lbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbGVtLmFkZENsYXNzKGF0dHJzLm5ld3NGaW5pc2hlZFRyYW5zaXRpb24pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG59KTsiLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuZGlyZWN0aXZlKCduZXdzRm9jdXMnLCBbXCIkdGltZW91dFwiLCBcIiRpbnRlcnBvbGF0ZVwiLCBmdW5jdGlvbiAoJHRpbWVvdXQsICRpbnRlcnBvbGF0ZSkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUsIGVsZW0sIGF0dHJzKSB7XG4gICAgICAgIGVsZW0uY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRvUmVhZGQgPSAkKCRpbnRlcnBvbGF0ZShhdHRycy5uZXdzRm9jdXMpKHNjb3BlKSk7XG4gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdG9SZWFkZC5mb2N1cygpO1xuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxufV0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cblxuYXBwLmRpcmVjdGl2ZSgnbmV3c0luc3RhbnROb3RpZmljYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtKSB7XG4gICAgICAgICAgICBlbGVtLmhpZGUoKTtcblxuICAgICAgICAgICAgdmFyIG5vdGlmaWNhdGlvbiA9IGVsZW0uaHRtbCgpO1xuICAgICAgICAgICAgT0MuTm90aWZpY2F0aW9uLnNob3dIdG1sKG5vdGlmaWNhdGlvbik7XG4gICAgICAgIH1cbiAgICB9O1xuXG59KTsiLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5cbi8qKlxuICogUGF1c2UgcGxheWJhY2sgb24gZWxlbWVudHMgb3RoZXIgdGhhbiB0aGUgY3VycmVudCBvbmVcbiAqL1xuYXBwLmRpcmVjdGl2ZSgnbmV3c1BsYXlPbmUnLCBbXCIkcm9vdFNjb3BlXCIsIGZ1bmN0aW9uICgkcm9vdFNjb3BlKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbSkge1xuICAgICAgICAgICAgZWxlbS5vbigncGxheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ3BsYXlpbmcnLCBlbGVtKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkcm9vdFNjb3BlLiRvbigncGxheWluZycsIGZ1bmN0aW9uIChzY29wZSwgYXJncykge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzWzBdICE9PSBlbGVtWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1bMF0ucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmRpcmVjdGl2ZSgnbmV3c1B1bGxUb1JlZnJlc2gnLCBbXCIkcm9vdFNjb3BlXCIsIGZ1bmN0aW9uICgkcm9vdFNjb3BlKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHNjcm9sbGVkID0gZmFsc2U7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICBzY29wZToge1xuICAgICAgICAgICAgbmV3c1B1bGxUb1JlZnJlc2g6ICc9J1xuICAgICAgICB9LFxuICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQpIHtcblxuICAgICAgICAgICAgLy8gY2hhbmdlIGluIHRoZSByb3V0ZSBtZWFucyB0aGUgY29udGVudCBpcyByZWZyZXNoZWRcbiAgICAgICAgICAgIC8vIHNvIHJlc2V0IHRoZSB2YXJcbiAgICAgICAgICAgICRyb290U2NvcGUuJG9uKCckcm91dGVDaGFuZ2VTdGFydCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzY3JvbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHNjb3BlLm5ld3NQdWxsVG9SZWZyZXNoID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZWxlbWVudC5vbignc2Nyb2xsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnNjcm9sbFRvcCgpID09PSAwICYmIHNjcm9sbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm5ld3NQdWxsVG9SZWZyZXNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufV0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5kaXJlY3RpdmUoJ25ld3NSZWFkRmlsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRyKSB7XG5cbiAgICAgICAgZWxlbS5jaGFuZ2UoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICB2YXIgZmlsZSA9IGVsZW1bMF0uZmlsZXNbMF07XG4gICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBpcyB0aGVyZSBhIG1vcmUgZmxleGlibGUgc29sdXRpb24gd2hlcmUgd2UgZG9udCBoYXZlXG4gICAgICAgICAgICAgICAgLy8gdG8gYmluZCB0aGUgZmlsZSB0byBzY29wZT9cbiAgICAgICAgICAgICAgICBzY29wZS4kZmlsZUNvbnRlbnQgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseShhdHRyLm5ld3NSZWFkRmlsZSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5kaXJlY3RpdmUoJ25ld3NSZWZyZXNoTWFzb25yeScsIFtcIiR0aW1lb3V0XCIsIGZ1bmN0aW9uICgkdGltZW91dCkge1xuXHQndXNlIHN0cmljdCc7XG5cdHZhciByZWZyZXNoID0gZnVuY3Rpb24gKGVsZW0pIHtcblx0XHQkdGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHQkdGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50KCkubWFzb25yeSh7XG5cdFx0XHRcdFx0aXRlbVNlbGVjdG9yOiAnLmdyaWQtaXRlbScsXG5cdFx0XHRcdFx0Z3V0dGVyOiAyNSxcblx0XHRcdFx0XHRjb2x1bW5XaWR0aDogMzAwXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH07XG5cblx0cmV0dXJuIGZ1bmN0aW9uIChzY29wZSwgZWxlbSkge1xuXHRcdGlmIChzY29wZS4kbGFzdCkge1xuXHRcdFx0cmVmcmVzaChlbGVtKTtcblx0XHR9XG5cdH07XG59XSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmRpcmVjdGl2ZSgnbmV3c1Njcm9sbCcsIFtcIiR0aW1lb3V0XCIsIFwiSVRFTV9BVVRPX1BBR0VfU0laRVwiLCBcIk1BUktfUkVBRF9USU1FT1VUXCIsIFwiU0NST0xMX1RJTUVPVVRcIiwgZnVuY3Rpb24gKCR0aW1lb3V0LCBJVEVNX0FVVE9fUEFHRV9TSVpFLFxuICAgIE1BUktfUkVBRF9USU1FT1VULCBTQ1JPTExfVElNRU9VVCkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgdGltZXI7XG5cbiAgICAvLyBhdXRvcGFnaW5nXG4gICAgdmFyIGF1dG9QYWdlID0gZnVuY3Rpb24gKGxpbWl0LCBlbGVtLCBzY29wZSkge1xuICAgICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICAgIHZhciBhcnRpY2xlcyA9IGVsZW0uZmluZCgnLml0ZW0nKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gYXJ0aWNsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gJChhcnRpY2xlc1tpXSk7XG5cblxuICAgICAgICAgICAgLy8gaWYgdGhlIGNvdW50ZXIgaXMgaGlnaGVyIHRoYW4gdGhlIHNpemUgaXQgbWVhbnNcbiAgICAgICAgICAgIC8vIHRoYXQgaXQgZGlkbnQgYnJlYWsgdG8gYXV0byBwYWdlIHlldCBhbmQgdGhhdFxuICAgICAgICAgICAgLy8gdGhlcmUgYXJlIG1vcmUgaXRlbXMsIHNvIGJyZWFrXG4gICAgICAgICAgICBpZiAoY291bnRlciA+PSBsaW1pdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGlzIGlzIG9ubHkgcmVhY2hlZCB3aGVuIHRoZSBpdGVtIGlzIG5vdCBpc1xuICAgICAgICAgICAgLy8gYmVsb3cgdGhlIHRvcCBhbmQgd2UgZGlkbnQgaGl0IHRoZSBmYWN0b3IgeWV0IHNvXG4gICAgICAgICAgICAvLyBhdXRvcGFnZSBhbmQgYnJlYWtcbiAgICAgICAgICAgIGlmIChpdGVtLnBvc2l0aW9uKCkudG9wIDwgMCkge1xuICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseShzY29wZS5uZXdzU2Nyb2xsQXV0b1BhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb3VudGVyICs9IDE7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gbWFyayByZWFkXG4gICAgdmFyIG1hcmtSZWFkID0gZnVuY3Rpb24gKGVuYWJsZWQsIGVsZW0sIHNjb3BlKSB7XG4gICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICB2YXIgaWRzID0gW107XG4gICAgICAgICAgICB2YXIgYXJ0aWNsZXMgPSBlbGVtLmZpbmQoJy5pdGVtOm5vdCgucmVhZCknKTtcblxuICAgICAgICAgICAgYXJ0aWNsZXMuZWFjaChmdW5jdGlvbihpbmRleCwgYXJ0aWNsZSkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gJChhcnRpY2xlKTtcblxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnBvc2l0aW9uKCkudG9wIDw9IC0xMCkge1xuICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChwYXJzZUludChpdGVtLmRhdGEoJ2lkJyksIDEwKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS5pdGVtSWRzID0gaWRzO1xuICAgICAgICAgICAgc2NvcGUuJGFwcGx5KHNjb3BlLm5ld3NTY3JvbGxNYXJrUmVhZCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICduZXdzU2Nyb2xsJzogJ0AnLFxuICAgICAgICAgICAgJ25ld3NTY3JvbGxBdXRvUGFnZSc6ICcmJyxcbiAgICAgICAgICAgICduZXdzU2Nyb2xsTWFya1JlYWQnOiAnJicsXG4gICAgICAgICAgICAnbmV3c1Njcm9sbEVuYWJsZWRNYXJrUmVhZCc6ICc9JyxcbiAgICAgICAgfSxcbiAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtKSB7XG4gICAgICAgICAgICB2YXIgYWxsb3dTY3JvbGwgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIHNjcm9sbEFyZWEgPSBlbGVtO1xuXG4gICAgICAgICAgICBpZiAoc2NvcGUubmV3c1Njcm9sbCkge1xuICAgICAgICAgICAgICAgIHNjcm9sbEFyZWEgPSAkKHNjb3BlLm5ld3NTY3JvbGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBhbGxvdyBvbmx5IG9uZSBzY3JvbGwgZXZlbnQgdG8gdHJpZ2dlciBldmVyeSAzMDBtc1xuICAgICAgICAgICAgICAgIGlmIChhbGxvd1Njcm9sbCkge1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1Njcm9sbCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93U2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSwgU0NST0xMX1RJTUVPVVQqMTAwMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYXV0b1BhZ2UoSVRFTV9BVVRPX1BBR0VfU0laRSwgZWxlbSwgc2NvcGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbnQgc3RhY2sgbWFyayByZWFkIHJlcXVlc3RzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVvdXQuY2FuY2VsKHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IHVzZXIgdG8gdW5kbyBhY2NpZGVudGFsIHNjcm9sbFxuICAgICAgICAgICAgICAgICAgICB0aW1lciA9ICR0aW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtSZWFkKHNjb3BlLm5ld3NTY3JvbGxFbmFibGVkTWFya1JlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0sIE1BUktfUkVBRF9USU1FT1VUKjEwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNjcm9sbEFyZWEub24oJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgc2Nyb2xsIGhhbmRsZXIgaWYgZWxlbWVudCBpcyBkZXN0cm95ZWRcbiAgICAgICAgICAgIHNjb3BlLiRvbignJGRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2Nyb2xsQXJlYS5vZmYoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufV0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5kaXJlY3RpdmUoJ25ld3NTZWFyY2gnLCBbXCIkZG9jdW1lbnRcIiwgXCIkbG9jYXRpb25cIiwgZnVuY3Rpb24gKCRkb2N1bWVudCwgJGxvY2F0aW9uKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICdvblNlYXJjaCc6ICc9J1xuICAgICAgICB9LFxuICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgICAgICAgIHZhciBib3ggPSAkKCcjc2VhcmNoYm94Jyk7XG4gICAgICAgICAgICBib3gudmFsKCRsb2NhdGlvbi5zZWFyY2goKS5zZWFyY2gpO1xuXG4gICAgICAgICAgICB2YXIgZG9TZWFyY2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gYm94LnZhbCgpO1xuICAgICAgICAgICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm9uU2VhcmNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJveC5vbignc2VhcmNoIGtleXVwJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdzZWFyY2gnIHx8IGV2ZW50LmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvU2VhcmNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGNhcnJ5IG92ZXIgc2VhcmNoIG9uIHJvdXRlIGNoYW5nZVxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJGxvY2F0aW9uLnNlYXJjaCgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHNlYXJjaCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggJiYgc2VhcmNoLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICBib3gudmFsKHNlYXJjaC5zZWFyY2gpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJveC52YWwoJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1dKTtcbiIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5kaXJlY3RpdmUoJ25ld3NTdGlja3lNZW51JywgZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHJldHVybiBmdW5jdGlvbiAoc2NvcGUsIGVsZW0sIGF0dHIpIHtcbiAgICAgICAgdmFyIGhlaWdodCA9IDQwO1xuXG4gICAgICAgICQoYXR0ci5uZXdzU3RpY2t5TWVudSkuc2Nyb2xsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxIZWlnaHQgPSAkKHRoaXMpLnNjcm9sbFRvcCgpO1xuXG4gICAgICAgICAgICBpZiAoc2Nyb2xsSGVpZ2h0ID4gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcygnZml4ZWQnKTtcbiAgICAgICAgICAgICAgICBlbGVtLmNzcygndG9wJywgc2Nyb2xsSGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcygnZml4ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbn0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5kaXJlY3RpdmUoJ25ld3NTdG9wUHJvcGFnYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSk7IiwiLyoqXG4gKiBvd25DbG91ZCAtIE5ld3NcbiAqXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBvclxuICogbGF0ZXIuIFNlZSB0aGUgQ09QWUlORyBmaWxlLlxuICpcbiAqIEBhdXRob3IgQmVybmhhcmQgUG9zc2VsdCA8ZGV2QGJlcm5oYXJkLXBvc3NlbHQuY29tPlxuICogQGNvcHlyaWdodCBCZXJuaGFyZCBQb3NzZWx0IDIwMTRcbiAqL1xuYXBwLmRpcmVjdGl2ZSgnbmV3c1RpbWVvdXQnLCBbXCIkdGltZW91dFwiLCBcIiRyb290U2NvcGVcIiwgZnVuY3Rpb24gKCR0aW1lb3V0LCAkcm9vdFNjb3BlKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICduZXdzVGltZW91dCc6ICcmJ1xuICAgICAgICB9LFxuICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBzZWNvbmRzID0gNztcbiAgICAgICAgICAgIHZhciB0aW1lciA9ICR0aW1lb3V0KHNjb3BlLm5ld3NUaW1lb3V0LCBzZWNvbmRzICogMTAwMCk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSB0aW1lb3V0IGlmIGVsZW1lbnQgaXMgYmVpbmcgcmVtb3ZlZCBieVxuICAgICAgICAgICAgLy8gZm9yIGluc3RhbmNlIGNsaWNraW5nIG9uIHRoZSB4IGJ1dHRvblxuICAgICAgICAgICAgc2NvcGUuJG9uKCckZGVzdHJveScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICR0aW1lb3V0LmNhbmNlbCh0aW1lcik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gYWxzbyBkZWxldGUgdGhlIGVudHJ5IGlmIHVuZG8gaXMgaWdub3JlZCBhbmQgdGhlIHVybFxuICAgICAgICAgICAgLy8gaXMgY2hhbmdlZFxuICAgICAgICAgICAgJHJvb3RTY29wZS4kb24oJyRsb2NhdGlvbkNoYW5nZVN0YXJ0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vICRsb2NhdGlvbkNoYW5nZVN0YXJ0IHRyaWdnZXJzIHR3aWNlIGJlY2F1c2Ugb2YgdGhlIHRyYWlsaW5nXG4gICAgICAgICAgICAgICAgLy8gc2xhc2ggb24gdGhlIGxpbmsgd2hpY2ggaXMga2luZGEgYSBoYWNrIHRvIHJlbG9hZCB0aGUgcm91dGVcbiAgICAgICAgICAgICAgICAvLyBpZiB5b3UgY2xpY2sgb24gdGhlIGxpbmsgd2hlbiB0aGUgcm91dGUgaXMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAkdGltZW91dC5jYW5jZWwodGltZXIpO1xuICAgICAgICAgICAgICAgIGlmICghZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLm5ld3NUaW1lb3V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufV0pOyIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5kaXJlY3RpdmUoJ25ld3NUaXRsZVVucmVhZENvdW50JywgW1wiJHdpbmRvd1wiLCBmdW5jdGlvbiAoJHdpbmRvdykge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBiYXNlVGl0bGUgPSAkd2luZG93LmRvY3VtZW50LnRpdGxlO1xuICAgIHZhciB0aXRsZXMgPSBiYXNlVGl0bGUuc3BsaXQoJy0nKTtcbiAgICB2YXIgYXBwTmFtZSA9IHRpdGxlc1swXSB8fCAnTmV3cyc7XG4gICAgdmFyIG93bkNsb3VkTmFtZSA9IHRpdGxlc1sxXSB8fCAnb3duQ2xvdWQnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIHVucmVhZENvdW50OiAnQCdcbiAgICAgICAgfSxcbiAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgICAgICAgICAgYXR0cnMuJG9ic2VydmUoJ3VucmVhZENvdW50JywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSAnMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IGFwcE5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJygnICsgdmFsdWUgKyAnKSAtICcgKyBvd25DbG91ZE5hbWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IGFwcE5hbWUgKyAnIC0gJyArIG93bkNsb3VkTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbn1dKTsiLCIvKipcbiAqIG93bkNsb3VkIC0gTmV3c1xuICpcbiAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAzIG9yXG4gKiBsYXRlci4gU2VlIHRoZSBDT1BZSU5HIGZpbGUuXG4gKlxuICogQGF1dGhvciBCZXJuaGFyZCBQb3NzZWx0IDxkZXZAYmVybmhhcmQtcG9zc2VsdC5jb20+XG4gKiBAY29weXJpZ2h0IEJlcm5oYXJkIFBvc3NlbHQgMjAxNFxuICovXG5hcHAuZGlyZWN0aXZlKCduZXdzVG9nZ2xlU2hvdycsIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICduZXdzVG9nZ2xlU2hvdyc6ICdAJ1xuICAgICAgICB9LFxuICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW0pIHtcbiAgICAgICAgICAgIGVsZW0uY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSAkKHNjb3BlLm5ld3NUb2dnbGVTaG93KTtcbiAgICAgICAgICAgICAgICB0YXJnZXQudG9nZ2xlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KTtcbiIsIi8qKlxuICogb3duQ2xvdWQgLSBOZXdzXG4gKlxuICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDMgb3JcbiAqIGxhdGVyLiBTZWUgdGhlIENPUFlJTkcgZmlsZS5cbiAqXG4gKiBAYXV0aG9yIEJlcm5oYXJkIFBvc3NlbHQgPGRldkBiZXJuaGFyZC1wb3NzZWx0LmNvbT5cbiAqIEBjb3B5cmlnaHQgQmVybmhhcmQgUG9zc2VsdCAyMDE0XG4gKi9cbmFwcC5kaXJlY3RpdmUoJ25ld3NUcmlnZ2VyQ2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzY29wZSwgZWxtLCBhdHRyKSB7XG4gICAgICAgIGVsbS5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKGF0dHIubmV3c1RyaWdnZXJDbGljaykudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxufSk7Il0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9
diff --git a/js/build/app.min.js.map b/js/build/app.min.js.map
deleted file mode 100644
index a223cfe02..000000000
--- a/js/build/app.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["app.js"],"names":["navigator","window","document","angular","$","OC","csrfToken","url","undefined","app","module","config","$routeProvider","$provide","$httpProvider","feedType","FEED","FOLDER","STARRED","SUBSCRIPTIONS","SHARED","EXPLORE","constant","generateUrl","factory","$q","BASE_URL","$window","request","domain","location","href","split","pathname","indexOf","headers","requesttoken","when","errorMessages",0,"t",401,403,412,500,503,"$timeout","timer","responseError","response","status","cancel","Notification","hide","showHtml","reject","interceptors","push","getItemResolve","type","data","$http","$route","$location","ITEM_BATCH_SIZE","FEED_TYPE","SettingsResource","FeedResource","showAll","get","oldestFirst","search","deferred","defer","resolve","parameters","limit","current","params","id","feed","getById","ordering","method","success","promise","getExploreResolve","sites","Publisher","language","lang","then","publishAll","replace","exploreUrl","defaultExploreUrl","controller","templateUrl","run","$rootScope","$interval","Loading","ItemResource","FolderResource","REFRESH_RATE","setLoading","subscribe","toChannels","settingsDeferred","activeFeedDeferred","path","activeFeed","test","feeds","feedDeferred","folders","folderDeferred","all","length","reload","$on","this","loading","isFirstRun","size","play","item","playingItem","$routeParams","ITEM_AUTO_PAGE_SIZE","clear","isAutoPagingEnabled","isNothingMoreToAutoPage","getItems","getAll","toggleStar","itemId","toggleItem","isCompactView","show","isShowAll","markRead","keepUnread","unread","markItemRead","markItemOfFeedRead","feedId","getFeed","toggleKeepUnread","markItemOfFeedUnread","self","getOrdering","isFeed","orderBy","isCompactExpand","autoPagingEnabled","markReadEnabled","scrollRead","itemIds","ids","feedIds","forEach","markItemsOfFeedsRead","markItemsRead","$$route","autoPage","autoPageAgain","items","error","getRelativeDate","timestamp","languageCode","date","moment","unix","locale","fromNow","refresh","getMediaType","Object","keys","map","key","reduce","xs","x","category","feedList","concat","feedExists","getByLocation","subscribeTo","$broadcast","isCategoryShown","filter","element","getSupportedLanguageCodes","getCurrentLanguageCode","showLanguage","selectedLanguageCode","feedError","showNewFolder","renamingFolder","addingFeed","addingFolder","folderError","renameError","getRouteId","parseInt","getLanguageCode","getFeeds","getFolders","markFolderRead","folderId","getByFolderId","markFeedRead","getFeedsOfFolder","getUnreadCount","isUnread","getFeedUnreadCount","unreadCount","isFeedUnread","getFolderUnreadCount","isFolderUnread","getStarredCount","isStarredUnread","toggleFolder","folderName","toggleOpen","hasFeeds","subFeedActive","isSubscriptionsActive","isStarredActive","isExploreActive","isFolderActive","isFeedActive","folderNameExists","trim","feedUrlExists","createFeed","newFolder","existingFolder","getsFeed","create","name","createFolder","folder","moveFeed","move","renameFeed","patch","title","editing","renameFolder","rename","message","reversiblyDeleteFeed","reversiblyDelete","undoDeleteFeed","undoDelete","deleteFeed","reversiblyDeleteFolder","undoDeleteFolder","deleteFolder","setOrdering","togglePinned","pinned","setUpdateMode","updateMode","toggleFullText","value","scope","setSelectedFolderForRoute","OPMLParser","OPMLImporter","isOPMLImporting","isArticlesImporting","opmlImportError","articleImportError","set","toggleSetting","getSetting","importOPML","content","parsedContent","parse","jobSize","importFolders","feedQueue","importFeedQueue","console","importArticles","articles","JSON","$sce","trustAsResourceUrl","Resource","call","locations","folderUnreadCount","folderIds","prototype","receive","updateUnreadCache","updateFolderCache","values","add","hashMap","startsWith","http","parentFolderId","faviconLink","updateCache","isFolder","deleted","promises","post","setPinned","isPinned","diff","fullTextEnabled","opened","open","toFolderName","batchSize","starredCount","lowestId","highestId","channel","newestItemId","getNewestItemId","star","isStarred","it","guidHash","starred","isRead","read","highestItemId","offset","json","service","global","autopaging","area","isLoading","startFeedJob","queue","pop","getsFeedCounter","folderPromises","jobPromises","i","parseOutline","outline","attr","recursivelyParse","level","root","firstLevel","entry","children","xml","parseXML","find","channels","obj","listeners","listener","objs","existing","deleteAtIndex","findIndex","splice","settings","compact","preventReadOnScroll","compactExpand","defaultLanguageCode","supportedLanguageCodes","processLanguageCode","toLowerCase","storage","localStorage","registerHandler","mime","registered","isContentHandlerRegistered","isRegistered","getItem","registerContentHandler","subscribeUrl","setItem","cleanUrl","protocol","host","mimeType","ready","subscription","input","val","trigger","setTimeout","focus","addEventListener","querySelector","scrollTo","noInputFocused","is","noModifierKey","event","shiftKey","altKey","ctrlKey","metaKey","markAllRead","navigationArea","selector","button","isInScrollView","elem","scrollArea","elemTop","top","elemBottom","height","areaBottom","scrollToNavigationElement","toTop","scrollTop","scrollToActiveNavigationEntry","reloadFeed","tryReload","pullToRefresh","hasClass","addClass","activateNavigationEntry","nextFeed","elements","subfeeds","next","getParentFolder","parent","selectFirstOrLastFolder","isLast","index","previousFolder","prevAll","first","parentFolder","nextFolder","nextAll","previousFeed","prev","siblings","previous","onActiveItem","callback","each","position","toggleUnread","expandItem","openLink","scrollToItem","expandItemInCompact","scrollToNextItem","jumped","prop","scrollToPreviousItem","last","keyup","keyCode","isExpandItem","preventDefault","News","exports","articleActionPlugins","addArticleAction","action","getArticleActionPlugins","jQuery","$document","click","directive","restrict","link","elm","menu","toggleClass","target","removeClass","_","stop","slideDown","Navigation","newsArticleActions","noPlugins","plugins","attrs","toFocus","newsAutoFocus","$watch","newsBindHtmlUnsafe","html","$eval","options","newsDraggable","isDefined","draggable","$observe","details","accept","hoverClass","greedy","drop","ui","$apply","droppable","on","newsFinishedTransition","$interpolate","toReadd","newsFocus","notification","args","pause","scrolled","newsPullToRefresh","change","file","files","reader","FileReader","onload","$fileContent","result","newsReadFile","readAsText","masonry","itemSelector","gutter","columnWidth","$last","MARK_READ_TIMEOUT","SCROLL_TIMEOUT","counter","newsScrollAutoPage","enabled","article","newsScrollMarkRead","newsScroll","newsScrollEnabledMarkRead","allowScroll","scrollHandler","off","onSearch","box","doSearch","newsStickyMenu","scroll","scrollHeight","css","bind","stopPropagation","newsTimeout","destroyed","seconds","remove","baseTitle","titles","appName","ownCloudName","newsToggleShow","toggle","newsTriggerClick","oc_requesttoken"],"mappings":"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","file":"app.min.js"} \ No newline at end of file
diff --git a/js/controller/AppController.js b/js/controller/AppController.js
index 31a288540..bb40b80fa 100644
--- a/js/controller/AppController.js
+++ b/js/controller/AppController.js
@@ -20,4 +20,4 @@ function (Loading, FeedResource, FolderResource) {
this.play = function (item) {
this.playingItem = item;
};
-}); \ No newline at end of file
+});
diff --git a/js/gui/ExternSubscription.js b/js/gui/ExternSubscription.js
index e6bc59d2e..84fa650db 100644
--- a/js/gui/ExternSubscription.js
+++ b/js/gui/ExternSubscription.js
@@ -33,7 +33,7 @@
};
if (navigator.registerContentHandler && !isRegistered(mime, url)) {
- navigator.registerContentHandler(mime, subscribeUrl, title);
+ navigator.registerContentHandler(mime, url, title);
if (!registered) {
storage.setItem('registeredHandler', url);
}
diff --git a/js/gulpfile.js b/js/gulpfile.js
new file mode 100644
index 000000000..497fd6959
--- /dev/null
+++ b/js/gulpfile.js
@@ -0,0 +1,93 @@
+/**
+ * ownCloud - News
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Bernhard Posselt <dev@bernhard-posselt.com>
+ * @copyright Bernhard Posselt 2012, 2014
+ */
+
+'use strict';
+
+let gulp = require('gulp'),
+ ngAnnotate = require('gulp-ng-annotate'),
+ uglify = require('gulp-uglify'),
+ jshint = require('gulp-jshint'),
+ KarmaServer = require('karma').Server,
+ phpunit = require('gulp-phpunit'),
+ concat = require('gulp-concat'),
+ sourcemaps = require('gulp-sourcemaps');
+
+/**
+ * Configuration
+ */
+let phpunitConfig = __dirname + '/../phpunit.xml';
+let karmaConfig = __dirname + '/karma.conf.js';
+let destinationFolder = __dirname + '/build/';
+let sources = [
+ 'app/App.js', 'app/Config.js', 'app/Run.js',
+ 'controller/**/*.js',
+ 'filter/**/*.js',
+ 'service/**/*.js',
+ 'gui/**/*.js',
+ 'plugin/**/*.js',
+ 'utility/**/*.js',
+ 'directive/**/*.js'
+];
+
+let testSources = [
+ 'tests/**/*.js'
+];
+
+let phpSources = [
+ '../*/**.php',
+ '!../js/*/**',
+ '!../vendor/*/**'
+];
+
+gulp.task('default', ['lint'], () => {
+ return gulp.src(sources)
+ .pipe(ngAnnotate())
+ .pipe(sourcemaps.init())
+ .pipe(concat('app.min.js'))
+ .pipe(uglify())
+ .pipe(sourcemaps.write())
+ .pipe(gulp.dest(destinationFolder));
+});
+
+gulp.task('lint', () => {
+ return gulp.src('*/**.js')
+ .pipe(jshint())
+ .pipe(jshint.reporter('jshint-stylish'))
+ .pipe(jshint.reporter('fail'));
+});
+
+gulp.task('watch', () => {
+ gulp.watch(sources.concat(testSources).concat('*.js'), ['default']);
+});
+
+gulp.task('karma', (done) => {
+ new KarmaServer({
+ configFile: karmaConfig,
+ singleRun: true
+ }, done).start();
+})
+
+gulp.task('watch-karma', (done) => {
+ new KarmaServer({
+ configFile: karmaConfig,
+ autoWatch: true
+ }, done).start();
+})
+
+gulp.task('phpunit', () => {
+ gulp.src(phpSources)
+ .pipe(phpunit('phpunit', {
+ configurationFile: phpunitConfig
+ }));
+});
+
+gulp.task('watch-phpunit', () => {
+ gulp.watch(phpSources, ['phpunit']);
+});
diff --git a/js/karma.conf.js b/js/karma.conf.js
index c1e255735..f9b427825 100644
--- a/js/karma.conf.js
+++ b/js/karma.conf.js
@@ -10,15 +10,10 @@ module.exports = function (config) {
// (eg. files, exclude)
basePath: '',
-
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine'],
- preprocessors: {
- 'build/app.js': ['coverage']
- },
-
// list of files / patterns to load in the browser
files: [
'vendor/js-url/url.min.js',
diff --git a/js/package.json b/js/package.json
index 6ad26a3fc..09a2b6eeb 100644
--- a/js/package.json
+++ b/js/package.json
@@ -24,21 +24,15 @@
},
"homepage": "https://github.com/owncloud/news",
"devDependencies": {
- "grunt": "^0.4.5",
- "grunt-cachebuster": "^0.1.5",
- "grunt-contrib-concat": "^0.5.1",
- "grunt-contrib-connect": "^0.11.2",
- "grunt-contrib-cssmin": "^0.14.0",
- "grunt-contrib-jshint": "^0.12.0",
- "grunt-contrib-uglify": "^0.11.0",
- "grunt-contrib-watch": "^0.6.1",
- "grunt-karma": "^0.12.1",
- "grunt-ng-annotate": "^1.0.1",
- "grunt-php": "^1.5.1",
- "grunt-phpunit": "^0.3.6",
- "grunt-protractor-runner": "^3.0.0",
- "grunt-protractor-webdriver": "^0.2.5",
- "grunt-wrap": "^0.3.0",
+ "gulp": "^3.9.1",
+ "gulp-concat": "^2.6.0",
+ "gulp-jshint": "^2.0.0",
+ "gulp-ng-annotate": "^1.1.0",
+ "gulp-phpunit": "^0.12.1",
+ "gulp-sourcemaps": "^1.6.0",
+ "gulp-uglify": "^1.5.2",
+ "jshint": "^2.9.1",
+ "jshint-stylish": "^2.1.0",
"karma": "^0.13.19",
"karma-chrome-launcher": "^0.2.2",
"karma-coverage": "^0.5.3",
diff --git a/js/tests/unit/controller/AppControllerSpec.js b/js/tests/unit/controller/AppControllerSpec.js
index a54b3b034..6ceb0e849 100644
--- a/js/tests/unit/controller/AppControllerSpec.js
+++ b/js/tests/unit/controller/AppControllerSpec.js
@@ -53,4 +53,4 @@ describe('AppController', function () {
expect(location.path).not.toHaveBeenCalled();
}));
-}); \ No newline at end of file
+});
diff --git a/phpunit.integration.xml b/phpunit.integration.xml
index eba04489b..3a43fe58b 100644
--- a/phpunit.integration.xml
+++ b/phpunit.integration.xml
@@ -1,4 +1,4 @@
-<phpunit bootstrap="tests/bootstrap.php">
+<phpunit bootstrap="tests/bootstrap.php" colors="true">
<testsuites>
<testsuite name="integration">
<directory>./tests/integration</directory>
diff --git a/phpunit.xml b/phpunit.xml
index 6a9499665..bd2b01caf 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -1,4 +1,4 @@
-<phpunit bootstrap="tests/bootstrap.php">
+<phpunit bootstrap="tests/bootstrap.php" colors="true">
<testsuites>
<testsuite name="unit">
<directory>./tests/unit</directory>
diff --git a/templates/index.php b/templates/index.php
index 1958428a5..d6c713aaa 100644
--- a/templates/index.php
+++ b/templates/index.php
@@ -13,7 +13,16 @@ script('news', [
'build/app.min',
]);
-style('news', 'news.min');
+style('news', [
+ 'app',
+ 'content',
+ 'custom',
+ 'explore',
+ 'mobile',
+ 'navigation',
+ 'settings',
+ 'shortcuts'
+]);
// load plugin scripts and styles
foreach (Plugin::getStyles() as $appName => $fileName) {