rubyfox-server 2.17.3.2 → 2.19.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +10 -1
  3. data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +90 -20
  4. data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +9 -0
  5. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +11 -0
  6. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +3 -3
  7. data/lib/rubyfox/server/data/config/core.xml +4 -4
  8. data/lib/rubyfox/server/data/config/default.words.txt +11 -0
  9. data/lib/rubyfox/server/data/config/log4j.properties +1 -2
  10. data/lib/rubyfox/server/data/config/server.xml +1 -1
  11. data/lib/rubyfox/server/data/data/GeoLite2-Country.mmdb +0 -0
  12. data/lib/rubyfox/server/data/data/bannedusers/users.bin +0 -0
  13. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
  14. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina-tasks.xml +39 -39
  15. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +0 -0
  16. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/ciphers.sh +0 -0
  17. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
  18. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
  19. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/configtest.sh +0 -0
  20. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/daemon.sh +0 -0
  21. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/digest.sh +0 -0
  22. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/makebase.sh +0 -0
  23. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/setclasspath.sh +0 -0
  24. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/shutdown.sh +0 -0
  25. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/startup.sh +0 -0
  26. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
  27. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
  28. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tool-wrapper.sh +0 -0
  29. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/version.sh +0 -0
  30. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/Catalina/localhost/rewrite.config +1 -1
  31. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +263 -263
  32. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +209 -207
  33. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/context.xml +31 -31
  34. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xml +23 -23
  35. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/jaspic-providers.xsd +52 -52
  36. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
  37. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/server.xml +177 -161
  38. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xml +18 -7
  39. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/tomcat-users.xsd +59 -59
  40. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/web.xml +4740 -4737
  41. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
  42. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
  43. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
  44. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
  45. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
  46. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
  47. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
  48. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
  49. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
  50. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
  51. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
  52. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
  53. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/sfs2x-ws-helper.jar +0 -0
  55. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
  56. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
  57. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
  58. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
  59. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
  60. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
  61. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
  62. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
  63. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
  64. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
  65. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
  66. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
  67. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
  68. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
  69. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
  70. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
  71. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
  72. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
  73. data/lib/rubyfox/server/data/lib/javax.activation-1.2.0.jar +0 -0
  74. data/lib/rubyfox/server/data/lib/javax.mail.jar +0 -0
  75. data/lib/rubyfox/server/data/lib/js/JSApi.js +2 -1
  76. data/lib/rubyfox/server/data/lib/js/LibApi.js +181 -48
  77. data/lib/rubyfox/server/data/lib/sfs2x-admin.jar +0 -0
  78. data/lib/rubyfox/server/data/lib/sfs2x-cluster.jar +0 -0
  79. data/lib/rubyfox/server/data/lib/sfs2x-core.jar +0 -0
  80. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  81. data/lib/rubyfox/server/data/sfs2x-service +26 -30
  82. data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
  83. data/lib/rubyfox/server/data/www/HelloServlet/WEB-INF/web.xml +1 -3
  84. data/lib/rubyfox/server/data/www/ROOT/_css_/default.css +14 -6
  85. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +44 -2
  86. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +98 -61
  87. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/endors~mod-0~mod-1~mod-11~mod-12~mod-17~mod-6~mod-7~mod-8~mod-9.bundle.js +17357 -0
  88. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +4 -4
  89. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +3 -3
  90. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +101 -66
  91. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +544 -8
  92. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +915 -1480
  93. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-15~module-16~module-4.bundle.js +2665 -0
  94. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +606 -3093
  95. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13~module-16~module-17~module-4.bundle.js +2665 -0
  96. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-14.bundle.js +764 -0
  97. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-15.bundle.js +71 -0
  98. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-16.bundle.js +1787 -0
  99. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-17.bundle.js +3383 -0
  100. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +121 -1009
  101. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +1214 -1744
  102. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +398 -666
  103. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +717 -192
  104. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +2117 -665
  105. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +613 -690
  106. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~mod-0~mod-1~mod-10~mod-11~mod-16~mod-5~mod-6~mod-7~mod-8.bundle.js +17357 -0
  107. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~mod-0~mod-1~mod-11~mod-12~mod-17~mod-5~mod-6~mod-7~mod-8~mod-9.bundle.js +17357 -0
  108. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/{vendors~module-0~module-1~module-13~module-4~module-5~module-7~module-8.bundle.js → vendors~mod-0~mod-1~mod-11~mod-12~mod-17~mod-5~mod-7~mod-8~mod-9.bundle.js} +2 -2
  109. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-12.bundle.js +807 -0
  110. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-13.bundle.js +807 -0
  111. data/lib/rubyfox/server/data/www/ROOT/admin/modules/cluster-configurator.html +32 -0
  112. data/lib/rubyfox/server/data/www/ROOT/admin/modules/cluster-monitor.html +185 -0
  113. data/lib/rubyfox/server/data/www/ROOT/admin/modules/cluster-updater.html +47 -0
  114. data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-deployer.html +84 -0
  115. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +15 -8
  116. data/lib/rubyfox/server/data/www/ROOT/index.html +13 -23
  117. data/lib/rubyfox/server/data/www/host-manager/META-INF/context.xml +2 -2
  118. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/jsp/404.jsp +2 -2
  119. data/lib/rubyfox/server/data/www/host-manager/{manager.xml → WEB-INF/manager.xml} +5 -1
  120. data/lib/rubyfox/server/data/www/host-manager/WEB-INF/web.xml +17 -0
  121. data/lib/rubyfox/server/data/www/host-manager/css/manager.css +141 -0
  122. data/lib/rubyfox/server/data/www/host-manager/images/tomcat.svg +967 -0
  123. data/lib/rubyfox/server/data/www/manager/META-INF/context.xml +2 -0
  124. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCerts.jsp +1 -1
  125. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorCiphers.jsp +1 -1
  126. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/connectorTrustedCerts.jsp +1 -1
  127. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionDetail.jsp +3 -3
  128. data/lib/rubyfox/server/data/www/manager/WEB-INF/jsp/sessionsList.jsp +1 -1
  129. data/lib/rubyfox/server/data/www/manager/WEB-INF/web.xml +17 -0
  130. data/lib/rubyfox/server/data/www/manager/css/manager.css +141 -0
  131. data/lib/rubyfox/server/data/www/manager/images/tomcat.svg +967 -0
  132. data/lib/rubyfox/server/data/www/manager/xform.xsl +74 -59
  133. data/lib/rubyfox/server/version.rb +1 -1
  134. metadata +30 -31
  135. data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
  136. data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
  137. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
  138. data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
  139. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
  140. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
  141. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
  142. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
  143. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
  144. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.png +0 -0
  145. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
  146. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
  147. data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
  148. data/lib/rubyfox/server/data/lib/apache-tomcat/LICENSE +0 -1061
  149. data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +0 -68
  150. data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +0 -81
  151. data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +0 -174
  152. data/lib/rubyfox/server/data/lib/imap.jar +0 -0
  153. data/lib/rubyfox/server/data/lib/mailapi.jar +0 -0
  154. data/lib/rubyfox/server/data/lib/pop3.jar +0 -0
  155. data/lib/rubyfox/server/data/lib/smtp.jar +0 -0
  156. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +0 -2634
  157. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +0 -807
  158. data/lib/rubyfox/server/data/www/host-manager/images/tomcat.gif +0 -0
  159. data/lib/rubyfox/server/data/www/manager/images/tomcat.gif +0 -0
  160. /data/lib/rubyfox/server/data/data/buddylists/{BasicExamples/.keep → .keep} +0 -0
@@ -1,531 +1,41 @@
1
1
  /*! (c) gotoAndPlay | All rights reserved */
2
2
  (window["webpackJsonpapplication"] = window["webpackJsonpapplication"] || []).push([["module-4"],{
3
3
 
4
- /***/ "./node_modules/file-saver/dist/FileSaver.min.js":
5
- /*!*******************************************************!*\
6
- !*** ./node_modules/file-saver/dist/FileSaver.min.js ***!
7
- \*******************************************************/
8
- /*! no static exports found */
9
- /***/ (function(module, exports, __webpack_require__) {
10
-
11
- /* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(a,b){if(true)!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (b),
12
- __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
13
- (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
14
- __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));else {}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(b,c,d){var e=new XMLHttpRequest;e.open("GET",b),e.responseType="blob",e.onload=function(){a(e.response,c,d)},e.onerror=function(){console.error("could not download file")},e.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(a,b,d,e){if(e=e||open("","_blank"),e&&(e.document.title=e.document.body.innerText="downloading..."),"string"==typeof a)return c(a,b,d);var g="application/octet-stream"===a.type,h=/constructor/i.test(f.HTMLElement)||f.safari,i=/CriOS\/[\d]+/.test(navigator.userAgent);if((i||g&&h)&&"object"==typeof FileReader){var j=new FileReader;j.onloadend=function(){var a=j.result;a=i?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),e?e.location.href=a:location=a,e=null},j.readAsDataURL(a)}else{var k=f.URL||f.webkitURL,l=k.createObjectURL(a);e?e.location=l:location.href=l,e=null,setTimeout(function(){k.revokeObjectURL(l)},4E4)}});f.saveAs=a.saveAs=a, true&&(module.exports=a)});
15
-
16
- //# sourceMappingURL=FileSaver.min.js.map
17
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
18
-
19
- /***/ }),
20
-
21
- /***/ "./node_modules/moment/locale sync recursive ^\\.\\/.*$":
22
- /*!**************************************************!*\
23
- !*** ./node_modules/moment/locale sync ^\.\/.*$ ***!
24
- \**************************************************/
25
- /*! no static exports found */
26
- /***/ (function(module, exports, __webpack_require__) {
27
-
28
- var map = {
29
- "./af": "./node_modules/moment/locale/af.js",
30
- "./af.js": "./node_modules/moment/locale/af.js",
31
- "./ar": "./node_modules/moment/locale/ar.js",
32
- "./ar-dz": "./node_modules/moment/locale/ar-dz.js",
33
- "./ar-dz.js": "./node_modules/moment/locale/ar-dz.js",
34
- "./ar-kw": "./node_modules/moment/locale/ar-kw.js",
35
- "./ar-kw.js": "./node_modules/moment/locale/ar-kw.js",
36
- "./ar-ly": "./node_modules/moment/locale/ar-ly.js",
37
- "./ar-ly.js": "./node_modules/moment/locale/ar-ly.js",
38
- "./ar-ma": "./node_modules/moment/locale/ar-ma.js",
39
- "./ar-ma.js": "./node_modules/moment/locale/ar-ma.js",
40
- "./ar-sa": "./node_modules/moment/locale/ar-sa.js",
41
- "./ar-sa.js": "./node_modules/moment/locale/ar-sa.js",
42
- "./ar-tn": "./node_modules/moment/locale/ar-tn.js",
43
- "./ar-tn.js": "./node_modules/moment/locale/ar-tn.js",
44
- "./ar.js": "./node_modules/moment/locale/ar.js",
45
- "./az": "./node_modules/moment/locale/az.js",
46
- "./az.js": "./node_modules/moment/locale/az.js",
47
- "./be": "./node_modules/moment/locale/be.js",
48
- "./be.js": "./node_modules/moment/locale/be.js",
49
- "./bg": "./node_modules/moment/locale/bg.js",
50
- "./bg.js": "./node_modules/moment/locale/bg.js",
51
- "./bm": "./node_modules/moment/locale/bm.js",
52
- "./bm.js": "./node_modules/moment/locale/bm.js",
53
- "./bn": "./node_modules/moment/locale/bn.js",
54
- "./bn.js": "./node_modules/moment/locale/bn.js",
55
- "./bo": "./node_modules/moment/locale/bo.js",
56
- "./bo.js": "./node_modules/moment/locale/bo.js",
57
- "./br": "./node_modules/moment/locale/br.js",
58
- "./br.js": "./node_modules/moment/locale/br.js",
59
- "./bs": "./node_modules/moment/locale/bs.js",
60
- "./bs.js": "./node_modules/moment/locale/bs.js",
61
- "./ca": "./node_modules/moment/locale/ca.js",
62
- "./ca.js": "./node_modules/moment/locale/ca.js",
63
- "./cs": "./node_modules/moment/locale/cs.js",
64
- "./cs.js": "./node_modules/moment/locale/cs.js",
65
- "./cv": "./node_modules/moment/locale/cv.js",
66
- "./cv.js": "./node_modules/moment/locale/cv.js",
67
- "./cy": "./node_modules/moment/locale/cy.js",
68
- "./cy.js": "./node_modules/moment/locale/cy.js",
69
- "./da": "./node_modules/moment/locale/da.js",
70
- "./da.js": "./node_modules/moment/locale/da.js",
71
- "./de": "./node_modules/moment/locale/de.js",
72
- "./de-at": "./node_modules/moment/locale/de-at.js",
73
- "./de-at.js": "./node_modules/moment/locale/de-at.js",
74
- "./de-ch": "./node_modules/moment/locale/de-ch.js",
75
- "./de-ch.js": "./node_modules/moment/locale/de-ch.js",
76
- "./de.js": "./node_modules/moment/locale/de.js",
77
- "./dv": "./node_modules/moment/locale/dv.js",
78
- "./dv.js": "./node_modules/moment/locale/dv.js",
79
- "./el": "./node_modules/moment/locale/el.js",
80
- "./el.js": "./node_modules/moment/locale/el.js",
81
- "./en-SG": "./node_modules/moment/locale/en-SG.js",
82
- "./en-SG.js": "./node_modules/moment/locale/en-SG.js",
83
- "./en-au": "./node_modules/moment/locale/en-au.js",
84
- "./en-au.js": "./node_modules/moment/locale/en-au.js",
85
- "./en-ca": "./node_modules/moment/locale/en-ca.js",
86
- "./en-ca.js": "./node_modules/moment/locale/en-ca.js",
87
- "./en-gb": "./node_modules/moment/locale/en-gb.js",
88
- "./en-gb.js": "./node_modules/moment/locale/en-gb.js",
89
- "./en-ie": "./node_modules/moment/locale/en-ie.js",
90
- "./en-ie.js": "./node_modules/moment/locale/en-ie.js",
91
- "./en-il": "./node_modules/moment/locale/en-il.js",
92
- "./en-il.js": "./node_modules/moment/locale/en-il.js",
93
- "./en-nz": "./node_modules/moment/locale/en-nz.js",
94
- "./en-nz.js": "./node_modules/moment/locale/en-nz.js",
95
- "./eo": "./node_modules/moment/locale/eo.js",
96
- "./eo.js": "./node_modules/moment/locale/eo.js",
97
- "./es": "./node_modules/moment/locale/es.js",
98
- "./es-do": "./node_modules/moment/locale/es-do.js",
99
- "./es-do.js": "./node_modules/moment/locale/es-do.js",
100
- "./es-us": "./node_modules/moment/locale/es-us.js",
101
- "./es-us.js": "./node_modules/moment/locale/es-us.js",
102
- "./es.js": "./node_modules/moment/locale/es.js",
103
- "./et": "./node_modules/moment/locale/et.js",
104
- "./et.js": "./node_modules/moment/locale/et.js",
105
- "./eu": "./node_modules/moment/locale/eu.js",
106
- "./eu.js": "./node_modules/moment/locale/eu.js",
107
- "./fa": "./node_modules/moment/locale/fa.js",
108
- "./fa.js": "./node_modules/moment/locale/fa.js",
109
- "./fi": "./node_modules/moment/locale/fi.js",
110
- "./fi.js": "./node_modules/moment/locale/fi.js",
111
- "./fo": "./node_modules/moment/locale/fo.js",
112
- "./fo.js": "./node_modules/moment/locale/fo.js",
113
- "./fr": "./node_modules/moment/locale/fr.js",
114
- "./fr-ca": "./node_modules/moment/locale/fr-ca.js",
115
- "./fr-ca.js": "./node_modules/moment/locale/fr-ca.js",
116
- "./fr-ch": "./node_modules/moment/locale/fr-ch.js",
117
- "./fr-ch.js": "./node_modules/moment/locale/fr-ch.js",
118
- "./fr.js": "./node_modules/moment/locale/fr.js",
119
- "./fy": "./node_modules/moment/locale/fy.js",
120
- "./fy.js": "./node_modules/moment/locale/fy.js",
121
- "./ga": "./node_modules/moment/locale/ga.js",
122
- "./ga.js": "./node_modules/moment/locale/ga.js",
123
- "./gd": "./node_modules/moment/locale/gd.js",
124
- "./gd.js": "./node_modules/moment/locale/gd.js",
125
- "./gl": "./node_modules/moment/locale/gl.js",
126
- "./gl.js": "./node_modules/moment/locale/gl.js",
127
- "./gom-latn": "./node_modules/moment/locale/gom-latn.js",
128
- "./gom-latn.js": "./node_modules/moment/locale/gom-latn.js",
129
- "./gu": "./node_modules/moment/locale/gu.js",
130
- "./gu.js": "./node_modules/moment/locale/gu.js",
131
- "./he": "./node_modules/moment/locale/he.js",
132
- "./he.js": "./node_modules/moment/locale/he.js",
133
- "./hi": "./node_modules/moment/locale/hi.js",
134
- "./hi.js": "./node_modules/moment/locale/hi.js",
135
- "./hr": "./node_modules/moment/locale/hr.js",
136
- "./hr.js": "./node_modules/moment/locale/hr.js",
137
- "./hu": "./node_modules/moment/locale/hu.js",
138
- "./hu.js": "./node_modules/moment/locale/hu.js",
139
- "./hy-am": "./node_modules/moment/locale/hy-am.js",
140
- "./hy-am.js": "./node_modules/moment/locale/hy-am.js",
141
- "./id": "./node_modules/moment/locale/id.js",
142
- "./id.js": "./node_modules/moment/locale/id.js",
143
- "./is": "./node_modules/moment/locale/is.js",
144
- "./is.js": "./node_modules/moment/locale/is.js",
145
- "./it": "./node_modules/moment/locale/it.js",
146
- "./it-ch": "./node_modules/moment/locale/it-ch.js",
147
- "./it-ch.js": "./node_modules/moment/locale/it-ch.js",
148
- "./it.js": "./node_modules/moment/locale/it.js",
149
- "./ja": "./node_modules/moment/locale/ja.js",
150
- "./ja.js": "./node_modules/moment/locale/ja.js",
151
- "./jv": "./node_modules/moment/locale/jv.js",
152
- "./jv.js": "./node_modules/moment/locale/jv.js",
153
- "./ka": "./node_modules/moment/locale/ka.js",
154
- "./ka.js": "./node_modules/moment/locale/ka.js",
155
- "./kk": "./node_modules/moment/locale/kk.js",
156
- "./kk.js": "./node_modules/moment/locale/kk.js",
157
- "./km": "./node_modules/moment/locale/km.js",
158
- "./km.js": "./node_modules/moment/locale/km.js",
159
- "./kn": "./node_modules/moment/locale/kn.js",
160
- "./kn.js": "./node_modules/moment/locale/kn.js",
161
- "./ko": "./node_modules/moment/locale/ko.js",
162
- "./ko.js": "./node_modules/moment/locale/ko.js",
163
- "./ku": "./node_modules/moment/locale/ku.js",
164
- "./ku.js": "./node_modules/moment/locale/ku.js",
165
- "./ky": "./node_modules/moment/locale/ky.js",
166
- "./ky.js": "./node_modules/moment/locale/ky.js",
167
- "./lb": "./node_modules/moment/locale/lb.js",
168
- "./lb.js": "./node_modules/moment/locale/lb.js",
169
- "./lo": "./node_modules/moment/locale/lo.js",
170
- "./lo.js": "./node_modules/moment/locale/lo.js",
171
- "./lt": "./node_modules/moment/locale/lt.js",
172
- "./lt.js": "./node_modules/moment/locale/lt.js",
173
- "./lv": "./node_modules/moment/locale/lv.js",
174
- "./lv.js": "./node_modules/moment/locale/lv.js",
175
- "./me": "./node_modules/moment/locale/me.js",
176
- "./me.js": "./node_modules/moment/locale/me.js",
177
- "./mi": "./node_modules/moment/locale/mi.js",
178
- "./mi.js": "./node_modules/moment/locale/mi.js",
179
- "./mk": "./node_modules/moment/locale/mk.js",
180
- "./mk.js": "./node_modules/moment/locale/mk.js",
181
- "./ml": "./node_modules/moment/locale/ml.js",
182
- "./ml.js": "./node_modules/moment/locale/ml.js",
183
- "./mn": "./node_modules/moment/locale/mn.js",
184
- "./mn.js": "./node_modules/moment/locale/mn.js",
185
- "./mr": "./node_modules/moment/locale/mr.js",
186
- "./mr.js": "./node_modules/moment/locale/mr.js",
187
- "./ms": "./node_modules/moment/locale/ms.js",
188
- "./ms-my": "./node_modules/moment/locale/ms-my.js",
189
- "./ms-my.js": "./node_modules/moment/locale/ms-my.js",
190
- "./ms.js": "./node_modules/moment/locale/ms.js",
191
- "./mt": "./node_modules/moment/locale/mt.js",
192
- "./mt.js": "./node_modules/moment/locale/mt.js",
193
- "./my": "./node_modules/moment/locale/my.js",
194
- "./my.js": "./node_modules/moment/locale/my.js",
195
- "./nb": "./node_modules/moment/locale/nb.js",
196
- "./nb.js": "./node_modules/moment/locale/nb.js",
197
- "./ne": "./node_modules/moment/locale/ne.js",
198
- "./ne.js": "./node_modules/moment/locale/ne.js",
199
- "./nl": "./node_modules/moment/locale/nl.js",
200
- "./nl-be": "./node_modules/moment/locale/nl-be.js",
201
- "./nl-be.js": "./node_modules/moment/locale/nl-be.js",
202
- "./nl.js": "./node_modules/moment/locale/nl.js",
203
- "./nn": "./node_modules/moment/locale/nn.js",
204
- "./nn.js": "./node_modules/moment/locale/nn.js",
205
- "./pa-in": "./node_modules/moment/locale/pa-in.js",
206
- "./pa-in.js": "./node_modules/moment/locale/pa-in.js",
207
- "./pl": "./node_modules/moment/locale/pl.js",
208
- "./pl.js": "./node_modules/moment/locale/pl.js",
209
- "./pt": "./node_modules/moment/locale/pt.js",
210
- "./pt-br": "./node_modules/moment/locale/pt-br.js",
211
- "./pt-br.js": "./node_modules/moment/locale/pt-br.js",
212
- "./pt.js": "./node_modules/moment/locale/pt.js",
213
- "./ro": "./node_modules/moment/locale/ro.js",
214
- "./ro.js": "./node_modules/moment/locale/ro.js",
215
- "./ru": "./node_modules/moment/locale/ru.js",
216
- "./ru.js": "./node_modules/moment/locale/ru.js",
217
- "./sd": "./node_modules/moment/locale/sd.js",
218
- "./sd.js": "./node_modules/moment/locale/sd.js",
219
- "./se": "./node_modules/moment/locale/se.js",
220
- "./se.js": "./node_modules/moment/locale/se.js",
221
- "./si": "./node_modules/moment/locale/si.js",
222
- "./si.js": "./node_modules/moment/locale/si.js",
223
- "./sk": "./node_modules/moment/locale/sk.js",
224
- "./sk.js": "./node_modules/moment/locale/sk.js",
225
- "./sl": "./node_modules/moment/locale/sl.js",
226
- "./sl.js": "./node_modules/moment/locale/sl.js",
227
- "./sq": "./node_modules/moment/locale/sq.js",
228
- "./sq.js": "./node_modules/moment/locale/sq.js",
229
- "./sr": "./node_modules/moment/locale/sr.js",
230
- "./sr-cyrl": "./node_modules/moment/locale/sr-cyrl.js",
231
- "./sr-cyrl.js": "./node_modules/moment/locale/sr-cyrl.js",
232
- "./sr.js": "./node_modules/moment/locale/sr.js",
233
- "./ss": "./node_modules/moment/locale/ss.js",
234
- "./ss.js": "./node_modules/moment/locale/ss.js",
235
- "./sv": "./node_modules/moment/locale/sv.js",
236
- "./sv.js": "./node_modules/moment/locale/sv.js",
237
- "./sw": "./node_modules/moment/locale/sw.js",
238
- "./sw.js": "./node_modules/moment/locale/sw.js",
239
- "./ta": "./node_modules/moment/locale/ta.js",
240
- "./ta.js": "./node_modules/moment/locale/ta.js",
241
- "./te": "./node_modules/moment/locale/te.js",
242
- "./te.js": "./node_modules/moment/locale/te.js",
243
- "./tet": "./node_modules/moment/locale/tet.js",
244
- "./tet.js": "./node_modules/moment/locale/tet.js",
245
- "./tg": "./node_modules/moment/locale/tg.js",
246
- "./tg.js": "./node_modules/moment/locale/tg.js",
247
- "./th": "./node_modules/moment/locale/th.js",
248
- "./th.js": "./node_modules/moment/locale/th.js",
249
- "./tl-ph": "./node_modules/moment/locale/tl-ph.js",
250
- "./tl-ph.js": "./node_modules/moment/locale/tl-ph.js",
251
- "./tlh": "./node_modules/moment/locale/tlh.js",
252
- "./tlh.js": "./node_modules/moment/locale/tlh.js",
253
- "./tr": "./node_modules/moment/locale/tr.js",
254
- "./tr.js": "./node_modules/moment/locale/tr.js",
255
- "./tzl": "./node_modules/moment/locale/tzl.js",
256
- "./tzl.js": "./node_modules/moment/locale/tzl.js",
257
- "./tzm": "./node_modules/moment/locale/tzm.js",
258
- "./tzm-latn": "./node_modules/moment/locale/tzm-latn.js",
259
- "./tzm-latn.js": "./node_modules/moment/locale/tzm-latn.js",
260
- "./tzm.js": "./node_modules/moment/locale/tzm.js",
261
- "./ug-cn": "./node_modules/moment/locale/ug-cn.js",
262
- "./ug-cn.js": "./node_modules/moment/locale/ug-cn.js",
263
- "./uk": "./node_modules/moment/locale/uk.js",
264
- "./uk.js": "./node_modules/moment/locale/uk.js",
265
- "./ur": "./node_modules/moment/locale/ur.js",
266
- "./ur.js": "./node_modules/moment/locale/ur.js",
267
- "./uz": "./node_modules/moment/locale/uz.js",
268
- "./uz-latn": "./node_modules/moment/locale/uz-latn.js",
269
- "./uz-latn.js": "./node_modules/moment/locale/uz-latn.js",
270
- "./uz.js": "./node_modules/moment/locale/uz.js",
271
- "./vi": "./node_modules/moment/locale/vi.js",
272
- "./vi.js": "./node_modules/moment/locale/vi.js",
273
- "./x-pseudo": "./node_modules/moment/locale/x-pseudo.js",
274
- "./x-pseudo.js": "./node_modules/moment/locale/x-pseudo.js",
275
- "./yo": "./node_modules/moment/locale/yo.js",
276
- "./yo.js": "./node_modules/moment/locale/yo.js",
277
- "./zh-cn": "./node_modules/moment/locale/zh-cn.js",
278
- "./zh-cn.js": "./node_modules/moment/locale/zh-cn.js",
279
- "./zh-hk": "./node_modules/moment/locale/zh-hk.js",
280
- "./zh-hk.js": "./node_modules/moment/locale/zh-hk.js",
281
- "./zh-tw": "./node_modules/moment/locale/zh-tw.js",
282
- "./zh-tw.js": "./node_modules/moment/locale/zh-tw.js"
283
- };
284
-
285
-
286
- function webpackContext(req) {
287
- var id = webpackContextResolve(req);
288
- return __webpack_require__(id);
289
- }
290
- function webpackContextResolve(req) {
291
- if(!__webpack_require__.o(map, req)) {
292
- var e = new Error("Cannot find module '" + req + "'");
293
- e.code = 'MODULE_NOT_FOUND';
294
- throw e;
295
- }
296
- return map[req];
297
- }
298
- webpackContext.keys = function webpackContextKeys() {
299
- return Object.keys(map);
300
- };
301
- webpackContext.resolve = webpackContextResolve;
302
- module.exports = webpackContext;
303
- webpackContext.id = "./node_modules/moment/locale sync recursive ^\\.\\/.*$";
304
-
305
- /***/ }),
306
-
307
- /***/ "./node_modules/webpack/buildin/global.js":
308
- /*!***********************************!*\
309
- !*** (webpack)/buildin/global.js ***!
310
- \***********************************/
311
- /*! no static exports found */
312
- /***/ (function(module, exports) {
313
-
314
- var g;
315
-
316
- // This works in non-strict mode
317
- g = (function() {
318
- return this;
319
- })();
320
-
321
- try {
322
- // This works if eval is allowed (see CSP)
323
- g = g || new Function("return this")();
324
- } catch (e) {
325
- // This works if the window reference is available
326
- if (typeof window === "object") g = window;
327
- }
328
-
329
- // g can still be undefined, but nothing to do about it...
330
- // We return undefined, instead of nothing here, so it's
331
- // easier to handle this case. if(!global) { ...}
332
-
333
- module.exports = g;
334
-
335
-
336
- /***/ }),
337
-
338
- /***/ "./src/data/command-history.js":
339
- /*!*************************************!*\
340
- !*** ./src/data/command-history.js ***!
341
- \*************************************/
342
- /*! exports provided: CommandHistory */
343
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
344
-
345
- "use strict";
346
- __webpack_require__.r(__webpack_exports__);
347
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CommandHistory", function() { return CommandHistory; });
348
- class CommandHistory
349
- {
350
- constructor(size = 100)
351
- {
352
- this._size = size;
353
-
354
- this.clear();
355
- this._loadState();
356
- }
357
-
358
- addCommand(cmd)
359
- {
360
- if (this._history.length >= this._size)
361
- this._history.splice(0, 1);
362
-
363
- this._history.push(cmd);
364
- this._pos = this._history.length;
365
- this._tempCmd = '';
366
-
367
- this._saveState();
368
- }
369
-
370
- addTempCommand(cmd)
371
- {
372
- this._tempCmd = cmd;
373
- this._pos = this._history.length;
374
- }
375
-
376
- rewind()
377
- {
378
- if (this._pos > 0)
379
- this._pos--;
380
-
381
- return this._history[this._pos];
382
- }
383
-
384
- forward()
385
- {
386
- if (this._pos < this._history.length)
387
- this._pos++;
388
-
389
- if (this._pos <= this._history.length - 1)
390
- return this._history[this._pos];
391
- else
392
- return this._tempCmd;
393
- }
394
-
395
- getList()
396
- {
397
- return this._history;
398
- }
399
-
400
- getSize()
401
- {
402
- return this._history.length
403
- }
404
-
405
- clear()
406
- {
407
- this._history = [];
408
- this._pos = 0;
409
- this._tempCmd = '';
410
- }
411
-
412
- _saveState()
413
- {
414
- Cookies.set('console-history', {
415
- history: this._history
416
- }, {expires: 36000});
417
- }
418
-
419
- _loadState()
420
- {
421
- let data = Cookies.getJSON('console-history')
422
-
423
- if (data)
424
- {
425
- this._history = data.history;
426
- this._pos = this._history.length;
427
- }
428
- }
429
- }
430
-
431
-
432
- /***/ }),
433
-
434
- /***/ "./src/modules/console.js":
435
- /*!********************************!*\
436
- !*** ./src/modules/console.js ***!
437
- \********************************/
4
+ /***/ "./src/modules/cluster-configurator.js":
5
+ /*!*********************************************!*\
6
+ !*** ./src/modules/cluster-configurator.js ***!
7
+ \*********************************************/
438
8
  /*! exports provided: default */
439
9
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
440
10
 
441
11
  "use strict";
442
12
  __webpack_require__.r(__webpack_exports__);
443
- /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Console; });
13
+ /* WEBPACK VAR INJECTION */(function($) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ClusterConfigurator; });
444
14
  /* harmony import */ var _base_module__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base-module */ "./src/modules/base-module.js");
445
- /* harmony import */ var _data_command_history__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data/command-history */ "./src/data/command-history.js");
446
- /* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! file-saver */ "./node_modules/file-saver/dist/FileSaver.min.js");
447
- /* harmony import */ var file_saver__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(file_saver__WEBPACK_IMPORTED_MODULE_2__);
448
- /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js");
449
- /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_3__);
450
- /* harmony import */ var _utils_utilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/utilities */ "./src/utils/utilities.js");
451
-
452
-
15
+ /* harmony import */ var _utils_uibuilder_config_interface_builder__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/uibuilder/config-interface-builder */ "./src/utils/uibuilder/config-interface-builder.js");
453
16
 
454
17
 
455
18
 
456
-
457
- class Console extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
19
+ class ClusterConfigurator extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
458
20
  {
459
21
  constructor()
460
22
  {
461
- super('console');
23
+ super('clusterConfig');
462
24
 
463
25
  // Outgoing requests
464
- this.REQ_CMD = 'cmd';
465
- this.REQ_HINT = 'hint';
466
- this.REQ_SCRIPT = 'script';
26
+ this.REQ_GET_CONFIG = 'getConfig';
27
+ this.REQ_UPDATE_CONFIG = 'updConfig';
467
28
 
468
29
  // Incoming responses
469
- this.RES_CMD = 'cmd';
470
- this.RES_HINT = 'hint';
471
- this.RES_SCRIPT = 'script';
472
- this.RES_ERROR_LOCKED = 'locked';
473
-
474
- this.VERSION = '3.0.0';
475
- this.TOKENS = ['=', 'from ', 'import '];
476
-
477
- this.TRANSCRIPT_TEMPLATE = `
478
- <html>
479
- <head>
480
- <title>SFS2X ADMIN CONSOLE Session Transcript</title>
481
- <style type='text/css' media='screen'>
482
- body, pre {
483
- background-color: #333;
484
- font-size: .8rem;
485
- font-family: Monaco,'Courier New', monospace;
486
- }
487
-
488
- h3 {
489
- color: #f8f9fa;
490
- }
491
-
492
- pre {
493
- white-space: pre-wrap;
494
- -moz-tab-size: 5;
495
- tab-size: 5;
496
- }
497
-
498
- .text-console {
499
- color: #28F32D;
500
- }
501
-
502
- .text-error {
503
- color: #dc3545;
504
- }
505
-
506
- .text-highlight {
507
- color: #ffc107;
508
- }
509
-
510
- .text-command {
511
- color: #f8f9fa;
512
- }
513
- </style>
514
- </head>
515
- <body>
516
- <h3><!--HEADER--></h3>
517
- <pre><!--TRANSCRIPT--></pre>
518
- </body>
519
- </html>
520
- `;
521
-
522
- this._cmdHistory = new _data_command_history__WEBPACK_IMPORTED_MODULE_1__["CommandHistory"]();
30
+ this.RESP_CONFIG = 'config';
31
+ this.RESP_CONFIG_UPDATE_CONFIRM = 'configUpdate';
523
32
  }
524
33
 
525
34
  //------------------------------------
526
35
  // COMMON MODULE INTERFACE METHODS
527
36
  // This members are used by the main controller
528
37
  // to communicate with the module's controller.
38
+ // This methods override those in BaseModule class.
529
39
  //------------------------------------
530
40
 
531
41
  initialize(idData, shellController)
@@ -533,58 +43,28 @@ class Console extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
533
43
  // Call super method
534
44
  super.initialize(idData, shellController);
535
45
 
536
- $('#cns-input').on('keyup', $.proxy(this.onInputKeyUp, this));
537
- $('#cns-input').on('keydown', $.proxy(this.onInputKeyDown, this));
538
-
539
- // Show welcome message
540
- this._showWelcomeMessage();
541
-
542
- // Focus on prompt input
543
- $('#cns-input').focus();
46
+ // Initialize progress bar
47
+ $('#clc-progressBar').kendoProgressBar({
48
+ min: 0,
49
+ max: 100,
50
+ value: false,
51
+ type: 'value',
52
+ animation: {
53
+ duration: 400
54
+ }
55
+ });
544
56
 
545
- // Add global click listener to close hint panel
546
- $(this).on('click', $.proxy(this._onGenericClick, this));
57
+ // Create interface builder instance
58
+ this._interfaceBuilder = new _utils_uibuilder_config_interface_builder__WEBPACK_IMPORTED_MODULE_1__["ConfigInterfaceBuilder"]();
547
59
 
548
- // Add global window resize listener to close hint panel
549
- $(window).on('resize', $.proxy(this._onGenericClick, this));
60
+ // Add listener to interface buttons
61
+ $('#clc-reloadButton').on('click', $.proxy(this._onReloadClick, this));
62
+ $('#clc-submitButton').on('click', $.proxy(this._onSubmitClick, this));
550
63
 
551
- // Add buttons click listeners
552
- $('#cns-clearButton').on('click', $.proxy(this._onClearConsoleClick, this));
553
- $('#cns-runButton').on('click', $.proxy(this._onRunScriptClick, this));
554
- $('#cns-exportButton').on('click', $.proxy(this._onExportSessionClick, this));
64
+ //-----------------------------------*/
555
65
 
556
- // Initialize "upload script" modal
557
- this._uploadScriptModal = $('#cns-uploadModal');
558
- this._uploadScriptModal.modal({
559
- backdrop: 'static',
560
- keyboard: false,
561
- show: false
562
- });
563
-
564
- // Initialize kendo uploader
565
- this._uploader = $('#cns-uploader').kendoUpload({
566
- allowedExtensions: ['.py'],
567
- multiple: false,
568
- template: function(dataItem) {
569
- dataItem.bytesToSize = _utils_utilities__WEBPACK_IMPORTED_MODULE_4__["bytesToSize"]; // Pass bytesToSize utility function to template
570
- return kendo.template(`
571
- <span class='k-progress w-100'></span>
572
- <span class="">
573
- <span class="k-file-name" title="#=name#">#=name#</span>
574
- <span class="k-file-size">Size: #=bytesToSize(size, 1, 'Bytes')#</span>
575
- </span>
576
- `)(dataItem);
577
- },
578
- localization: {
579
- select: 'Select file...'
580
- }
581
- }).data('kendoUpload');
582
-
583
- // Add listener to modal hide event
584
- this._uploadScriptModal.on('hidden.bs.modal', $.proxy(this._onUploadScriptrModalHidden, this));
585
-
586
- // Add listener to modal button
587
- $('#cns-uploadScriptButton').on('click', $.proxy(this._onUploadScriptrButtonCLick, this));
66
+ // Request configuration data to server instance
67
+ this.sendExtensionRequest(this.REQ_GET_CONFIG);
588
68
  }
589
69
 
590
70
  destroy()
@@ -592,525 +72,157 @@ class Console extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
592
72
  // Call super method
593
73
  super.destroy();
594
74
 
595
- $('#cns-clearButton').off('click');
596
- $('#cns-runButton').off('click');
597
- $('#cns-exportButton').off('click');
598
- $('#cns-uploadScriptButton').off('click');
599
-
600
- $(this).off('click');
601
- $(window).off('resize');
75
+ // Remove interface buttons click listeners
76
+ $('#clc-reloadButton').off('click');
77
+ $('#clc-submitButton').off('click');
602
78
 
603
- this._uploadScriptModal.off('hidden.bs.modal');
604
- this._uploadScriptModal.modal('dispose');
79
+ // Clear tabs container
80
+ this._clearTabs();
605
81
  }
606
82
 
607
83
  onExtensionCommand(command, data)
608
84
  {
609
- if (command == this.RES_CMD || command == this.RES_SCRIPT)
610
- {
611
- const result = data.getUtfString('r');
612
- const error = data.getUtfString('e');
613
-
614
- if (result != null)
615
- this._writeConsole(result);
616
- else if (error != null)
617
- this._writeConsole(`<span class="text-error">ERROR</span> ${this._parseHtml(error)}`);
618
- }
619
-
620
- else if (command == this.RES_HINT)
85
+ // Cluster configuration data received
86
+ if (command == this.RESP_CONFIG)
621
87
  {
622
- this._lastHints = data.getUtfStringArray('h');
88
+ // Build user interface based on received data
89
+ this._interfaceBuilder.buildInterface(data.getSFSArray('settings'), 'clc-tabNavigator', false);
623
90
 
624
- this._showHintPanel();
625
- }
626
-
627
- else if (command == this.RES_ERROR_LOCKED)
628
- {
629
- this._writeConsole(`<span class="text-error">ERROR</span> <span class="text-highlight">Console module is locked from server side. Please follow the instructions you were given to unlock it.</span>`);
630
- }
631
- }
632
-
633
- //---------------------------------
634
- // UI EVENT LISTENERS
635
- //---------------------------------
636
-
637
- onInputKeyDown(e)
638
- {
639
- // Save previous input value
640
- this._prevInput = $('#cns-input').val();
641
-
642
- const keyName = e.key;
643
-
644
- if (keyName == 'ArrowUp' || keyName == 'ArrowDown' || keyName == 'Tab')
645
- {
646
- e.preventDefault();
647
- }
648
- }
649
-
650
- onInputKeyUp(e)
651
- {
652
- const keyName = e.key;
653
- const input = $('#cns-input').val();
654
-
655
- // Copy input to dummy
656
- $('#cns-input-dummy').html(input);
657
-
658
- //--- DOT (CODE HINTING) -----------------------------------------------
659
- if (keyName == '.')
660
- {
661
- // Close hint panel if open
662
- if (this._isHintPanelOpen)
663
- this._closeHintPanel();
664
-
665
- // Request code hints
666
- this._requestHints(input);
667
- }
668
-
669
- //--- ENTER ------------------------------------------------------------
670
- else if (keyName == 'Enter' && input.length > 0)
671
- {
672
- // Get selected hint
673
- if (this._isHintPanelOpen)
674
- {
675
- this._setInputOnHintSelected();
676
- }
677
- else
678
- {
679
- // Send command to server
680
- let sfso = new SFS2X.SFSObject();
681
- sfso.putUtfString('c', input);
682
- this.sendExtensionRequest(this.REQ_CMD, sfso);
683
-
684
- // Write command to console
685
- this._writeConsole(input, true);
686
-
687
- // Clear hints
688
- this._lastHints = null;
689
-
690
- // Clear input
691
- this._clearInput();
692
-
693
- // Add command to history
694
- this._cmdHistory.addCommand(input);
695
- }
696
- }
697
-
698
- //--- ENTER ------------------------------------------------------------
699
- else if (keyName == 'Tab')
700
- {
701
- // Get selected hint
702
- if (this._isHintPanelOpen)
703
- {
704
- if (this._hintPanel.find('.hint-item.selected').length > 0)
705
- this._setInputOnHintSelected();
706
- }
707
- }
708
-
709
- //--- CTRL+BACKSPACE (CLEAR CONSOLE) -----------------------------------
710
- else if (e.ctrlKey && keyName == 'Backspace')
711
- {
712
- this._onClearConsoleClick();
713
- }
91
+ // Enable buttons
92
+ this._enableButtons(true);
714
93
 
715
- //--- BACKSPACE ------------------------------------------------------
716
- else if (keyName == 'Backspace')
717
- {
718
- // Check the deleted char
719
- if (this._prevInput.substring(this._prevInput.length - 1) == '.')
94
+ // Initialize TabNavigator-ralated widgets
95
+ if (!this._tabNavInitialized)
720
96
  {
721
- // Reset hinting
722
- this._resetHinting(input);
97
+ // Enable scrolling tabs
98
+ $('#clc-tabNavigator > #tabs').scrollingTabs({
99
+ bootstrapVersion: 4,
100
+ scrollToTabEdge: true,
101
+ enableSwiping: true,
102
+ disableScrollArrowsOnFullyScrolled: true,
103
+ cssClassLeftArrow: 'fa fa-chevron-left',
104
+ cssClassRightArrow: 'fa fa-chevron-right'
105
+ });
106
+
107
+ this._tabNavInitialized = true;
723
108
  }
724
109
 
725
- // Update hint panel if open
726
- if (this._isHintPanelOpen)
727
- this._updateHintPanel();
728
- }
110
+ // Run validation (to remove validation messages if data was reloaded)
111
+ this._interfaceBuilder.checkIsValid();
729
112
 
730
- //--- ESC (CLEAR) ------------------------------------------------------
731
- else if (keyName == 'Escape')
732
- {
733
- // Close hint panel if open
734
- if (this._isHintPanelOpen)
735
- this._closeHintPanel();
736
-
737
- else
738
- {
739
- // Clear hints
740
- this._lastHints = null;
741
-
742
- // Clear input
743
- this._clearInput();
744
- }
113
+ this._switchView('clc-main');
745
114
  }
746
115
 
747
- //--- ARROW UP ---------------------------------------------------------
748
- else if (keyName == 'ArrowUp')
116
+ // Cluster configuration update confirmation
117
+ else if (command == this.RESP_CONFIG_UPDATE_CONFIRM)
749
118
  {
750
- // If hint panel is open, set selection
751
- if (this._isHintPanelOpen)
752
- {
753
- this._currHintFocus--;
119
+ // Enable buttons
120
+ this._enableButtons(true);
754
121
 
755
- this._setHintItemSelected();
756
- }
122
+ // Enable form items
123
+ this._interfaceBuilder.disableInterface(false);
757
124
 
758
- // Browse history
759
- else
760
- {
761
- this._setInputOnHistorySelected(this._cmdHistory.rewind());
762
- }
763
- }
125
+ // If the current user is the updater, show a notification
126
+ // Otherwise, show a dialog box suggesting to reload
127
+ let updater = data.getUtfString('user');
764
128
 
765
- //--- ARROW DOWN -------------------------------------------------------
766
- else if (keyName == 'ArrowDown')
767
- {
768
- // If hint panel is open, set selection
769
- if (this._isHintPanelOpen)
129
+ if (updater == this.smartFox.mySelf.name)
770
130
  {
771
- this._currHintFocus++;
131
+ // Reset the 'modified' flag
132
+ this._interfaceBuilder.resetIsModified();
772
133
 
773
- this._setHintItemSelected();
134
+ // Display notification
135
+ this.shellCtrl.showNotification('Cluster settings updated', 'Immediate changes (<i class="fas fa-bolt"></i>) have been applied; all other changes will be active after next server restart');
774
136
  }
775
-
776
- // Browse history
777
137
  else
778
138
  {
779
- this._setInputOnHistorySelected(this._cmdHistory.forward());
780
- }
781
- }
782
-
783
- //--- ARROW LEFT & RIGHT -----------------------------------------------
784
- else if (keyName == 'ArrowLeft' || keyName == 'ArrowRight')
785
- {
786
- // Close hint panel if open
787
- if (this._isHintPanelOpen)
788
- this._closeHintPanel();
789
- }
790
-
791
- //--- ANY OTHER KEY ----------------------------------------------------
792
- else
793
- {
794
- // Update temp in command history
795
- this._cmdHistory.addTempCommand(input);
796
-
797
- if (input.length == $('#cns-input')[0].selectionEnd)
798
- {
799
- // Update hint panel if open
800
- if (this._isHintPanelOpen)
801
- this._updateHintPanel();
139
+ // Show alert
140
+ this.shellCtrl.showSimpleAlert(`Administrator ${updater} has modified the cluster settings; please reload to update your view.`);
802
141
 
803
- // Show hint panel
804
- else
805
- this._showHintPanel();
806
- }
807
- else
808
- {
809
- // Reset hinting
810
- this._resetHinting(input);
142
+ // Disable submit button
143
+ $('#clc-submitButton').attr('disabled', true);
811
144
  }
812
145
  }
813
146
  }
814
147
 
815
- _onClearConsoleClick()
816
- {
817
- $('#cns-console').empty();
818
- }
819
-
820
- _onHintItemClick(e)
821
- {
822
- e.preventDefault();
823
-
824
- // Set clicked item as selected
825
- e.currentTarget.classList.add('selected');
826
-
827
- // Set input value
828
- this._setInputOnHintSelected();
829
-
830
- // Focus on prompt input
831
- $('#cns-input').focus();
832
- }
833
-
834
- _onGenericClick()
835
- {
836
- // Close hint panel if open
837
- if (this._isHintPanelOpen)
838
- this._closeHintPanel();
839
- }
840
-
841
- _onExportSessionClick()
842
- {
843
- let date = moment__WEBPACK_IMPORTED_MODULE_3__();
844
-
845
- let transcript = this.TRANSCRIPT_TEMPLATE.replace('<!--HEADER-->', `Saved on ${date.format('dddd, MMMM Do YYYY, HH:mm:ss')}`);
846
- transcript = transcript.replace('<!--TRANSCRIPT-->', $('#cns-console').html());
847
-
848
- let blob = new Blob([transcript], {type: 'text/html;charset=utf-8'});
849
-
850
- file_saver__WEBPACK_IMPORTED_MODULE_2__["saveAs"](blob, `ConsoleSession_${date.format('YYYYMMDD_HHmmss')}.html`);
851
- }
852
-
853
- _onRunScriptClick()
854
- {
855
- // Open modal
856
- this._uploadScriptModal.modal('show');
857
- }
858
-
859
- _onUploadScriptrModalHidden()
860
- {
861
- // Clear uploader
862
- this._uploader.clearAllFiles();
863
- }
864
-
865
- _onUploadScriptrButtonCLick()
866
- {
867
- if (this._uploader.getFiles().length > 0)
868
- {
869
- let file = this._uploader.getFiles()[0].rawFile;
870
-
871
- file.arrayBuffer().then(buffer => {
872
- this._writeConsole(`EXEC: ${file.name}`, true);
873
-
874
- let sfso = new SFS2X.SFSObject();
875
- sfso.putByteArray('script', new Uint8Array(buffer));
876
-
877
- this.sendExtensionRequest(this.REQ_SCRIPT, sfso);
878
- });
879
-
880
- // Close modal
881
- this._uploadScriptModal.modal('hide');
882
- }
883
- }
884
-
885
148
  //------------------------------------
886
149
  // PRIVATE METHODS
887
150
  //------------------------------------
888
151
 
889
- _showWelcomeMessage()
890
- {
891
- this._writeConsole(`--------------------------------------\nADMIN_CONSOLE, version ${this.VERSION}\n--------------------------------------\nType help() for assistance.\n`, false, false);
892
- }
893
-
894
- _clearInput()
152
+ _enableButtons(enabled)
895
153
  {
896
- $('#cns-input').val('');
897
- $('#cns-input-dummy').html('');
154
+ $('#clc-reloadButton').attr('disabled', !enabled);
155
+ $('#clc-submitButton').attr('disabled', !enabled);
156
+ $('#clc-backupCheck').attr('disabled', !enabled);
898
157
  }
899
158
 
900
- _setInputOnHintSelected()
159
+ _switchView(viewId)
901
160
  {
902
- if (this._hintPanel)
903
- {
904
- const input = $('#cns-input').val();
905
- const selectedVal = this._hintPanel.find('.hint-item.selected input').val();
906
- const newInput = input.substring(0, input.lastIndexOf('.')) + '.' + selectedVal;
907
-
908
- $('#cns-input').val(newInput);
909
- $('#cns-input-dummy').html(newInput);
910
-
911
- this._closeHintPanel();
912
- }
161
+ document.getElementById('clc-viewstack').selectedElement = document.getElementById(viewId);
913
162
  }
914
163
 
915
- _setInputOnHistorySelected(command)
164
+ _clearTabs()
916
165
  {
917
- $('#cns-input').val(command);
918
- $('#cns-input-dummy').html(command);
919
- }
920
-
921
- _writeConsole(txt, isInput = false, linebreak = true)
922
- {
923
- let msg;
924
-
925
- if (isInput)
926
- msg = `<span class="text-command">&gt; ${txt}</span>`;
927
- else
928
- msg = `<span class="text-console">${txt}</span>`;
166
+ // Destroy scrolling tabs
167
+ $('#clc-tabNavigator #tabs').scrollingTabs('destroy');
929
168
 
930
- if (linebreak)
931
- msg = `\n${msg}`;
932
-
933
- // Append text to console
934
- $('#cns-console').append(msg);
935
-
936
- // scroll console to bottom
937
- $('#cns-console').scrollTop(function() { return this.scrollHeight; });
169
+ // Remove all tab navigator content
170
+ this._interfaceBuilder.destroyInterface();
938
171
  }
939
172
 
940
- _parseHtml(ss)
173
+ _onReloadClick()
941
174
  {
942
- ss = ss.replace('<', '&lt;');
943
- ss = ss.replace('>', '&gt;');
944
-
945
- return ss;
946
- }
175
+ // Disable buttons
176
+ this._enableButtons(false);
947
177
 
948
- _showHintPanel()
949
- {
950
- if (this._lastHints != null && this._lastHints.length > 0)
951
- {
952
- this._currHintFocus = -1;
178
+ // Switch to loading view
179
+ this._switchView('clc-loading');
953
180
 
954
- // Create panel
955
- this._hintPanel = $('<div>', {'class': 'hint-panel'});
956
- $(this).append(this._hintPanel);
181
+ // Hide validation messages
182
+ this._interfaceBuilder.resetValidation();
957
183
 
958
- // Show hints
959
- this._updateHintPanel();
960
- }
184
+ // Request configuration data to server instance
185
+ this.sendExtensionRequest(this.REQ_GET_CONFIG);
961
186
  }
962
187
 
963
- _closeHintPanel()
188
+ _onSubmitClick()
964
189
  {
965
- this._hintPanel.remove();
966
- this._hintPanel = null;
967
- }
968
-
969
- _updateHintPanel()
970
- {
971
- if (this._lastHints != null && this._lastHints.length > 0)
190
+ // Check validity
191
+ if (this._interfaceBuilder.checkIsValid())
972
192
  {
973
- // Clear hints panel
974
- this._hintPanel.empty();
975
-
976
- const dotIndex = $('#cns-input').val().lastIndexOf('.');
977
- let lastWord = '';
978
-
979
- if (dotIndex > -1)
980
- lastWord = $('#cns-input').val().substr(dotIndex + 1, $('#cns-input').val().length);
981
-
982
- let isEmpty = true;
983
-
984
- for (let word of this._lastHints)
985
- {
986
- // Check if the item starts with the same letters as the input's last word
987
- if (lastWord == '' || word.substr(0, lastWord.length).toUpperCase() == lastWord.toUpperCase())
988
- {
989
- // Create div
990
- let item = $('<div>', {'class': 'hint-item'});
991
-
992
- // Show value, and make the matching letters bold
993
- item.append(`<strong>${word.substr(0, lastWord.length)}</strong>${word.substr(lastWord.length)}`);
193
+ let changes = this._interfaceBuilder.getChangedData();
994
194
 
995
- // Insert an input field that will hold the current item's value
996
- item.append(`<input type="hidden" value="${word}">`);
997
-
998
- // Add click listener
999
- item.on('click', $.proxy(this._onHintItemClick, this));
1000
-
1001
- this._hintPanel.append(item);
1002
-
1003
- isEmpty = false;
1004
- }
1005
- }
1006
-
1007
- // If panel is empty, rmove it
1008
- if (isEmpty)
1009
- this._closeHintPanel();
1010
-
1011
- // Else set panel position
1012
- else
195
+ if (changes.size() > 0)
1013
196
  {
1014
- const extContPos = $('#cns-input-container-2').position();
1015
- const intContPos = $('#cns-input-container-1').position();
197
+ // Disable buttons
198
+ this._enableButtons(false);
1016
199
 
1017
- let left = extContPos.left + intContPos.left + $('#cns-input-dummy').outerWidth();
1018
- let top = extContPos.top + intContPos.top - this._hintPanel.outerHeight();
200
+ // Disable form items
201
+ this._interfaceBuilder.disableInterface(true);
1019
202
 
1020
- if (left > window.innerWidth - this._hintPanel.outerWidth())
1021
- left = window.innerWidth - this._hintPanel.outerWidth();
203
+ // Send updated settings to server instance
204
+ let params = new SFS2X.SFSObject();
205
+ params.putSFSArray('settings', changes);
206
+ params.putBool('backup', $('#clc-backupCheck').prop('checked'));
1022
207
 
1023
- this._hintPanel.css({top: top, left: left, position: 'absolute'});
208
+ this.sendExtensionRequest(this.REQ_UPDATE_CONFIG, params);
1024
209
  }
1025
210
  }
211
+ else
212
+ this.shellCtrl.showSimpleAlert('Unable to submit configuration changes due to an invalid value; please verify the highlighted form fields in all tabs.', true);
1026
213
  }
1027
214
 
1028
- _requestHints(input)
1029
- {
1030
- // Clear previous hints
1031
- this._lastHints = null;
1032
-
1033
- // Parse input
1034
- let hintParent = this._extractHintParent(input);
1035
-
1036
- // Request code hint
1037
- let params = new SFS2X.SFSObject();
1038
- params.putUtfString('c', hintParent);
1039
-
1040
- this.sendExtensionRequest(this.REQ_HINT, params);
1041
- }
1042
-
1043
- _extractHintParent(inVal)
1044
- {
1045
- let outVal = null;
1046
-
1047
- for (let tok of this.TOKENS)
1048
- {
1049
- const p = inVal.indexOf(tok);
1050
-
1051
- if (p > -1)
1052
- {
1053
- outVal = inVal.substring(p + tok.length, inVal.length).trim();
1054
- break;
1055
- }
1056
- }
1057
-
1058
- if (outVal == null)
1059
- outVal = inVal;
1060
-
1061
- // Remove dot at the end if needed
1062
- if (outVal.endsWith('.'))
1063
- outVal = outVal.substr(0, outVal.length - 1);
1064
-
1065
- return outVal;
1066
- }
1067
-
1068
- _setHintItemSelected()
1069
- {
1070
- let items = this._hintPanel.find('.hint-item');
1071
- items.removeClass('selected');
1072
-
1073
- if (this._currHintFocus >= items.length)
1074
- this._currHintFocus = 0;
1075
-
1076
- if (this._currHintFocus < 0)
1077
- this._currHintFocus = items.length - 1;
1078
-
1079
- let item = items.eq(this._currHintFocus);
1080
- item.addClass('selected');
1081
-
1082
- // Scroll to item
1083
- this._hintPanel.scrollTop(this._hintPanel.scrollTop() + item.position().top);
1084
- }
1085
-
1086
- _resetHinting(input)
215
+ _updateConfigFormItemDisplayedValue(configParamName, newValue)
1087
216
  {
1088
- // Close hint panel
1089
- if (this._isHintPanelOpen)
1090
- this._closeHintPanel();
217
+ // Get the relevant Configuration Form Item
218
+ const configFormItem = this._interfaceBuilder.getConfigFormItem(configParamName);
1091
219
 
1092
- // Clear hints
1093
- this._lastHints = null;
220
+ // Update Configuration Parameter associated with the Configuration Form Item
221
+ configFormItem.data.value = newValue;
222
+ configFormItem.data.resetIsModified(); // This is needed to avoid the Configuration Parameter to flagged as 'changed'
1094
223
 
1095
- // Get previous word
1096
- const dotIndex = input.lastIndexOf('.');
1097
-
1098
- if (dotIndex > -1)
1099
- {
1100
- let value = input.substring(0, dotIndex);
1101
-
1102
- // Request code hints
1103
- this._requestHints(value);
1104
- }
1105
- }
1106
-
1107
- //---------------------------------
1108
- // PRIVATE GETTERS
1109
- //---------------------------------
1110
-
1111
- get _isHintPanelOpen()
1112
- {
1113
- return this._hintPanel != null;
224
+ // Display the new value of the Configuration Form Item
225
+ configFormItem._setWidgetValue(); // Display the new value in the config form item
1114
226
  }
1115
227
  }
1116
228
 
@@ -1119,4 +231,4 @@ class Console extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
1119
231
  /***/ })
1120
232
 
1121
233
  }]);
1122
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtNC5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL25vZGVfbW9kdWxlcy9maWxlLXNhdmVyL2Rpc3QvRmlsZVNhdmVyLm1pbi5qcyIsIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvZGF0YS9jb21tYW5kLWhpc3RvcnkuanMiLCJ3ZWJwYWNrOi8vYXBwbGljYXRpb24vLi9zcmMvbW9kdWxlcy9jb25zb2xlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbihhLGIpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sYik7ZWxzZSBpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgZXhwb3J0cyliKCk7ZWxzZXtiKCksYS5GaWxlU2F2ZXI9e2V4cG9ydHM6e319LmV4cG9ydHN9fSkodGhpcyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoYSxiKXtyZXR1cm5cInVuZGVmaW5lZFwiPT10eXBlb2YgYj9iPXthdXRvQm9tOiExfTpcIm9iamVjdFwiIT10eXBlb2YgYiYmKGNvbnNvbGUud2FybihcIkRlcHJlY2F0ZWQ6IEV4cGVjdGVkIHRoaXJkIGFyZ3VtZW50IHRvIGJlIGEgb2JqZWN0XCIpLGI9e2F1dG9Cb206IWJ9KSxiLmF1dG9Cb20mJi9eXFxzKig/OnRleHRcXC9cXFMqfGFwcGxpY2F0aW9uXFwveG1sfFxcUypcXC9cXFMqXFwreG1sKVxccyo7LipjaGFyc2V0XFxzKj1cXHMqdXRmLTgvaS50ZXN0KGEudHlwZSk/bmV3IEJsb2IoW1wiXFx1RkVGRlwiLGFdLHt0eXBlOmEudHlwZX0pOmF9ZnVuY3Rpb24gYyhiLGMsZCl7dmFyIGU9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub3BlbihcIkdFVFwiLGIpLGUucmVzcG9uc2VUeXBlPVwiYmxvYlwiLGUub25sb2FkPWZ1bmN0aW9uKCl7YShlLnJlc3BvbnNlLGMsZCl9LGUub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoXCJjb3VsZCBub3QgZG93bmxvYWQgZmlsZVwiKX0sZS5zZW5kKCl9ZnVuY3Rpb24gZChhKXt2YXIgYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yi5vcGVuKFwiSEVBRFwiLGEsITEpO3RyeXtiLnNlbmQoKX1jYXRjaChhKXt9cmV0dXJuIDIwMDw9Yi5zdGF0dXMmJjI5OT49Yi5zdGF0dXN9ZnVuY3Rpb24gZShhKXt0cnl7YS5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KFwiY2xpY2tcIikpfWNhdGNoKGMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiTW91c2VFdmVudHNcIik7Yi5pbml0TW91c2VFdmVudChcImNsaWNrXCIsITAsITAsd2luZG93LDAsMCwwLDgwLDIwLCExLCExLCExLCExLDAsbnVsbCksYS5kaXNwYXRjaEV2ZW50KGIpfX12YXIgZj1cIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cud2luZG93PT09d2luZG93P3dpbmRvdzpcIm9iamVjdFwiPT10eXBlb2Ygc2VsZiYmc2VsZi5zZWxmPT09c2VsZj9zZWxmOlwib2JqZWN0XCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbC5nbG9iYWw9PT1nbG9iYWw/Z2xvYmFsOnZvaWQgMCxhPWYuc2F2ZUFzfHwoXCJvYmplY3RcIiE9dHlwZW9mIHdpbmRvd3x8d2luZG93IT09Zj9mdW5jdGlvbigpe306XCJkb3dubG9hZFwiaW4gSFRNTEFuY2hvckVsZW1lbnQucHJvdG90eXBlP2Z1bmN0aW9uKGIsZyxoKXt2YXIgaT1mLlVSTHx8Zi53ZWJraXRVUkwsaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtnPWd8fGIubmFtZXx8XCJkb3dubG9hZFwiLGouZG93bmxvYWQ9ZyxqLnJlbD1cIm5vb3BlbmVyXCIsXCJzdHJpbmdcIj09dHlwZW9mIGI/KGouaHJlZj1iLGoub3JpZ2luPT09bG9jYXRpb24ub3JpZ2luP2Uoaik6ZChqLmhyZWYpP2MoYixnLGgpOmUoaixqLnRhcmdldD1cIl9ibGFua1wiKSk6KGouaHJlZj1pLmNyZWF0ZU9iamVjdFVSTChiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5yZXZva2VPYmplY3RVUkwoai5ocmVmKX0sNEU0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShqKX0sMCkpfTpcIm1zU2F2ZU9yT3BlbkJsb2JcImluIG5hdmlnYXRvcj9mdW5jdGlvbihmLGcsaCl7aWYoZz1nfHxmLm5hbWV8fFwiZG93bmxvYWRcIixcInN0cmluZ1wiIT10eXBlb2YgZiluYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihiKGYsaCksZyk7ZWxzZSBpZihkKGYpKWMoZixnLGgpO2Vsc2V7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7aS5ocmVmPWYsaS50YXJnZXQ9XCJfYmxhbmtcIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShpKX0pfX06ZnVuY3Rpb24oYSxiLGQsZSl7aWYoZT1lfHxvcGVuKFwiXCIsXCJfYmxhbmtcIiksZSYmKGUuZG9jdW1lbnQudGl0bGU9ZS5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD1cImRvd25sb2FkaW5nLi4uXCIpLFwic3RyaW5nXCI9PXR5cGVvZiBhKXJldHVybiBjKGEsYixkKTt2YXIgZz1cImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiPT09YS50eXBlLGg9L2NvbnN0cnVjdG9yL2kudGVzdChmLkhUTUxFbGVtZW50KXx8Zi5zYWZhcmksaT0vQ3JpT1NcXC9bXFxkXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoKGl8fGcmJmgpJiZcIm9iamVjdFwiPT10eXBlb2YgRmlsZVJlYWRlcil7dmFyIGo9bmV3IEZpbGVSZWFkZXI7ai5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgYT1qLnJlc3VsdDthPWk/YTphLnJlcGxhY2UoL15kYXRhOlteO10qOy8sXCJkYXRhOmF0dGFjaG1lbnQvZmlsZTtcIiksZT9lLmxvY2F0aW9uLmhyZWY9YTpsb2NhdGlvbj1hLGU9bnVsbH0sai5yZWFkQXNEYXRhVVJMKGEpfWVsc2V7dmFyIGs9Zi5VUkx8fGYud2Via2l0VVJMLGw9ay5jcmVhdGVPYmplY3RVUkwoYSk7ZT9lLmxvY2F0aW9uPWw6bG9jYXRpb24uaHJlZj1sLGU9bnVsbCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ay5yZXZva2VPYmplY3RVUkwobCl9LDRFNCl9fSk7Zi5zYXZlQXM9YS5zYXZlQXM9YSxcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlJiYobW9kdWxlLmV4cG9ydHM9YSl9KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZVNhdmVyLm1pbi5qcy5tYXAiLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJleHBvcnQgY2xhc3MgQ29tbWFuZEhpc3Rvcnlcbntcblx0Y29uc3RydWN0b3Ioc2l6ZSA9IDEwMClcblx0e1xuXHRcdHRoaXMuX3NpemUgPSBzaXplO1xuXG5cdFx0dGhpcy5jbGVhcigpO1xuXHRcdHRoaXMuX2xvYWRTdGF0ZSgpO1xuXHR9XG5cblx0YWRkQ29tbWFuZChjbWQpXG5cdHtcblx0XHRpZiAodGhpcy5faGlzdG9yeS5sZW5ndGggPj0gdGhpcy5fc2l6ZSlcblx0XHRcdHRoaXMuX2hpc3Rvcnkuc3BsaWNlKDAsIDEpO1xuXG5cdFx0dGhpcy5faGlzdG9yeS5wdXNoKGNtZCk7XG5cdFx0dGhpcy5fcG9zID0gdGhpcy5faGlzdG9yeS5sZW5ndGg7XG5cdFx0dGhpcy5fdGVtcENtZCA9ICcnO1xuXG5cdFx0dGhpcy5fc2F2ZVN0YXRlKCk7XG5cdH1cblxuXHRhZGRUZW1wQ29tbWFuZChjbWQpXG5cdHtcblx0XHR0aGlzLl90ZW1wQ21kID0gY21kO1xuXHRcdHRoaXMuX3BvcyA9IHRoaXMuX2hpc3RvcnkubGVuZ3RoO1xuXHR9XG5cblx0cmV3aW5kKClcblx0e1xuXHRcdGlmICh0aGlzLl9wb3MgPiAwKVxuXHRcdFx0dGhpcy5fcG9zLS07XG5cblx0XHRyZXR1cm4gdGhpcy5faGlzdG9yeVt0aGlzLl9wb3NdO1xuXHR9XG5cblx0Zm9yd2FyZCgpXG5cdHtcblx0XHRpZiAodGhpcy5fcG9zIDwgdGhpcy5faGlzdG9yeS5sZW5ndGgpXG5cdFx0XHR0aGlzLl9wb3MrKztcblxuXHRcdGlmICh0aGlzLl9wb3MgPD0gdGhpcy5faGlzdG9yeS5sZW5ndGggLSAxKVxuXHRcdFx0cmV0dXJuIHRoaXMuX2hpc3RvcnlbdGhpcy5fcG9zXTtcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gdGhpcy5fdGVtcENtZDtcblx0fVxuXG5cdGdldExpc3QoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2hpc3Rvcnk7XG5cdH1cblxuXHRnZXRTaXplKClcblx0e1xuXHRcdHJldHVybiB0aGlzLl9oaXN0b3J5Lmxlbmd0aFxuXHR9XG5cblx0Y2xlYXIoKVxuXHR7XG5cdFx0dGhpcy5faGlzdG9yeSA9IFtdO1xuXHRcdHRoaXMuX3BvcyA9IDA7XG5cdFx0dGhpcy5fdGVtcENtZCA9ICcnO1xuXHR9XG5cblx0X3NhdmVTdGF0ZSgpXG5cdHtcblx0XHRDb29raWVzLnNldCgnY29uc29sZS1oaXN0b3J5Jywge1xuXHRcdFx0aGlzdG9yeTogdGhpcy5faGlzdG9yeVxuXHRcdH0sIHtleHBpcmVzOiAzNjAwMH0pO1xuXHR9XG5cblx0X2xvYWRTdGF0ZSgpXG5cdHtcblx0XHRsZXQgZGF0YSA9IENvb2tpZXMuZ2V0SlNPTignY29uc29sZS1oaXN0b3J5JylcblxuXHRcdGlmIChkYXRhKVxuXHRcdHtcblx0XHRcdHRoaXMuX2hpc3RvcnkgPSBkYXRhLmhpc3Rvcnk7XG5cdFx0XHR0aGlzLl9wb3MgPSB0aGlzLl9oaXN0b3J5Lmxlbmd0aDtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0NvbW1hbmRIaXN0b3J5fSBmcm9tICcuLi9kYXRhL2NvbW1hbmQtaGlzdG9yeSc7XG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7Ynl0ZXNUb1NpemV9IGZyb20gJy4uL3V0aWxzL3V0aWxpdGllcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnNvbGUgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2NvbnNvbGUnKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfQ01EID0gJ2NtZCc7XG5cdFx0dGhpcy5SRVFfSElOVCA9ICdoaW50Jztcblx0XHR0aGlzLlJFUV9TQ1JJUFQgPSAnc2NyaXB0JztcblxuXHRcdC8vIEluY29taW5nIHJlc3BvbnNlc1xuXHRcdHRoaXMuUkVTX0NNRCA9ICdjbWQnO1xuXHRcdHRoaXMuUkVTX0hJTlQgPSAnaGludCc7XG5cdFx0dGhpcy5SRVNfU0NSSVBUID0gJ3NjcmlwdCc7XG5cdFx0dGhpcy5SRVNfRVJST1JfTE9DS0VEID0gJ2xvY2tlZCc7XG5cblx0XHR0aGlzLlZFUlNJT04gPSAnMy4wLjAnO1xuXHRcdHRoaXMuVE9LRU5TID0gWyc9JywgJ2Zyb20gJywgJ2ltcG9ydCAnXTtcblxuXHRcdHRoaXMuVFJBTlNDUklQVF9URU1QTEFURSA9IGBcblx0XHQ8aHRtbD5cblx0XHQ8aGVhZD5cblx0XHRcdDx0aXRsZT5TRlMyWCBBRE1JTiBDT05TT0xFIFNlc3Npb24gVHJhbnNjcmlwdDwvdGl0bGU+XG5cdFx0XHQ8c3R5bGUgdHlwZT0ndGV4dC9jc3MnIG1lZGlhPSdzY3JlZW4nPlxuXHRcdFx0XHRib2R5LCBwcmUge1xuXHRcdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICMzMzM7XG5cdFx0XHRcdFx0Zm9udC1zaXplOiAuOHJlbTtcblx0XHRcdFx0XHRmb250LWZhbWlseTogTW9uYWNvLCdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGgzIHtcblx0XHRcdFx0XHRjb2xvcjogI2Y4ZjlmYTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHByZSB7XG5cdFx0XHRcdFx0d2hpdGUtc3BhY2U6IHByZS13cmFwO1xuXHRcdFx0XHRcdC1tb3otdGFiLXNpemU6IDU7XG5cdFx0XHRcdFx0dGFiLXNpemU6IDU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQudGV4dC1jb25zb2xlIHtcblx0XHRcdFx0XHRjb2xvcjogIzI4RjMyRDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC50ZXh0LWVycm9yIHtcblx0XHRcdFx0XHRjb2xvcjogI2RjMzU0NTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC50ZXh0LWhpZ2hsaWdodCB7XG5cdFx0XHRcdFx0Y29sb3I6ICNmZmMxMDc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQudGV4dC1jb21tYW5kIHtcblx0XHRcdFx0XHRjb2xvcjogI2Y4ZjlmYTtcblx0XHRcdFx0fVxuXHRcdFx0PC9zdHlsZT5cblx0XHQ8L2hlYWQ+XG5cdFx0PGJvZHk+XG5cdFx0XHQ8aDM+PCEtLUhFQURFUi0tPjwvaDM+XG5cdFx0XHQ8cHJlPjwhLS1UUkFOU0NSSVBULS0+PC9wcmU+XG5cdFx0PC9ib2R5PlxuXHRcdDwvaHRtbD5cblx0XHRgO1xuXG5cdFx0dGhpcy5fY21kSGlzdG9yeSA9IG5ldyBDb21tYW5kSGlzdG9yeSgpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmluaXRpYWxpemUoaWREYXRhLCBzaGVsbENvbnRyb2xsZXIpO1xuXG5cdFx0JCgnI2Nucy1pbnB1dCcpLm9uKCdrZXl1cCcsICQucHJveHkodGhpcy5vbklucHV0S2V5VXAsIHRoaXMpKTtcblx0XHQkKCcjY25zLWlucHV0Jykub24oJ2tleWRvd24nLCAkLnByb3h5KHRoaXMub25JbnB1dEtleURvd24sIHRoaXMpKTtcblxuXHRcdC8vIFNob3cgd2VsY29tZSBtZXNzYWdlXG5cdFx0dGhpcy5fc2hvd1dlbGNvbWVNZXNzYWdlKCk7XG5cblx0XHQvLyBGb2N1cyBvbiBwcm9tcHQgaW5wdXRcblx0XHQkKCcjY25zLWlucHV0JykuZm9jdXMoKTtcblxuXHRcdC8vIEFkZCBnbG9iYWwgY2xpY2sgbGlzdGVuZXIgdG8gY2xvc2UgaGludCBwYW5lbFxuXHRcdCQodGhpcykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkdlbmVyaWNDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gQWRkIGdsb2JhbCB3aW5kb3cgcmVzaXplIGxpc3RlbmVyIHRvIGNsb3NlIGhpbnQgcGFuZWxcblx0XHQkKHdpbmRvdykub24oJ3Jlc2l6ZScsICQucHJveHkodGhpcy5fb25HZW5lcmljQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEFkZCBidXR0b25zIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyNjbnMtY2xlYXJCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQ2xlYXJDb25zb2xlQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjY25zLXJ1bkJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SdW5TY3JpcHRDbGljaywgdGhpcykpO1xuXHRcdCQoJyNjbnMtZXhwb3J0QnV0dG9uJykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkV4cG9ydFNlc3Npb25DbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBcInVwbG9hZCBzY3JpcHRcIiBtb2RhbFxuXHRcdHRoaXMuX3VwbG9hZFNjcmlwdE1vZGFsID0gJCgnI2Nucy11cGxvYWRNb2RhbCcpO1xuXHRcdHRoaXMuX3VwbG9hZFNjcmlwdE1vZGFsLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlXG5cdFx0fSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHVwbG9hZGVyXG5cdFx0dGhpcy5fdXBsb2FkZXIgPSAkKCcjY25zLXVwbG9hZGVyJykua2VuZG9VcGxvYWQoe1xuXHRcdFx0YWxsb3dlZEV4dGVuc2lvbnM6IFsnLnB5J10sXG5cdFx0XHRtdWx0aXBsZTogZmFsc2UsXG5cdFx0XHR0ZW1wbGF0ZTogZnVuY3Rpb24oZGF0YUl0ZW0pIHtcblx0XHRcdFx0ZGF0YUl0ZW0uYnl0ZXNUb1NpemUgPSBieXRlc1RvU2l6ZTsgLy8gUGFzcyBieXRlc1RvU2l6ZSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHRlbXBsYXRlXG5cdFx0XHRcdHJldHVybiBrZW5kby50ZW1wbGF0ZShgXG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9J2stcHJvZ3Jlc3Mgdy0xMDAnPjwvc3Bhbj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIlwiPlxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJrLWZpbGUtbmFtZVwiIHRpdGxlPVwiIz1uYW1lI1wiPiM9bmFtZSM8L3NwYW4+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImstZmlsZS1zaXplXCI+U2l6ZTogIz1ieXRlc1RvU2l6ZShzaXplLCAxLCAnQnl0ZXMnKSM8L3NwYW4+XG5cdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRgKShkYXRhSXRlbSk7XG5cdFx0XHR9LFxuXHQgICAgICAgIGxvY2FsaXphdGlvbjoge1xuXHQgICAgICAgICAgICBzZWxlY3Q6ICdTZWxlY3QgZmlsZS4uLidcblx0ICAgICAgICB9XG5cdFx0fSkuZGF0YSgna2VuZG9VcGxvYWQnKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtb2RhbCBoaWRlIGV2ZW50XG5cdFx0dGhpcy5fdXBsb2FkU2NyaXB0TW9kYWwub24oJ2hpZGRlbi5icy5tb2RhbCcsICQucHJveHkodGhpcy5fb25VcGxvYWRTY3JpcHRyTW9kYWxIaWRkZW4sIHRoaXMpKTtcblxuXHRcdC8vIEFkZCBsaXN0ZW5lciB0byBtb2RhbCBidXR0b25cblx0XHQkKCcjY25zLXVwbG9hZFNjcmlwdEJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25VcGxvYWRTY3JpcHRyQnV0dG9uQ0xpY2ssIHRoaXMpKTtcblx0fVxuXG5cdGRlc3Ryb3koKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5kZXN0cm95KCk7XG5cblx0XHQkKCcjY25zLWNsZWFyQnV0dG9uJykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNjbnMtcnVuQnV0dG9uJykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNjbnMtZXhwb3J0QnV0dG9uJykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNjbnMtdXBsb2FkU2NyaXB0QnV0dG9uJykub2ZmKCdjbGljaycpO1xuXG5cdFx0JCh0aGlzKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCh3aW5kb3cpLm9mZigncmVzaXplJyk7XG5cblx0XHR0aGlzLl91cGxvYWRTY3JpcHRNb2RhbC5vZmYoJ2hpZGRlbi5icy5tb2RhbCcpO1xuXHRcdHRoaXMuX3VwbG9hZFNjcmlwdE1vZGFsLm1vZGFsKCdkaXNwb3NlJyk7XG5cdH1cblxuXHRvbkV4dGVuc2lvbkNvbW1hbmQoY29tbWFuZCwgZGF0YSlcblx0e1xuXHRcdGlmIChjb21tYW5kID09IHRoaXMuUkVTX0NNRCB8fCBjb21tYW5kID09IHRoaXMuUkVTX1NDUklQVClcblx0XHR7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBkYXRhLmdldFV0ZlN0cmluZygncicpO1xuXHRcdFx0Y29uc3QgZXJyb3IgPSBkYXRhLmdldFV0ZlN0cmluZygnZScpO1xuXG5cdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpXG5cdFx0XHRcdHRoaXMuX3dyaXRlQ29uc29sZShyZXN1bHQpO1xuXHRcdFx0ZWxzZSBpZiAoZXJyb3IgIT0gbnVsbClcblx0XHRcdFx0dGhpcy5fd3JpdGVDb25zb2xlKGA8c3BhbiBjbGFzcz1cInRleHQtZXJyb3JcIj5FUlJPUjwvc3Bhbj4gJHt0aGlzLl9wYXJzZUh0bWwoZXJyb3IpfWApO1xuXHRcdH1cblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNfSElOVClcblx0XHR7XG5cdFx0XHR0aGlzLl9sYXN0SGludHMgPSBkYXRhLmdldFV0ZlN0cmluZ0FycmF5KCdoJyk7XG5cblx0XHRcdHRoaXMuX3Nob3dIaW50UGFuZWwoKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTX0VSUk9SX0xPQ0tFRClcblx0XHR7XG5cdFx0XHR0aGlzLl93cml0ZUNvbnNvbGUoYDxzcGFuIGNsYXNzPVwidGV4dC1lcnJvclwiPkVSUk9SPC9zcGFuPiA8c3BhbiBjbGFzcz1cInRleHQtaGlnaGxpZ2h0XCI+Q29uc29sZSBtb2R1bGUgaXMgbG9ja2VkIGZyb20gc2VydmVyIHNpZGUuIFBsZWFzZSBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB5b3Ugd2VyZSBnaXZlbiB0byB1bmxvY2sgaXQuPC9zcGFuPmApO1xuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIEVWRU5UIExJU1RFTkVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdG9uSW5wdXRLZXlEb3duKGUpXG5cdHtcblx0XHQvLyBTYXZlIHByZXZpb3VzIGlucHV0IHZhbHVlXG5cdFx0dGhpcy5fcHJldklucHV0ID0gJCgnI2Nucy1pbnB1dCcpLnZhbCgpO1xuXG5cdFx0Y29uc3Qga2V5TmFtZSA9IGUua2V5O1xuXG5cdFx0aWYgKGtleU5hbWUgPT0gJ0Fycm93VXAnIHx8IGtleU5hbWUgPT0gJ0Fycm93RG93bicgfHwga2V5TmFtZSA9PSAnVGFiJylcblx0XHR7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9XG5cblx0b25JbnB1dEtleVVwKGUpXG5cdHtcblx0XHRjb25zdCBrZXlOYW1lID0gZS5rZXk7XG5cdFx0Y29uc3QgaW5wdXQgPSAkKCcjY25zLWlucHV0JykudmFsKCk7XG5cblx0XHQvLyBDb3B5IGlucHV0IHRvIGR1bW15XG5cdFx0JCgnI2Nucy1pbnB1dC1kdW1teScpLmh0bWwoaW5wdXQpO1xuXG5cdFx0Ly8tLS0gRE9UIChDT0RFIEhJTlRJTkcpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0aWYgKGtleU5hbWUgPT0gJy4nKVxuXHRcdHtcblx0XHRcdC8vIENsb3NlIGhpbnQgcGFuZWwgaWYgb3BlblxuXHRcdFx0aWYgKHRoaXMuX2lzSGludFBhbmVsT3Blbilcblx0XHRcdFx0dGhpcy5fY2xvc2VIaW50UGFuZWwoKTtcblxuXHRcdFx0Ly8gUmVxdWVzdCBjb2RlIGhpbnRzXG5cdFx0XHR0aGlzLl9yZXF1ZXN0SGludHMoaW5wdXQpO1xuXHRcdH1cblxuXHRcdC8vLS0tIEVOVEVSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdGVsc2UgaWZcdChrZXlOYW1lID09ICdFbnRlcicgJiYgaW5wdXQubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHQvLyBHZXQgc2VsZWN0ZWQgaGludFxuXHRcdFx0aWYgKHRoaXMuX2lzSGludFBhbmVsT3Blbilcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fc2V0SW5wdXRPbkhpbnRTZWxlY3RlZCgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTZW5kIGNvbW1hbmQgdG8gc2VydmVyXG5cdFx0XHRcdGxldCBzZnNvID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0XHRzZnNvLnB1dFV0ZlN0cmluZygnYycsIGlucHV0KTtcblx0XHRcdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9DTUQsIHNmc28pO1xuXG5cdFx0XHRcdC8vIFdyaXRlIGNvbW1hbmQgdG8gY29uc29sZVxuXHRcdFx0XHR0aGlzLl93cml0ZUNvbnNvbGUoaW5wdXQsIHRydWUpO1xuXG5cdFx0XHRcdC8vIENsZWFyIGhpbnRzXG5cdFx0XHRcdHRoaXMuX2xhc3RIaW50cyA9IG51bGw7XG5cblx0XHRcdFx0Ly8gQ2xlYXIgaW5wdXRcblx0XHRcdFx0dGhpcy5fY2xlYXJJbnB1dCgpO1xuXG5cdFx0XHRcdC8vIEFkZCBjb21tYW5kIHRvIGhpc3Rvcnlcblx0XHRcdFx0dGhpcy5fY21kSGlzdG9yeS5hZGRDb21tYW5kKGlucHV0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLy0tLSBFTlRFUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHRlbHNlIGlmXHQoa2V5TmFtZSA9PSAnVGFiJylcblx0XHR7XG5cdFx0XHQvLyBHZXQgc2VsZWN0ZWQgaGludFxuXHRcdFx0aWYgKHRoaXMuX2lzSGludFBhbmVsT3Blbilcblx0XHRcdHtcblx0XHRcdFx0aWYgKHRoaXMuX2hpbnRQYW5lbC5maW5kKCcuaGludC1pdGVtLnNlbGVjdGVkJykubGVuZ3RoID4gMClcblx0XHRcdFx0XHR0aGlzLl9zZXRJbnB1dE9uSGludFNlbGVjdGVkKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8tLS0gQ1RSTCtCQUNLU1BBQ0UgKENMRUFSIENPTlNPTEUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0ZWxzZSBpZiAoZS5jdHJsS2V5ICYmIGtleU5hbWUgPT0gJ0JhY2tzcGFjZScpXG5cdFx0e1xuXHRcdFx0dGhpcy5fb25DbGVhckNvbnNvbGVDbGljaygpO1xuXHRcdH1cblxuXHRcdC8vLS0tIEJBQ0tTUEFDRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHRlbHNlIGlmIChrZXlOYW1lID09ICdCYWNrc3BhY2UnKVxuXHRcdHtcblx0XHRcdC8vIENoZWNrIHRoZSBkZWxldGVkIGNoYXJcblx0XHRcdGlmICh0aGlzLl9wcmV2SW5wdXQuc3Vic3RyaW5nKHRoaXMuX3ByZXZJbnB1dC5sZW5ndGggLSAxKSA9PSAnLicpXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFJlc2V0IGhpbnRpbmdcblx0XHRcdFx0dGhpcy5fcmVzZXRIaW50aW5nKGlucHV0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIGhpbnQgcGFuZWwgaWYgb3BlblxuXHRcdFx0aWYgKHRoaXMuX2lzSGludFBhbmVsT3Blbilcblx0XHRcdFx0dGhpcy5fdXBkYXRlSGludFBhbmVsKCk7XG5cdFx0fVxuXG5cdFx0Ly8tLS0gRVNDIChDTEVBUikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0ZWxzZSBpZiAoa2V5TmFtZSA9PSAnRXNjYXBlJylcblx0XHR7XG5cdFx0XHQvLyBDbG9zZSBoaW50IHBhbmVsIGlmIG9wZW5cblx0XHRcdGlmICh0aGlzLl9pc0hpbnRQYW5lbE9wZW4pXG5cdFx0XHRcdHRoaXMuX2Nsb3NlSGludFBhbmVsKCk7XG5cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gQ2xlYXIgaGludHNcblx0XHRcdFx0dGhpcy5fbGFzdEhpbnRzID0gbnVsbDtcblxuXHRcdFx0XHQvLyBDbGVhciBpbnB1dFxuXHRcdFx0XHR0aGlzLl9jbGVhcklucHV0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8tLS0gQVJST1cgVVAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0ZWxzZSBpZiAoa2V5TmFtZSA9PSAnQXJyb3dVcCcpXG5cdFx0e1xuXHRcdFx0Ly8gSWYgaGludCBwYW5lbCBpcyBvcGVuLCBzZXQgc2VsZWN0aW9uXG5cdFx0XHRpZiAodGhpcy5faXNIaW50UGFuZWxPcGVuKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl9jdXJySGludEZvY3VzLS07XG5cblx0XHRcdFx0dGhpcy5fc2V0SGludEl0ZW1TZWxlY3RlZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCcm93c2UgaGlzdG9yeVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl9zZXRJbnB1dE9uSGlzdG9yeVNlbGVjdGVkKHRoaXMuX2NtZEhpc3RvcnkucmV3aW5kKCkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vLS0tIEFSUk9XIERPV04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdGVsc2UgaWYgKGtleU5hbWUgPT0gJ0Fycm93RG93bicpXG5cdFx0e1xuXHRcdFx0Ly8gSWYgaGludCBwYW5lbCBpcyBvcGVuLCBzZXQgc2VsZWN0aW9uXG5cdFx0XHRpZiAodGhpcy5faXNIaW50UGFuZWxPcGVuKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl9jdXJySGludEZvY3VzKys7XG5cblx0XHRcdFx0dGhpcy5fc2V0SGludEl0ZW1TZWxlY3RlZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCcm93c2UgaGlzdG9yeVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl9zZXRJbnB1dE9uSGlzdG9yeVNlbGVjdGVkKHRoaXMuX2NtZEhpc3RvcnkuZm9yd2FyZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLy0tLSBBUlJPVyBMRUZUICYgUklHSFQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHRlbHNlIGlmIChrZXlOYW1lID09ICdBcnJvd0xlZnQnIHx8IGtleU5hbWUgPT0gJ0Fycm93UmlnaHQnKVxuXHRcdHtcblx0XHRcdC8vIENsb3NlIGhpbnQgcGFuZWwgaWYgb3BlblxuXHRcdFx0aWYgKHRoaXMuX2lzSGludFBhbmVsT3Blbilcblx0XHRcdFx0dGhpcy5fY2xvc2VIaW50UGFuZWwoKTtcblx0XHR9XG5cblx0XHQvLy0tLSBBTlkgT1RIRVIgS0VZIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0Ly8gVXBkYXRlIHRlbXAgaW4gY29tbWFuZCBoaXN0b3J5XG5cdFx0XHR0aGlzLl9jbWRIaXN0b3J5LmFkZFRlbXBDb21tYW5kKGlucHV0KTtcblxuXHRcdFx0aWYgKGlucHV0Lmxlbmd0aCA9PSAkKCcjY25zLWlucHV0JylbMF0uc2VsZWN0aW9uRW5kKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBVcGRhdGUgaGludCBwYW5lbCBpZiBvcGVuXG5cdFx0XHRcdGlmICh0aGlzLl9pc0hpbnRQYW5lbE9wZW4pXG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlSGludFBhbmVsKCk7XG5cblx0XHRcdFx0Ly8gU2hvdyBoaW50IHBhbmVsXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLl9zaG93SGludFBhbmVsKCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFJlc2V0IGhpbnRpbmdcblx0XHRcdFx0dGhpcy5fcmVzZXRIaW50aW5nKGlucHV0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfb25DbGVhckNvbnNvbGVDbGljaygpXG5cdHtcblx0XHQkKCcjY25zLWNvbnNvbGUnKS5lbXB0eSgpO1xuXHR9XG5cblx0X29uSGludEl0ZW1DbGljayhlKVxuXHR7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Ly8gU2V0IGNsaWNrZWQgaXRlbSBhcyBzZWxlY3RlZFxuXHRcdGUuY3VycmVudFRhcmdldC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xuXG5cdFx0Ly8gU2V0IGlucHV0IHZhbHVlXG5cdFx0dGhpcy5fc2V0SW5wdXRPbkhpbnRTZWxlY3RlZCgpO1xuXG5cdFx0Ly8gRm9jdXMgb24gcHJvbXB0IGlucHV0XG5cdFx0JCgnI2Nucy1pbnB1dCcpLmZvY3VzKCk7XG5cdH1cblxuXHRfb25HZW5lcmljQ2xpY2soKVxuXHR7XG5cdFx0Ly8gQ2xvc2UgaGludCBwYW5lbCBpZiBvcGVuXG5cdFx0aWYgKHRoaXMuX2lzSGludFBhbmVsT3Blbilcblx0XHRcdHRoaXMuX2Nsb3NlSGludFBhbmVsKCk7XG5cdH1cblxuXHRfb25FeHBvcnRTZXNzaW9uQ2xpY2soKVxuXHR7XG5cdFx0bGV0IGRhdGUgPSBtb21lbnQoKTtcblxuXHRcdGxldCB0cmFuc2NyaXB0ID0gdGhpcy5UUkFOU0NSSVBUX1RFTVBMQVRFLnJlcGxhY2UoJzwhLS1IRUFERVItLT4nLCBgU2F2ZWQgb24gJHtkYXRlLmZvcm1hdCgnZGRkZCwgTU1NTSBEbyBZWVlZLCBISDptbTpzcycpfWApO1xuXHRcdHRyYW5zY3JpcHQgPSB0cmFuc2NyaXB0LnJlcGxhY2UoJzwhLS1UUkFOU0NSSVBULS0+JywgJCgnI2Nucy1jb25zb2xlJykuaHRtbCgpKTtcblxuXHRcdGxldCBibG9iID0gbmV3IEJsb2IoW3RyYW5zY3JpcHRdLCB7dHlwZTogJ3RleHQvaHRtbDtjaGFyc2V0PXV0Zi04J30pO1xuXG5cdFx0RmlsZVNhdmVyLnNhdmVBcyhibG9iLCBgQ29uc29sZVNlc3Npb25fJHtkYXRlLmZvcm1hdCgnWVlZWU1NRERfSEhtbXNzJyl9Lmh0bWxgKTtcblx0fVxuXG5cdF9vblJ1blNjcmlwdENsaWNrKClcblx0e1xuXHRcdC8vIE9wZW4gbW9kYWxcblx0XHR0aGlzLl91cGxvYWRTY3JpcHRNb2RhbC5tb2RhbCgnc2hvdycpO1xuXHR9XG5cblx0X29uVXBsb2FkU2NyaXB0ck1vZGFsSGlkZGVuKClcblx0e1xuXHRcdC8vIENsZWFyIHVwbG9hZGVyXG5cdFx0dGhpcy5fdXBsb2FkZXIuY2xlYXJBbGxGaWxlcygpO1xuXHR9XG5cblx0X29uVXBsb2FkU2NyaXB0ckJ1dHRvbkNMaWNrKClcblx0e1xuXHRcdGlmICh0aGlzLl91cGxvYWRlci5nZXRGaWxlcygpLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0bGV0IGZpbGUgPSB0aGlzLl91cGxvYWRlci5nZXRGaWxlcygpWzBdLnJhd0ZpbGU7XG5cblx0XHRcdGZpbGUuYXJyYXlCdWZmZXIoKS50aGVuKGJ1ZmZlciA9PiB7XG5cdFx0XHRcdHRoaXMuX3dyaXRlQ29uc29sZShgRVhFQzogJHtmaWxlLm5hbWV9YCwgdHJ1ZSk7XG5cblx0XHRcdFx0bGV0IHNmc28gPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0XHRcdHNmc28ucHV0Qnl0ZUFycmF5KCdzY3JpcHQnLCBuZXcgVWludDhBcnJheShidWZmZXIpKTtcblxuXHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1NDUklQVCwgc2Zzbyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ2xvc2UgbW9kYWxcblx0XHRcdHRoaXMuX3VwbG9hZFNjcmlwdE1vZGFsLm1vZGFsKCdoaWRlJyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X3Nob3dXZWxjb21lTWVzc2FnZSgpXG5cdHtcblx0XHR0aGlzLl93cml0ZUNvbnNvbGUoYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuQURNSU5fQ09OU09MRSwgdmVyc2lvbiAke3RoaXMuVkVSU0lPTn1cXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblR5cGUgaGVscCgpIGZvciBhc3Npc3RhbmNlLlxcbmAsIGZhbHNlLCBmYWxzZSk7XG5cdH1cblxuXHRfY2xlYXJJbnB1dCgpXG5cdHtcblx0XHQkKCcjY25zLWlucHV0JykudmFsKCcnKTtcblx0XHQkKCcjY25zLWlucHV0LWR1bW15JykuaHRtbCgnJyk7XG5cdH1cblxuXHRfc2V0SW5wdXRPbkhpbnRTZWxlY3RlZCgpXG5cdHtcblx0XHRpZiAodGhpcy5faGludFBhbmVsKVxuXHRcdHtcblx0XHRcdGNvbnN0IGlucHV0ID0gJCgnI2Nucy1pbnB1dCcpLnZhbCgpO1xuXHRcdFx0Y29uc3Qgc2VsZWN0ZWRWYWwgPSB0aGlzLl9oaW50UGFuZWwuZmluZCgnLmhpbnQtaXRlbS5zZWxlY3RlZCBpbnB1dCcpLnZhbCgpO1xuXHRcdFx0Y29uc3QgbmV3SW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgaW5wdXQubGFzdEluZGV4T2YoJy4nKSkgKyAnLicgKyBzZWxlY3RlZFZhbDtcblxuXHRcdFx0JCgnI2Nucy1pbnB1dCcpLnZhbChuZXdJbnB1dCk7XG5cdFx0XHQkKCcjY25zLWlucHV0LWR1bW15JykuaHRtbChuZXdJbnB1dCk7XG5cblx0XHRcdHRoaXMuX2Nsb3NlSGludFBhbmVsKCk7XG5cdFx0fVxuXHR9XG5cblx0X3NldElucHV0T25IaXN0b3J5U2VsZWN0ZWQoY29tbWFuZClcblx0e1xuXHRcdCQoJyNjbnMtaW5wdXQnKS52YWwoY29tbWFuZCk7XG5cdFx0JCgnI2Nucy1pbnB1dC1kdW1teScpLmh0bWwoY29tbWFuZCk7XG5cdH1cblxuXHRfd3JpdGVDb25zb2xlKHR4dCwgaXNJbnB1dCA9IGZhbHNlLCBsaW5lYnJlYWsgPSB0cnVlKVxuXHR7XG5cdFx0bGV0IG1zZztcblxuXHRcdGlmIChpc0lucHV0KVxuXHRcdFx0bXNnID0gYDxzcGFuIGNsYXNzPVwidGV4dC1jb21tYW5kXCI+Jmd0OyAke3R4dH08L3NwYW4+YDtcblx0XHRlbHNlXG5cdFx0XHRtc2cgPSBgPHNwYW4gY2xhc3M9XCJ0ZXh0LWNvbnNvbGVcIj4ke3R4dH08L3NwYW4+YDtcblxuXHRcdGlmIChsaW5lYnJlYWspXG5cdFx0XHRtc2cgPSBgXFxuJHttc2d9YDtcblxuXHRcdC8vIEFwcGVuZCB0ZXh0IHRvIGNvbnNvbGVcblx0XHQkKCcjY25zLWNvbnNvbGUnKS5hcHBlbmQobXNnKTtcblxuXHRcdC8vIHNjcm9sbCBjb25zb2xlIHRvIGJvdHRvbVxuXHRcdCQoJyNjbnMtY29uc29sZScpLnNjcm9sbFRvcChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuc2Nyb2xsSGVpZ2h0OyB9KTtcblx0fVxuXG5cdF9wYXJzZUh0bWwoc3MpXG5cdHtcblx0XHRzcyA9IHNzLnJlcGxhY2UoJzwnLCAnJmx0OycpO1xuXHRcdHNzID0gc3MucmVwbGFjZSgnPicsICcmZ3Q7Jyk7XG5cblx0XHRyZXR1cm4gc3M7XG5cdH1cblxuXHRfc2hvd0hpbnRQYW5lbCgpXG5cdHtcblx0XHRpZiAodGhpcy5fbGFzdEhpbnRzICE9IG51bGwgJiYgdGhpcy5fbGFzdEhpbnRzLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0dGhpcy5fY3VyckhpbnRGb2N1cyA9IC0xO1xuXG5cdFx0XHQvLyBDcmVhdGUgcGFuZWxcblx0XHRcdHRoaXMuX2hpbnRQYW5lbCA9ICQoJzxkaXY+JywgeydjbGFzcyc6ICdoaW50LXBhbmVsJ30pO1xuXHRcdFx0JCh0aGlzKS5hcHBlbmQodGhpcy5faGludFBhbmVsKTtcblxuXHRcdFx0Ly8gU2hvdyBoaW50c1xuXHRcdFx0dGhpcy5fdXBkYXRlSGludFBhbmVsKCk7XG5cdFx0fVxuXHR9XG5cblx0X2Nsb3NlSGludFBhbmVsKClcblx0e1xuXHRcdHRoaXMuX2hpbnRQYW5lbC5yZW1vdmUoKTtcblx0XHR0aGlzLl9oaW50UGFuZWwgPSBudWxsO1xuXHR9XG5cblx0X3VwZGF0ZUhpbnRQYW5lbCgpXG5cdHtcblx0XHRpZiAodGhpcy5fbGFzdEhpbnRzICE9IG51bGwgJiYgdGhpcy5fbGFzdEhpbnRzLmxlbmd0aCA+IDApXG5cdFx0e1xuXHRcdFx0Ly8gQ2xlYXIgaGludHMgcGFuZWxcblx0XHRcdHRoaXMuX2hpbnRQYW5lbC5lbXB0eSgpO1xuXG5cdFx0XHRjb25zdCBkb3RJbmRleCA9ICQoJyNjbnMtaW5wdXQnKS52YWwoKS5sYXN0SW5kZXhPZignLicpO1xuXHRcdFx0bGV0IGxhc3RXb3JkID0gJyc7XG5cblx0XHRcdGlmIChkb3RJbmRleCA+IC0xKVxuXHRcdFx0XHRsYXN0V29yZCA9ICQoJyNjbnMtaW5wdXQnKS52YWwoKS5zdWJzdHIoZG90SW5kZXggKyAxLCAkKCcjY25zLWlucHV0JykudmFsKCkubGVuZ3RoKTtcblxuXHRcdFx0bGV0IGlzRW1wdHkgPSB0cnVlO1xuXG5cdFx0XHRmb3IgKGxldCB3b3JkIG9mIHRoaXMuX2xhc3RIaW50cylcblx0XHRcdHtcblx0XHRcdFx0Ly8gQ2hlY2sgaWYgdGhlIGl0ZW0gc3RhcnRzIHdpdGggdGhlIHNhbWUgbGV0dGVycyBhcyB0aGUgaW5wdXQncyBsYXN0IHdvcmRcblx0XHRcdFx0aWYgKGxhc3RXb3JkID09ICcnIHx8IHdvcmQuc3Vic3RyKDAsIGxhc3RXb3JkLmxlbmd0aCkudG9VcHBlckNhc2UoKSA9PSBsYXN0V29yZC50b1VwcGVyQ2FzZSgpKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Ly8gQ3JlYXRlIGRpdlxuXHRcdFx0XHRcdGxldCBpdGVtID0gJCgnPGRpdj4nLCB7J2NsYXNzJzogJ2hpbnQtaXRlbSd9KTtcblxuXHRcdFx0XHRcdC8vIFNob3cgdmFsdWUsIGFuZCBtYWtlIHRoZSBtYXRjaGluZyBsZXR0ZXJzIGJvbGRcblx0XHRcdFx0XHRpdGVtLmFwcGVuZChgPHN0cm9uZz4ke3dvcmQuc3Vic3RyKDAsIGxhc3RXb3JkLmxlbmd0aCl9PC9zdHJvbmc+JHt3b3JkLnN1YnN0cihsYXN0V29yZC5sZW5ndGgpfWApO1xuXG5cdFx0XHRcdFx0Ly8gSW5zZXJ0IGFuIGlucHV0IGZpZWxkIHRoYXQgd2lsbCBob2xkIHRoZSBjdXJyZW50IGl0ZW0ncyB2YWx1ZVxuXHRcdFx0XHRcdGl0ZW0uYXBwZW5kKGA8aW5wdXQgdHlwZT1cImhpZGRlblwiIHZhbHVlPVwiJHt3b3JkfVwiPmApO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIGNsaWNrIGxpc3RlbmVyXG5cdFx0XHRcdFx0aXRlbS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uSGludEl0ZW1DbGljaywgdGhpcykpO1xuXG5cdFx0XHRcdFx0dGhpcy5faGludFBhbmVsLmFwcGVuZChpdGVtKTtcblxuXHRcdFx0XHRcdGlzRW1wdHkgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBwYW5lbCBpcyBlbXB0eSwgcm1vdmUgaXRcblx0XHRcdGlmIChpc0VtcHR5KVxuXHRcdFx0XHR0aGlzLl9jbG9zZUhpbnRQYW5lbCgpO1xuXG5cdFx0XHQvLyBFbHNlIHNldCBwYW5lbCBwb3NpdGlvblxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBleHRDb250UG9zID0gJCgnI2Nucy1pbnB1dC1jb250YWluZXItMicpLnBvc2l0aW9uKCk7XG5cdFx0XHRcdGNvbnN0IGludENvbnRQb3MgPSAkKCcjY25zLWlucHV0LWNvbnRhaW5lci0xJykucG9zaXRpb24oKTtcblxuXHRcdFx0XHRsZXQgbGVmdCA9IGV4dENvbnRQb3MubGVmdCArIGludENvbnRQb3MubGVmdCArICQoJyNjbnMtaW5wdXQtZHVtbXknKS5vdXRlcldpZHRoKCk7XG5cdFx0XHRcdGxldCB0b3AgPSBleHRDb250UG9zLnRvcCArIGludENvbnRQb3MudG9wIC0gdGhpcy5faGludFBhbmVsLm91dGVySGVpZ2h0KCk7XG5cblx0XHRcdFx0aWYgKGxlZnQgPiB3aW5kb3cuaW5uZXJXaWR0aCAtIHRoaXMuX2hpbnRQYW5lbC5vdXRlcldpZHRoKCkpXG5cdFx0XHRcdFx0bGVmdCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy5faGludFBhbmVsLm91dGVyV2lkdGgoKTtcblxuXHRcdFx0XHR0aGlzLl9oaW50UGFuZWwuY3NzKHt0b3A6IHRvcCwgbGVmdDogbGVmdCwgcG9zaXRpb246ICdhYnNvbHV0ZSd9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVxdWVzdEhpbnRzKGlucHV0KVxuXHR7XG5cdFx0Ly8gQ2xlYXIgcHJldmlvdXMgaGludHNcblx0XHR0aGlzLl9sYXN0SGludHMgPSBudWxsO1xuXG5cdFx0Ly8gUGFyc2UgaW5wdXRcblx0XHRsZXQgaGludFBhcmVudCA9IHRoaXMuX2V4dHJhY3RIaW50UGFyZW50KGlucHV0KTtcblx0XHRcblx0XHQvLyBSZXF1ZXN0IGNvZGUgaGludFxuXHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnYycsIGhpbnRQYXJlbnQpO1xuXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9ISU5ULCBwYXJhbXMpO1xuXHR9XG5cblx0X2V4dHJhY3RIaW50UGFyZW50KGluVmFsKVxuXHR7XG5cdFx0bGV0IG91dFZhbCA9IG51bGw7XG5cblx0XHRmb3IgKGxldCB0b2sgb2YgdGhpcy5UT0tFTlMpXG5cdFx0e1xuXHRcdFx0Y29uc3QgcCA9IGluVmFsLmluZGV4T2YodG9rKTtcblxuXHRcdFx0aWYgKHAgPiAtMSlcblx0XHRcdHtcblx0XHRcdFx0b3V0VmFsID0gaW5WYWwuc3Vic3RyaW5nKHAgKyB0b2subGVuZ3RoLCBpblZhbC5sZW5ndGgpLnRyaW0oKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG91dFZhbCA9PSBudWxsKVxuXHRcdFx0b3V0VmFsID0gaW5WYWw7XG5cblx0XHQvLyBSZW1vdmUgZG90IGF0IHRoZSBlbmQgaWYgbmVlZGVkXG5cdFx0aWYgKG91dFZhbC5lbmRzV2l0aCgnLicpKVxuXHRcdFx0b3V0VmFsID0gb3V0VmFsLnN1YnN0cigwLCBvdXRWYWwubGVuZ3RoIC0gMSk7XG5cblx0XHRyZXR1cm4gb3V0VmFsO1xuXHR9XG5cblx0X3NldEhpbnRJdGVtU2VsZWN0ZWQoKVxuXHR7XG5cdFx0bGV0IGl0ZW1zID0gdGhpcy5faGludFBhbmVsLmZpbmQoJy5oaW50LWl0ZW0nKTtcblx0XHRpdGVtcy5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcblxuXHRcdGlmICh0aGlzLl9jdXJySGludEZvY3VzID49IGl0ZW1zLmxlbmd0aClcblx0XHRcdHRoaXMuX2N1cnJIaW50Rm9jdXMgPSAwO1xuXG4gICAgXHRpZiAodGhpcy5fY3VyckhpbnRGb2N1cyA8IDApXG5cdFx0XHR0aGlzLl9jdXJySGludEZvY3VzID0gaXRlbXMubGVuZ3RoIC0gMTtcblxuXHRcdGxldCBpdGVtID0gaXRlbXMuZXEodGhpcy5fY3VyckhpbnRGb2N1cyk7XG5cdFx0aXRlbS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcblxuXHRcdC8vIFNjcm9sbCB0byBpdGVtXG5cdFx0dGhpcy5faGludFBhbmVsLnNjcm9sbFRvcCh0aGlzLl9oaW50UGFuZWwuc2Nyb2xsVG9wKCkgKyBpdGVtLnBvc2l0aW9uKCkudG9wKTtcblx0fVxuXG5cdF9yZXNldEhpbnRpbmcoaW5wdXQpXG5cdHtcblx0XHQvLyBDbG9zZSBoaW50IHBhbmVsXG5cdFx0aWYgKHRoaXMuX2lzSGludFBhbmVsT3Blbilcblx0XHRcdHRoaXMuX2Nsb3NlSGludFBhbmVsKCk7XG5cblx0XHQvLyBDbGVhciBoaW50c1xuXHRcdHRoaXMuX2xhc3RIaW50cyA9IG51bGw7XG5cblx0XHQvLyBHZXQgcHJldmlvdXMgd29yZFxuXHRcdGNvbnN0IGRvdEluZGV4ID0gaW5wdXQubGFzdEluZGV4T2YoJy4nKTtcblxuXHRcdGlmIChkb3RJbmRleCA+IC0xKVxuXHRcdHtcblx0XHRcdGxldCB2YWx1ZSA9IGlucHV0LnN1YnN0cmluZygwLCBkb3RJbmRleCk7XG5cblx0XHRcdC8vIFJlcXVlc3QgY29kZSBoaW50c1xuXHRcdFx0dGhpcy5fcmVxdWVzdEhpbnRzKHZhbHVlKTtcblx0XHR9XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIEdFVFRFUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRnZXQgX2lzSGludFBhbmVsT3BlbigpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faGludFBhbmVsICE9IG51bGw7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNuQkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDakZBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9
234
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtNC5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9tb2R1bGVzL2NsdXN0ZXItY29uZmlndXJhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0NvbmZpZ0ludGVyZmFjZUJ1aWxkZXJ9IGZyb20gJy4uL3V0aWxzL3VpYnVpbGRlci9jb25maWctaW50ZXJmYWNlLWJ1aWxkZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbHVzdGVyQ29uZmlndXJhdG9yIGV4dGVuZHMgQmFzZU1vZHVsZVxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0ICAgIHN1cGVyKCdjbHVzdGVyQ29uZmlnJyk7XG5cblx0XHQvLyBPdXRnb2luZyByZXF1ZXN0c1xuXHRcdHRoaXMuUkVRX0dFVF9DT05GSUcgPSAnZ2V0Q29uZmlnJztcblx0XHR0aGlzLlJFUV9VUERBVEVfQ09ORklHID0gJ3VwZENvbmZpZyc7XG5cblx0XHQvLyBJbmNvbWluZyByZXNwb25zZXNcblx0XHR0aGlzLlJFU1BfQ09ORklHID0gJ2NvbmZpZyc7XG5cdFx0dGhpcy5SRVNQX0NPTkZJR19VUERBVEVfQ09ORklSTSA9ICdjb25maWdVcGRhdGUnO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gQ09NTU9OIE1PRFVMRSBJTlRFUkZBQ0UgTUVUSE9EU1xuXHQvLyBUaGlzIG1lbWJlcnMgYXJlIHVzZWQgYnkgdGhlIG1haW4gY29udHJvbGxlclxuXHQvLyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBtb2R1bGUncyBjb250cm9sbGVyLlxuXHQvLyBUaGlzIG1ldGhvZHMgb3ZlcnJpZGUgdGhvc2UgaW4gQmFzZU1vZHVsZSBjbGFzcy5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRpbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5pbml0aWFsaXplKGlkRGF0YSwgc2hlbGxDb250cm9sbGVyKTtcblxuXHRcdC8vIEluaXRpYWxpemUgcHJvZ3Jlc3MgYmFyXG5cdFx0JCgnI2NsYy1wcm9ncmVzc0JhcicpLmtlbmRvUHJvZ3Jlc3NCYXIoe1xuXHRcdFx0bWluOiAwLFxuICAgICAgICAgICAgbWF4OiAxMDAsXG5cdFx0XHR2YWx1ZTogZmFsc2UsXG4gICAgICAgICAgICB0eXBlOiAndmFsdWUnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDQwMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdC8vIENyZWF0ZSBpbnRlcmZhY2UgYnVpbGRlciBpbnN0YW5jZVxuXHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIgPSBuZXcgQ29uZmlnSW50ZXJmYWNlQnVpbGRlcigpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIGludGVyZmFjZSBidXR0b25zXG5cdFx0JCgnI2NsYy1yZWxvYWRCdXR0b24nKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVsb2FkQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjY2xjLXN1Ym1pdEJ1dHRvbicpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TdWJtaXRDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0XHQvLyBSZXF1ZXN0IGNvbmZpZ3VyYXRpb24gZGF0YSB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9DT05GSUcpO1xuXHR9XG5cblx0ZGVzdHJveSgpXG5cdHtcblx0XHQvLyBDYWxsIHN1cGVyIG1ldGhvZFxuXHRcdHN1cGVyLmRlc3Ryb3koKTtcblxuXHRcdC8vIFJlbW92ZSBpbnRlcmZhY2UgYnV0dG9ucyBjbGljayBsaXN0ZW5lcnNcblx0XHQkKCcjY2xjLXJlbG9hZEJ1dHRvbicpLm9mZignY2xpY2snKTtcblx0XHQkKCcjY2xjLXN1Ym1pdEJ1dHRvbicpLm9mZignY2xpY2snKTtcblxuXHRcdC8vIENsZWFyIHRhYnMgY29udGFpbmVyXG5cdFx0dGhpcy5fY2xlYXJUYWJzKCk7XG5cdH1cblxuXHRvbkV4dGVuc2lvbkNvbW1hbmQoY29tbWFuZCwgZGF0YSlcblx0e1xuXHRcdC8vIENsdXN0ZXIgY29uZmlndXJhdGlvbiBkYXRhIHJlY2VpdmVkXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX0NPTkZJRylcblx0XHR7XG5cdFx0XHQvLyBCdWlsZCB1c2VyIGludGVyZmFjZSBiYXNlZCBvbiByZWNlaXZlZCBkYXRhXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmJ1aWxkSW50ZXJmYWNlKGRhdGEuZ2V0U0ZTQXJyYXkoJ3NldHRpbmdzJyksICdjbGMtdGFiTmF2aWdhdG9yJywgZmFsc2UpO1xuXG5cdFx0XHQvLyBFbmFibGUgYnV0dG9uc1xuXHRcdFx0dGhpcy5fZW5hYmxlQnV0dG9ucyh0cnVlKTtcblxuXHRcdFx0Ly8gSW5pdGlhbGl6ZSBUYWJOYXZpZ2F0b3ItcmFsYXRlZCB3aWRnZXRzXG5cdFx0XHRpZiAoIXRoaXMuX3RhYk5hdkluaXRpYWxpemVkKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBFbmFibGUgc2Nyb2xsaW5nIHRhYnNcblx0XHRcdFx0JCgnI2NsYy10YWJOYXZpZ2F0b3IgPiAjdGFicycpLnNjcm9sbGluZ1RhYnMoe1xuXHRcdFx0XHRcdGJvb3RzdHJhcFZlcnNpb246IDQsXG5cdFx0XHRcdFx0c2Nyb2xsVG9UYWJFZGdlOiB0cnVlLFxuXHRcdFx0XHRcdGVuYWJsZVN3aXBpbmc6IHRydWUsXG5cdFx0XHRcdFx0ZGlzYWJsZVNjcm9sbEFycm93c09uRnVsbHlTY3JvbGxlZDogdHJ1ZSxcblx0XHRcdFx0XHRjc3NDbGFzc0xlZnRBcnJvdzogJ2ZhIGZhLWNoZXZyb24tbGVmdCcsXG5cdFx0XHRcdFx0Y3NzQ2xhc3NSaWdodEFycm93OiAnZmEgZmEtY2hldnJvbi1yaWdodCdcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy5fdGFiTmF2SW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSdW4gdmFsaWRhdGlvbiAodG8gcmVtb3ZlIHZhbGlkYXRpb24gbWVzc2FnZXMgaWYgZGF0YSB3YXMgcmVsb2FkZWQpXG5cdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmNoZWNrSXNWYWxpZCgpO1xuXG5cdFx0XHR0aGlzLl9zd2l0Y2hWaWV3KCdjbGMtbWFpbicpO1xuXHRcdH1cblxuXHRcdC8vIENsdXN0ZXIgY29uZmlndXJhdGlvbiB1cGRhdGUgY29uZmlybWF0aW9uXG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfQ09ORklHX1VQREFURV9DT05GSVJNKVxuXHRcdHtcblx0XHRcdC8vIEVuYWJsZSBidXR0b25zXG5cdFx0XHR0aGlzLl9lbmFibGVCdXR0b25zKHRydWUpO1xuXG5cdFx0XHQvLyBFbmFibGUgZm9ybSBpdGVtc1xuXHRcdFx0dGhpcy5faW50ZXJmYWNlQnVpbGRlci5kaXNhYmxlSW50ZXJmYWNlKGZhbHNlKTtcblxuXHRcdFx0Ly8gSWYgdGhlIGN1cnJlbnQgdXNlciBpcyB0aGUgdXBkYXRlciwgc2hvdyBhIG5vdGlmaWNhdGlvblxuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBzaG93IGEgZGlhbG9nIGJveCBzdWdnZXN0aW5nIHRvIHJlbG9hZFxuXHRcdFx0bGV0IHVwZGF0ZXIgPSBkYXRhLmdldFV0ZlN0cmluZygndXNlcicpO1xuXG5cdFx0XHRpZiAodXBkYXRlciA9PSB0aGlzLnNtYXJ0Rm94Lm15U2VsZi5uYW1lKVxuXHRcdFx0e1xuXHRcdFx0XHQvLyBSZXNldCB0aGUgJ21vZGlmaWVkJyBmbGFnXG5cdFx0XHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIucmVzZXRJc01vZGlmaWVkKCk7XG5cblx0XHRcdFx0Ly8gRGlzcGxheSBub3RpZmljYXRpb25cblx0XHRcdFx0dGhpcy5zaGVsbEN0cmwuc2hvd05vdGlmaWNhdGlvbignQ2x1c3RlciBzZXR0aW5ncyB1cGRhdGVkJywgJ0ltbWVkaWF0ZSBjaGFuZ2VzICg8aSBjbGFzcz1cImZhcyBmYS1ib2x0XCI+PC9pPikgaGF2ZSBiZWVuIGFwcGxpZWQ7IGFsbCBvdGhlciBjaGFuZ2VzIHdpbGwgYmUgYWN0aXZlIGFmdGVyIG5leHQgc2VydmVyIHJlc3RhcnQnKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0Ly8gU2hvdyBhbGVydFxuXHRcdFx0XHR0aGlzLnNoZWxsQ3RybC5zaG93U2ltcGxlQWxlcnQoYEFkbWluaXN0cmF0b3IgJHt1cGRhdGVyfSBoYXMgbW9kaWZpZWQgdGhlIGNsdXN0ZXIgc2V0dGluZ3M7IHBsZWFzZSByZWxvYWQgdG8gdXBkYXRlIHlvdXIgdmlldy5gKTtcblxuXHRcdFx0XHQvLyBEaXNhYmxlIHN1Ym1pdCBidXR0b25cblx0XHRcdFx0JCgnI2NsYy1zdWJtaXRCdXR0b24nKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgTUVUSE9EU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9lbmFibGVCdXR0b25zKGVuYWJsZWQpXG5cdHtcblx0XHQkKCcjY2xjLXJlbG9hZEJ1dHRvbicpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXHRcdCQoJyNjbGMtc3VibWl0QnV0dG9uJykuYXR0cignZGlzYWJsZWQnLCAhZW5hYmxlZCk7XG5cdFx0JCgnI2NsYy1iYWNrdXBDaGVjaycpLmF0dHIoJ2Rpc2FibGVkJywgIWVuYWJsZWQpO1xuXHR9XG5cblx0X3N3aXRjaFZpZXcodmlld0lkKVxuXHR7XG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsYy12aWV3c3RhY2snKS5zZWxlY3RlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2aWV3SWQpO1xuXHR9XG5cblx0X2NsZWFyVGFicygpXG5cdHtcblx0XHQvLyBEZXN0cm95IHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2NsYy10YWJOYXZpZ2F0b3IgI3RhYnMnKS5zY3JvbGxpbmdUYWJzKCdkZXN0cm95Jyk7XG5cblx0XHQvLyBSZW1vdmUgYWxsIHRhYiBuYXZpZ2F0b3IgY29udGVudFxuXHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZGVzdHJveUludGVyZmFjZSgpO1xuXHR9XG5cblx0X29uUmVsb2FkQ2xpY2soKVxuXHR7XG5cdFx0Ly8gRGlzYWJsZSBidXR0b25zXG5cdFx0dGhpcy5fZW5hYmxlQnV0dG9ucyhmYWxzZSk7XG5cblx0XHQvLyBTd2l0Y2ggdG8gbG9hZGluZyB2aWV3XG5cdFx0dGhpcy5fc3dpdGNoVmlldygnY2xjLWxvYWRpbmcnKTtcblxuXHRcdC8vIEhpZGUgdmFsaWRhdGlvbiBtZXNzYWdlc1xuXHRcdHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIucmVzZXRWYWxpZGF0aW9uKCk7XG5cblx0XHQvLyBSZXF1ZXN0IGNvbmZpZ3VyYXRpb24gZGF0YSB0byBzZXJ2ZXIgaW5zdGFuY2Vcblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9DT05GSUcpO1xuXHR9XG5cblx0X29uU3VibWl0Q2xpY2soKVxuXHR7XG5cdFx0Ly8gQ2hlY2sgdmFsaWRpdHlcblx0XHRpZiAodGhpcy5faW50ZXJmYWNlQnVpbGRlci5jaGVja0lzVmFsaWQoKSlcblx0XHR7XG5cdFx0XHRsZXQgY2hhbmdlcyA9IHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZ2V0Q2hhbmdlZERhdGEoKTtcblxuXHRcdFx0aWYgKGNoYW5nZXMuc2l6ZSgpID4gMClcblx0XHRcdHtcblx0XHRcdFx0Ly8gRGlzYWJsZSBidXR0b25zXG5cdFx0XHRcdHRoaXMuX2VuYWJsZUJ1dHRvbnMoZmFsc2UpO1xuXG5cdFx0XHRcdC8vIERpc2FibGUgZm9ybSBpdGVtc1xuXHRcdFx0XHR0aGlzLl9pbnRlcmZhY2VCdWlsZGVyLmRpc2FibGVJbnRlcmZhY2UodHJ1ZSk7XG5cblx0XHRcdFx0Ly8gU2VuZCB1cGRhdGVkIHNldHRpbmdzIHRvIHNlcnZlciBpbnN0YW5jZVxuXHRcdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0XHRwYXJhbXMucHV0U0ZTQXJyYXkoJ3NldHRpbmdzJywgY2hhbmdlcyk7XG5cdFx0XHRcdHBhcmFtcy5wdXRCb29sKCdiYWNrdXAnLCAkKCcjY2xjLWJhY2t1cENoZWNrJykucHJvcCgnY2hlY2tlZCcpKTtcblxuXHRcdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1VQREFURV9DT05GSUcsIHBhcmFtcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc2hlbGxDdHJsLnNob3dTaW1wbGVBbGVydCgnVW5hYmxlIHRvIHN1Ym1pdCBjb25maWd1cmF0aW9uIGNoYW5nZXMgZHVlIHRvIGFuIGludmFsaWQgdmFsdWU7IHBsZWFzZSB2ZXJpZnkgdGhlIGhpZ2hsaWdodGVkIGZvcm0gZmllbGRzIGluIGFsbCB0YWJzLicsIHRydWUpO1xuXHR9XG5cblx0X3VwZGF0ZUNvbmZpZ0Zvcm1JdGVtRGlzcGxheWVkVmFsdWUoY29uZmlnUGFyYW1OYW1lLCBuZXdWYWx1ZSlcblx0e1xuXHRcdC8vIEdldCB0aGUgcmVsZXZhbnQgQ29uZmlndXJhdGlvbiBGb3JtIEl0ZW1cblx0XHRjb25zdCBjb25maWdGb3JtSXRlbSA9IHRoaXMuX2ludGVyZmFjZUJ1aWxkZXIuZ2V0Q29uZmlnRm9ybUl0ZW0oY29uZmlnUGFyYW1OYW1lKTtcblxuXHRcdC8vIFVwZGF0ZSBDb25maWd1cmF0aW9uIFBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIENvbmZpZ3VyYXRpb24gRm9ybSBJdGVtXG5cdFx0Y29uZmlnRm9ybUl0ZW0uZGF0YS52YWx1ZSA9IG5ld1ZhbHVlO1xuXHRcdGNvbmZpZ0Zvcm1JdGVtLmRhdGEucmVzZXRJc01vZGlmaWVkKCk7IC8vIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBDb25maWd1cmF0aW9uIFBhcmFtZXRlciB0byBmbGFnZ2VkIGFzICdjaGFuZ2VkJ1xuXG5cdFx0Ly8gRGlzcGxheSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBDb25maWd1cmF0aW9uIEZvcm0gSXRlbVxuXHRcdGNvbmZpZ0Zvcm1JdGVtLl9zZXRXaWRnZXRWYWx1ZSgpOyAvLyBEaXNwbGF5IHRoZSBuZXcgdmFsdWUgaW4gdGhlIGNvbmZpZyBmb3JtIGl0ZW1cblx0fVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0EiLCJzb3VyY2VSb290IjoiIn0=