├── style.css ├── README.md ├── index.html └── osmon └── osmonscript.js /style.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-family: 'Poppins', sans-serif; 3 | background: linear-gradient(270deg, #4b52ff, #ff1589, #b83877, #5d28d1, #1983f4, #00592d, #444444, #ab4a00); 4 | background-size: 1600% 1600%; 5 | 6 | -webkit-animation: AnimationName 59s ease infinite; 7 | -moz-animation: AnimationName 59s ease infinite; 8 | animation: AnimationName 59s ease infinite; 9 | } 10 | 11 | .container { 12 | max-width: 400px; 13 | margin: 10vh auto 0 auto; 14 | border: rgb(190, 190, 190); 15 | border-style: solid; 16 | border-width: 0.5px; 17 | border-radius: 16px; 18 | } 19 | 20 | #display { 21 | text-align: right; 22 | height: 70px; 23 | /* line-height: 70px; */ 24 | padding: 16px 8px; 25 | font-size: 25px; 26 | color: white; 27 | } 28 | 29 | .buttons { 30 | display: grid; 31 | /* border-bottom: 1px solid rgb(255, 0, 0); */ 32 | border-left: 1px solidrgb(255, 0, 0); 33 | grid-template-columns: 1fr 1fr 1fr 1fr; 34 | border-radius: 16px; 35 | } 36 | 37 | .buttons > div { 38 | border-top: 1px solid #999; 39 | border-right: 1px solid#999; 40 | } 41 | 42 | .button { 43 | /* border: 0.5px solid rgb(255, 0, 0); */ 44 | line-height: 100px; 45 | text-align: center; 46 | font-size: 25px; 47 | cursor: pointer; 48 | color: white; 49 | } 50 | 51 | #equal { 52 | background-color: rgb(85, 85, 255); 53 | color: white; 54 | border-bottom-right-radius: 16px;; 55 | } 56 | #lbracket { 57 | border-bottom-left-radius: 16px; 58 | } 59 | 60 | .button:hover { 61 | background-color: #323330; 62 | color: white; 63 | transition: 0.1s ease-in-out; 64 | } 65 | 66 | 67 | /* .css-selector { 68 | 69 | } */ 70 | 71 | @-webkit-keyframes AnimationName { 72 | 0%{background-position:0% 50%} 73 | 50%{background-position:100% 50%} 74 | 100%{background-position:0% 50%} 75 | } 76 | @-moz-keyframes AnimationName { 77 | 0%{background-position:0% 50%} 78 | 50%{background-position:100% 50%} 79 | 100%{background-position:0% 50%} 80 | } 81 | @keyframes AnimationName { 82 | 0%{background-position:0% 50%} 83 | 50%{background-position:100% 50%} 84 | 100%{background-position:0% 50%} 85 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Osmon

2 | 3 |

Programming Language | Dasturlash Tili

4 | 5 |

O'zbek boshlang'ichlari uchun o'rgatuvchi til | Language made for uzbek learners

6 | 7 |

Website | Wiki

8 | 9 |

Xissasini qo'shayotganlar:

10 | 11 |

UwUssimo (birinchi muallif) | Mukhammadyusuf (osmon-react) | Fromgodd (hozirgi muallif) | Genemator (osmon-script)

12 |

Osmon langni o'rnatish

13 | 14 |

Windows/Powershell uchun

15 | 16 | ```bash 17 | iwr https://sh.osmon.dev/install.ps1 -useb | iex 18 | ``` 19 | 20 |

*NIX/Bash uchun

21 | 22 | ```bash 23 | curl -fsSL https://sh.osmon.dev/install.sh | sh 24 | ``` 25 |

Osmon Lang VSCode Kengaytmasi

26 | 27 | [Osmon Lang VSCode Kengaytmasini o'rnatish](https://marketplace.visualstudio.com/items?itemName=osmon.osmon) 28 | 29 | ## Maqsad 30 | * **O'zbekona sintaksis** 31 | * **Rust bilan integratsiya** 32 | * **O'rganish darajasini oshirish** 33 | * **Virtual Mashinani OOP ga moslash** 34 | 35 | ## Holis (istamaymiz) 36 | * Judayam haddan ortiq ko'p resurslar ko'paytirish 37 | * JIT kompilyatsiya 38 | * Baytkod fayllarni yaratish 39 | 40 | 41 | # Misol 42 | 43 | ``` 44 | funksiya faktorial(n) { 45 | agar n == 0 { 46 | qaytar 1; 47 | } 48 | qaytar faktorial(n - 1) * n; 49 | } 50 | 51 | klass Faktorial { 52 | funksiya yarat(v) { 53 | shu._v = v; 54 | qaytar shu; 55 | } 56 | 57 | funksiya qiymat() { 58 | agar shu._v == 0 { 59 | qaytar 1; 60 | } 61 | 62 | joy f = Faktorial(shu._v - 1); 63 | joy v = shu._v; 64 | 65 | 66 | qaytar f.qiymat() * v; 67 | } 68 | } 69 | 70 | funksiya asosiy() { 71 | yoz("Klasslik faktorial(5) = ",Faktorial(5).qiymat()); 72 | yoz("Rekursiv faktorial(5) = ",faktorial(5)); 73 | } 74 | ``` 75 | 76 |

Programming Language | Dasturlash Tili

77 |

Xinux Jamiyati tomonidan yaratilgan Dasturlash tili [osmon-lang].

78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Calculator on Osmonscript 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 |

Osmonscript calculator

16 |
17 |
18 |
C
19 |
/
20 |
*
21 |
22 |
7
23 |
8
24 |
9
25 |
-
26 |
4
27 |
5
28 |
6
29 |
+
30 |
1
31 |
2
32 |
3
33 |
.
34 |
(
35 |
0
36 |
)
37 |
=
38 |
39 |
40 |
41 | 42 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /osmon/osmonscript.js: -------------------------------------------------------------------------------- 1 | /*! Osmonscript v0.1.2 (https://osmon.dev) | Copyright (c) 2022-2022 Osmon & Osmonscript project and Contributors | Licensed under the MIT license */(()=>{"use strict";var e={289:(e,t,r)=>{var n=r(215),o="function"==typeof Symbol&&"symbol"==typeof Symbol("foo"),a=Object.prototype.toString,i=Array.prototype.concat,l=Object.defineProperty,c=l&&function(){var e={};try{for(var t in l(e,"x",{enumerable:!1,value:e}),e)return!1;return e.x===e}catch(e){return!1}}(),u=function(e,t,r,n){var o;(!(t in e)||"function"==typeof(o=n)&&"[object Function]"===a.call(o)&&n())&&(c?l(e,t,{configurable:!0,enumerable:!1,value:r,writable:!0}):e[t]=r)},s=function(e,t){var r=arguments.length>2?arguments[2]:{},a=n(t);o&&(a=i.call(a,Object.getOwnPropertySymbols(t)));for(var l=0;l{"undefined"!=typeof self?e.exports=self:"undefined"!=typeof window?e.exports=window:e.exports=Function("return this")()},503:(e,t,r)=>{var n=r(289),o=r(221),a=r(168),i=r(471),l=a(),c=function(){return l};n(c,{getPolyfill:a,implementation:o,shim:i}),e.exports=c},168:(e,t,r)=>{var n=r(221);e.exports=function(){return"object"==typeof r.g&&r.g&&r.g.Math===Math&&r.g.Array===Array?r.g:n}},471:(e,t,r)=>{var n=r(289),o=r(168);e.exports=function(){var e=o();if(n.supportsDescriptors){var t=Object.getOwnPropertyDescriptor(e,"globalThis");(!t||t.configurable&&(t.enumerable||t.writable||globalThis!==e))&&Object.defineProperty(e,"globalThis",{configurable:!0,enumerable:!1,value:e,writable:!1})}else"object"==typeof globalThis&&globalThis===e||(e.globalThis=e);return e}},987:(e,t,r)=>{var n;if(!Object.keys){var o=Object.prototype.hasOwnProperty,a=Object.prototype.toString,i=r(414),l=Object.prototype.propertyIsEnumerable,c=!l.call({toString:null},"toString"),u=l.call((function(){}),"prototype"),s=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],f=function(e){var t=e.constructor;return t&&t.prototype===e},p={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},h=function(){if("undefined"==typeof window)return!1;for(var e in window)try{if(!p["$"+e]&&o.call(window,e)&&null!==window[e]&&"object"==typeof window[e])try{f(window[e])}catch(e){return!0}}catch(e){return!0}return!1}();n=function(e){var t=null!==e&&"object"==typeof e,r="[object Function]"===a.call(e),n=i(e),l=t&&"[object String]"===a.call(e),p=[];if(!t&&!r&&!n)throw new TypeError("Object.keys called on a non-object");var y=u&&r;if(l&&e.length>0&&!o.call(e,0))for(var b=0;b0)for(var d=0;d{var n=Array.prototype.slice,o=r(414),a=Object.keys,i=a?function(e){return a(e)}:r(987),l=Object.keys;i.shim=function(){if(Object.keys){var e=function(){var e=Object.keys(arguments);return e&&e.length===arguments.length}(1,2);e||(Object.keys=function(e){return o(e)?l(n.call(e)):l(e)})}else Object.keys=i;return Object.keys||i},e.exports=i},414:e=>{var t=Object.prototype.toString;e.exports=function(e){var r=t.call(e),n="[object Arguments]"===r;return n||(n="[object Array]"!==r&&null!==e&&"object"==typeof e&&"number"==typeof e.length&&e.length>=0&&"[object Function]"===t.call(e.callee)),n}},776:function(e,t,r){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.compile=void 0;var o=n(r(503)),a=n(r(110));function i(e,t){void 0===t&&(t="osm");var r="osm"===t?1:0;return a.default.sort((function(e,t){var n=e[r].length;return t[r].length-n})).forEach((function(t){return n=e,o=t[r],a=t[+!r],i=new RegExp(function(e){return e=e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),/^\w+$/.test(e)&&(e="\\b"+e+"\\b"),e}(o),"g"),e=n.replace(i,a);var n,o,a,i})),e}function l(e,t){void 0===t&&(t="osm");var r=/((?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:\/\/.*))/g,n="ys_"+(new Date).getTime()+"_",o={},a=(e=e.replace(/\"(?:\\.|[^\"\\])*\"|\'(?:\\.|[^\'\\])*\'/g,(function(e,t){var r=n+t;return o[r]=e,r}))).match(r)||[];for(var l in e=(e=i(e,t)).replace(r,(function(){return a.shift()||""})),o)e=e.replace(l,o[l]);return e}t.compile=l,(0,o.default)().yopta=l},607:function(e,t,r){var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,a){function i(e){try{c(n.next(e))}catch(e){a(e)}}function l(e){try{c(n.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(i,l)}c((n=n.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var r,n,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function l(a){return function(l){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,n=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]{e.exports=JSON.parse('[["createDocumentFragment","dokumentFragmentYarat"],["createNodeIterator","nodeIteratorYarat"],["getElementsByClassName","klassdanElementOl"],["execCommand","komandaBajarish"],["maximize","maksimallashtir"],["getElementById","idDanElementOl"],["minimize","minimallashtir"],["captureEvents","hodisalarniOl"],["createAttribute","attributYarat"],["createTextNode","nodeTextYarat"],["isArray","massivTekshir"],["implements","implementlar"],["protected","himoyalangan"],["undefined","aniqlanmagan"],["createRange","chegaraYarat"],["createElement","elementYarat"],["getAttention","etiborQilish"],["openDialog","ochishDialog"],["profileEnd","profilTugash"],["module","qoshimchalar"],["groupEnd","guruhTugash"],["instanceof","obyektTuri"],["createEvent","hodisYarat"],["importNode","importNode"],["addEventListener","ishlovQosh"],["timeEnd","vaqtTugash"],["Math","Matematika"],["exports","eksportlar"],["function*","funksiya*"],["Double","Ikkitalik"],["double","ikkitalik"],["extends","qoshimcha"],["interface","struktura"],["writeln","yozChiziq"],["print","chiqarish"],["values","qiymatlar"],["debugger","debagger"],["function","funksiya"],["switch","ozgarish"],["while","qachonki"],["Abstract","Abstrakt"],["abstract","abstrakt"],["interface","tuzilish"],["volatile","volatile"],["document","dokument"],["constructor","quruvchi"],["break","toxtash"],["finally","nihoyat"],["private","shaxsiy"],["public","ommaviy"],["throws","плюнуть"],["moveTo","oborish"],["error","xatolik"],["assign","tayinla"],["export","eksport"],["continue","tashla"],["default","defolt"],["return","qaytar"],["var","joyVar"],["Boolean","Mantiq"],["boolean","mantiq"],["Const","Doimiy"],["const","doimiy"],["import","ishlat"],["native","native"],["static","statik"],["synchronized","вписон"],["clear","tozala"],["URL","ssilka"],["value","qiymat"],["count","sanash"],["profile","profil"],["table","jadval"],["Array","massiv"],["map","toplam"],["then","shunda"],["Object","Obyekt"],["global","global"],["case","holat"],["catch","ushla"],["delete","ochir"],["do","bajar"],["finally","oxiri"],["for","uchun"],["default","oddiy"],["new","yangi"],["new","yengi"],["throw","otvor"],["with","bilan"],["class","klass"],["final","final"],["Float","Onlik"],["float","onlik"],["Int","Butun"],["int","butun"],["package","paket"],["Short","Kalta"],["short","kalta"],["super","super"],["alert","yozuv"],["focus","fokus"],["group","guruh"],["Math","Matem"],["all","hamma"],["else","unda"],["if","agar"],["yield*","ber*"],["try","urin"],["typeof","turi"],["void","bosh"],["with","with"],["Byte","Bayt"],["byte","bayt"],["Char","Ramz"],["char","ramz"],["Long","Uzun"],["long","uzun"],["||","yoki"],["moveBy","obor"],["search","izla"],["info","info"],["time","vaqt"],["catch","tut"],["yield","ber"],["this","shu"],["let","joy"],["Enum","Tur"],["enum","tur"],["goto","bor"],["transient","ахз"],["null","nol"],["NaN","NaN"],["false","yoq"],["eval","qil"],["===","==="],["close","yop"],["write","yoz"],["find","top"],["slice","kes"],["split","bol"],["log","log"],["from","dan"],["of","dan"],["in","in"],["true","ha"],["==","=="],[">=",">="],["<=","<="],["&&","va"],[";"," ;"],["++","++"],["--","--"],["of","of"],["{","{"],["}","}"],[">",">"],["<","<"],["=","="],["!","!"]]')}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var a=t[n]={exports:{}};return e[n].call(a.exports,a,a.exports,r),a.exports}r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();r(607)})(); 2 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,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SSxTQUdLbEQsUSxPQUFoQmdELEVBQU8sUyxpQkFFWCxNQUFPLENBQVAsRUFBT0EsVUEvQlMscUVBSFgsRUFBQWhDLFdBTWEsb0JBQVh4RixTQUVQZ0gsU0FBU1csaUJBQWlCLDRCQUE0QjVDLFFBQVF3QixHQUM5RFMsU0FBU1csaUJBQWlCLCtCQUErQjVDLFFBQVF3QixLLG9yR0NSakVxQixFQUEyQixHQUcvQixTQUFTQyxFQUFvQkMsR0FFNUIsSUFBSUMsRUFBZUgsRUFBeUJFLEdBQzVDLFFBQXFCRSxJQUFqQkQsRUFDSCxPQUFPQSxFQUFhakksUUFHckIsSUFBSUQsRUFBUytILEVBQXlCRSxHQUFZLENBR2pEaEksUUFBUyxJQU9WLE9BSEFtSSxFQUFvQkgsR0FBVTVJLEtBQUtXLEVBQU9DLFFBQVNELEVBQVFBLEVBQU9DLFFBQVMrSCxHQUdwRWhJLEVBQU9DLFFDckJmK0gsRUFBb0J0SCxFQUFJLFdBQ3ZCLEdBQTBCLGlCQUFmSyxXQUF5QixPQUFPQSxXQUMzQyxJQUNDLE9BQU9zSCxNQUFRLElBQUlqSSxTQUFTLGNBQWIsR0FDZCxNQUFPckIsR0FDUixHQUFzQixpQkFBWG9CLE9BQXFCLE9BQU9BLFFBTGpCLEdDR0U2SCxFQUFvQixNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vb3Ntb25zY3JpcHQvLi9ub2RlX21vZHVsZXMvZGVmaW5lLXByb3BlcnRpZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vb3Ntb25zY3JpcHQvLi9ub2RlX21vZHVsZXMvZ2xvYmFsdGhpcy9pbXBsZW1lbnRhdGlvbi5icm93c2VyLmpzIiwid2VicGFjazovL29zbW9uc2NyaXB0Ly4vbm9kZV9tb2R1bGVzL2dsb2JhbHRoaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vb3Ntb25zY3JpcHQvLi9ub2RlX21vZHVsZXMvZ2xvYmFsdGhpcy9wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly9vc21vbnNjcmlwdC8uL25vZGVfbW9kdWxlcy9nbG9iYWx0aGlzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vb3Ntb25zY3JpcHQvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW1wbGVtZW50YXRpb24uanMiLCJ3ZWJwYWNrOi8vb3Ntb25zY3JpcHQvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vb3Ntb25zY3JpcHQvLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vb3Ntb25zY3JpcHQvLi9zcmMvY29yZS50cyIsIndlYnBhY2s6Ly9vc21vbnNjcmlwdC8uL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9vc21vbnNjcmlwdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9vc21vbnNjcmlwdC93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL29zbW9uc2NyaXB0L3dlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sKCdmb28nKSA9PT0gJ3N5bWJvbCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBvcmlnRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gKGZuKSB7XG5cdHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgdG9TdHIuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIG9iaiA9IHt9O1xuXHR0cnkge1xuXHRcdG9yaWdEZWZpbmVQcm9wZXJ0eShvYmosICd4JywgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IG9iaiB9KTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cdFx0Zm9yICh2YXIgXyBpbiBvYmopIHsgLy8ganNjczppZ25vcmUgZGlzYWxsb3dVbnVzZWRWYXJpYWJsZXNcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIG9iai54ID09PSBvYmo7XG5cdH0gY2F0Y2ggKGUpIHsgLyogdGhpcyBpcyBJRSA4LiAqL1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gb3JpZ0RlZmluZVByb3BlcnR5ICYmIGFyZVByb3BlcnR5RGVzY3JpcHRvcnNTdXBwb3J0ZWQoKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgdmFsdWUsIHByZWRpY2F0ZSkge1xuXHRpZiAobmFtZSBpbiBvYmplY3QgJiYgKCFpc0Z1bmN0aW9uKHByZWRpY2F0ZSkgfHwgIXByZWRpY2F0ZSgpKSkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdG9yaWdEZWZpbmVQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvYmplY3RbbmFtZV0gPSB2YWx1ZTtcblx0fVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXApIHtcblx0dmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXHR2YXIgcHJvcHMgPSBrZXlzKG1hcCk7XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0cHJvcHMgPSBjb25jYXQuY2FsbChwcm9wcywgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcblx0fVxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wc1tpXSwgbWFwW3Byb3BzW2ldXSwgcHJlZGljYXRlc1twcm9wc1tpXV0pO1xuXHR9XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydGllcztcbiIsIi8qIGVzbGludCBuby1uZWdhdGVkLWNvbmRpdGlvbjogMCwgbm8tbmV3LWZ1bmM6IDAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG5cdG1vZHVsZS5leHBvcnRzID0gc2VsZjtcbn0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSB3aW5kb3c7XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIHNoaW0gPSByZXF1aXJlKCcuL3NoaW0nKTtcblxudmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblxudmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBvbHlmaWxsOyB9O1xuXG5kZWZpbmVQcm9wZXJ0aWVzKGdldEdsb2JhbCwge1xuXHRnZXRQb2x5ZmlsbDogZ2V0UG9seWZpbGwsXG5cdGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbixcblx0c2hpbTogc2hpbVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0R2xvYmFsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsICE9PSAnb2JqZWN0JyB8fCAhZ2xvYmFsIHx8IGdsb2JhbC5NYXRoICE9PSBNYXRoIHx8IGdsb2JhbC5BcnJheSAhPT0gQXJyYXkpIHtcblx0XHRyZXR1cm4gaW1wbGVtZW50YXRpb247XG5cdH1cblx0cmV0dXJuIGdsb2JhbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1HbG9iYWwoKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGlmIChkZWZpbmUuc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwb2x5ZmlsbCwgJ2dsb2JhbFRoaXMnKTtcblx0XHRpZiAoIWRlc2NyaXB0b3IgfHwgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlICYmIChkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZGVzY3JpcHRvci53cml0YWJsZSB8fCBnbG9iYWxUaGlzICE9PSBwb2x5ZmlsbCkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LWxlblxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHBvbHlmaWxsLCAnZ2xvYmFsVGhpcycsIHtcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdFx0dmFsdWU6IHBvbHlmaWxsLFxuXHRcdFx0XHR3cml0YWJsZTogZmFsc2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0fSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ29iamVjdCcgfHwgZ2xvYmFsVGhpcyAhPT0gcG9seWZpbGwpIHtcblx0XHRwb2x5ZmlsbC5nbG9iYWxUaGlzID0gcG9seWZpbGw7XG5cdH1cblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtleXNTaGltO1xuaWYgKCFPYmplY3Qua2V5cykge1xuXHQvLyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbVxuXHR2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblx0dmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnbG9iYWwtcmVxdWlyZVxuXHR2YXIgaXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblx0dmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bWVyYWJsZS5jYWxsKHsgdG9TdHJpbmc6IG51bGwgfSwgJ3RvU3RyaW5nJyk7XG5cdHZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW1lcmFibGUuY2FsbChmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuXHR2YXIgZG9udEVudW1zID0gW1xuXHRcdCd0b1N0cmluZycsXG5cdFx0J3RvTG9jYWxlU3RyaW5nJyxcblx0XHQndmFsdWVPZicsXG5cdFx0J2hhc093blByb3BlcnR5Jyxcblx0XHQnaXNQcm90b3R5cGVPZicsXG5cdFx0J3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcblx0XHQnY29uc3RydWN0b3InXG5cdF07XG5cdHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0dmFyIGN0b3IgPSBvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xuXHR9O1xuXHR2YXIgZXhjbHVkZWRLZXlzID0ge1xuXHRcdCRhcHBsaWNhdGlvbkNhY2hlOiB0cnVlLFxuXHRcdCRjb25zb2xlOiB0cnVlLFxuXHRcdCRleHRlcm5hbDogdHJ1ZSxcblx0XHQkZnJhbWU6IHRydWUsXG5cdFx0JGZyYW1lRWxlbWVudDogdHJ1ZSxcblx0XHQkZnJhbWVzOiB0cnVlLFxuXHRcdCRpbm5lckhlaWdodDogdHJ1ZSxcblx0XHQkaW5uZXJXaWR0aDogdHJ1ZSxcblx0XHQkb25tb3pmdWxsc2NyZWVuY2hhbmdlOiB0cnVlLFxuXHRcdCRvbm1vemZ1bGxzY3JlZW5lcnJvcjogdHJ1ZSxcblx0XHQkb3V0ZXJIZWlnaHQ6IHRydWUsXG5cdFx0JG91dGVyV2lkdGg6IHRydWUsXG5cdFx0JHBhZ2VYT2Zmc2V0OiB0cnVlLFxuXHRcdCRwYWdlWU9mZnNldDogdHJ1ZSxcblx0XHQkcGFyZW50OiB0cnVlLFxuXHRcdCRzY3JvbGxMZWZ0OiB0cnVlLFxuXHRcdCRzY3JvbGxUb3A6IHRydWUsXG5cdFx0JHNjcm9sbFg6IHRydWUsXG5cdFx0JHNjcm9sbFk6IHRydWUsXG5cdFx0JHNlbGY6IHRydWUsXG5cdFx0JHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcblx0XHQkd2Via2l0U3RvcmFnZUluZm86IHRydWUsXG5cdFx0JHdpbmRvdzogdHJ1ZVxuXHR9O1xuXHR2YXIgaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnID0gKGZ1bmN0aW9uICgpIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGZvciAodmFyIGsgaW4gd2luZG93KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBoYXMuY2FsbCh3aW5kb3csIGspICYmIHdpbmRvd1trXSAhPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93W2tdID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSh3aW5kb3dba10pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9KCkpO1xuXHR2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5ID0gZnVuY3Rpb24gKG8pIHtcblx0XHQvKiBnbG9iYWwgd2luZG93ICovXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXG5cdGtleXNTaGltID0gZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcblx0XHR2YXIgaXNPYmplY3QgPSBvYmplY3QgIT09IG51bGwgJiYgdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCc7XG5cdFx0dmFyIGlzRnVuY3Rpb24gPSB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdFx0dmFyIGlzQXJndW1lbnRzID0gaXNBcmdzKG9iamVjdCk7XG5cdFx0dmFyIGlzU3RyaW5nID0gaXNPYmplY3QgJiYgdG9TdHIuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBTdHJpbmddJztcblx0XHR2YXIgdGhlS2V5cyA9IFtdO1xuXG5cdFx0aWYgKCFpc09iamVjdCAmJiAhaXNGdW5jdGlvbiAmJiAhaXNBcmd1bWVudHMpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcblx0XHR9XG5cblx0XHR2YXIgc2tpcFByb3RvID0gaGFzUHJvdG9FbnVtQnVnICYmIGlzRnVuY3Rpb247XG5cdFx0aWYgKGlzU3RyaW5nICYmIG9iamVjdC5sZW5ndGggPiAwICYmICFoYXMuY2FsbChvYmplY3QsIDApKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKGkpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNBcmd1bWVudHMgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgb2JqZWN0Lmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcoaikpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKHZhciBuYW1lIGluIG9iamVjdCkge1xuXHRcdFx0XHRpZiAoIShza2lwUHJvdG8gJiYgbmFtZSA9PT0gJ3Byb3RvdHlwZScpICYmIGhhcy5jYWxsKG9iamVjdCwgbmFtZSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goU3RyaW5nKG5hbWUpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoYXNEb250RW51bUJ1Zykge1xuXHRcdFx0dmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuXG5cdFx0XHRmb3IgKHZhciBrID0gMDsgayA8IGRvbnRFbnVtcy5sZW5ndGg7ICsraykge1xuXHRcdFx0XHRpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW1zW2tdID09PSAnY29uc3RydWN0b3InKSAmJiBoYXMuY2FsbChvYmplY3QsIGRvbnRFbnVtc1trXSkpIHtcblx0XHRcdFx0XHR0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhlS2V5cztcblx0fTtcbn1cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBpc0FyZ3MgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyk7XG5cbnZhciBvcmlnS2V5cyA9IE9iamVjdC5rZXlzO1xudmFyIGtleXNTaGltID0gb3JpZ0tleXMgPyBmdW5jdGlvbiBrZXlzKG8pIHsgcmV0dXJuIG9yaWdLZXlzKG8pOyB9IDogcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG52YXIgb3JpZ2luYWxLZXlzID0gT2JqZWN0LmtleXM7XG5cbmtleXNTaGltLnNoaW0gPSBmdW5jdGlvbiBzaGltT2JqZWN0S2V5cygpIHtcblx0aWYgKE9iamVjdC5rZXlzKSB7XG5cdFx0dmFyIGtleXNXb3Jrc1dpdGhBcmd1bWVudHMgPSAoZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gU2FmYXJpIDUuMCBidWdcblx0XHRcdHZhciBhcmdzID0gT2JqZWN0LmtleXMoYXJndW1lbnRzKTtcblx0XHRcdHJldHVybiBhcmdzICYmIGFyZ3MubGVuZ3RoID09PSBhcmd1bWVudHMubGVuZ3RoO1xuXHRcdH0oMSwgMikpO1xuXHRcdGlmICgha2V5c1dvcmtzV2l0aEFyZ3VtZW50cykge1xuXHRcdFx0T2JqZWN0LmtleXMgPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuXHRcdFx0XHRpZiAoaXNBcmdzKG9iamVjdCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxLZXlzKHNsaWNlLmNhbGwob2JqZWN0KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9yaWdpbmFsS2V5cyhvYmplY3QpO1xuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0T2JqZWN0LmtleXMgPSBrZXlzU2hpbTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMgfHwga2V5c1NoaW07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNTaGltO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG5cdHZhciBzdHIgPSB0b1N0ci5jYWxsKHZhbHVlKTtcblx0dmFyIGlzQXJncyA9IHN0ciA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG5cdGlmICghaXNBcmdzKSB7XG5cdFx0aXNBcmdzID0gc3RyICE9PSAnW29iamVjdCBBcnJheV0nICYmXG5cdFx0XHR2YWx1ZSAhPT0gbnVsbCAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuXHRcdFx0dHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcicgJiZcblx0XHRcdHZhbHVlLmxlbmd0aCA+PSAwICYmXG5cdFx0XHR0b1N0ci5jYWxsKHZhbHVlLmNhbGxlZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdH1cblx0cmV0dXJuIGlzQXJncztcbn07XG4iLCJpbXBvcnQgcG9seWZpbGwgZnJvbSAnZ2xvYmFsdGhpcyc7XG5pbXBvcnQgZGljdGlvbmFyeSBmcm9tICcuL2RpY3Rpb25hcnkvc29ydGVkT3Ntb24uanNvbic7XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHI6IHN0cmluZykge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcblxuICAgIGlmICgvXlxcdyskLy50ZXN0KHN0cikpIHtcbiAgICAgICAgc3RyID0gJ1xcXFxiJyArIHN0ciArICdcXFxcYic7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24geW9wdFJlcGxhY2VBbGwoc3RyOiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ0V4cChzZWFyY2gpLCAnZycpO1xuICAgIHJldHVybiBzdHIucmVwbGFjZShyZSwgcmVwbGFjZW1lbnQpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB0ZXh0INGC0LXQutGB0YIsINC/0L4g0LrQvtGC0L7RgNC+0LzRgyDRgdC70LXQtNGD0LXRgiDQv9GA0L7QudGC0LjRgdGMXG4gKiBAcGFyYW0gdG8g0Y/Qt9GL0Log0YLQtdC60YHRgtCwICgneXMnIG9yICdqcycpXG4gKi9cbmZ1bmN0aW9uIGl0ZXJhdGVUZXh0KHRleHQ6IHN0cmluZywgdG86ICdqcycgfCAnb3NtJyA9ICdvc20nKSB7XG4gICAgY29uc3QgbGFuZ0NvbCA9IHRvID09PSAnb3NtJyA/IDEgOiAwO1xuICAgIGNvbnN0IGRpY2sgPSBkaWN0aW9uYXJ5O1xuICAgIGRpY2suc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhbCA9IGFbbGFuZ0NvbF0ubGVuZ3RoO1xuICAgICAgICBjb25zdCBibCA9IGJbbGFuZ0NvbF0ubGVuZ3RoO1xuICAgICAgICByZXR1cm4gYmwgLSBhbDtcbiAgICB9KS5mb3JFYWNoKFxuICAgICAgICAocGFpcikgPT4gKHRleHQgPSB5b3B0UmVwbGFjZUFsbCh0ZXh0LCBwYWlyW2xhbmdDb2xdLCBwYWlyWyshbGFuZ0NvbF0pKVxuICAgICk7XG5cbiAgICByZXR1cm4gdGV4dDtcbn1cblxuLyoqXG5jb252ZXJ0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGUodGV4dDogc3RyaW5nLCBsYW5nOiAnanMnIHwgJ29zbScgPSAnb3NtJyk6IHN0cmluZyB7XG4gICAgLyogdGV4dCAtIHRleHQgZm9yIHJlcGxhY2VcbiAgICAgKiBsYW5nIC0gbGFuZ1xuICAgICAqL1xuICAgIGludGVyZmFjZSBMaXRlcmFscyB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9XG4gICAgY29uc3QgY29tbWVudFJlZ0V4cCA9IC8oKD86XFwvXFwqKD86W14qXXwoPzpcXCorW14qXFwvXSkpKlxcKitcXC8pfCg/OlxcL1xcLy4qKSkvZztcbiAgICBjb25zdCB0bXBUb2tlbiA9ICd5c18nICsgbmV3IERhdGUoKS5nZXRUaW1lKCkgKyAnXyc7XG4gICAgY29uc3QgclN0cmluZ0xpdGVyYWxzOiBMaXRlcmFscyA9IHt9O1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoXG4gICAgICAgIC9cXFwiKD86XFxcXC58W15cXFwiXFxcXF0pKlxcXCJ8XFwnKD86XFxcXC58W15cXCdcXFxcXSkqXFwnL2csXG4gICAgICAgIGZ1bmN0aW9uICh2YWwsIHBvcykge1xuICAgICAgICAgICAgY29uc3QgbmVlZEtleSA9IHRtcFRva2VuICsgcG9zO1xuICAgICAgICAgICAgclN0cmluZ0xpdGVyYWxzW25lZWRLZXldID0gdmFsO1xuICAgICAgICAgICAgcmV0dXJuIG5lZWRLZXk7XG4gICAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IGNvbW1lbnRzQXJyYXkgPSB0ZXh0Lm1hdGNoKGNvbW1lbnRSZWdFeHApIHx8IFtdO1xuICAgIHRleHQgPSBpdGVyYXRlVGV4dCh0ZXh0LCBsYW5nKTtcbiAgICAvLyBjb21lYmFjayBjb21tZW50c1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoY29tbWVudFJlZ0V4cCwgKCkgPT4gY29tbWVudHNBcnJheS5zaGlmdCgpIHx8ICcnKTtcbiAgICAvLyBjb21lYmFjayBzdHJpbmdzXG4gICAgZm9yIChjb25zdCBrZXkgaW4gclN0cmluZ0xpdGVyYWxzKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2Uoa2V5LCByU3RyaW5nTGl0ZXJhbHNba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xufVxuXG4vLyB0byBnbG9iYWxzXG5jb25zdCBnbG9iYWxUaGlzID0gcG9seWZpbGwoKSBhcyBhbnk7XG5nbG9iYWxUaGlzLnlvcHRhID0gY29tcGlsZTtcbiIsImltcG9ydCB7IGNvbXBpbGUgfSBmcm9tICcuL2NvcmUnO1xuXG4vLyBleHBvcnQgZm9yIG1vZHVsZVxuZXhwb3J0IHsgY29tcGlsZSBhcyB5b3B0YSB9O1xuXG4vLyBmaW5kIHNjcmlwdHNcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vZ2V0IG9zbW9uIGZyb20gc2NyaXB0XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2xhbmd1YWdlPVwib3Ntb25zY3JpcHRcIl0nKS5mb3JFYWNoKHlvcHRhVG9Kcyk7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3R5cGU9XCJ0ZXh0L3gtb3Ntb25zY3JpcHRcIl0nKS5mb3JFYWNoKHlvcHRhVG9Kcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHlvcHRhVG9KcyhzY3JpcHROb2RlOiBFbGVtZW50KSB7XG4gICAgaWYgKHNjcmlwdE5vZGUucGFyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAvL2dldCBvc20gZnJvbSBzY3JpcHRcbiAgICAgICAgY29uc3QgeW9wdGFUZXh0OiBzdHJpbmcgPVxuICAgICAgICAgICAgc2NyaXB0Tm9kZS50ZXh0Q29udGVudCB8fCAoYXdhaXQgZ2V0VHh0RnJvbVNyYyhzY3JpcHROb2RlKSk7XG4gICAgICAgIC8vcmVtb3ZlIG9sZCBzY3JpcHRcbiAgICAgICAgc2NyaXB0Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdE5vZGUpO1xuICAgICAgICAvL2NyZWF0ZSBtaXhlZCBzY3JpcHRcbiAgICAgICAgYWRkU2NyaXB0Tm9kZShjb21waWxlKHlvcHRhVGV4dCwgJ29zbScpKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFR4dEZyb21TcmMobm9kZTogRWxlbWVudCkge1xuICAgIC8vZmluZCBzcmNzXG4gICAgY29uc3Qgc3JjID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgIGxldCByZXNwID0gJyc7XG4gICAgaWYgKHNyYyAhPT0gbnVsbCAmJiBzcmMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZlID0gYXdhaXQgZmV0Y2goc3JjLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzcCA9IGF3YWl0IGZlLnRleHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3A7XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdE5vZGUoY29tcGlsZWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5pbm5lckhUTUwgPSBjb21waWxlZDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNjA3KTtcbiJdLCJuYW1lcyI6WyJrZXlzIiwiaGFzU3ltYm9scyIsIlN5bWJvbCIsInRvU3RyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjb25jYXQiLCJBcnJheSIsIm9yaWdEZWZpbmVQcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5Iiwic3VwcG9ydHNEZXNjcmlwdG9ycyIsIm9iaiIsIl8iLCJlbnVtZXJhYmxlIiwidmFsdWUiLCJ4IiwiZSIsImFyZVByb3BlcnR5RGVzY3JpcHRvcnNTdXBwb3J0ZWQiLCJvYmplY3QiLCJuYW1lIiwicHJlZGljYXRlIiwiZm4iLCJjYWxsIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJkZWZpbmVQcm9wZXJ0aWVzIiwibWFwIiwicHJlZGljYXRlcyIsImFyZ3VtZW50cyIsImxlbmd0aCIsInByb3BzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiaSIsIm1vZHVsZSIsImV4cG9ydHMiLCJzZWxmIiwid2luZG93IiwiRnVuY3Rpb24iLCJpbXBsZW1lbnRhdGlvbiIsImdldFBvbHlmaWxsIiwic2hpbSIsInBvbHlmaWxsIiwiZ2V0R2xvYmFsIiwiZyIsIk1hdGgiLCJkZWZpbmUiLCJkZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ2xvYmFsVGhpcyIsImtleXNTaGltIiwiaGFzIiwiaGFzT3duUHJvcGVydHkiLCJpc0FyZ3MiLCJpc0VudW1lcmFibGUiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImhhc0RvbnRFbnVtQnVnIiwiaGFzUHJvdG9FbnVtQnVnIiwiZG9udEVudW1zIiwiZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUiLCJvIiwiY3RvciIsImNvbnN0cnVjdG9yIiwiZXhjbHVkZWRLZXlzIiwiJGFwcGxpY2F0aW9uQ2FjaGUiLCIkY29uc29sZSIsIiRleHRlcm5hbCIsIiRmcmFtZSIsIiRmcmFtZUVsZW1lbnQiLCIkZnJhbWVzIiwiJGlubmVySGVpZ2h0IiwiJGlubmVyV2lkdGgiLCIkb25tb3pmdWxsc2NyZWVuY2hhbmdlIiwiJG9ubW96ZnVsbHNjcmVlbmVycm9yIiwiJG91dGVySGVpZ2h0IiwiJG91dGVyV2lkdGgiLCIkcGFnZVhPZmZzZXQiLCIkcGFnZVlPZmZzZXQiLCIkcGFyZW50IiwiJHNjcm9sbExlZnQiLCIkc2Nyb2xsVG9wIiwiJHNjcm9sbFgiLCIkc2Nyb2xsWSIsIiRzZWxmIiwiJHdlYmtpdEluZGV4ZWREQiIsIiR3ZWJraXRTdG9yYWdlSW5mbyIsIiR3aW5kb3ciLCJoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWciLCJrIiwiaXNPYmplY3QiLCJpc0Z1bmN0aW9uIiwiaXNBcmd1bWVudHMiLCJpc1N0cmluZyIsInRoZUtleXMiLCJUeXBlRXJyb3IiLCJza2lwUHJvdG8iLCJwdXNoIiwiU3RyaW5nIiwiaiIsInNraXBDb25zdHJ1Y3RvciIsImVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneSIsInNsaWNlIiwib3JpZ0tleXMiLCJvcmlnaW5hbEtleXMiLCJrZXlzV29ya3NXaXRoQXJndW1lbnRzIiwiYXJncyIsInN0ciIsImNhbGxlZSIsIml0ZXJhdGVUZXh0IiwidGV4dCIsInRvIiwibGFuZ0NvbCIsInNvcnQiLCJhIiwiYiIsImFsIiwiZm9yRWFjaCIsInBhaXIiLCJzZWFyY2giLCJyZXBsYWNlbWVudCIsInJlIiwiUmVnRXhwIiwicmVwbGFjZSIsInRlc3QiLCJlc2NhcGVSZWdFeHAiLCJjb21waWxlIiwibGFuZyIsImNvbW1lbnRSZWdFeHAiLCJ0bXBUb2tlbiIsIkRhdGUiLCJnZXRUaW1lIiwiclN0cmluZ0xpdGVyYWxzIiwiY29tbWVudHNBcnJheSIsInZhbCIsInBvcyIsIm5lZWRLZXkiLCJtYXRjaCIsImtleSIsInNoaWZ0IiwieW9wdGEiLCJ5b3B0YVRvSnMiLCJzY3JpcHROb2RlIiwicGFyZW50Tm9kZSIsInRleHRDb250ZW50IiwiZ2V0VHh0RnJvbVNyYyIsInlvcHRhVGV4dCIsInJlbW92ZUNoaWxkIiwiY29tcGlsZWQiLCJzY3JpcHQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lckhUTUwiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJub2RlIiwic3JjIiwiZ2V0QXR0cmlidXRlIiwicmVzcCIsImZldGNoIiwibWV0aG9kIiwicXVlcnlTZWxlY3RvckFsbCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsInVuZGVmaW5lZCIsIl9fd2VicGFja19tb2R1bGVzX18iLCJ0aGlzIl0sInNvdXJjZVJvb3QiOiIifQ== --------------------------------------------------------------------------------