PageSourceSearch

https://www.raiplaysound.it/assets/js/raiPredict_v2.js

js raiplaysound.it collected 2026-09-24 08:41:28 UTC 302,434 bytes, 1 lines download raw bytes

1(function(){var __webpack_modules__={880:function(module){eval('{!function(e,t){ true?module.exports=t():0}(this,(function(){return function(e){var t={};function r(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,i){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(i,n,function(t){return e[t]}.bind(null,n));return i},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=90)}({17:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var i=r(18),n=function(){function e(){}return e.getFirstMatch=function(e,t){var r=t.match(e);return r&&r.length>0&&r[1]||""},e.getSecondMatch=function(e,t){var r=t.match(e);return r&&r.length>1&&r[2]||""},e.matchAndReturnConst=function(e,t,r){if(e.test(t))return r},e.getWindowsVersionName=function(e){switch(e){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}},e.getMacOSVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));t.push(0);var r=t[0],i=t[1];if(10===r)switch(i){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return}switch(r){case 11:return"Big Sur";case 12:return"Monterey";case 13:return"Ventura";case 14:return"Sonoma";case 15:return"Sequoia";default:return}},e.getAndroidVersionName=function(e){var t=e.split(".").splice(0,2).map((function(e){return parseInt(e,10)||0}));if(t.push(0),!(1===t[0]&&t[1]<5))return 1===t[0]&&t[1]<6?"Cupcake":1===t[0]&&t[1]>=6?"Donut":2===t[0]&&t[1]<2?"Eclair":2===t[0]&&2===t[1]?"Froyo":2===t[0]&&t[1]>2?"Gingerbread":3===t[0]?"Honeycomb":4===t[0]&&t[1]<1?"Ice Cream Sandwich":4===t[0]&&t[1]<4?"Jelly Bean":4===t[0]&&t[1]>=4?"KitKat":5===t[0]?"Lollipop":6===t[0]?"Marshmallow":7===t[0]?"Nougat":8===t[0]?"Oreo":9===t[0]?"Pie":void 0},e.getVersionPrecision=function(e){return e.split(".").length},e.compareVersions=function(t,r,i){void 0===i&&(i=!1);var n=e.getVersionPrecision(t),a=e.getVersionPrecision(r),o=Math.max(n,a),s=0,u=e.map([t,r],(function(t){var r=o-e.getVersionPrecision(t),i=t+new Array(r+1).join(".0");return e.map(i.split("."),(function(e){return new Array(20-e.length).join("0")+e})).reverse()}));for(i&&(s=o-Math.min(n,a)),o-=1;o>=s;){if(u[0][o]>u[1][o])return 1;if(u[0][o]===u[1][o]){if(o===s)return 0;o-=1}else if(u[0][o]<u[1][o])return-1}},e.map=function(e,t){var r,i=[];if(Array.prototype.map)return Array.prototype.map.call(e,t);for(r=0;r<e.length;r+=1)i.push(t(e[r]));return i},e.find=function(e,t){var r,i;if(Array.prototype.find)return Array.prototype.find.call(e,t);for(r=0,i=e.length;r<i;r+=1){var n=e[r];if(t(n,r))return n}},e.assign=function(e){for(var t,r,i=e,n=arguments.length,a=new Array(n>1?n-1:0),o=1;o<n;o++)a[o-1]=arguments[o];if(Object.assign)return Object.assign.apply(Object,[e].concat(a));var s=function(){var e=a[t];"object"==typeof e&&null!==e&&Object.keys(e).forEach((function(t){i[t]=e[t]}))};for(t=0,r=a.length;t<r;t+=1)s();return e},e.getBrowserAlias=function(e){return i.BROWSER_ALIASES_MAP[e]},e.getBrowserTypeByAlias=function(e){return i.BROWSER_MAP[e]||""},e}();t.default=n,e.exports=t.default},18:function(e,t,r){"use strict";t.__esModule=!0,t.ENGINE_MAP=t.OS_MAP=t.PLATFORMS_MAP=t.BROWSER_MAP=t.BROWSER_ALIASES_MAP=void 0;t.BROWSER_ALIASES_MAP={AmazonBot:"amazonbot","Amazon Silk":"amazon_silk","Android Browser":"android",BaiduSpider:"baiduspider",Bada:"bada",BingCrawler:"bingcrawler",Brave:"brave",BlackBerry:"blackberry","ChatGPT-User":"chatgpt_user",Chrome:"chrome",ClaudeBot:"claudebot",Chromium:"chromium",Diffbot:"diffbot",DuckDuckBot:"duckduckbot",DuckDuckGo:"duckduckgo",Electron:"electron",Epiphany:"epiphany",FacebookExternalHit:"facebookexternalhit",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot",GPTBot:"gptbot","Internet Explorer":"ie",InternetArchiveCrawler:"internetarchivecrawler","K-Meleon":"k_meleon",LibreWolf:"librewolf",Linespider:"linespider",Maxthon:"maxthon","Meta-ExternalAds":"meta_externalads","Meta-ExternalAgent":"meta_externalagent","Meta-ExternalFetcher":"meta_externalfetcher","Meta-WebIndexer":"meta_webindexer","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver","OAI-SearchBot":"oai_searchbot",Omgilibot:"omgilibot",Opera:"opera","Opera Coast":"opera_coast","Pale Moon":"pale_moon",PerplexityBot:"perplexitybot","Perplexity-User":"perplexity_user",PhantomJS:"phantomjs",PingdomBot:"pingdombot",Puffin:"puffin",QQ:"qq",QQLite:"qqlite",QupZilla:"qupzilla",Roku:"roku",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SlackBot:"slackbot",SeaMonkey:"seamonkey",Sleipnir:"sleipnir","Sogou Browser":"sogou",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat",YahooSlurp:"yahooslurp","Yandex Browser":"yandex",YandexBot:"yandexbot",YouBot:"youbot"};t.BROWSER_MAP={amazonbot:"AmazonBot",amazon_silk:"Amazon Silk",android:"Android Browser",baiduspider:"BaiduSpider",bada:"Bada",bingcrawler:"BingCrawler",blackberry:"BlackBerry",brave:"Brave",chatgpt_user:"ChatGPT-User",chrome:"Chrome",claudebot:"ClaudeBot",chromium:"Chromium",diffbot:"Diffbot",duckduckbot:"DuckDuckBot",duckduckgo:"DuckDuckGo",edge:"Microsoft Edge",electron:"Electron",epiphany:"Epiphany",facebookexternalhit:"FacebookExternalHit",firefox:"Firefox",focus:"Focus",generic:"Generic",google_search:"Google Search",googlebot:"Googlebot",gptbot:"GPTBot",ie:"Internet Explorer",internetarchivecrawler:"InternetArchiveCrawler",k_meleon:"K-Meleon",librewolf:"LibreWolf",linespider:"Linespider",maxthon:"Maxthon",meta_externalads:"Meta-ExternalAds",meta_externalagent:"Meta-ExternalAgent",meta_externalfetcher:"Meta-ExternalFetcher",meta_webindexer:"Meta-WebIndexer",mz:"MZ Browser",naver:"NAVER Whale Browser",oai_searchbot:"OAI-SearchBot",omgilibot:"Omgilibot",opera:"Opera",opera_coast:"Opera Coast",pale_moon:"Pale Moon",perplexitybot:"PerplexityBot",perplexity_user:"Perplexity-User",phantomjs:"PhantomJS",pingdombot:"PingdomBot",puffin:"Puffin",qq:"QQ Browser",qqlite:"QQ Browser Lite",qupzilla:"QupZilla",roku:"Roku",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",slackbot:"SlackBot",sleipnir:"Sleipnir",sogou:"Sogou Browser",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yahooslurp:"YahooSlurp",yandex:"Yandex Browser",yandexbot:"YandexBot",youbot:"YouBot"};t.PLATFORMS_MAP={bot:"bot",desktop:"desktop",mobile:"mobile",tablet:"tablet",tv:"tv"};t.OS_MAP={Android:"Android",Bada:"Bada",BlackBerry:"BlackBerry",ChromeOS:"Chrome OS",HarmonyOS:"HarmonyOS",iOS:"iOS",Linux:"Linux",MacOS:"macOS",PlayStation4:"PlayStation 4",Roku:"Roku",Tizen:"Tizen",WebOS:"WebOS",Windows:"Windows",WindowsPhone:"Windows Phone"};t.ENGINE_MAP={Blink:"Blink",EdgeHTML:"EdgeHTML",Gecko:"Gecko",Presto:"Presto",Trident:"Trident",WebKit:"WebKit"}},90:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var i,n=(i=r(91))&&i.__esModule?i:{default:i},a=r(18);function o(e,t){for(var r=0;r<t.length;r++){var i=t[r];
vendor: 10,865 bytes, line 1
1i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}var s=function(){function e(){}var t,r,i;return e.getParser=function(e,t,r){if(void 0===t&&(t=!1),void 0===r&&(r=null),"string"!=typeof e)throw new Error("UserAgent should be a string");return new n.default(e,t,r)},e.parse=function(e,t){return void 0===t&&(t=null),new n.default(e,t).getResult()},t=e,i=[{key:"BROWSER_MAP",get:function(){return a.BROWSER_MAP}},{key:"ENGINE_MAP",get:function(){return a.ENGINE_MAP}},{key:"OS_MAP",get:function(){return a.OS_MAP}},{key:"PLATFORMS_MAP",get:function(){return a.PLATFORMS_MAP}}],(r=null)&&o(t.prototype,r),i&&o(t,i),e}();t.default=s,e.exports=t.default},91:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var i=u(r(92)),n=u(r(93)),a=u(r(94)),o=u(r(95)),s=u(r(17));function u(e){return e&&e.__esModule?e:{default:e}}var d=function(){function e(e,t,r){if(void 0===t&&(t=!1),void 0===r&&(r=null),null==e||""===e)throw new Error("UserAgent parameter can\'t be empty");this._ua=e;var i=!1;"boolean"==typeof t?(i=t,this._hints=r):this._hints=null!=t&&"object"==typeof t?t:null,this.parsedResult={},!0!==i&&this.parse()}var t=e.prototype;return t.getHints=function(){return this._hints},t.hasBrand=function(e){if(!this._hints||!Array.isArray(this._hints.brands))return!1;var t=e.toLowerCase();return this._hints.brands.some((function(e){return e.brand&&e.brand.toLowerCase()===t}))},t.getBrandVersion=function(e){if(this._hints&&Array.isArray(this._hints.brands)){var t=e.toLowerCase(),r=this._hints.brands.find((function(e){return e.brand&&e.brand.toLowerCase()===t}));return r?r.version:void 0}},t.getUA=function(){return this._ua},t.test=function(e){return e.test(this._ua)},t.parseBrowser=function(){var e=this;this.parsedResult.browser={};var t=s.default.find(i.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))return t.test.some((function(t){return e.test(t)}));throw new Error("Browser\'s test function is not valid")}));return t&&(this.parsedResult.browser=t.describe(this.getUA(),this)),this.parsedResult.browser},t.getBrowser=function(){return this.parsedResult.browser?this.parsedResult.browser:this.parseBrowser()},t.getBrowserName=function(e){return e?String(this.getBrowser().name).toLowerCase()||"":this.getBrowser().name||""},t.getBrowserVersion=function(){return this.getBrowser().version},t.getOS=function(){return this.parsedResult.os?this.parsedResult.os:this.parseOS()},t.parseOS=function(){var e=this;this.parsedResult.os={};var t=s.default.find(n.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))return t.test.some((function(t){return e.test(t)}));throw new Error("Browser\'s test function is not valid")}));return t&&(this.parsedResult.os=t.describe(this.getUA())),this.parsedResult.os},t.getOSName=function(e){var t=this.getOS().name;return e?String(t).toLowerCase()||"":t||""},t.getOSVersion=function(){return this.getOS().version},t.getPlatform=function(){return this.parsedResult.platform?this.parsedResult.platform:this.parsePlatform()},t.getPlatformType=function(e){void 0===e&&(e=!1);var t=this.getPlatform().type;return e?String(t).toLowerCase()||"":t||""},t.parsePlatform=function(){var e=this;this.parsedResult.platform={};var t=s.default.find(a.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))return t.test.some((function(t){return e.test(t)}));throw new Error("Browser\'s test function is not valid")}));return t&&(this.parsedResult.platform=t.describe(this.getUA())),this.parsedResult.platform},t.getEngine=function(){return this.parsedResult.engine?this.parsedResult.engine:this.parseEngine()},t.getEngineName=function(e){return e?String(this.getEngine().name).toLowerCase()||"":this.getEngine().name||""},t.parseEngine=function(){var e=this;this.parsedResult.engine={};var t=s.default.find(o.default,(function(t){if("function"==typeof t.test)return t.test(e);if(Array.isArray(t.test))return t.test.some((function(t){return e.test(t)}));throw new Error("Browser\'s test function is not valid")}));return t&&(this.parsedResult.engine=t.describe(this.getUA())),this.parsedResult.engine},t.parse=function(){return this.parseBrowser(),this.parseOS(),this.parsePlatform(),this.parseEngine(),this},t.getResult=function(){return s.default.assign({},this.parsedResult)},t.satisfies=function(e){var t=this,r={},i=0,n={},a=0;if(Object.keys(e).forEach((function(t){var o=e[t];"string"==typeof o?(n[t]=o,a+=1):"object"==typeof o&&(r[t]=o,i+=1)})),i>0){var o=Object.keys(r),u=s.default.find(o,(function(e){return t.isOS(e)}));if(u){var d=this.satisfies(r[u]);if(void 0!==d)return d}var c=s.default.find(o,(function(e){return t.isPlatform(e)}));if(c){var f=this.satisfies(r[c]);if(void 0!==f)return f}}if(a>0){var l=Object.keys(n),b=s.default.find(l,(function(e){return t.isBrowser(e,!0)}));if(void 0!==b)return this.compareVersion(n[b])}},t.isBrowser=function(e,t){void 0===t&&(t=!1);var r=this.getBrowserName().toLowerCase(),i=e.toLowerCase(),n=s.default.getBrowserTypeByAlias(i);return t&&n&&(i=n.toLowerCase()),i===r},t.compareVersion=function(e){var t=[0],r=e,i=!1,n=this.getBrowserVersion();if("string"==typeof n)return">"===e[0]||"<"===e[0]?(r=e.substr(1),"="===e[1]?(i=!0,r=e.substr(2)):t=[],">"===e[0]?t.push(1):t.push(-1)):"="===e[0]?r=e.substr(1):"~"===e[0]&&(i=!0,r=e.substr(1)),t.indexOf(s.default.compareVersions(n,r,i))>-1},t.isOS=function(e){return this.getOSName(!0)===String(e).toLowerCase()},t.isPlatform=function(e){return this.getPlatformType(!0)===String(e).toLowerCase()},t.isEngine=function(e){return this.getEngineName(!0)===String(e).toLowerCase()},t.is=function(e,t){return void 0===t&&(t=!1),this.isBrowser(e,t)||this.isOS(e)||this.isPlatform(e)},t.some=function(e){var t=this;return void 0===e&&(e=[]),e.some((function(e){return t.is(e)}))},e}();t.default=d,e.exports=t.default},92:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i};var a=/version\\/(\\d+(\\.?_?\\d+)+)/i,o=[{test:[/gptbot/i],describe:function(e){var t={name:"GPTBot"},r=n.default.getFirstMatch(/gptbot\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/chatgpt-user/i],describe:function(e){var t={name:"ChatGPT-User"},r=n.default.getFirstMatch(/chatgpt-user\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/oai-searchbot/i],describe:function(e){var t={name:"OAI-SearchBot"},r=n.default.getFirstMatch(/oai-searchbot\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe:function(e){var t={name:"ClaudeBot"},r=n.default.getFirstMatch(/(?:claudebot|claude-web|claude-user|claude-searchbot)\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/omgilibot/i,/webzio-extended/i],describe:function(e){var t={name:"Omgilibot"},r=n.default.getFirstMatch(/(?:omgilibot|webzio-extended)\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/diffbot/i],describe:function(e){var t={name:"Diffbot"},r=n.default.getFirstMatch(/diffbot\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/perplexitybot/i],describe:function(e){var t={name:"PerplexityBot"},r=n.default.getFirstMatch(/perplexitybot\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/perplexity-user/i],describe:function(e){var t={name:"Perplexity-User"},r=n.default.getFirstMatch(/perplexity-user\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/youbot/i],describe:function(e){var t={name:"YouBot"},r=n.default.getFirstMatch(/youbot\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-webindexer/i],describe:function(e){var t={name:"Meta-WebIndexer"},r=n.default.getFirstMatch(/meta-webindexer\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-externalads/i],describe:function(e){var t={name:"Meta-ExternalAds"},r=n.default.getFirstMatch(/meta-externalads\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-externalagent/i],describe:function(e){var t={name:"Meta-ExternalAgent"},r=n.default.getFirstMatch(/meta-externalagent\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/meta-externalfetcher/i],describe:function(e){var t={name:"Meta-ExternalFetcher"},r=n.default.getFirstMatch(/meta-externalfetcher\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/googlebot/i],describe:function(e){var t={name:"Googlebot"},r=n.default.getFirstMatch(/googlebot\\/(\\d+(\\.\\d+))/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/linespider/i],describe:function(e){var t={name:"Linespider"},r=n.default.getFirstMatch(/(?:linespider)(?:-[-\\w]+)?[\\s/](\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/amazonbot/i],describe:function(e){var t={name:"AmazonBot"},r=n.default.getFirstMatch(/amazonbot\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/bingbot/i],describe:function(e){var t={name:"BingCrawler"},r=n.default.getFirstMatch(/bingbot\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/baiduspider/i],describe:function(e){var t={name:"BaiduSpider"},r=n.default.getFirstMatch(/baiduspider\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/duckduckbot/i],describe:function(e){var t={name:"DuckDuckBot"},r=n.default.getFirstMatch(/duckduckbot\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/ia_archiver/i],describe:function(e){var t={name:"InternetArchiveCrawler"},r=n.default.getFirstMatch(/ia_archiver\\/(\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe:function(){return{name:"FacebookExternalHit"}}},{test:[/slackbot/i,/slack-imgProxy/i],describe:function(e){var t={name:"SlackBot"},r=n.default.getFirstMatch(/(?:slackbot|slack-imgproxy)(?:-[-\\w]+)?[\\s/](\\d+(\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/yahoo!?[\\s/]*slurp/i],describe:function(){return{name:"YahooSlurp"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe:function(){return{name:"YandexBot"}}},{test:[/pingdom/i],describe:function(){return{name:"PingdomBot"}}},{test:[/opera/i],describe:function(e){var t={name:"Opera"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:opera)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}}
1,{test:[/opr\\/|opios/i],describe:function(e){var t={name:"Opera"},r=n.default.getFirstMatch(/(?:opr|opios)[\\s/](\\S+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/SamsungBrowser/i],describe:function(e){var t={name:"Samsung Internet for Android"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:SamsungBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Whale/i],describe:function(e){var t={name:"NAVER Whale Browser"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:whale)[\\s/](\\d+(?:\\.\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/PaleMoon/i],describe:function(e){var t={name:"Pale Moon"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:PaleMoon)[\\s/](\\d+(?:\\.\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/MZBrowser/i],describe:function(e){var t={name:"MZ Browser"},r=n.default.getFirstMatch(/(?:MZBrowser)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/focus/i],describe:function(e){var t={name:"Focus"},r=n.default.getFirstMatch(/(?:focus)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/swing/i],describe:function(e){var t={name:"Swing"},r=n.default.getFirstMatch(/(?:swing)[\\s/](\\d+(?:\\.\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/coast/i],describe:function(e){var t={name:"Opera Coast"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:coast)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/opt\\/\\d+(?:.?_?\\d+)+/i],describe:function(e){var t={name:"Opera Touch"},r=n.default.getFirstMatch(/(?:opt)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/yabrowser/i],describe:function(e){var t={name:"Yandex Browser"},r=n.default.getFirstMatch(/(?:yabrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/ucbrowser/i],describe:function(e){var t={name:"UC Browser"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:ucbrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/Maxthon|mxios/i],describe:function(e){var t={name:"Maxthon"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:Maxthon|mxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/epiphany/i],describe:function(e){var t={name:"Epiphany"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:epiphany)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/puffin/i],describe:function(e){var t={name:"Puffin"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:puffin)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sleipnir/i],describe:function(e){var t={name:"Sleipnir"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:sleipnir)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/k-meleon/i],describe:function(e){var t={name:"K-Meleon"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/(?:k-meleon)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/micromessenger/i],describe:function(e){var t={name:"WeChat"},r=n.default.getFirstMatch(/(?:micromessenger)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/qqbrowser/i],describe:function(e){var t={name:/qqbrowserlite/i.test(e)?"QQ Browser Lite":"QQ Browser"},r=n.default.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\\d+(\\.?_?\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/msie|trident/i],describe:function(e){var t={name:"Internet Explorer"},r=n.default.getFirstMatch(/(?:msie |rv:)(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/\\sedg\\//i],describe:function(e){var t={name:"Microsoft Edge"},r=n.default.getFirstMatch(/\\sedg\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/edg([ea]|ios)/i],describe:function(e){var t={name:"Microsoft Edge"},r=n.default.getSecondMatch(/edg([ea]|ios)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/vivaldi/i],describe:function(e){var t={name:"Vivaldi"},r=n.default.getFirstMatch(/vivaldi\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/seamonkey/i],describe:function(e){var t={name:"SeaMonkey"},r=n.default.getFirstMatch(/seamonkey\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sailfish/i],describe:function(e){var t={name:"Sailfish"}
1,r=n.default.getFirstMatch(/sailfish\\s?browser\\/(\\d+(\\.\\d+)?)/i,e);return r&&(t.version=r),t}},{test:[/silk/i],describe:function(e){var t={name:"Amazon Silk"},r=n.default.getFirstMatch(/silk\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/phantom/i],describe:function(e){var t={name:"PhantomJS"},r=n.default.getFirstMatch(/phantomjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/slimerjs/i],describe:function(e){var t={name:"SlimerJS"},r=n.default.getFirstMatch(/slimerjs\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t={name:"BlackBerry"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/blackberry[\\d]+\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t={name:"WebOS Browser"},r=n.default.getFirstMatch(a,e)||n.default.getFirstMatch(/w(?:eb)?[o0]sbrowser\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/bada/i],describe:function(e){var t={name:"Bada"},r=n.default.getFirstMatch(/dolfin\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/tizen/i],describe:function(e){var t={name:"Tizen"},r=n.default.getFirstMatch(/(?:tizen\\s?)?browser\\/(\\d+(\\.?_?\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/qupzilla/i],describe:function(e){var t={name:"QupZilla"},r=n.default.getFirstMatch(/(?:qupzilla)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/librewolf/i],describe:function(e){var t={name:"LibreWolf"},r=n.default.getFirstMatch(/(?:librewolf)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/firefox|iceweasel|fxios/i],describe:function(e){var t={name:"Firefox"},r=n.default.getFirstMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/electron/i],describe:function(e){var t={name:"Electron"},r=n.default.getFirstMatch(/(?:electron)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/sogoumobilebrowser/i,/metasr/i,/se 2\\.[x]/i],describe:function(e){var t={name:"Sogou Browser"},r=n.default.getFirstMatch(/(?:sogoumobilebrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e),i=n.default.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i,e),a=n.default.getFirstMatch(/se ([\\d.]+)x/i,e),o=r||i||a;return o&&(t.version=o),t}},{test:[/MiuiBrowser/i],describe:function(e){var t={name:"Miui"},r=n.default.getFirstMatch(/(?:MiuiBrowser)[\\s/](\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return!!e.hasBrand("DuckDuckGo")||e.test(/\\sDdg\\/[\\d.]+$/i)},describe:function(e,t){var r={name:"DuckDuckGo"};if(t){var i=t.getBrandVersion("DuckDuckGo");if(i)return r.version=i,r}var a=n.default.getFirstMatch(/\\sDdg\\/([\\d.]+)$/i,e);return a&&(r.version=a),r}},{test:function(e){return e.hasBrand("Brave")},describe:function(e,t){var r={name:"Brave"};if(t){var i=t.getBrandVersion("Brave");if(i)return r.version=i,r}return r}},{test:[/chromium/i],describe:function(e){var t={name:"Chromium"},r=n.default.getFirstMatch(/(?:chromium)[\\s/](\\d+(\\.?_?\\d+)+)/i,e)||n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/chrome|crios|crmo/i],describe:function(e){var t={name:"Chrome"},r=n.default.getFirstMatch(/(?:chrome|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/GSA/i],describe:function(e){var t={name:"Google Search"},r=n.default.getFirstMatch(/(?:GSA)\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t={name:"Android Browser"},r=n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/playstation 4/i],describe:function(e){var t={name:"PlayStation 4"},r=n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/safari|applewebkit/i],describe:function(e){var t={name:"Safari"},r=n.default.getFirstMatch(a,e);return r&&(t.version=r),t}},{test:[/.*/i],describe:function(e){var t=-1!==e.search("\\\\(")?/^(.*)\\/(.*)[ \\t]\\((.*)/:/^(.*)\\/(.*) /;return{name:n.default.getFirstMatch(t,e),version:n.default.getSecondMatch(t,e)}}}];t.default=o,e.exports=t.default},93:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i},a=r(18);var o=[{test:[/Roku\\/DVP/],describe:function(e){var t=n.default.getFirstMatch(/Roku\\/DVP-(\\d+\\.\\d+)/i,e);return{name:a.OS_MAP.Roku,version:t}}},{test:[/windows phone/i],describe:function(e){var t=n.default.getFirstMatch(/windows phone (?:os)?\\s?(\\d+(\\.\\d+)*)/i,e);return{name:a.OS_MAP.WindowsPhone,version:t}}},{test:[/windows /i],describe:function(e){var t=n.default.getFirstMatch(/Windows ((NT|XP)( \\d\\d?.\\d)?)/i,e),r=n.default.getWindowsVersionName(t);return{name:a.OS_MAP.Windows,version:t,versionName:r}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(e){var t={name:a.OS_MAP.iOS},r=n.default.getSecondMatch(/(Version\\/)(\\d[\\d.]+)/,e);return r&&(t.version=r),t}},{test:[/macintosh/i],describe:function(e){var t=n.default.getFirstMatch(/mac os x (\\d+(\\.?_?\\d+)+)/i,e).replace(/[_\\s]/g,"."),r=n.default.getMacOSVersionName(t),i={name:a.OS_MAP.MacOS,version:t};return r&&(i.versionName=r),i}},{test:[/(ipod|iphone|ipad)/i],describe:function(e){var t=n.default.getFirstMatch(/os (\\d+([_\\s]\\d+)*) like mac os x/i,e).replace(/[_\\s]/g,".");return{name:a.OS_MAP.iOS,version:t}}},{test:[/OpenHarmony/i],describe:function(e){var t=n.default.getFirstMatch(/OpenHarmony\\s+(\\d+(\\.\\d+)*)/i,e);return{name:a.OS_MAP.HarmonyOS,version:t}}},{test:function(e){var t=!e.test(/like android/i),r=e.test(/android/i);return t&&r},describe:function(e){var t=n.default.getFirstMatch(/android[\\s/-](\\d+(\\.\\d+)*)/i,e),r=n.default.getAndroidVersionName(t),i={name:a.OS_MAP.Android,version:t};return r&&(i.versionName=r),i}},{test:[/(web|hpw)[o0]s/i],describe:function(e){var t=n.default.getFirstMatch(/(?:web|hpw)[o0]s\\/(\\d+(\\.\\d+)*)/i,e),r={name:a.OS_MAP.WebOS};return t&&t.length&&(r.version=t),r}},{test:[/blackberry|\\bbb\\d+/i,/rim\\stablet/i],describe:function(e){var t=n.default.getFirstMatch(/rim\\stablet\\sos\\s(\\d+(\\.\\d+)*)/i,e)||n.default.getFirstMatch(/blackberry\\d+\\/(\\d+([_\\s]\\d+)*)/i,e)||n.default.getFirstMatch(/\\bbb(\\d+)/i,e);return{name:a.OS_MAP.BlackBerry,version:t}}},{test:[/bada/i],describe:function(e){var t=n.default.getFirstMatch(/bada\\/(\\d+(\\.\\d+)*)/i,e);return{name:a.OS_MAP.Bada,version:t}}},{test:[/tizen/i],describe:function(e){var t=n.default.getFirstMatch(/tizen[/\\s](\\d+(\\.\\d+)*)/i,e);return{name:a.OS_MAP.Tizen,version:t}}},{test:[/linux/i],describe:function(){return{name:a.OS_MAP.Linux}}},{test:[/CrOS/],describe:function(){return{name:a.OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe:function(e){var t=n.default.getFirstMatch(/PlayStation 4[/\\s](\\d+(\\.\\d+)*)/i,e);
vendor: 7,254 bytes, line 1
1return{name:a.OS_MAP.PlayStation4,version:t}}}];t.default=o,e.exports=t.default},94:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i},a=r(18);var o=[{test:[/googlebot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Google"}}},{test:[/linespider/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Line"}}},{test:[/amazonbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Amazon"}}},{test:[/gptbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/chatgpt-user/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/oai-searchbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"OpenAI"}}},{test:[/baiduspider/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Baidu"}}},{test:[/bingbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Bing"}}},{test:[/duckduckbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"DuckDuckGo"}}},{test:[/claudebot/i,/claude-web/i,/claude-user/i,/claude-searchbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Anthropic"}}},{test:[/omgilibot/i,/webzio-extended/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Webz.io"}}},{test:[/diffbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Diffbot"}}},{test:[/perplexitybot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Perplexity AI"}}},{test:[/perplexity-user/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Perplexity AI"}}},{test:[/youbot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"You.com"}}},{test:[/ia_archiver/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Internet Archive"}}},{test:[/meta-webindexer/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalads/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalagent/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/meta-externalfetcher/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/facebookexternalhit/i,/facebookcatalog/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Meta"}}},{test:[/slackbot/i,/slack-imgProxy/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Slack"}}},{test:[/yahoo/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Yahoo"}}},{test:[/yandexbot/i,/yandexmobilebot/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Yandex"}}},{test:[/pingdom/i],describe:function(){return{type:a.PLATFORMS_MAP.bot,vendor:"Pingdom"}}},{test:[/huawei/i],describe:function(e){var t=n.default.getFirstMatch(/(can-l01)/i,e)&&"Nova",r={type:a.PLATFORMS_MAP.mobile,vendor:"Huawei"};return t&&(r.model=t),r}},{test:[/nexus\\s*(?:7|8|9|10).*/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\\//],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe:function(){return{type:a.PLATFORMS_MAP.tablet}}},{test:function(e){var t=e.test(/ipod|iphone/i),r=e.test(/like (ipod|iphone)/i);return t&&!r},describe:function(e){var t=n.default.getFirstMatch(/(ipod|iphone)/i,e);return{type:a.PLATFORMS_MAP.mobile,vendor:"Apple",model:t}}},{test:[/nexus\\s*[0-6].*/i,/galaxy nexus/i],describe:function(){return{type:a.PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/Nokia/i],describe:function(e){var t=n.default.getFirstMatch(/Nokia\\s+([0-9]+(\\.[0-9]+)?)/i,e),r={type:a.PLATFORMS_MAP.mobile,vendor:"Nokia"};return t&&(r.model=t),r}},{test:[/[^-]mobi/i],describe:function(){return{type:a.PLATFORMS_MAP.mobile}}},{test:function(e){return"blackberry"===e.getBrowserName(!0)},describe:function(){return{type:a.PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test:function(e){return"bada"===e.getBrowserName(!0)},describe:function(){return{type:a.PLATFORMS_MAP.mobile}}},{test:function(e){return"windows phone"===e.getBrowserName()},describe:function(){return{type:a.PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test:function(e){var t=Number(String(e.getOSVersion()).split(".")[0]);return"android"===e.getOSName(!0)&&t>=3},describe:function(){return{type:a.PLATFORMS_MAP.tablet}}},{test:function(e){return"android"===e.getOSName(!0)},describe:function(){return{type:a.PLATFORMS_MAP.mobile}}},{test:[/smart-?tv|smarttv/i],describe:function(){return{type:a.PLATFORMS_MAP.tv}}},{test:[/netcast/i],describe:function(){return{type:a.PLATFORMS_MAP.tv}}},{test:function(e){return"macos"===e.getOSName(!0)},describe:function(){return{type:a.PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test:function(e){return"windows"===e.getOSName(!0)},describe:function(){return{type:a.PLATFORMS_MAP.desktop}}},{test:function(e){return"linux"===e.getOSName(!0)},describe:function(){return{type:a.PLATFORMS_MAP.desktop}}},{test:function(e){return"playstation 4"===e.getOSName(!0)},describe:function(){return{type:a.PLATFORMS_MAP.tv}}},{test:function(e){return"roku"===e.getOSName(!0)},describe:function(){return{type:a.PLATFORMS_MAP.tv}}}];t.default=o,e.exports=t.default},95:function(e,t,r){"use strict";t.__esModule=!0,t.default=void 0;var i,n=(i=r(17))&&i.__esModule?i:{default:i},a=r(18);var o=[{test:function(e){return"microsoft edge"===e.getBrowserName(!0)},describe:function(e){if(/\\sedg\\//i.test(e))return{name:a.ENGINE_MAP.Blink};var t=n.default.getFirstMatch(/edge\\/(\\d+(\\.?_?\\d+)+)/i,e);return{name:a.ENGINE_MAP.EdgeHTML,version:t}}},{test:[/trident/i],describe:function(e){var t={name:a.ENGINE_MAP.Trident},r=n.default.getFirstMatch(/trident\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){return e.test(/presto/i)},describe:function(e){var t={name:a.ENGINE_MAP.Presto},r=n.default.getFirstMatch(/presto\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:function(e){var t=e.test(/gecko/i),r=e.test(/like gecko/i);return t&&!r},describe:function(e){var t={name:a.ENGINE_MAP.Gecko},r=n.default.getFirstMatch(/gecko\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}},{test:[/(apple)?webkit\\/537\\.36/i],describe:function(){return{name:a.ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe:function(e){var t={name:a.ENGINE_MAP.WebKit},r=n.default.getFirstMatch(/webkit\\/(\\d+(\\.?_?\\d+)+)/i,e);return r&&(t.version=r),t}}];t.default=o,e.exports=t.default}})}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODgwLmpzIiwibWFwcGluZ3MiOiJBQUFBLGVBQWUsS0FBaUQsb0JBQW9CLENBQTJHLENBQUMsa0JBQWtCLG1CQUFtQixTQUFTLGNBQWMsNEJBQTRCLFlBQVkscUJBQXFCLDJEQUEyRCx1Q0FBdUMscUNBQXFDLG9CQUFvQixFQUFFLGlCQUFpQiw0RkFBNEYsZUFBZSx3Q0FBd0MsU0FBUyxFQUFFLG1CQUFtQiw4QkFBOEIscURBQXFELDBCQUEwQiw2Q0FBNkMsc0JBQXNCLDZEQUE2RCxZQUFZLGVBQWUsU0FBUyxpQkFBaUIsaUNBQWlDLGlCQUFpQixZQUFZLFVBQVUsc0JBQXNCLG1CQUFtQixpREFB
1aUQsa0JBQWtCLEVBQUUsbUJBQW1CLGFBQWEsaUNBQWlDLHlCQUF5QixjQUFjLHFDQUFxQyxpQkFBaUIsK0JBQStCLGdDQUFnQyxpQkFBaUIsK0JBQStCLHVDQUF1QyxzQkFBc0IscUNBQXFDLFVBQVUsb0JBQW9CLG9CQUFvQiwwQkFBMEIsd0JBQXdCLDBCQUEwQiwyQkFBMkIsdUJBQXVCLHVCQUF1Qix5QkFBeUIseUJBQXlCLGdCQUFnQixtQ0FBbUMsZ0RBQWdELHlCQUF5QixHQUFHLFVBQVUsa0JBQWtCLG9CQUFvQix1QkFBdUIsNEJBQTRCLG9CQUFvQiw2QkFBNkIseUJBQXlCLHlCQUF5QiwyQkFBMkIsdUJBQXVCLDRCQUE0Qix1QkFBdUIseUJBQXlCLGVBQWUsVUFBVSx3QkFBd0IseUJBQXlCLHdCQUF3Qix1QkFBdUIsd0JBQXdCLGdCQUFnQixxQ0FBcUMsZ0RBQWdELHlCQUF5QixHQUFHLHdZQUF3WSxtQ0FBbUMsMkJBQTJCLG1DQUFtQyxtQkFBbUIseUdBQXlHLCtEQUErRCx1Q0FBdUMsMENBQTBDLGFBQWEsR0FBRyxnQ0FBZ0MsS0FBSyxFQUFFLDRCQUE0QixzQkFBc0Isa0JBQWtCLEtBQUssa0NBQWtDLHFCQUFxQixXQUFXLDREQUE0RCxRQUFRLFdBQVcscUJBQXFCLFNBQVMsc0JBQXNCLFFBQVEsOERBQThELG1CQUFtQixJQUFJLE1BQU0sV0FBVyxvQkFBb0Isc0JBQXNCLDhEQUE4RCxJQUFJLHdCQUF3QixrRUFBa0UsaUJBQWlCLFdBQVcsa0VBQWtFLFVBQVUsSUFBSSxtQkFBbUIsSUFBSSxTQUFTLFNBQVMsK0JBQStCLGdDQUFnQyxxQ0FBcUMsNEJBQTRCLEdBQUcsR0FBRyxnQ0FBZ0Msb0JBQW9CLGFBQWEsaUdBQWlHLHVCQUF1Qixna0RBQWdrRCxlQUFlLHFpREFBcWlELGlCQUFpQixxRUFBcUUsVUFBVSw0UEFBNFAsY0FBYyxtR0FBbUcsb0JBQW9CLGFBQWEsaUNBQWlDLG1DQUFtQyxVQUFVLFNBQVMsZ0JBQWdCLFlBQVksV0FBVyxLQUFLLFdBQVcsK0dBQStHLGlCQUFpQixjQUF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Sx1Q0FBdUMsT0FBTyw4QkFBOEIsRUFBRSxpQkFBaUIsMENBQTBDLHFCQUFxQixPQUFPLGtEQUFrRCxFQUFFLGlCQUFpQixvQ0FBb0MscUJBQXFCLE9BQU8sOEJBQThCLEVBQUUsaUJBQWlCLDJDQUEyQyxxQkFBcUIsT0FBTyxpREFBaUQsRUFBRSxpQkFBaUIscURBQXFELHdDQUF3QyxxQkFBcUIsT0FBTyw4QkFBOEIsRUFBRSxpQkFBaUIsa0NBQWtDLHFCQUFxQixPQUFPLDhCQUE4QixFQUFFLGdEQUFnRCxPQUFPLDBCQUEwQixFQUFFLHNDQUFzQyxPQUFPLDBCQUEwQixFQUFFLGlCQUFpQixnQ0FBZ0MscUJBQXFCLE9BQU8sOENBQThDLEVBQUUsaUJBQWlCLGtDQUFrQyxxQkFBcUIsT0FBTywrQkFBK0IsRUFBRSxpQkFBaUIsZ0NBQWdDLHFCQUFxQixPQUFPLCtCQUErQixFQUFFLGlCQUFpQix3Q0FBd0MscUJBQXFCLE9BQU8sMEJBQTBCLEVBQUUsaUJBQWlCLCtCQUErQixxQkFBcUIsT0FBTywwQkFBMEIsRUFBRSxnQ0FBZ0Msb0JBQW9CLGFBQWEsaUNBQWlDLG1DQUFtQyxVQUFVLFNBQVMsUUFBUSxpQkFBaUIsOENBQThDLHNCQUFzQiw2QkFBNkIseUJBQXlCLDJEQUEyRCxPQUFPLHVDQUF1QyxFQUFFLHVDQUF1QyxPQUFPLDBCQUEwQiwyREFBMkQsMkJBQTJCLEVBQUUsaUJBQWlCLHlCQUF5QixzQkFBc0IsT0FBTyx5QkFBeUIsMERBQTBELDJCQUEyQixFQUFFLGlCQUFpQiwrQ0FBK0MsYUFBYSxzQkFBc0IsT0FBTyx3QkFBd0IseURBQXlELDJCQUEyQixFQUFFLHNEQUFzRCxPQUFPLDBCQUEwQixFQUFFLDhDQUE4QyxPQUFPLHlCQUF5QiwwREFBMEQsMkJBQTJCLEVBQUUsaUNBQWlDLEVBQUUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9yYWktcHJlZGljdC8uL25vZGVfbW9kdWxlcy9ib3dzZXIvZXM1LmpzPzMzN2YiXSwic291cmNlc0NvbnRlbnQiOlsiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5ib3dzZXI9dCgpOmUuYm93c2VyPXQoKX0odGhpcywoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gcihpKXtpZih0W2ldKXJldHVybiB0W2ldLmV4cG9ydHM7dmFyIG49dFtpXT17aTppLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbaV0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsciksbi5sPSEwLG4uZXhwb3J0c31yZXR1cm4gci5tPWUsci5jPXQsci5kPWZ1bmN0aW9uKGUsdCxpKXtyLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6aX0pfSxyLnI9ZnVuY3Rpb24oZSl7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOlwiTW9kdWxlXCJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0sci50PWZ1bmN0aW9uKGUsdCl7aWYoMSZ0JiYoZT1yKGUpKSw4JnQpcmV0dXJuIGU7aWYoNCZ0JiZcIm9iamVjdFwiPT10eXBlb2YgZSYmZSYmZS5fX2VzTW9kdWxlKXJldHVybi
1BlO3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoci5yKGkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJlwic3RyaW5nXCIhPXR5cGVvZiBlKWZvcih2YXIgbiBpbiBlKXIuZChpLG4sZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxuKSk7cmV0dXJuIGl9LHIubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gci5kKHQsXCJhXCIsdCksdH0sci5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSxyLnA9XCJcIixyKHIucz05MCl9KHsxNzpmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dC5fX2VzTW9kdWxlPSEwLHQuZGVmYXVsdD12b2lkIDA7dmFyIGk9cigxOCksbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUuZ2V0Rmlyc3RNYXRjaD1mdW5jdGlvbihlLHQpe3ZhciByPXQubWF0Y2goZSk7cmV0dXJuIHImJnIubGVuZ3RoPjAmJnJbMV18fFwiXCJ9LGUuZ2V0U2Vjb25kTWF0Y2g9ZnVuY3Rpb24oZSx0KXt2YXIgcj10Lm1hdGNoKGUpO3JldHVybiByJiZyLmxlbmd0aD4xJiZyWzJdfHxcIlwifSxlLm1hdGNoQW5kUmV0dXJuQ29uc3Q9ZnVuY3Rpb24oZSx0LHIpe2lmKGUudGVzdCh0KSlyZXR1cm4gcn0sZS5nZXRXaW5kb3dzVmVyc2lvbk5hbWU9ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2VcIk5UXCI6cmV0dXJuXCJOVFwiO2Nhc2VcIlhQXCI6cmV0dXJuXCJYUFwiO2Nhc2VcIk5UIDUuMFwiOnJldHVyblwiMjAwMFwiO2Nhc2VcIk5UIDUuMVwiOnJldHVyblwiWFBcIjtjYXNlXCJOVCA1LjJcIjpyZXR1cm5cIjIwMDNcIjtjYXNlXCJOVCA2LjBcIjpyZXR1cm5cIlZpc3RhXCI7Y2FzZVwiTlQgNi4xXCI6cmV0dXJuXCI3XCI7Y2FzZVwiTlQgNi4yXCI6cmV0dXJuXCI4XCI7Y2FzZVwiTlQgNi4zXCI6cmV0dXJuXCI4LjFcIjtjYXNlXCJOVCAxMC4wXCI6cmV0dXJuXCIxMFwiO2RlZmF1bHQ6cmV0dXJufX0sZS5nZXRNYWNPU1ZlcnNpb25OYW1lPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3BsaXQoXCIuXCIpLnNwbGljZSgwLDIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGUsMTApfHwwfSkpO3QucHVzaCgwKTt2YXIgcj10WzBdLGk9dFsxXTtpZigxMD09PXIpc3dpdGNoKGkpe2Nhc2UgNTpyZXR1cm5cIkxlb3BhcmRcIjtjYXNlIDY6cmV0dXJuXCJTbm93IExlb3BhcmRcIjtjYXNlIDc6cmV0dXJuXCJMaW9uXCI7Y2FzZSA4OnJldHVyblwiTW91bnRhaW4gTGlvblwiO2Nhc2UgOTpyZXR1cm5cIk1hdmVyaWNrc1wiO2Nhc2UgMTA6cmV0dXJuXCJZb3NlbWl0ZVwiO2Nhc2UgMTE6cmV0dXJuXCJFbCBDYXBpdGFuXCI7Y2FzZSAxMjpyZXR1cm5cIlNpZXJyYVwiO2Nhc2UgMTM6cmV0dXJuXCJIaWdoIFNpZXJyYVwiO2Nhc2UgMTQ6cmV0dXJuXCJNb2phdmVcIjtjYXNlIDE1OnJldHVyblwiQ2F0YWxpbmFcIjtkZWZhdWx0OnJldHVybn1zd2l0Y2gocil7Y2FzZSAxMTpyZXR1cm5cIkJpZyBTdXJcIjtjYXNlIDEyOnJldHVyblwiTW9udGVyZXlcIjtjYXNlIDEzOnJldHVyblwiVmVudHVyYVwiO2Nhc2UgMTQ6cmV0dXJuXCJTb25vbWFcIjtjYXNlIDE1OnJldHVyblwiU2VxdW9pYVwiO2RlZmF1bHQ6cmV0dXJufX0sZS5nZXRBbmRyb2lkVmVyc2lvbk5hbWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcGxpdChcIi5cIikuc3BsaWNlKDAsMikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZSwxMCl8fDB9KSk7aWYodC5wdXNoKDApLCEoMT09PXRbMF0mJnRbMV08NSkpcmV0dXJuIDE9PT10WzBdJiZ0WzFdPDY/XCJDdXBjYWtlXCI6MT09PXRbMF0mJnRbMV0+PTY/XCJEb251dFwiOjI9PT10WzBdJiZ0WzFdPDI/XCJFY2xhaXJcIjoyPT09dFswXSYmMj09PXRbMV0/XCJGcm95b1wiOjI9PT10WzBdJiZ0WzFdPjI/XCJHaW5nZXJicmVhZFwiOjM9PT10WzBdP1wiSG9uZXljb21iXCI6ND09PXRbMF0mJnRbMV08MT9cIkljZSBDcmVhbSBTYW5kd2ljaFwiOjQ9PT10WzBdJiZ0WzFdPDQ/XCJKZWxseSBCZWFuXCI6ND09PXRbMF0mJnRbMV0+PTQ/XCJLaXRLYXRcIjo1PT09dFswXT9cIkxvbGxpcG9wXCI6Nj09PXRbMF0/XCJNYXJzaG1hbGxvd1wiOjc9PT10WzBdP1wiTm91Z2F0XCI6OD09PXRbMF0/XCJPcmVvXCI6OT09PXRbMF0/XCJQaWVcIjp2b2lkIDB9LGUuZ2V0VmVyc2lvblByZWNpc2lvbj1mdW5jdGlvbihlKXtyZXR1cm4gZS5zcGxpdChcIi5cIikubGVuZ3RofSxlLmNvbXBhcmVWZXJzaW9ucz1mdW5jdGlvbih0LHIsaSl7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBuPWUuZ2V0VmVyc2lvblByZWNpc2lvbih0KSxhPWUuZ2V0VmVyc2lvblByZWNpc2lvbihyKSxvPU1hdGgubWF4KG4sYSkscz0wLHU9ZS5tYXAoW3Qscl0sKGZ1bmN0aW9uKHQpe3ZhciByPW8tZS5nZXRWZXJzaW9uUHJlY2lzaW9uKHQpLGk9dCtuZXcgQXJyYXkocisxKS5qb2luKFwiLjBcIik7cmV0dXJuIGUubWFwKGkuc3BsaXQoXCIuXCIpLChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEFycmF5KDIwLWUubGVuZ3RoKS5qb2luKFwiMFwiKStlfSkpLnJldmVyc2UoKX0pKTtmb3IoaSYmKHM9by1NYXRoLm1pbihuLGEpKSxvLT0xO28+PXM7KXtpZih1WzBdW29dPnVbMV1bb10pcmV0dXJuIDE7aWYodVswXVtvXT09PXVbMV1bb10pe2lmKG89PT1zKXJldHVybiAwO28tPTF9ZWxzZSBpZih1WzBdW29dPHVbMV1bb10pcmV0dXJuLTF9fSxlLm1hcD1mdW5jdGlvbihlLHQpe3ZhciByLGk9W107aWYoQXJyYXkucHJvdG90eXBlLm1hcClyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGUsdCk7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrPTEpaS5wdXNoKHQoZVtyXSkpO3JldHVybiBpfSxlLmZpbmQ9ZnVuY3Rpb24oZSx0KXt2YXIgcixpO2lmKEFycmF5LnByb3RvdHlwZS5maW5kKXJldHVybiBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKGUsdCk7Zm9yKHI9MCxpPWUubGVuZ3RoO3I8aTtyKz0xKXt2YXIgbj1lW3JdO2lmKHQobixyKSlyZXR1cm4gbn19LGUuYXNzaWduPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyLGk9ZSxuPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylhW28tMV09YXJndW1lbnRzW29dO2lmKE9iamVjdC5hc3NpZ24pcmV0dXJuIE9iamVjdC5hc3NpZ24uYXBwbHkoT2JqZWN0LFtlXS5jb25jYXQoYSkpO3ZhciBzPWZ1bmN0aW9uKCl7dmFyIGU9YVt0XTtcIm9iamVjdFwiPT10eXBlb2YgZSYmbnVsbCE9PWUmJk9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lbdF09ZVt0XX0pKX07Zm9yKHQ9MCxyPWEubGVuZ3RoO3Q8cjt0Kz0xKXMoKTtyZXR1cm4gZX0sZS5nZXRCcm93c2VyQWxpYXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuQlJPV1NFUl9BTElBU0VTX01BUFtlXX0sZS5nZXRCcm93c2VyVHlwZUJ5QWxpYXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuQlJPV1NFUl9NQVBbZV18fFwiXCJ9LGV9KCk7dC5kZWZh
1dWx0PW4sZS5leHBvcnRzPXQuZGVmYXVsdH0sMTg6ZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3QuX19lc01vZHVsZT0hMCx0LkVOR0lORV9NQVA9dC5PU19NQVA9dC5QTEFURk9STVNfTUFQPXQuQlJPV1NFUl9NQVA9dC5CUk9XU0VSX0FMSUFTRVNfTUFQPXZvaWQgMDt0LkJST1dTRVJfQUxJQVNFU19NQVA9e0FtYXpvbkJvdDpcImFtYXpvbmJvdFwiLFwiQW1hem9uIFNpbGtcIjpcImFtYXpvbl9zaWxrXCIsXCJBbmRyb2lkIEJyb3dzZXJcIjpcImFuZHJvaWRcIixCYWlkdVNwaWRlcjpcImJhaWR1c3BpZGVyXCIsQmFkYTpcImJhZGFcIixCaW5nQ3Jhd2xlcjpcImJpbmdjcmF3bGVyXCIsQnJhdmU6XCJicmF2ZVwiLEJsYWNrQmVycnk6XCJibGFja2JlcnJ5XCIsXCJDaGF0R1BULVVzZXJcIjpcImNoYXRncHRfdXNlclwiLENocm9tZTpcImNocm9tZVwiLENsYXVkZUJvdDpcImNsYXVkZWJvdFwiLENocm9taXVtOlwiY2hyb21pdW1cIixEaWZmYm90OlwiZGlmZmJvdFwiLER1Y2tEdWNrQm90OlwiZHVja2R1Y2tib3RcIixEdWNrRHVja0dvOlwiZHVja2R1Y2tnb1wiLEVsZWN0cm9uOlwiZWxlY3Ryb25cIixFcGlwaGFueTpcImVwaXBoYW55XCIsRmFjZWJvb2tFeHRlcm5hbEhpdDpcImZhY2Vib29rZXh0ZXJuYWxoaXRcIixGaXJlZm94OlwiZmlyZWZveFwiLEZvY3VzOlwiZm9jdXNcIixHZW5lcmljOlwiZ2VuZXJpY1wiLFwiR29vZ2xlIFNlYXJjaFwiOlwiZ29vZ2xlX3NlYXJjaFwiLEdvb2dsZWJvdDpcImdvb2dsZWJvdFwiLEdQVEJvdDpcImdwdGJvdFwiLFwiSW50ZXJuZXQgRXhwbG9yZXJcIjpcImllXCIsSW50ZXJuZXRBcmNoaXZlQ3Jhd2xlcjpcImludGVybmV0YXJjaGl2ZWNyYXdsZXJcIixcIkstTWVsZW9uXCI6XCJrX21lbGVvblwiLExpYnJlV29sZjpcImxpYnJld29sZlwiLExpbmVzcGlkZXI6XCJsaW5lc3BpZGVyXCIsTWF4dGhvbjpcIm1heHRob25cIixcIk1ldGEtRXh0ZXJuYWxBZHNcIjpcIm1ldGFfZXh0ZXJuYWxhZHNcIixcIk1ldGEtRXh0ZXJuYWxBZ2VudFwiOlwibWV0YV9leHRlcm5hbGFnZW50XCIsXCJNZXRhLUV4dGVybmFsRmV0Y2hlclwiOlwibWV0YV9leHRlcm5hbGZldGNoZXJcIixcIk1ldGEtV2ViSW5kZXhlclwiOlwibWV0YV93ZWJpbmRleGVyXCIsXCJNaWNyb3NvZnQgRWRnZVwiOlwiZWRnZVwiLFwiTVogQnJvd3NlclwiOlwibXpcIixcIk5BVkVSIFdoYWxlIEJyb3dzZXJcIjpcIm5hdmVyXCIsXCJPQUktU2VhcmNoQm90XCI6XCJvYWlfc2VhcmNoYm90XCIsT21naWxpYm90Olwib21naWxpYm90XCIsT3BlcmE6XCJvcGVyYVwiLFwiT3BlcmEgQ29hc3RcIjpcIm9wZXJhX2NvYXN0XCIsXCJQYWxlIE1vb25cIjpcInBhbGVfbW9vblwiLFBlcnBsZXhpdHlCb3Q6XCJwZXJwbGV4aXR5Ym90XCIsXCJQZXJwbGV4aXR5LVVzZXJcIjpcInBlcnBsZXhpdHlfdXNlclwiLFBoYW50b21KUzpcInBoYW50b21qc1wiLFBpbmdkb21Cb3Q6XCJwaW5nZG9tYm90XCIsUHVmZmluOlwicHVmZmluXCIsUVE6XCJxcVwiLFFRTGl0ZTpcInFxbGl0ZVwiLFF1cFppbGxhOlwicXVwemlsbGFcIixSb2t1Olwicm9rdVwiLFNhZmFyaTpcInNhZmFyaVwiLFNhaWxmaXNoOlwic2FpbGZpc2hcIixcIlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWRcIjpcInNhbXN1bmdfaW50ZXJuZXRcIixTbGFja0JvdDpcInNsYWNrYm90XCIsU2VhTW9ua2V5Olwic2VhbW9ua2V5XCIsU2xlaXBuaXI6XCJzbGVpcG5pclwiLFwiU29nb3UgQnJvd3NlclwiOlwic29nb3VcIixTd2luZzpcInN3aW5nXCIsVGl6ZW46XCJ0aXplblwiLFwiVUMgQnJvd3NlclwiOlwidWNcIixWaXZhbGRpOlwidml2YWxkaVwiLFwiV2ViT1MgQnJvd3NlclwiOlwid2Vib3NcIixXZUNoYXQ6XCJ3ZWNoYXRcIixZYWhvb1NsdXJwOlwieWFob29zbHVycFwiLFwiWWFuZGV4IEJyb3dzZXJcIjpcInlhbmRleFwiLFlhbmRleEJvdDpcInlhbmRleGJvdFwiLFlvdUJvdDpcInlvdWJvdFwifTt0LkJST1dTRVJfTUFQPXthbWF6b25ib3Q6XCJBbWF6b25Cb3RcIixhbWF6b25fc2lsazpcIkFtYXpvbiBTaWxrXCIsYW5kcm9pZDpcIkFuZHJvaWQgQnJvd3NlclwiLGJhaWR1c3BpZGVyOlwiQmFpZHVTcGlkZXJcIixiYWRhOlwiQmFkYVwiLGJpbmdjcmF3bGVyOlwiQmluZ0NyYXdsZXJcIixibGFja2JlcnJ5OlwiQmxhY2tCZXJyeVwiLGJyYXZlOlwiQnJhdmVcIixjaGF0Z3B0X3VzZXI6XCJDaGF0R1BULVVzZXJcIixjaHJvbWU6XCJDaHJvbWVcIixjbGF1ZGVib3Q6XCJDbGF1ZGVCb3RcIixjaHJvbWl1bTpcIkNocm9taXVtXCIsZGlmZmJvdDpcIkRpZmZib3RcIixkdWNrZHVja2JvdDpcIkR1Y2tEdWNrQm90XCIsZHVja2R1Y2tnbzpcIkR1Y2tEdWNrR29cIixlZGdlOlwiTWljcm9zb2Z0IEVkZ2VcIixlbGVjdHJvbjpcIkVsZWN0cm9uXCIsZXBpcGhhbnk6XCJFcGlwaGFueVwiLGZhY2Vib29rZXh0ZXJuYWxoaXQ6XCJGYWNlYm9va0V4dGVybmFsSGl0XCIsZmlyZWZveDpcIkZpcmVmb3hcIixmb2N1czpcIkZvY3VzXCIsZ2VuZXJpYzpcIkdlbmVyaWNcIixnb29nbGVfc2VhcmNoOlwiR29vZ2xlIFNlYXJjaFwiLGdvb2dsZWJvdDpcIkdvb2dsZWJvdFwiLGdwdGJvdDpcIkdQVEJvdFwiLGllOlwiSW50ZXJuZXQgRXhwbG9yZXJcIixpbnRlcm5ldGFyY2hpdmVjcmF3bGVyOlwiSW50ZXJuZXRBcmNoaXZlQ3Jhd2xlclwiLGtfbWVsZW9uOlwiSy1NZWxlb25cIixsaWJyZXdvbGY6XCJMaWJyZVdvbGZcIixsaW5lc3BpZGVyOlwiTGluZXNwaWRlclwiLG1heHRob246XCJNYXh0aG9uXCIsbWV0YV9leHRlcm5hbGFkczpcIk1ldGEtRXh0ZXJuYWxBZHNcIixtZXRhX2V4dGVybmFsYWdlbnQ6XCJNZXRhLUV4dGVybmFsQWdlbnRcIixtZXRhX2V4dGVybmFsZmV0Y2hlcjpcIk1ldGEtRXh0ZXJuYWxGZXRjaGVyXCIsbWV0YV93ZWJpbmRleGVyOlwiTWV0YS1XZWJJbmRleGVyXCIsbXo6XCJNWiBCcm93c2VyXCIsbmF2ZXI6XCJOQVZFUiBXaGFsZSBCcm93c2VyXCIsb2FpX3NlYXJjaGJvdDpcIk9BSS1TZWFyY2hCb3RcIixvbWdpbGlib3Q6XCJPbWdpbGlib3RcIixvcGVyYTpcIk9wZXJhXCIsb3BlcmFfY29hc3Q6XCJPcGVyYSBDb2FzdFwiLHBhbGVfbW9vbjpcIlBhbGUgTW9vblwiLHBlcnBsZXhpdHlib3Q6XCJQZXJwbGV4aXR5Qm90XCIscGVycGxleGl0eV91c2VyOlwiUGVycGxleGl0eS1Vc2VyXCIscGh
1hbnRvbWpzOlwiUGhhbnRvbUpTXCIscGluZ2RvbWJvdDpcIlBpbmdkb21Cb3RcIixwdWZmaW46XCJQdWZmaW5cIixxcTpcIlFRIEJyb3dzZXJcIixxcWxpdGU6XCJRUSBCcm93c2VyIExpdGVcIixxdXB6aWxsYTpcIlF1cFppbGxhXCIscm9rdTpcIlJva3VcIixzYWZhcmk6XCJTYWZhcmlcIixzYWlsZmlzaDpcIlNhaWxmaXNoXCIsc2Ftc3VuZ19pbnRlcm5ldDpcIlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWRcIixzZWFtb25rZXk6XCJTZWFNb25rZXlcIixzbGFja2JvdDpcIlNsYWNrQm90XCIsc2xlaXBuaXI6XCJTbGVpcG5pclwiLHNvZ291OlwiU29nb3UgQnJvd3NlclwiLHN3aW5nOlwiU3dpbmdcIix0aXplbjpcIlRpemVuXCIsdWM6XCJVQyBCcm93c2VyXCIsdml2YWxkaTpcIlZpdmFsZGlcIix3ZWJvczpcIldlYk9TIEJyb3dzZXJcIix3ZWNoYXQ6XCJXZUNoYXRcIix5YWhvb3NsdXJwOlwiWWFob29TbHVycFwiLHlhbmRleDpcIllhbmRleCBCcm93c2VyXCIseWFuZGV4Ym90OlwiWWFuZGV4Qm90XCIseW91Ym90OlwiWW91Qm90XCJ9O3QuUExBVEZPUk1TX01BUD17Ym90OlwiYm90XCIsZGVza3RvcDpcImRlc2t0b3BcIixtb2JpbGU6XCJtb2JpbGVcIix0YWJsZXQ6XCJ0YWJsZXRcIix0djpcInR2XCJ9O3QuT1NfTUFQPXtBbmRyb2lkOlwiQW5kcm9pZFwiLEJhZGE6XCJCYWRhXCIsQmxhY2tCZXJyeTpcIkJsYWNrQmVycnlcIixDaHJvbWVPUzpcIkNocm9tZSBPU1wiLEhhcm1vbnlPUzpcIkhhcm1vbnlPU1wiLGlPUzpcImlPU1wiLExpbnV4OlwiTGludXhcIixNYWNPUzpcIm1hY09TXCIsUGxheVN0YXRpb240OlwiUGxheVN0YXRpb24gNFwiLFJva3U6XCJSb2t1XCIsVGl6ZW46XCJUaXplblwiLFdlYk9TOlwiV2ViT1NcIixXaW5kb3dzOlwiV2luZG93c1wiLFdpbmRvd3NQaG9uZTpcIldpbmRvd3MgUGhvbmVcIn07dC5FTkdJTkVfTUFQPXtCbGluazpcIkJsaW5rXCIsRWRnZUhUTUw6XCJFZGdlSFRNTFwiLEdlY2tvOlwiR2Vja29cIixQcmVzdG86XCJQcmVzdG9cIixUcmlkZW50OlwiVHJpZGVudFwiLFdlYktpdDpcIldlYktpdFwifX0sOTA6ZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3QuX19lc01vZHVsZT0hMCx0LmRlZmF1bHQ9dm9pZCAwO3ZhciBpLG49KGk9cig5MSkpJiZpLl9fZXNNb2R1bGU/aTp7ZGVmYXVsdDppfSxhPXIoMTgpO2Z1bmN0aW9uIG8oZSx0KXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGk9dFtyXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBpJiYoaS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaS5rZXksaSl9fXZhciBzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe312YXIgdCxyLGk7cmV0dXJuIGUuZ2V0UGFyc2VyPWZ1bmN0aW9uKGUsdCxyKXtpZih2b2lkIDA9PT10JiYodD0hMSksdm9pZCAwPT09ciYmKHI9bnVsbCksXCJzdHJpbmdcIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKFwiVXNlckFnZW50IHNob3VsZCBiZSBhIHN0cmluZ1wiKTtyZXR1cm4gbmV3IG4uZGVmYXVsdChlLHQscil9LGUucGFyc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9bnVsbCksbmV3IG4uZGVmYXVsdChlLHQpLmdldFJlc3VsdCgpfSx0PWUsaT1be2tleTpcIkJST1dTRVJfTUFQXCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuQlJPV1NFUl9NQVB9fSx7a2V5OlwiRU5HSU5FX01BUFwiLGdldDpmdW5jdGlvbigpe3JldHVybiBhLkVOR0lORV9NQVB9fSx7a2V5OlwiT1NfTUFQXCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEuT1NfTUFQfX0se2tleTpcIlBMQVRGT1JNU19NQVBcIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5QTEFURk9STVNfTUFQfX1dLChyPW51bGwpJiZvKHQucHJvdG90eXBlLHIpLGkmJm8odCxpKSxlfSgpO3QuZGVmYXVsdD1zLGUuZXhwb3J0cz10LmRlZmF1bHR9LDkxOmZ1bmN0aW9uKGUsdCxyKXtcInVzZSBzdHJpY3RcIjt0Ll9fZXNNb2R1bGU9ITAsdC5kZWZhdWx0PXZvaWQgMDt2YXIgaT11KHIoOTIpKSxuPXUocig5MykpLGE9dShyKDk0KSksbz11KHIoOTUpKSxzPXUocigxNykpO2Z1bmN0aW9uIHUoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQscil7aWYodm9pZCAwPT09dCYmKHQ9ITEpLHZvaWQgMD09PXImJihyPW51bGwpLG51bGw9PWV8fFwiXCI9PT1lKXRocm93IG5ldyBFcnJvcihcIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHlcIik7dGhpcy5fdWE9ZTt2YXIgaT0hMTtcImJvb2xlYW5cIj09dHlwZW9mIHQ/KGk9dCx0aGlzLl9oaW50cz1yKTp0aGlzLl9oaW50cz1udWxsIT10JiZcIm9iamVjdFwiPT10eXBlb2YgdD90Om51bGwsdGhpcy5wYXJzZWRSZXN1bHQ9e30sITAhPT1pJiZ0aGlzLnBhcnNlKCl9dmFyIHQ9ZS5wcm90b3R5cGU7cmV0dXJuIHQuZ2V0SGludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGludHN9LHQuaGFzQnJhbmQ9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuX2hpbnRzfHwhQXJyYXkuaXNBcnJheSh0aGlzLl9oaW50cy5icmFuZHMpKXJldHVybiExO3ZhciB0PWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdGhpcy5faGludHMuYnJhbmRzLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmJyYW5kJiZlLmJyYW5kLnRvTG93ZXJDYXNlKCk9PT10fSkpfSx0LmdldEJyYW5kVmVyc2lvbj1mdW5jdGlvbihlKXtpZih0aGlzLl9oaW50cyYmQXJyYXkuaXNBcnJheSh0aGlzLl9oaW50cy5icmFuZHMpKXt2YXIgdD1lLnRvTG93ZXJDYXNlKCkscj10aGlzLl9oaW50cy5icmFuZHMuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYnJhbmQmJmUuYnJhbmQudG9Mb3dlckNhc2UoKT09PXR9KSk7cmV0dXJuIHI/ci52ZXJzaW9uOnZvaWQgMH19LHQuZ2V0VUE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdWF9LHQudGVzdD1mdW5jdGlvbihlKXtyZXR1cm4gZS50ZXN0KHRoaXMuX3VhKX0sdC5wYXJzZUJyb3dzZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9e307dmFyIHQ9cy5kZWZhdWx0LmZpbmQoaS5kZWZhdWx0LChmdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnRlc3QpcmV0dXJuIHQudGVzdChlKTtpZihBcnJheS5pc0FycmF
15KHQudGVzdCkpcmV0dXJuIHQudGVzdC5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gZS50ZXN0KHQpfSkpO3Rocm93IG5ldyBFcnJvcihcIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZFwiKX0pKTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9dC5kZXNjcmliZSh0aGlzLmdldFVBKCksdGhpcykpLHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXJ9LHQuZ2V0QnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyP3RoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI6dGhpcy5wYXJzZUJyb3dzZXIoKX0sdC5nZXRCcm93c2VyTmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gZT9TdHJpbmcodGhpcy5nZXRCcm93c2VyKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8XCJcIjp0aGlzLmdldEJyb3dzZXIoKS5uYW1lfHxcIlwifSx0LmdldEJyb3dzZXJWZXJzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259LHQuZ2V0T1M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9LHQucGFyc2VPUz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5wYXJzZWRSZXN1bHQub3M9e307dmFyIHQ9cy5kZWZhdWx0LmZpbmQobi5kZWZhdWx0LChmdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnRlc3QpcmV0dXJuIHQudGVzdChlKTtpZihBcnJheS5pc0FycmF5KHQudGVzdCkpcmV0dXJuIHQudGVzdC5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gZS50ZXN0KHQpfSkpO3Rocm93IG5ldyBFcnJvcihcIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZFwiKX0pKTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0Lm9zPXQuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQub3N9LHQuZ2V0T1NOYW1lPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0T1MoKS5uYW1lO3JldHVybiBlP1N0cmluZyh0KS50b0xvd2VyQ2FzZSgpfHxcIlwiOnR8fFwiXCJ9LHQuZ2V0T1NWZXJzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T1MoKS52ZXJzaW9ufSx0LmdldFBsYXRmb3JtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtP3RoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtOnRoaXMucGFyc2VQbGF0Zm9ybSgpfSx0LmdldFBsYXRmb3JtVHlwZT1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT0hMSk7dmFyIHQ9dGhpcy5nZXRQbGF0Zm9ybSgpLnR5cGU7cmV0dXJuIGU/U3RyaW5nKHQpLnRvTG93ZXJDYXNlKCl8fFwiXCI6dHx8XCJcIn0sdC5wYXJzZVBsYXRmb3JtPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTt2YXIgdD1zLmRlZmF1bHQuZmluZChhLmRlZmF1bHQsKGZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQudGVzdClyZXR1cm4gdC50ZXN0KGUpO2lmKEFycmF5LmlzQXJyYXkodC50ZXN0KSlyZXR1cm4gdC50ZXN0LnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBlLnRlc3QodCl9KSk7dGhyb3cgbmV3IEVycm9yKFwiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkXCIpfSkpO3JldHVybiB0JiYodGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm09dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybX0sdC5nZXRFbmdpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lP3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZTp0aGlzLnBhcnNlRW5naW5lKCl9LHQuZ2V0RW5naW5lTmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gZT9TdHJpbmcodGhpcy5nZXRFbmdpbmUoKS5uYW1lKS50b0xvd2VyQ2FzZSgpfHxcIlwiOnRoaXMuZ2V0RW5naW5lKCkubmFtZXx8XCJcIn0sdC5wYXJzZUVuZ2luZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXt9O3ZhciB0PXMuZGVmYXVsdC5maW5kKG8uZGVmYXVsdCwoZnVuY3Rpb24odCl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdC50ZXN0KXJldHVybiB0LnRlc3QoZSk7aWYoQXJyYXkuaXNBcnJheSh0LnRlc3QpKXJldHVybiB0LnRlc3Quc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGUudGVzdCh0KX0pKTt0aHJvdyBuZXcgRXJyb3IoXCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWRcIil9KSk7cmV0dXJuIHQmJih0aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmV9LHQucGFyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJzZUJyb3dzZXIoKSx0aGlzLnBhcnNlT1MoKSx0aGlzLnBhcnNlUGxhdGZvcm0oKSx0aGlzLnBhcnNlRW5naW5lKCksdGhpc30sdC5nZXRSZXN1bHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWZhdWx0LmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9LHQuc2F0aXNmaWVzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMscj17fSxpPTAsbj17fSxhPTA7aWYoT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG89ZVt0XTtcInN0cmluZ1wiPT10eXBlb2Ygbz8oblt0XT1vLGErPTEpOlwib2JqZWN0XCI9PXR5cGVvZiBvJiYoclt0XT1vLGkrPTEpfSkpLGk+MCl7dmFyIG89T2JqZWN0LmtleXMociksdT1zLmRlZmF1bHQuZmluZChvLChmdW5jdGlvbihlKXtyZXR1cm4gdC5pc09TKGUpfSkpO2lmKHUpe3ZhciBkPXRoaXMuc2F0aXNmaWVzKHJbdV0pO2lmKHZvaWQgMCE9PWQpcmV0dXJuIGR9dmFyIGM9cy5kZWZhdWx0LmZpbmQobywoZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNQbGF0Zm9ybShlKX0pKTtpZihjKXt2YXIgZj10aGlzLnNhdGlzZmllcyhyW2NdKTtpZih2b2lkIDAhPT1mKXJldHVybi
1BmfX1pZihhPjApe3ZhciBsPU9iamVjdC5rZXlzKG4pLGI9cy5kZWZhdWx0LmZpbmQobCwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNCcm93c2VyKGUsITApfSkpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIHRoaXMuY29tcGFyZVZlcnNpb24obltiXSl9fSx0LmlzQnJvd3Nlcj1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PXQmJih0PSExKTt2YXIgcj10aGlzLmdldEJyb3dzZXJOYW1lKCkudG9Mb3dlckNhc2UoKSxpPWUudG9Mb3dlckNhc2UoKSxuPXMuZGVmYXVsdC5nZXRCcm93c2VyVHlwZUJ5QWxpYXMoaSk7cmV0dXJuIHQmJm4mJihpPW4udG9Mb3dlckNhc2UoKSksaT09PXJ9LHQuY29tcGFyZVZlcnNpb249ZnVuY3Rpb24oZSl7dmFyIHQ9WzBdLHI9ZSxpPSExLG49dGhpcy5nZXRCcm93c2VyVmVyc2lvbigpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBuKXJldHVyblwiPlwiPT09ZVswXXx8XCI8XCI9PT1lWzBdPyhyPWUuc3Vic3RyKDEpLFwiPVwiPT09ZVsxXT8oaT0hMCxyPWUuc3Vic3RyKDIpKTp0PVtdLFwiPlwiPT09ZVswXT90LnB1c2goMSk6dC5wdXNoKC0xKSk6XCI9XCI9PT1lWzBdP3I9ZS5zdWJzdHIoMSk6XCJ+XCI9PT1lWzBdJiYoaT0hMCxyPWUuc3Vic3RyKDEpKSx0LmluZGV4T2Yocy5kZWZhdWx0LmNvbXBhcmVWZXJzaW9ucyhuLHIsaSkpPi0xfSx0LmlzT1M9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0T1NOYW1lKCEwKT09PVN0cmluZyhlKS50b0xvd2VyQ2FzZSgpfSx0LmlzUGxhdGZvcm09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0UGxhdGZvcm1UeXBlKCEwKT09PVN0cmluZyhlKS50b0xvd2VyQ2FzZSgpfSx0LmlzRW5naW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldEVuZ2luZU5hbWUoITApPT09U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl9LHQuaXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ITEpLHRoaXMuaXNCcm93c2VyKGUsdCl8fHRoaXMuaXNPUyhlKXx8dGhpcy5pc1BsYXRmb3JtKGUpfSx0LnNvbWU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gdm9pZCAwPT09ZSYmKGU9W10pLGUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXMoZSl9KSl9LGV9KCk7dC5kZWZhdWx0PWQsZS5leHBvcnRzPXQuZGVmYXVsdH0sOTI6ZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3QuX19lc01vZHVsZT0hMCx0LmRlZmF1bHQ9dm9pZCAwO3ZhciBpLG49KGk9cigxNykpJiZpLl9fZXNNb2R1bGU/aTp7ZGVmYXVsdDppfTt2YXIgYT0vdmVyc2lvblxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxvPVt7dGVzdDpbL2dwdGJvdC9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIkdQVEJvdFwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9ncHRib3RcXC8oXFxkKyhcXC5cXGQrKSspL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvY2hhdGdwdC11c2VyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiQ2hhdEdQVC1Vc2VyXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL2NoYXRncHQtdXNlclxcLyhcXGQrKFxcLlxcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9vYWktc2VhcmNoYm90L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiT0FJLVNlYXJjaEJvdFwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9vYWktc2VhcmNoYm90XFwvKFxcZCsoXFwuXFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2NsYXVkZWJvdC9pLC9jbGF1ZGUtd2ViL2ksL2NsYXVkZS11c2VyL2ksL2NsYXVkZS1zZWFyY2hib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJDbGF1ZGVCb3RcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86Y2xhdWRlYm90fGNsYXVkZS13ZWJ8Y2xhdWRlLXVzZXJ8Y2xhdWRlLXNlYXJjaGJvdClcXC8oXFxkKyhcXC5cXGQrKSspL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0Olsvb21naWxpYm90L2ksL3dlYnppby1leHRlbmRlZC9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIk9tZ2lsaWJvdFwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpvbWdpbGlib3R8d2ViemlvLWV4dGVuZGVkKVxcLyhcXGQrKFxcLlxcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9kaWZmYm90L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiRGlmZmJvdFwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9kaWZmYm90XFwvKFxcZCsoXFwuXFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL3BlcnBsZXhpdHlib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJQZXJwbGV4aXR5Qm90XCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3BlcnBsZXhpdHlib3RcXC8oXFxkKyhcXC5cXGQrKSspL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvcGVycGxleGl0eS11c2VyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiUGVycGxleGl0eS1Vc2VyXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3BlcnBsZXhpdHktdXNlclxcLyhcXGQrKFxcLlxcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy95b3Vib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJZb3VCb3RcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgveW91Ym90XFwvKFxcZCsoXFwuXFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL21ldGEtd2ViaW5kZXhlci9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIk1ldGEtV2ViSW5kZXhlclwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9tZXRhLXdlYmluZGV4ZXJcXC8oXFxkKyhcXC5cXGQrKSspL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvbWV0YS1leHRlcm5hbGFkcy9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIk1ldGEtRXh0ZXJuYWxBZHNcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvbWV0YS1leHRlcm5hbGFkc1xcLyhcXGQrKFxcLlxcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxl
1KTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9tZXRhLWV4dGVybmFsYWdlbnQvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJNZXRhLUV4dGVybmFsQWdlbnRcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvbWV0YS1leHRlcm5hbGFnZW50XFwvKFxcZCsoXFwuXFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL21ldGEtZXh0ZXJuYWxmZXRjaGVyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiTWV0YS1FeHRlcm5hbEZldGNoZXJcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvbWV0YS1leHRlcm5hbGZldGNoZXJcXC8oXFxkKyhcXC5cXGQrKSspL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiR29vZ2xlYm90XCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL2dvb2dsZWJvdFxcLyhcXGQrKFxcLlxcZCspKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2xpbmVzcGlkZXIvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJMaW5lc3BpZGVyXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OmxpbmVzcGlkZXIpKD86LVstXFx3XSspP1tcXHMvXShcXGQrKFxcLlxcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9hbWF6b25ib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJBbWF6b25Cb3RcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvYW1hem9uYm90XFwvKFxcZCsoXFwuXFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2Jpbmdib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJCaW5nQ3Jhd2xlclwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9iaW5nYm90XFwvKFxcZCsoXFwuXFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2JhaWR1c3BpZGVyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiQmFpZHVTcGlkZXJcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvYmFpZHVzcGlkZXJcXC8oXFxkKyhcXC5cXGQrKSspL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvZHVja2R1Y2tib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJEdWNrRHVja0JvdFwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9kdWNrZHVja2JvdFxcLyhcXGQrKFxcLlxcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9pYV9hcmNoaXZlci9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIkludGVybmV0QXJjaGl2ZUNyYXdsZXJcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvaWFfYXJjaGl2ZXJcXC8oXFxkKyhcXC5cXGQrKSspL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvZmFjZWJvb2tleHRlcm5hbGhpdC9pLC9mYWNlYm9va2NhdGFsb2cvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57bmFtZTpcIkZhY2Vib29rRXh0ZXJuYWxIaXRcIn19fSx7dGVzdDpbL3NsYWNrYm90L2ksL3NsYWNrLWltZ1Byb3h5L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiU2xhY2tCb3RcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86c2xhY2tib3R8c2xhY2staW1ncHJveHkpKD86LVstXFx3XSspP1tcXHMvXShcXGQrKFxcLlxcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy95YWhvbyE/W1xccy9dKnNsdXJwL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue25hbWU6XCJZYWhvb1NsdXJwXCJ9fX0se3Rlc3Q6Wy95YW5kZXhib3QvaSwveWFuZGV4bW9iaWxlYm90L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue25hbWU6XCJZYW5kZXhCb3RcIn19fSx7dGVzdDpbL3Bpbmdkb20vaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57bmFtZTpcIlBpbmdkb21Cb3RcIn19fSx7dGVzdDpbL29wZXJhL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiT3BlcmFcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL29wclxcL3xvcGlvcy9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIk9wZXJhXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/Om9wcnxvcGlvcylbXFxzL10oXFxTKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9TYW1zdW5nQnJvd3Nlci9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIlNhbXN1bmcgSW50ZXJuZXQgZm9yIEFuZHJvaWRcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL1doYWxlL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiTkFWRVIgV2hhbGUgQnJvd3NlclwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzp3aGFsZSlbXFxzL10oXFxkKyg/OlxcLlxcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9QYWxlTW9vbi9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIlBhbGUgTW9vblwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpQYWxlTW9vbilbXFxzL10oXFxkKyg/OlxcLlxcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJNWiBCcm93c2VyXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/Ok1aQnJvd3NlcilbXFxzL10oXFxkKyg/OlxcLlxcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxl
1KTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9mb2N1cy9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIkZvY3VzXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OmZvY3VzKVtcXHMvXShcXGQrKD86XFwuXFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL3N3aW5nL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiU3dpbmdcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xccy9dKFxcZCsoPzpcXC5cXGQrKSspL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJPcGVyYSBDb2FzdFwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpjb2FzdClbXFxzL10oXFxkKyhcXC4/Xz9cXGQrKSspL2ksZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0Olsvb3B0XFwvXFxkKyg/Oi4/Xz9cXGQrKSsvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJPcGVyYSBUb3VjaFwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpvcHQpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL3lhYnJvd3Nlci9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIllhbmRleCBCcm93c2VyXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXFxzL10oXFxkKyhcXC4/Xz9cXGQrKSspL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiVUMgQnJvd3NlclwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzp1Y2Jyb3dzZXIpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL01heHRob258bXhpb3MvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJNYXh0aG9uXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2VwaXBoYW55L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiRXBpcGhhbnlcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86ZXBpcGhhbnkpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIlB1ZmZpblwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKGEsZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpwdWZmaW4pW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL3NsZWlwbmlyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiU2xlaXBuaXJcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2stbWVsZW9uL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiSy1NZWxlb25cIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86ay1tZWxlb24pW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiV2VDaGF0XCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/Om1pY3JvbWVzc2VuZ2VyKVtcXHMvXShcXGQrKFxcLj9fP1xcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9xcWJyb3dzZXIvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KGUpP1wiUVEgQnJvd3NlciBMaXRlXCI6XCJRUSBCcm93c2VyXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcXGQrKFxcLj9fP1xcZCspKykvaSxlKXx8bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9tc2llfHRyaWRlbnQvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJJbnRlcm5ldCBFeHBsb3JlclwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzptc2llIHxydjopKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL1xcc2VkZ1xcLy9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIk1pY3Jvc29mdCBFZGdlXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL1xcc2VkZ1xcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9lZGcoW2VhXXxpb3MpL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiTWljcm9zb2Z0IEVkZ2VcIn0scj1uLmRlZmF1bHQuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0Olsvdml2YWxkaS9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIlZpdmFsZGlcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9zZWFtb25rZXkvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJTZWFNb25rZXlcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL3NhaWxmaXNoL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiU2FpbGZpc2hcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hcXHM/YnJvd3NlclxcLyhcXGQrKFxcLlxcZCspPykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiQW1hem9uIFNpbGtcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvc2lsa1xcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9waGFudG9tL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiUGhhbnRvbUpTXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3BoYW50b21qc1xcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9zbGltZXJqcy9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIlNsaW1lckpTXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3NsaW1lcmpzXFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2JsYWNrYmVycnl8XFxiYmJcXGQrL2ksL3JpbVxcc3RhYmxldC9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIkJsYWNrQmVycnlcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcXGRdK1xcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIldlYk9TIEJyb3dzZXJcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvYmFkYS9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIkJhZGFcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiVGl6ZW5cIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5cXHM/KT9icm93c2VyXFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL3F1cHppbGxhL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiUXVwWmlsbGFcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2xpYnJld29sZi9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTpcIkxpYnJlV29sZlwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpsaWJyZXdvbGYpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiRmlyZWZveFwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpmaXJlZm94fGljZXdlYXNlbHxmeGlvcylbXFxzL10oXFxkKyhcXC4/Xz9cXGQrKSspL2ksZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJFbGVjdHJvblwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzplbGVjdHJvbilcXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0Olsvc29nb3Vtb2JpbGVicm93c2VyL2ksL21ldGFzci9pLC9zZSAyXFwuW3hdL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiU29nb3UgQnJvd3NlclwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpzb2dvdW1vYmlsZWJyb3dzZXIpW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpLGk9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxlKSxhPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9zZSAoW1xcZC5dKyl4L2ksZSksbz1yfHxpfHxhO3JldHVybiBvJiYodC52ZXJzaW9uPW8pLHR9fSx7dGVzdDpbL01pdWlCcm93c2VyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiTWl1aVwifSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXFxzL10oXFxkKyhcXC4/Xz9cXGQrKSspL2ksZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OmZ1bmN0aW9uKGUpe3JldHVybiEhZS5oYXNCcmFuZChcIkR1Y2tEdWNrR29cIil8fGUudGVzdCgvXFxzRGRnXFwvW1xcZC5dKyQvaSl9LGRlc2NyaWJlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9e25hbWU6XCJEdWNrRHVja0dvXCJ9O2lmKHQpe3ZhciBpPXQuZ2V0QnJhbmRWZXJzaW9uKFwiRHVja0R1Y2tHb1wiKTtpZihpKXJldHVybi
1ByLnZlcnNpb249aSxyfXZhciBhPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9cXHNEZGdcXC8oW1xcZC5dKykkL2ksZSk7cmV0dXJuIGEmJihyLnZlcnNpb249YSkscn19LHt0ZXN0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmhhc0JyYW5kKFwiQnJhdmVcIil9LGRlc2NyaWJlOmZ1bmN0aW9uKGUsdCl7dmFyIHI9e25hbWU6XCJCcmF2ZVwifTtpZih0KXt2YXIgaT10LmdldEJyYW5kVmVyc2lvbihcIkJyYXZlXCIpO2lmKGkpcmV0dXJuIHIudmVyc2lvbj1pLHJ9cmV0dXJuIHJ9fSx7dGVzdDpbL2Nocm9taXVtL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiQ2hyb21pdW1cIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvKD86Y2hyb21pdW0pW1xccy9dKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL2Nocm9tZXxjcmlvc3xjcm1vL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOlwiQ2hyb21lXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9HU0EvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJHb29nbGUgU2VhcmNoXCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OmZ1bmN0aW9uKGUpe3ZhciB0PSFlLnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxyPWUudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gdCYmcn0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJBbmRyb2lkIEJyb3dzZXJcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL3BsYXlzdGF0aW9uIDQvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJQbGF5U3RhdGlvbiA0XCJ9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goYSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9e25hbWU6XCJTYWZhcmlcIn0scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaChhLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbLy4qL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PS0xIT09ZS5zZWFyY2goXCJcXFxcKFwiKT8vXiguKilcXC8oLiopWyBcXHRdXFwoKC4qKS86L14oLiopXFwvKC4qKSAvO3JldHVybntuYW1lOm4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKHQsZSksdmVyc2lvbjpuLmRlZmF1bHQuZ2V0U2Vjb25kTWF0Y2godCxlKX19fV07dC5kZWZhdWx0PW8sZS5leHBvcnRzPXQuZGVmYXVsdH0sOTM6ZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3QuX19lc01vZHVsZT0hMCx0LmRlZmF1bHQ9dm9pZCAwO3ZhciBpLG49KGk9cigxNykpJiZpLl9fZXNNb2R1bGU/aTp7ZGVmYXVsdDppfSxhPXIoMTgpO3ZhciBvPVt7dGVzdDpbL1Jva3VcXC9EVlAvXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvUm9rdVxcL0RWUC0oXFxkK1xcLlxcZCspL2ksZSk7cmV0dXJue25hbWU6YS5PU19NQVAuUm9rdSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy93aW5kb3dzIHBob25lL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC93aW5kb3dzIHBob25lICg/Om9zKT9cXHM/KFxcZCsoXFwuXFxkKykqKS9pLGUpO3JldHVybntuYW1lOmEuT1NfTUFQLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXFxkXFxkPy5cXGQpPykvaSxlKSxyPW4uZGVmYXVsdC5nZXRXaW5kb3dzVmVyc2lvbk5hbWUodCk7cmV0dXJue25hbWU6YS5PU19NQVAuV2luZG93cyx2ZXJzaW9uOnQsdmVyc2lvbk5hbWU6cn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcXC8vXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD17bmFtZTphLk9TX01BUC5pT1N9LHI9bi5kZWZhdWx0LmdldFNlY29uZE1hdGNoKC8oVmVyc2lvblxcLykoXFxkW1xcZC5dKykvLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpbL21hY2ludG9zaC9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvbWFjIG9zIHggKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpLnJlcGxhY2UoL1tfXFxzXS9nLFwiLlwiKSxyPW4uZGVmYXVsdC5nZXRNYWNPU1ZlcnNpb25OYW1lKHQpLGk9e25hbWU6YS5PU19NQVAuTWFjT1MsdmVyc2lvbjp0fTtyZXR1cm4gciYmKGkudmVyc2lvbk5hbWU9ciksaX19LHt0ZXN0OlsvKGlwb2R8aXBob25lfGlwYWQpL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9vcyAoXFxkKyhbX1xcc11cXGQrKSopIGxpa2UgbWFjIG9zIHgvaSxlKS5yZXBsYWNlKC9bX1xcc10vZyxcIi5cIik7cmV0dXJue25hbWU6YS5PU19NQVAuaU9TLHZlcnNpb246dH19fSx7dGVzdDpbL09wZW5IYXJtb255L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9PcGVuSGFybW9ueVxccysoXFxkKyhcXC5cXGQrKSopL2ksZSk7cmV0dXJue25hbWU6YS5PU19NQVAuSGFybW9ueU9TLHZlcnNpb246dH19fSx7dGVzdDpmdW5jdGlvbihlKXt2YXIgdD0hZS50ZXN0KC9saWtlIGFuZHJvaWQvaSkscj1lLnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHQmJnJ9LGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9hbmRyb2lkW1xccy8tXShcXGQrKFxcLlxcZCspKikvaSxlKSxyPW4uZGVmYXVsdC5nZXRBbmRyb2lkVmVyc2lvbk5hbWUodCksaT17bmFtZTphLk9TX01BUC5BbmRyb2lkLHZlcnNpb246dH07cmV0dXJuIHImJihpLnZlcnNpb25OYW1lPXIpLGl9fSx7dGVzdDpbLyh3ZWJ8aHB3KVtvMF1zL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC8oPzp3ZWJ8aHB3KVtvMF1zXFwvKFxcZCsoXFwuXFxkKykqKS9pLGUpLHI9e25hbWU6YS5PU19NQVAuV2ViT1N9O3JldHVybiB0JiZ0Lmxlbmd0aCYmKHIudmVyc2lvbj10KSxyfX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxcYmJiXFxkKy9pLC9yaW1cXHN0YWJsZXQvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3JpbVxcc3RhYmxldFxcc29zXFxzKFxcZCsoXFwuXFxkKykqKS9pLGUpfHxuLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxcZCtcXC8oXFxkKyhbX1xcc11cXGQrKSopL2ksZSl8fG4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9cXGJiYihcXGQrKS9pLGUpO3JldHVybntuYW1lOmEuT1NfTUFQLkJsYWNrQmVycnksdmVyc2lvbjp0fX19LHt0ZXN0OlsvYmFkYS9pXSxkZXNjcmliZTpmdW5jdGlvbihlKXt2YXIgdD1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvYmFkYVxcLyhcXGQrKFxcLlxcZCspKikvaSxlKTtyZXR1cm57bmFtZTphLk9TX01BUC5CYWRhLHZlcnNpb246dH19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC90aXplblsvXFxzXShcXGQrKFxcLlxcZCspKikvaSxlKTtyZXR1cm57bmFtZTphLk9TX01BUC5UaXplbix2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy9saW51eC9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybntuYW1lOmEuT1NfTUFQLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue25hbWU6YS5PU19NQVAuQ2hyb21lT1N9fX0se3Rlc3Q6Wy9QbGF5U3RhdGlvbiA0L10sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL1BsYXlTdGF0aW9uIDRbL1xcc10oXFxkKyhcXC5cXGQrKSopL2ksZSk7cmV0dXJue25hbWU6YS5PU19NQVAuUGxheVN0YXRpb240LHZlcnNpb246dH19fV07dC5kZWZh
1dWx0PW8sZS5leHBvcnRzPXQuZGVmYXVsdH0sOTQ6ZnVuY3Rpb24oZSx0LHIpe1widXNlIHN0cmljdFwiO3QuX19lc01vZHVsZT0hMCx0LmRlZmF1bHQ9dm9pZCAwO3ZhciBpLG49KGk9cigxNykpJiZpLl9fZXNNb2R1bGU/aTp7ZGVmYXVsdDppfSxhPXIoMTgpO3ZhciBvPVt7dGVzdDpbL2dvb2dsZWJvdC9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5ib3QsdmVuZG9yOlwiR29vZ2xlXCJ9fX0se3Rlc3Q6Wy9saW5lc3BpZGVyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLmJvdCx2ZW5kb3I6XCJMaW5lXCJ9fX0se3Rlc3Q6Wy9hbWF6b25ib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAuYm90LHZlbmRvcjpcIkFtYXpvblwifX19LHt0ZXN0OlsvZ3B0Ym90L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLmJvdCx2ZW5kb3I6XCJPcGVuQUlcIn19fSx7dGVzdDpbL2NoYXRncHQtdXNlci9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5ib3QsdmVuZG9yOlwiT3BlbkFJXCJ9fX0se3Rlc3Q6Wy9vYWktc2VhcmNoYm90L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLmJvdCx2ZW5kb3I6XCJPcGVuQUlcIn19fSx7dGVzdDpbL2JhaWR1c3BpZGVyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLmJvdCx2ZW5kb3I6XCJCYWlkdVwifX19LHt0ZXN0OlsvYmluZ2JvdC9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5ib3QsdmVuZG9yOlwiQmluZ1wifX19LHt0ZXN0OlsvZHVja2R1Y2tib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAuYm90LHZlbmRvcjpcIkR1Y2tEdWNrR29cIn19fSx7dGVzdDpbL2NsYXVkZWJvdC9pLC9jbGF1ZGUtd2ViL2ksL2NsYXVkZS11c2VyL2ksL2NsYXVkZS1zZWFyY2hib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAuYm90LHZlbmRvcjpcIkFudGhyb3BpY1wifX19LHt0ZXN0Olsvb21naWxpYm90L2ksL3dlYnppby1leHRlbmRlZC9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5ib3QsdmVuZG9yOlwiV2Viei5pb1wifX19LHt0ZXN0OlsvZGlmZmJvdC9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5ib3QsdmVuZG9yOlwiRGlmZmJvdFwifX19LHt0ZXN0OlsvcGVycGxleGl0eWJvdC9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5ib3QsdmVuZG9yOlwiUGVycGxleGl0eSBBSVwifX19LHt0ZXN0OlsvcGVycGxleGl0eS11c2VyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLmJvdCx2ZW5kb3I6XCJQZXJwbGV4aXR5IEFJXCJ9fX0se3Rlc3Q6Wy95b3Vib3QvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAuYm90LHZlbmRvcjpcIllvdS5jb21cIn19fSx7dGVzdDpbL2lhX2FyY2hpdmVyL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLmJvdCx2ZW5kb3I6XCJJbnRlcm5ldCBBcmNoaXZlXCJ9fX0se3Rlc3Q6Wy9tZXRhLXdlYmluZGV4ZXIvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAuYm90LHZlbmRvcjpcIk1ldGFcIn19fSx7dGVzdDpbL21ldGEtZXh0ZXJuYWxhZHMvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAuYm90LHZlbmRvcjpcIk1ldGFcIn19fSx7dGVzdDpbL21ldGEtZXh0ZXJuYWxhZ2VudC9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5ib3QsdmVuZG9yOlwiTWV0YVwifX19LHt0ZXN0OlsvbWV0YS1leHRlcm5hbGZldGNoZXIvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAuYm90LHZlbmRvcjpcIk1ldGFcIn19fSx7dGVzdDpbL2ZhY2Vib29rZXh0ZXJuYWxoaXQvaSwvZmFjZWJvb2tjYXRhbG9nL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLmJvdCx2ZW5kb3I6XCJNZXRhXCJ9fX0se3Rlc3Q6Wy9zbGFja2JvdC9pLC9zbGFjay1pbWdQcm94eS9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5ib3QsdmVuZG9yOlwiU2xhY2tcIn19fSx7dGVzdDpbL3lhaG9vL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLmJvdCx2ZW5kb3I6XCJZYWhvb1wifX19LHt0ZXN0OlsveWFuZGV4Ym90L2ksL3lhbmRleG1vYmlsZWJvdC9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5ib3QsdmVuZG9yOlwiWWFuZGV4XCJ9fX0se3Rlc3Q6Wy9waW5nZG9tL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLmJvdCx2ZW5kb3I6XCJQaW5nZG9tXCJ9fX0se3Rlc3Q6Wy9odWF3ZWkvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyhjYW4tbDAxKS9pLGUpJiZcIk5vdmFcIixyPXt0eXBlOmEuUExBVEZPUk1TX01BUC5tb2JpbGUsdmVuZG9yOlwiSHVhd2VpXCJ9O3JldHVybiB0JiYoci5tb2RlbD10KSxyfX0se3Rlc3Q6Wy9uZXh1c1xccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC50YWJsZXQsdmVuZG9yOlwiTmV4dXNcIn19fSx7dGVzdDpbL2lwYWQvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAudGFibGV0LHZlbmRvcjpcIkFwcGxlXCIsbW9kZWw6XCJpUGFkXCJ9fX0se3Rlc3Q6Wy9NYWNpbnRvc2goLio/KSBGeGlPUyguKj8pXFwvL10sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAudGFibGV0LHZlbmRvcjpcIkFwcGxlXCIsbW9kZWw6XCJpUGFkXCJ9fX0se3Rlc3Q6Wy9rZnR0IGJ1aWxkL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLnRhYmxldCx2ZW5kb3I6XCJBbWF6b25cIixtb2RlbDpcIktpbmRsZSBGaXJlIEhEIDdcIn19fSx7dGVzdDpbL3NpbGsvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAudGFibGV0LHZlbmRvcjpcIkFtYXpvblwifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUEx
1BVEZPUk1TX01BUC50YWJsZXR9fX0se3Rlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50ZXN0KC9pcG9kfGlwaG9uZS9pKSxyPWUudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiB0JiYhcn0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSxlKTtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAubW9iaWxlLHZlbmRvcjpcIkFwcGxlXCIsbW9kZWw6dH19fSx7dGVzdDpbL25leHVzXFxzKlswLTZdLiovaSwvZ2FsYXh5IG5leHVzL2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLm1vYmlsZSx2ZW5kb3I6XCJOZXh1c1wifX19LHt0ZXN0OlsvTm9raWEvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL05va2lhXFxzKyhbMC05XSsoXFwuWzAtOV0rKT8pL2ksZSkscj17dHlwZTphLlBMQVRGT1JNU19NQVAubW9iaWxlLHZlbmRvcjpcIk5va2lhXCJ9O3JldHVybiB0JiYoci5tb2RlbD10KSxyfX0se3Rlc3Q6Wy9bXi1dbW9iaS9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5tb2JpbGV9fX0se3Rlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuXCJibGFja2JlcnJ5XCI9PT1lLmdldEJyb3dzZXJOYW1lKCEwKX0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAubW9iaWxlLHZlbmRvcjpcIkJsYWNrQmVycnlcIn19fSx7dGVzdDpmdW5jdGlvbihlKXtyZXR1cm5cImJhZGFcIj09PWUuZ2V0QnJvd3Nlck5hbWUoITApfSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5tb2JpbGV9fX0se3Rlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuXCJ3aW5kb3dzIHBob25lXCI9PT1lLmdldEJyb3dzZXJOYW1lKCl9LGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLm1vYmlsZSx2ZW5kb3I6XCJNaWNyb3NvZnRcIn19fSx7dGVzdDpmdW5jdGlvbihlKXt2YXIgdD1OdW1iZXIoU3RyaW5nKGUuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KFwiLlwiKVswXSk7cmV0dXJuXCJhbmRyb2lkXCI9PT1lLmdldE9TTmFtZSghMCkmJnQ+PTN9LGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLnRhYmxldH19fSx7dGVzdDpmdW5jdGlvbihlKXtyZXR1cm5cImFuZHJvaWRcIj09PWUuZ2V0T1NOYW1lKCEwKX0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAubW9iaWxlfX19LHt0ZXN0Olsvc21hcnQtP3R2fHNtYXJ0dHYvaV0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAudHZ9fX0se3Rlc3Q6Wy9uZXRjYXN0L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLnR2fX19LHt0ZXN0OmZ1bmN0aW9uKGUpe3JldHVyblwibWFjb3NcIj09PWUuZ2V0T1NOYW1lKCEwKX0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAuZGVza3RvcCx2ZW5kb3I6XCJBcHBsZVwifX19LHt0ZXN0OmZ1bmN0aW9uKGUpe3JldHVyblwid2luZG93c1wiPT09ZS5nZXRPU05hbWUoITApfSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOmEuUExBVEZPUk1TX01BUC5kZXNrdG9wfX19LHt0ZXN0OmZ1bmN0aW9uKGUpe3JldHVyblwibGludXhcIj09PWUuZ2V0T1NOYW1lKCEwKX0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAuZGVza3RvcH19fSx7dGVzdDpmdW5jdGlvbihlKXtyZXR1cm5cInBsYXlzdGF0aW9uIDRcIj09PWUuZ2V0T1NOYW1lKCEwKX0sZGVzY3JpYmU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTphLlBMQVRGT1JNU19NQVAudHZ9fX0se3Rlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuXCJyb2t1XCI9PT1lLmdldE9TTmFtZSghMCl9LGRlc2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6YS5QTEFURk9STVNfTUFQLnR2fX19XTt0LmRlZmF1bHQ9byxlLmV4cG9ydHM9dC5kZWZhdWx0fSw5NTpmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7dC5fX2VzTW9kdWxlPSEwLHQuZGVmYXVsdD12b2lkIDA7dmFyIGksbj0oaT1yKDE3KSkmJmkuX19lc01vZHVsZT9pOntkZWZhdWx0Oml9LGE9cigxOCk7dmFyIG89W3t0ZXN0OmZ1bmN0aW9uKGUpe3JldHVyblwibWljcm9zb2Z0IGVkZ2VcIj09PWUuZ2V0QnJvd3Nlck5hbWUoITApfSxkZXNjcmliZTpmdW5jdGlvbihlKXtpZigvXFxzZWRnXFwvL2kudGVzdChlKSlyZXR1cm57bmFtZTphLkVOR0lORV9NQVAuQmxpbmt9O3ZhciB0PW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC9lZGdlXFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybntuYW1lOmEuRU5HSU5FX01BUC5FZGdlSFRNTCx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy90cmlkZW50L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOmEuRU5HSU5FX01BUC5UcmlkZW50fSxyPW4uZGVmYXVsdC5nZXRGaXJzdE1hdGNoKC90cmlkZW50XFwvKFxcZCsoXFwuP18/XFxkKykrKS9pLGUpO3JldHVybiByJiYodC52ZXJzaW9uPXIpLHR9fSx7dGVzdDpmdW5jdGlvbihlKXtyZXR1cm4gZS50ZXN0KC9wcmVzdG8vaSl9LGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOmEuRU5HSU5FX01BUC5QcmVzdG99LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3ByZXN0b1xcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX0se3Rlc3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50ZXN0KC9nZWNrby9pKSxyPWUudGVzdCgvbGlrZSBnZWNrby9pKTtyZXR1cm4gdCYmIXJ9LGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOmEuRU5HSU5FX01BUC5HZWNrb30scj1uLmRlZmF1bHQuZ2V0Rmlyc3RNYXRjaCgvZ2Vja29cXC8oXFxkKyhcXC4/Xz9cXGQrKSspL2ksZSk7cmV0dXJuIHImJih0LnZlcnNpb249ciksdH19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcXC81MzdcXC4zNi9pXSxkZXNjcmliZTpmdW5jdGlvbigpe3JldHVybntuYW1lOmEuRU5HSU5FX01BUC5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlOmZ1bmN0aW9uKGUpe3ZhciB0PXtuYW1lOmEuRU5HSU5FX01BUC5XZWJLaXR9LHI9bi5kZWZhdWx0LmdldEZpcnN0TWF0Y2goL3dlYmtpdFxcLyhcXGQrKFxcLj9fP1xcZCspKykvaSxlKTtyZXR1cm4gciYmKHQudmVyc2lvbj1yKSx0fX1dO3QuZGVmYXVsdD1vLGUuZXhwb3J0cz10LmRlZmF1bHR9fSl9KSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///880\n\n}')},807:function(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__){"use strict";eval('{\n;// ../../extensions/utils.js\n/**\r\n * @typedef {import(\'../libraries/packages/rai-bdo/src/index\').PolicyManager} PolicyManager\r\n */\r\n\r\nfunction getValueFromJson(keys, json) {\r\n  if (!Array.isArray(keys)) {\r\n    keys = keys.split(".");\r\n  }
1\r\n\r\n  function getKeyVal(obj, key) {\r\n    const k = parseInt(key, 10);\r\n    if (k.toString() === key) {\r\n      key = k;\r\n    }\r\n\r\n    if (Array.isArray(obj)) {\r\n      return typeof key === "number" && obj.length > key ? obj[key] : null;\r\n    }\r\n\r\n    return (obj?.[key] ?? null);\r\n  }\r\n\r\n  const val = keys.reduce(getKeyVal, json);\r\n  return val;\r\n}\r\n\r\nfunction replaceSpecialCharacters(val) {\r\n  return val\r\n    .replace(/%C3%A0/g, "a")\r\n    .replace(/%C3%80/g, "A")\r\n    .replace(/%C3%A8/g, "e")\r\n    .replace(/%C3%88/g, "E")\r\n    .replace(/%C3%AC/g, "i")\r\n    .replace(/%C3%8C/g, "I")\r\n    .replace(/%C3%B2/g, "o")\r\n    .replace(/%C3%92/g, "O")\r\n    .replace(/%C3%B9/g, "u")\r\n    .replace(/%C3%99/g, "U");\r\n}\r\n\r\nfunction getMetaValue(name) {\r\n  if (!name) {\r\n    return false;\r\n  }\r\n\r\n  let res = false;\r\n  const meta = document.querySelector("meta[property=" + name + "]");\r\n  res = (!!meta && meta.content) || false;\r\n  return res;\r\n}\r\n\r\nfunction get_video_duration(hms) {\r\n  if (!hms) {return null;}\r\n  const a = hms.split(":");\r\n  const minutes = a.length > 1 ? (+a[0] * 60) + +a[1] : a[0];\r\n  return minutes + " min";\r\n}\r\n\r\nfunction adUnitIframeOverride(videoItemJson) {\r\n  let override = false;\r\n  if (document.referrer.indexOf("msn.com") > -1) {\r\n    switch (location.host.replace(/www.|.com|.it/g, "")) {\r\n    case "raiplay":\r\n      override = "/rmsnw/progr/spett/video";\r\n      break;\r\n    case "rainews":\r\n      override = "/rmsnw/progr/newsx/video";\r\n      break;\r\n    case "raisport":\r\n      override = "/rmsnw/progr/sport/video";\r\n      break;\r\n    default:\r\n      break;\r\n    }\r\n\r\n    if (videoItemJson.typology === "programmi tv" || videoItemJson.typology === "fiction") {\r\n      override = "/rmsnw/progr/spett/video";\r\n    }\r\n\r\n    if (videoItemJson.program_info.name.toLowerCase().indexOf("sanremo") >= 0) {\r\n      override = "/rmsnw/progr/sanrm/video";\r\n    }\r\n\r\n    if (videoItemJson.program_info.name.toLowerCase().indexOf("altro festival") >= 0) {\r\n      override = "/rmsnw/progr/sanrm/video";\r\n    }\r\n\r\n    if (videoItemJson.program_info.name.toLowerCase().indexOf("vivaraiplay") >= 0) {\r\n      override = "/rmsnw/progr/vivar/video";\r\n    }\r\n  }\r\n\r\n  return override;\r\n}\r\n\r\nfunction getStringOperatingSystem() {\r\n  const userAgent = navigator.userAgent || navigator.vendor || window.opera;\r\n\r\n  if (/android/i.test(userAgent)) {\r\n    return "android";\r\n  }\r\n\r\n  if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {\r\n    return "ios";\r\n  }\r\n\r\n  return "web";\r\n}\r\n\r\nfunction setupMsnPostMessages(raiPlayer) {\r\n  const objToSend = {};\r\n  objToSend.referrer = "microsoft";\r\n  objToSend.event = "load";\r\n  parent.postMessage(objToSend, document.referrer);\r\n  raiPlayer.on(raiPlayer.events.EventsType.CREATION, () => {\r\n    objToSend.event = "load";\r\n    parent.postMessage(objToSend, document.referrer);\r\n  });\r\n  raiPlayer.on(raiPlayer.events.EventsType.FIRSTPLAY, () => {\r\n    objToSend.event = "start";\r\n    objToSend.videoType = "content";\r\n    parent.postMessage(objToSend, document.referrer);\r\n  });\r\n  raiPlayer.on(raiPlayer.events.EventsType.ENDED, () => {\r\n    objToSend.event = "end";\r\n    objToSend.videoType = "content";\r\n    parent.postMessage(objToSend, document.referrer);\r\n  });\r\n}\r\n\r\nfunction isInIframe() {\r\n  return top !== self;\r\n}\r\n\r\nfunction isIframePage() {\r\n  return document.body.classList.contains("iframe");\r\n}\r\n\r\nfunction isInMsnIframe() {\r\n  return isIframePage() && document.referrer.indexOf("msn.com") >= 0;\r\n}\r\n\r\nfunction isEmbeddableForm(videoItemJson) {\r\n  const form = videoItemJson.form.toLowerCase();\r\n  return form === "clip" || form === "extra" || videoItemJson.is_live;\r\n}\r\n\r\nfunction isEmbeddableContent(videoItemJson) {\r\n  try {\r\n    const programName\r\n      = !!videoItemJson.program_info && !!videoItemJson.program_info.name ? videoItemJson.program_info.name.toLowerCase() : "";\r\n    if (\r\n      programName.indexOf("sanremo") >= 0\r\n      || programName.indexOf("altro festival") >= 0\r\n      || programName.indexOf("L\'AltroFestival") >= 0\r\n      || programName.indexOf("l\'altrofestival") >= 0\r\n    ) {\r\n      return isEmbeddableForm(videoItemJson);\r\n    }\r\n\r\n    console.log("not embeddable");\r\n    return false;\r\n  }
1 catch (e) {\r\n    console.log("not embeddable catch");\r\n    console.log(e);\r\n    return false;\r\n  }\r\n}\r\n\r\nfunction isHomepage() {\r\n  return document.body.classList.contains("rai-home");\r\n}\r\n\r\nfunction getAdvLabelFromPage() {\r\n  if (!!window.rai_adv && !!window.rai_adv.adv_label) {return window.rai_adv.adv_label;}\r\n  if (!!window.rai_adv && !!window.rai_adv.dfp && !!window.rai_adv.dfp.label) {return window.rai_adv.dfp.label;}\r\n  if (isHomepage()) {return "hompg/hompg";}\r\n  if (isNativePage()) {return "hompg/hompg";}\r\n  if (document.body.classList.contains("my-list-page")) {return "progr/lmlst";}\r\n  return "rplyw/genrc";\r\n}\r\n\r\nfunction isNativePage() {\r\n  return document.body.classList.contains("rai-native");\r\n}\r\n\r\nfunction getAdvPortalCode() {\r\n  const domain = document.domain.indexOf("www.") > -1 ? document.domain.split(".")[1] : document.domain.split(".")[0];\r\n  let portalCode = "rplyw";\r\n  switch (domain) {\r\n  case "raiplay":\r\n    portalCode = "rplyw";\r\n    break;\r\n  case "rainews":\r\n  case "rainews-dev":\r\n  case "rainews-pre":\r\n  case "rainews-int":\r\n    portalCode = "rnwsw";\r\n    break;\r\n  case "rai":\r\n    if (isInIframe() && document.referrer.indexOf("msn.com") > -1) {\r\n      portalCode = "rplyw";\r\n    } else {\r\n      window.raiAdv.dfp.codicePortale = "raitw";\r\n    }\r\n\r\n    break;\r\n  case "raisport":\r\n    portalCode = "rsptw";\r\n    break;\r\n  default:\r\n    break;\r\n  }\r\n\r\n  return portalCode;\r\n}\r\n\r\nfunction getUrlParameter(sParam) {\r\n  const sPageURL = window.location.search.substring(1);\r\n  const sURLVariables = sPageURL.split("&");\r\n  let sParameterName;\r\n  let i;\r\n\r\n  for (i = 0; i < sURLVariables.length; i++) {\r\n    sParameterName = sURLVariables[i].split("=");\r\n\r\n    if (sParameterName[0] === sParam) {\r\n      return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\r\n    }\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\nfunction generatePassword(length, prefix) {\r\n  if (typeof length !== "number") {length = 8;}\r\n  if (typeof prefix !== "string") {prefix = "";}\r\n  const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_$!*";\r\n  let retVal = prefix;\r\n  for (let i = 0, n = charset.length; i < length; ++i) {\r\n    retVal += charset.charAt(Math.floor(Math.random() * n));\r\n  }\r\n\r\n  return retVal;\r\n}\r\n\r\nasync function getGDPRManager() {\r\n  if (window.Rai?.PolicyManager) {\r\n    return window.Rai.PolicyManager;\r\n  }\r\n\r\n  return new Promise(resolve => {\r\n    window.Rai = new Proxy(window.Rai ?? {}, {\r\n      set(target, prop, val) {\r\n        const setted = Reflect.set(target, prop, val);\r\n        if (prop === "PolicyManager") {\r\n          setTimeout(() => {\r\n            resolve(window.Rai.PolicyManager);\r\n          });\r\n        }\r\n\r\n        return setted;\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\nasync function getPrivacyConsent() {\r\n  const GDPRManager = await getGDPRManager();\r\n  return new Promise(resolve => {\r\n    GDPRManager.events$.subscribe(event => {\r\n      if (event.type === GDPRManager.events.POLICY_MANAGER_DEFINED_EVENT) {\r\n        const _manager = window.Rai.PolicyManager;\r\n        resolve(_manager.hasOptIn());\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nasync function getAdvPrivacyConsent() {\r\n  const GDPRManager = await getGDPRManager();\r\n  return new Promise(resolve => {\r\n    GDPRManager.events$.subscribe(event => {\r\n      if (event.type === GDPRManager.events.POLICY_MANAGER_DEFINED_EVENT) {\r\n        const _manager = window.Rai.PolicyManager;\r\n        resolve(_manager.hasGoogleVendorAvailable() && _manager.hasAdvConsents());\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nasync function getTcString() {\r\n  const GDPRManager = await getGDPRManager();\r\n  return new Promise(resolve => {\r\n    GDPRManager.events$.subscribe(event => {\r\n      if (event.type === GDPRManager.events.POLICY_MANAGER_DEFINED_EVENT) {\r\n        const _manager = window.Rai.PolicyManager;\r\n        resolve(_manager.getTcString());\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nconst escapeHTML = str =>\r\n  str.replace(\r\n    /[&<>\'"]/g,\r\n    tag =>\r\n      ({\r\n        "&": "&amp;",\r\n        "<": "&lt;",\r\n        ">": "&gt;",\r\n        "\'": "&#39;",\r\n        \'"\': "&quot;",\r\n      }[tag] || tag),\r\n  );\r\n\r\nconst chunk = (arr, chunkSize = 1, cache = []) => {\r\n  const tmp = [...arr];\r\n  if (chunkSize <= 0) {return cache;}\r\n  while (tmp.length) {cache.push(tmp.splice(0, chunkSize));}\r\n  return cache;\r\n};\r\n\r\nfunction getScript(url, callback) {\r\n  const script = document.createElement("script");\r\n  script.type = "text/javascript";\r\n  script.src = url;\r\n  // Most browsers\r\n  if (typeof callback === "function") {\r\n    script.onload = callback;\r\n    // IE 6 & 7\r\n    script.onreadystatechange = function () {\r\n      if (this.readyState === "complete") {\r\n        try {\r\n          callback();\r\n        } catch (e) {\r\n          console.error(e);\r\n        }\r\n      }\r\n    };\r\n  }\r\n\r\n  document.getElementsByTagName("head")[0].appendChild(script);\r\n}\r\n\r\nfunction getChanInfo(chan, key) {\r\n  const chanInfo = {\r\n    "Rai 1": {\r\n      path_id: "/dirette/rai1.json",\r\n      weblink: "/dirette/rai1",\r\n      class: "rai-1",\r\n    },\r\n    "Rai 2": {\r\n      path_id: "/dirette/rai2.json",\r\n      weblink: "/dirette/rai2",\r\n      class: "rai-2",\r\n    },\r\n    "Rai 3": {\r\n      path_id: "/dirette/rai3.json",\r\n      weblink: "/dirette/rai3",\r\n      class: "rai-3",\r\n    },\r\n    "Rai 4": {\r\n      path_id: "/dirette/rai4.json",\r\n      weblink: "/dirette/rai4",\r\n      class: "rai-4",\r\n    },\r\n    "Rai 5": {\r\n      path_id: "/dirette/rai5.json",\r\n      weblink: "/dirette/rai5",\r\n      class: "rai-5",\r\n    },\r\n    "Rai Movie": {\r\n      path_id: "/dirette/raimovie.json",\r\n      weblink: "/dirette/raimovie",\r\n      class: "rai-movie",\r\n    },\r\n    "Rai Premium": {\r\n      path_id: "/dirette/raipremium.json",\r\n      weblink: "/dirette/raipremium",\r\n      class: "rai-premium",\r\n    },\r\n    "Rai Gulp": {\r\n      path_id: "/dirette/raigulp.json",\r\n      weblink: "/dirette/raigulp",\r\n      class: "rai-gulp",\r\n    },\r\n    "Rai Yoyo": {\r\n      path_id: "/dirette/raiyoyo.json",\r\n      weblink: "/dirette/raiyoyo",\r\n      class: "rai-yoyo",\r\n    },\r\n    "Rai Storia": {\r\n      path_id: "/dirette/raistoria.json",\r\n      weblink: "/dirette/raistoria",\r\n      class: "rai-storia",\r\n    },\r\n    "Rai Scuola": {\r\n      path_id: "/dirette/raiscuola.json",\r\n      weblink: "/dirette/raiscuola",\r\n      class: "rai-scuola",\r\n    },\r\n    "Rai News 24": {\r\n      path_id: "/dirette/rainews24.json",\r\n      weblink: "/dirette/rainews24",\r\n      class: "rainews",\r\n    },\r\n    "Rai Sport piu HD": {\r\n      path_id: "/dirette/raisportpiuhd.json",\r\n      weblink: "/dirette/raisportpiuhd",\r\n      class: "raisport--hd",\r\n    },\r\n    "Rai Sport": {\r\n      path_id: "/dirette/raisport.json",\r\n      weblink: "/dirette/raisport",\r\n      class: "raisport-2",\r\n    },\r\n    "Rai Sport HD": {\r\n      path_id: "/dirette/raisporthd.json",\r\n      weblink: "/dirette/raisporthd",\r\n      class: "raisporthd",\r\n    },\r\n    Raiplay: {\r\n      path_id: "/dirette/raiplay.json",\r\n      weblink: "/dirette/raiplay",\r\n      class: "rai
1play",\r\n    },\r\n    RaiPlay: {\r\n      path_id: "/dirette/raiplay.json",\r\n      weblink: "/dirette/raiplay",\r\n      class: "raiplay",\r\n    },\r\n    "Raiplay 2": {\r\n      path_id: "/dirette/raiplay2.json",\r\n      weblink: "/dirette/raiplay2",\r\n      class: "raiplay2",\r\n    },\r\n    Raiplay2: {\r\n      path_id: "/dirette/raiplay2.json",\r\n      weblink: "/dirette/raiplay2",\r\n      class: "raiplay2",\r\n    },\r\n    "RaiPlay 2": {\r\n      path_id: "/dirette/raiplay2.json",\r\n      weblink: "/dirette/raiplay2",\r\n      class: "raiplay2",\r\n    },\r\n    RaiPlay2: {\r\n      path_id: "/dirette/raiplay2.json",\r\n      weblink: "/dirette/raiplay2",\r\n      class: "raiplay2",\r\n    },\r\n    "RaiPlay 3": {\r\n      path_id: "/dirette/raiplay3.json",\r\n      weblink: "/dirette/raiplay3",\r\n      class: "raiplay3",\r\n    },\r\n    RaiPlay3: {\r\n      path_id: "/dirette/raiplay3.json",\r\n      weblink: "/dirette/raiplay3",\r\n      class: "raiplay3",\r\n    },\r\n    "Raiplay Sport 2": {\r\n      path_id: "/dirette/raiplaysport2.json",\r\n      weblink: "/dirette/raiplaysport2",\r\n      class: "raiplaysport2",\r\n    },\r\n    "Raiplay Sport": {\r\n      path_id: "/dirette/raiplaysport.json",\r\n      weblink: "/dirette/raiplaysport",\r\n      class: "raiplaysport",\r\n    },\r\n    "Rai Radio 2": {\r\n      path_id: "/dirette/rairadio2.json",\r\n      weblink: "/dirette/rairadio2",\r\n      class: "rairadio2",\r\n    },\r\n  };\r\n  if (!!chanInfo[chan] && !!chanInfo[chan][key]) {\r\n    return chanInfo[chan][key];\r\n  }\r\n\r\n  return "";\r\n}\r\n\r\nfunction setRaiGlobalProperty(key, value) {\r\n  if (typeof key !== "string") {return;}\r\n  window.Rai = window.Rai || {};\r\n  window.Rai[key] = value;\r\n  return value;\r\n}\r\n\r\nfunction getRaiGlobalProperty(key) {\r\n  if (typeof key !== "string") {return null;}\r\n  return window.Rai ? window.Rai[key] : null;\r\n}\r\n\r\nasync function waitRaiGlobalProperty(varName, needTimeout, timeout) {\r\n  if (window.Rai?.[varName]) {\r\n    return window.Rai[varName];\r\n  }\r\n\r\n  return new Promise(resolve => {\r\n    let tmt;\r\n    window.Rai = new Proxy(window.Rai ?? {}, {\r\n      set(target, prop, value) {\r\n        const setted = Reflect.set(target, prop, value);\r\n        if (prop === varName) {\r\n          window.clearTimeout(tmt);\r\n          window.setTimeout(() => {\r\n            resolve(window.Rai[varName]);\r\n          }, 0);\r\n        }\r\n\r\n        return setted;\r\n      },\r\n    });\r\n    if (needTimeout) {\r\n      tmt = window.setTimeout(() => {\r\n        resolve(undefined);\r\n      }, timeout || 1000);\r\n    }\r\n  });\r\n}\r\n\n// EXTERNAL MODULE: ./node_modules/bowser/es5.js\nvar es5 = __webpack_require__(880);\nvar es5_default = /*#__PURE__*/__webpack_require__.n(es5);\n;// ./node_modules/es-cookie/src/es-cookie.js\nfunction stringifyAttribute(name, value) {\n    if (!value) {\n        return \'\';\n    }\n    let stringified = \'; \' + name;\n    if (value === true) {\n        return stringified; // boolean attributes shouldn\'t have a value\n    }\n    return stringified + \'=\' + value;\n}\nfunction stringifyAttributes(attributes) {\n    if (typeof attributes.expires === \'number\') {\n        const milliseconds = Math.min(Date.now() + attributes.expires * 864e+5, 864e+13);\n        attributes.expires = new Date(milliseconds);\n    }\n    return stringifyAttribute(\'Expires\', attributes.expires ? attributes.expires.toUTCString() : \'\')\n        + stringifyAttribute(\'Domain\', attributes.domain)\n        + stringifyAttribute(\'Path\', attributes.path)\n        + stringifyAttribute(\'Secure\', attributes.secure)\n        + stringifyAttribute(\'Partitioned\', attributes.partitioned)\n        + stringifyAttribute(\'SameSite\', attributes.sameSite);\n}\nfunction encode(name, value, attributes) {\n    return encodeURIComponent(name)\n        .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent) // allowed special characters\n        .replace(/\\(/g, \'%28\').replace(/\\)/g, \'%29\') // replace opening and closing parens\n        + \'=\' + encodeURIComponent(value)\n        // allowed special characters\n        .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent)\n        + stringifyAttributes(attributes);\n}\nfunction parse(cookieString) {\n    let result = {};\n    const cookies = cookieString ? cookieString.split(\'; \') : [];\n    for (let cookie of cookies) {\n        const parts = cookie.split(\'=\');\n        let value = parts.slice(1).join(\'=\');\n        if (value[0] === \'"\') {\n            value = value.slice(1, -1);\n        }\n        try {\n            const name = decodeURIComponent(parts[0]);\n            result[name] = value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent);\n        }\n        catch (e) {\n            // ignore cookies with invali
1d name/value encoding\n        }\n    }\n    return result;\n}\nfunction getAll() {\n    return parse(document.cookie);\n}\nfunction get(name) {\n    return getAll()[name];\n}\nfunction set(name, value, attributes) {\n    document.cookie = encode(name, value, { path: \'/\', ...attributes });\n}\nfunction remove(name, attributes) {\n    set(name, \'\', { ...attributes, expires: -1 });\n}\n\n;// ./src/storage-service.ts\n//@ts-ignore\n\nlet instance;\nclass StorageService {\n    constructor() {\n        if (!instance) {\n            instance = this;\n        }\n        return instance;\n    }\n    setStorage(name, obj, useSession = false) {\n        if (!name || !obj)\n            throw new Error("Invalid mandatory parameters");\n        if (window.localStorage && (useSession ? window.sessionStorage : true)) {\n            if (useSession) {\n                sessionStorage.setItem(name, JSON.stringify(obj));\n            }\n            else {\n                localStorage.setItem(name, JSON.stringify(obj));\n            }\n        }\n        else {\n            set(name, encodeURIComponent(JSON.stringify(obj)), {\n                domain: document.location.host,\n                path: "/",\n                expires: useSession ? undefined : 360,\n            });\n        }\n    }\n    getStorage(name, useSession = false) {\n        if (!name)\n            throw new Error("Invalid mandatory parameters");\n        if (window.localStorage && (useSession ? window.sessionStorage : true)) {\n            const storage = useSession ? sessionStorage : localStorage;\n            const res = storage.getItem(name);\n            return res ? JSON.parse(res) : null;\n        }\n        else {\n            const res = get(name);\n            return res ? JSON.parse(decodeURIComponent(res)) : null;\n        }\n    }\n    deleteStorage(name, useSession = false) {\n        if (window.localStorage && (useSession ? window.sessionStorage : true)) {\n            if (useSession) {\n                sessionStorage.removeItem(name);\n            }\n            else {\n                localStorage.removeItem(name);\n            }\n        }\n        else {\n            remove(name, { path: "/", domain: document.location.host });\n        }\n    }\n}\nconst StorageServiceFactory = {\n    getService: () => new StorageService(),\n};\n/* harmony default export */ var storage_service = (StorageServiceFactory);\n\n;// ./src/utils/definitions.ts\nconst STORAGE_KEYS = {\n    RECOMMENDATION_SECTIONS: "rps:recommendation-sections",\n    RECOMMENDATION_CARD_CLICKS: "rps:recommendation-card-clicks",\n    RECOMMENDATION_MAIN_PAGE_CACHE: "rps:recommendation-main-page",\n};\n\n;// ../../../../../../raiplay/assets-src/js/utilities/utils.js\n// Copia del file common\\assets-src\\js\\utilities\\utils.js\r\n\r\nconst avoidTypes = (/* unused pure expression or super */ null && ([\'raccolta\']))\r\n\r\n/**\r\n * @param {string|string[]} keys\r\n * @param {any} json\r\n */\r\nfunction utils_getValueFromJson(keys, json) {\r\n  if (!Array.isArray(keys)) {\r\n    keys = keys.split(\'.\');\r\n  }\r\n\r\n  /**\r\n   * @param {Record<string, any> | any[]} obj\r\n   * @param {string | number} key\r\n   */\r\n  function getKeyVal(obj, key) {\r\n    const k = parseInt(key.toString(), 10);\r\n    if (k.toString() === key) {\r\n      key = k;\r\n    }\r\n\r\n    if (Array.isArray(obj)) {\r\n      return typeof key === \'number\' && obj.length > key ? obj[key]\r\n        : null;\r\n    }\r\n\r\n    return obj?.[key] ? obj[key] : null;\r\n  }\r\n\r\n  const val = keys.reduce(getKeyVal, json);\r\n  return val;\r\n}\r\n\r\n/**\r\n * @param {string} val\r\n */\r\nfunction utils_replaceSpecialCharacters(val) {\r\n  return val.replace(/%C3%A0/g, \'a\')\r\n    .replace(/%C3%80/g, \'A\')\r\n    .replace(/%C3%A8/g, \'e\')\r\n    .replace(/%C3%88/g, \'E\')\r\n    .replace(/%C3%AC/g, \'i\')\r\n    .replace(/%C3%8C/g, \'I\')\r\n    .replace(/%C3%B2/g, \'o\')\r\n    .replace(/%C3%92/g, \'O\')\r\n    .replace(/%C3%B9/g, \'u\')\r\n    .replace(/%C3%99/g, \'U\');\r\n}\r\n\r\n/**\r\n * @param {string} _path\r\n */\r\nfunction pathToAvoid(_path){\r\n  var res = false;
1\r\n  avoidTypes.forEach(type => {\r\n    if(_path.indexOf(type)!=-1)\r\n      res = true;\r\n  });\r\n  return res;\r\n}\r\n\r\n/**\r\n * @param {string} name\r\n */\r\nfunction utils_getMetaValue(name) {\r\n  if (!name) {return false;}\r\n  /** @type {string|boolean} */\r\n  let res = false;\r\n  /** @type {HTMLMetaElement|null} */const meta = document.querySelector(\'meta[property=\' + name + \']\');\r\n  res = (!!meta && meta.content) || false;\r\n  return res;\r\n}\r\n\r\n/**\r\n * @param {string} hms\r\n */\r\nfunction utils_get_video_duration(hms) {\r\n  if (!hms) {return null;}\r\n  const a = hms.split(\':\');\r\n  const minutes = a.length > 1 ? ((+a[0]) * 60) + (+a[1]) : a[0];\r\n  return minutes + \' min\';\r\n}\r\n\r\n/**\r\n * @param {{ typology: string; program_info: { name: string; }; }} videoItemJson\r\n */\r\nfunction utils_adUnitIframeOverride(videoItemJson) {\r\n  /** @type {boolean|string} */\r\n  let override = false;\r\n  if (document.referrer.indexOf("msn.com") > -1) {\r\n    switch (location.host.replace(/www.|.com|.it/g, \'\')) {\r\n    case "raiplay":\r\n      override = \'/rmsnw/progr/spett/video\';\r\n      break;\r\n    case "rainews":\r\n      override = \'/rmsnw/progr/newsx/video\';\r\n      break;\r\n    case "raisport":\r\n      override = \'/rmsnw/progr/sport/video\';\r\n      break;\r\n    default:\r\n      break;\r\n    }\r\n\r\n    if (videoItemJson.typology === "programmi tv" || videoItemJson.typology === "fiction") {\r\n      override = \'/rmsnw/progr/spett/video\';\r\n    }\r\n\r\n    if (videoItemJson.program_info.name.toLowerCase().indexOf("sanremo") >= 0) {\r\n      override = \'/rmsnw/progr/sanrm/video\';\r\n    }\r\n\r\n    if (videoItemJson.program_info.name.toLowerCase().indexOf("altro festival") >= 0) {\r\n      override = \'/rmsnw/progr/sanrm/video\';\r\n    }\r\n\r\n    if (videoItemJson.program_info.name.toLowerCase().indexOf("vivaraiplay") >= 0) {\r\n      override = \'/rmsnw/progr/vivar/video\';\r\n    }\r\n  }\r\n\r\n  return override;\r\n}\r\n\r\nfunction utils_getStringOperatingSystem() {\r\n  const userAgent = navigator.userAgent || navigator.vendor || (/** @type {any} */(window)).opera;\r\n\r\n  if (/android/i.test(userAgent)) {\r\n    return "android";\r\n  }\r\n\r\n  if (/iPad|iPhone|iPod/.test(userAgent) && !(/** @type {any} */(window)).MSStream) {\r\n    return "ios";\r\n  }\r\n\r\n  return "web";\r\n}\r\n\r\n/**\r\n * @param {{ on: (arg0: any, arg1: { (): void; (): void; (): void; }) => void; events: { EventsType: { CREATION: any; FIRSTPLAY: any; ENDED: any; }; }; }} raiPlayer\r\n */\r\nfunction utils_setupMsnPostMessages(raiPlayer) {\r\n  /** @type {any} */\r\n  const objToSend = {};\r\n  objToSend.referrer = \'microsoft\';\r\n  objToSend.event = \'load\';\r\n  parent.postMessage(objToSend, document.referrer);\r\n  raiPlayer.on(raiPlayer.events.EventsType.CREATION, () => {\r\n    objToSend.event = \'load\';\r\n    parent.postMessage(objToSend, document.referrer);\r\n  });\r\n  raiPlayer.on(raiPlayer.events.EventsType.FIRSTPLAY, () => {\r\n    objToSend.event = \'start\';\r\n    objToSend.videoType = \'content\';\r\n    parent.postMessage(objToSend, document.referrer);\r\n  });\r\n  raiPlayer.on(raiPlayer.events.EventsType.ENDED, () => {\r\n    objToSend.event = \'end\';\r\n    objToSend.videoType = \'content\';\r\n    parent.postMessage(objToSend, document.referrer);\r\n  });\r\n}\r\n\r\nfunction utils_isInIframe() {\r\n  return top !== self;\r\n}\r\n\r\nfunction utils_isIframePage() {\r\n  return document.body.classList.contains(\'iframe\');\r\n}\r\n\r\nfunction utils_isInMsnIframe() {\r\n  return utils_isIframePage() && document.referrer.indexOf(\'msn.com\') >= 0;\r\n}\r\n\r\n/**\r\n * @param {{ form: string; is_live: any; }} videoItemJson\r\n */\r\nfunction utils_isEmbeddableForm(videoItemJson) {\r\n  const form = videoItemJson.form.toLowerCase();\r\n  return (form === \'clip\' || form === \'extra\' || videoItemJson.is_live);\r\n}\r\n\r\n/**\r\n * @param {{ program_info?: any; form: string; is_live: any; }} videoItemJson\r\n */\r\nfunction utils_isEmbeddableContent(videoItemJson) {\r\n  try {\r\n    const programName = !!videoItemJson.program_info && !!videoItemJson.program_info.name ? videoItemJson.program_info.name.toLowerCase() : \'\';\r\n    if (programName.indexOf("sanremo") >= 0 || programName.indexOf("altro festival") >= 0 || programName.indexOf("L\'AltroFestival") >= 0 || programName.indexOf("l\'altrofestival") >= 0) {\r\n      return utils_isEmbeddableForm(videoItemJson);\r\n    }\r\n\r\n    console.log(\'not embeddable\');\r\n    return false;\r\n  }
1 catch (e) {\r\n    console.log(\'not embeddable catch\');\r\n    console.log(e);\r\n    return false;\r\n  }\r\n}\r\n\r\nfunction utils_isHomepage() {\r\n  return document.body.classList.contains(\'rai-home\');\r\n}\r\n\r\nfunction isMobileOS(){\r\n  const ua = navigator.userAgent;\r\n  if (/android/i.test(ua)) \r\n    return true;\r\n  if (/iPad|iPhone|iPod/.test(ua) || navigator.maxTouchPoints > 0)\r\n    return true;\r\n  return false;\r\n}\r\n\r\nfunction utils_getAdvLabelFromPage() {\r\n  /** @type {any} */\r\n  const win = window;\r\n  if (!!win.rai_adv && !!win.rai_adv.adv_label) { return win.rai_adv.adv_label; }\r\n  if (!!win.rai_adv && !!win.rai_adv.dfp && !!win.rai_adv.dfp.label) { return win.rai_adv.dfp.label; }\r\n  if (utils_isHomepage()) { return "hompg/hompg"; }\r\n  if (utils_isNativePage()) { return "hompg/hompg"; }\r\n  if (document.body.classList.contains("my-list-page")) { return "progr/lmlst"; }\r\n  return "rplyw/genrc";\r\n}\r\n\r\nfunction utils_isNativePage() {\r\n  return document.body.classList.contains("rai-native");\r\n}\r\n\r\nfunction utils_getAdvPortalCode() {\r\n  const domain = document.domain.indexOf("www.") > -1 ? document.domain.split(".")[1] : document.domain.split(".")[0];\r\n  let portalCode = "rplyw";\r\n  switch (domain) {\r\n  case "raiplay":\r\n    break;\r\n  case "rainews":\r\n  case "rainews-dev":\r\n  case "rainews-pre":\r\n  case "rainews-int":\r\n    portalCode = "rnwsw";\r\n    break;\r\n  case "rai":\r\n    if (!(utils_isInIframe() && document.referrer.indexOf("msn.com") > -1)) {\r\n      /** @type {any} */(window).raiAdv.dfp.codicePortale = "raitw";\r\n    }\r\n\r\n    break;\r\n  case "raisport":\r\n    portalCode = "rsptw";\r\n    break;\r\n  default:\r\n    break;\r\n  }\r\n\r\n  return portalCode;\r\n}\r\n\r\n/**\r\n * @param {string} sParam\r\n */\r\nfunction utils_getUrlParameter(sParam) {\r\n  const sPageURL = window.location.search.substring(1);\r\n  const sURLVariables = sPageURL.split(\'&\');\r\n  let sParameterName;\r\n  let i;\r\n\r\n  for (i = 0; i < sURLVariables.length; i++) {\r\n    sParameterName = sURLVariables[i].split(\'=\');\r\n\r\n    if (sParameterName[0] === sParam) {\r\n      return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\r\n    }\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\n/**\r\n * @param {number} length\r\n * @param {string} prefix\r\n */\r\nfunction utils_generatePassword(length, prefix) {\r\n  if (typeof length !== \'number\') {\r\n    length = 8;\r\n  }\r\n\r\n  if (typeof prefix !== \'string\') {\r\n    prefix = \'\';\r\n  }\r\n\r\n  const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_$!*";\r\n  let retVal = prefix;\r\n  for (let i = 0, n = charset.length; i < length; ++i) {\r\n    retVal += charset.charAt(Math.floor(Math.random() * n));\r\n  }\r\n\r\n  return retVal;\r\n}\r\n\r\nasync function utils_getGDPRManager() {\r\n  if (window.Rai?.PolicyManager) {\r\n    return window.Rai.PolicyManager;\r\n  }\r\n\r\n  return new Promise(resolve => {\r\n    window.Rai = new Proxy(window.Rai ?? {}, {\r\n      set(target, prop, val) {\r\n        const setted = Reflect.set(target, prop, val);\r\n        if (prop === "PolicyManager") {\r\n          setTimeout(() => {\r\n            resolve(window.Rai.PolicyManager);\r\n          }, 0);\r\n        }\r\n\r\n        return setted;\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\nasync function getIdentifierService() {\r\n  if (window.Rai?.IdentifierService) {\r\n    return window.Rai.IdentifierService;\r\n  }\r\n\r\n  return new Promise(resolve => {\r\n    window.Rai = new Proxy(window.Rai ?? {}, {\r\n      set(target, prop, val) {\r\n        const setted = Reflect.set(target, prop, val);\r\n        if (prop === "IdentifierService") {\r\n          setTimeout(() => {\r\n            resolve(window.Rai.IdentifierService);\r\n          }, 0);\r\n        }\r\n\r\n        return setted;\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\nasync function utils_getPrivacyConsent() {\r\n  const GDPRManager = await utils_getGDPRManager();\r\n  return new Promise(resolve => {\r\n    GDPRManager.events$.subscribe((/** @type {Event} */ event) => {\r\n      if (event.type === GDPRManager.events.POLICY_MANAGER_DEFINED_EVENT) {\r\n        const _manager = window.Rai.PolicyManager;\r\n        resolve(_manager.hasOptIn());\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nasync function utils_getAdvPrivacyConsent() {\r\n  const GDPRManager = await utils_getGDPRManager();\r\n  return new Promise(resolve => {\r\n    GDPRManager.events$.subscribe((/** @type {Event} */event) => {\r\n      if (event.type === GDPRManager.events.POLICY_MANAGER_DEFINED_EVENT) {\r\n        const _manager = window.Rai.PolicyManager;\r\n        resolve(_manager.hasGoogleVendorAvailable() && _manager.hasAdvConsents());\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nasync function utils_getTcString() {\r\n  const GDPRManager = await utils_getGDPRManager();\r\n  return new Promise(resolve => {\r\n    GDPRManager.events$.subscribe((/** @type {Event} */ event) => {\r\n      if (event.type === GDPRManager.events.POLICY_MANAGER_DEFINED_EVENT) {\r\n        const _manager = window.Rai.PolicyManager;\r\n        resolve(_manager.getTcString());\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nasync function getCustomPurposesConsents() {\r\n  const GDPRManager = await utils_getGDPRManager();\r\n  return new Promise(resolve => {\r\n    GDPRManager.events$.subscribe((/** @type {Event} */event) => {\r\n      if (event.type === GDPRManager.events.POLICY_MANAGER_DEFINED_EVENT) {\r\n        const _manager = window.Rai.PolicyManager;\r\n        resolve(_manager.getCustomPurposesConsents());\r\n      }\r\n    });\r\n  });\r\n}\r\n\r\nasync function getFingerPrintManager() {\r\n  if (window.Rai?.FingerPrintManager) {\r\n    return window.Rai.FingerPrintManager;\r\n  }\r\n\r\n  return new Promise(resolve => {\r\n    window.Rai = new Proxy(window.Rai ?? {}, {\r\n      set(target, prop, val) {\r\n        const setted = Reflect.set(target, prop, val);\r\n        if (prop === "FingerPrintManager") {\r\n          setTimeout(() => {\r\n            resolve(window.Rai.FingerPrintManager);\r\n          }, 0);\r\n        }\r\n\r\n        return setted;\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\nconst utils_escapeHTML = (/** @type {string} */ str) => str.replace(/[&<>\'"]/g,\r\n  tag => ({\r\n    \'&\': \'&amp;\',\r\n    \'<\': \'&lt;\',\r\n    \'>\': \'&gt;\',\r\n    "\'": \'&#39;\',\r\n    \'"\': \'&quot;\',\r\n  }[tag] || tag));\r\n\r\nconst utils_chunk = (/** @type {any[]} */ arr, chunkSize = 1, /** @type {any[]} */cache = []) => {\r\n  const tmp = [...arr];\r\n  if (chunkSize <= 0) {\r\n    return cache;\r\n  }\r\n\r\n  while (tmp.length) {\r\n    cache.push(tmp.splice(0, chunkSize));\r\n  }\r\n\r\n  return cache;\r\n};\r\n\r\n/**\r\n * @param {string} url\r\n * @param {((this: GlobalEventHandlers, ev: Event) => any) | null} callback\r\n */\r\nfunction utils_getScript(url, callback) {\r\n  const script = document.createElement(\'script\');\r\n  script.type = \'text/javascript\';\r\n  script.src = url;\r\n  if (typeof callback === \'function\') {\r\n    script.onload = callback;\r\n  }\r\n\r\n  document.getElementsByTagName(\'head\')[0].appendChild(script);\r\n}\r\n\r\n/**\r\n * @param {string} chan\r\n * @param {\'path_id\' | \'weblink\' | \'class\'} key\r\n */\r\nfunction utils_getChanInfo(chan, key) {\r\n  const chanInfo = {\r\n    \'Rai 1\': {\r\n      path_id: \'/dirette/rai1.json\',\r\n      weblink: \'/dirette/rai1\',\r\n      class: \'rai-1\',\r\n    },\r\n    \'Rai 2\': {\r\n      path_id: \'/dirette/rai2.json\',\r\n      weblink: \'/dirette/rai2\',\r\n      class: \'rai-2\',\r\n    },\r\n    \'Rai 3\': {\r\n      path_id: \'/dirette/rai3.json\',\r\n      weblink: \'/dirette/rai3\',\r\n      class: \'rai-3\',\r\n    },\r\n    \'Rai 4\': {\r\n      path_id: \'/dirette/rai4.json\',\r\n      weblink: \'/dirette/rai4\',\r\n      class: \'rai-4\',\r\n    },\r\n    \'Rai 5\': {\r\n      path_id: \'/dirette/rai5.json\',\r\n      weblink: \'/dirette/rai5\',\r\n      class: \'rai-5\',\r\n    },\r\n    \'Rai Movie\': {\r\n      path_id: \'/dirette/raimovie.json\',\r\n      weblink: \'/dirette/raimovie\',\r\n      class: \'rai-movie\',\r\n    },\r\n    \'Rai Premium\': {\r\n      path_id: \'/dirette/raipremium.json\',\r\n      weblink: \'/dirette/raipremium\',\r\n      class: \'rai-premium\',\r\n    },\r\n    \'Rai Gulp\': {\r\n      path_id: \'/dirette/raigulp.json\',\r\n      weblink: \'/dirette/raigulp\',\r\n      class: \'rai-gulp\',\r\n    },\r\n    \'Rai Yoyo\': {\r\n      path_id: \'/dirette/raiyoyo.json\',\r\n      weblink: \'/dirette/raiyoyo\',\r\n      class: \'rai-yoyo\',\r\n    },\r\n    \'Rai Storia\': {\r\n      path_id: \'/dirette/raistoria.json\',\r\n      weblink: \'/dirette/raistoria\',\r\n      class: \'rai-storia\',\r\n    },\r\n    \'Rai Scuola\': {\r\n      path_id: \'/dirette/raiscuola.json\',\r\n      weblink: \'/dirette/raiscuola\',\r\n      class: \'rai-scuola\',\r\n    },\r\n    \'Rai News 24\': {\r\n      path_id: \'/dirette/rainews24.json\',\r\n      weblink: \'/dirette/rainews24\',\r\n      class: \'rainews\',\r\n    },\r\n    \'Rai Sport piu HD\': {\r\n      path_id: \'/dirette/raisportpiuhd.json\',\r\n      weblink: \'/dirette/raisportpiuhd\',\r\n      class: \'raisport--hd\',\r\n    },\r\n    \'Rai Sport\': {\r\n      path_id: \'/dirette/raisport.json\',\r\n      weblink: \'/dirette/raisport\',\r\n      class: \'raisport-2\',\r\n    },\r\n    \'Rai Sport HD\': {\r\n      path_id: \'/dirette/raisporthd.json\',\r\n      weblink: \'/dirette/raisporthd\',\r\n      class: \'raisporthd\',\r\n    },\r\n    Raiplay: {\r\n      path_id: \'/dirette/raiplay.json\',\r\n      weblink: \'/dirette/raiplay\',\r\n      class: \'rai
1play\',\r\n    },\r\n    RaiPlay: {\r\n      path_id: \'/dirette/raiplay.json\',\r\n      weblink: \'/dirette/raiplay\',\r\n      class: \'raiplay\',\r\n    },\r\n    \'Raiplay 2\': {\r\n      path_id: \'/dirette/raiplay2.json\',\r\n      weblink: \'/dirette/raiplay2\',\r\n      class: \'raiplay2\',\r\n    },\r\n    Raiplay2: {\r\n      path_id: \'/dirette/raiplay2.json\',\r\n      weblink: \'/dirette/raiplay2\',\r\n      class: \'raiplay2\',\r\n    },\r\n    \'RaiPlay 2\': {\r\n      path_id: \'/dirette/raiplay2.json\',\r\n      weblink: \'/dirette/raiplay2\',\r\n      class: \'raiplay2\',\r\n    },\r\n    RaiPlay2: {\r\n      path_id: \'/dirette/raiplay2.json\',\r\n      weblink: \'/dirette/raiplay2\',\r\n      class: \'raiplay2\',\r\n    },\r\n    \'RaiPlay 3\': {\r\n      path_id: \'/dirette/raiplay3.json\',\r\n      weblink: \'/dirette/raiplay3\',\r\n      class: \'raiplay3\',\r\n    },\r\n    RaiPlay3: {\r\n      path_id: \'/dirette/raiplay3.json\',\r\n      weblink: \'/dirette/raiplay3\',\r\n      class: \'raiplay3\',\r\n    },\r\n    \'Raiplay Sport 2\': {\r\n      path_id: \'/dirette/raiplaysport2.json\',\r\n      weblink: \'/dirette/raiplaysport2\',\r\n      class: \'raiplaysport2\',\r\n    },\r\n    \'Raiplay Sport\': {\r\n      path_id: \'/dirette/raiplaysport.json\',\r\n      weblink: \'/dirette/raiplaysport\',\r\n      class: \'raiplaysport\',\r\n    },\r\n    \'Rai Radio 2\': {\r\n      path_id: \'/dirette/rairadio2.json\',\r\n      weblink: \'/dirette/rairadio2\',\r\n      class: \'rairadio2\',\r\n    },\r\n  };\r\n\r\n  const ch = /** @type {keyof typeof chanInfo} */(chan);\r\n  if (!!chanInfo[ch] && !!chanInfo[ch][key]) {\r\n    return chanInfo[ch][key];\r\n  }\r\n\r\n  return \'\';\r\n}\r\n\r\n/**\r\n * @param {keyof typeof window.Rai} key\r\n * @param {any} value\r\n */\r\nfunction utils_setRaiGlobalProperty(key, value) {\r\n  if (typeof key !== \'string\') { return; }\r\n  window.Rai = window.Rai || (/** @type {any} */{});\r\n  window.Rai[key] = value;\r\n  return value;\r\n}\r\n\r\n/**\r\n * @param {keyof typeof window.Rai} key\r\n */\r\nfunction utils_getRaiGlobalProperty(key) {\r\n  if (typeof key !== \'string\') { return null; }\r\n  return window.Rai ? window.Rai[key] : null;\r\n}\r\n\r\n/**\r\n * @param {keyof typeof window.Rai} varName\r\n * @param {any} needTimeout\r\n * @param {any} timeout\r\n */\r\nasync function utils_waitRaiGlobalProperty(varName, needTimeout, timeout) {\r\n  if (window.Rai?.[varName]) {\r\n    return window.Rai[varName];\r\n  }\r\n\r\n  return new Promise(resolve => {\r\n    /**\r\n     * @type {number | undefined}\r\n     */\r\n    let tmt;\r\n    window.Rai = new Proxy((window.Rai ?? {}), {\r\n      set(target, prop, value) {\r\n        const setted = Reflect.set(target, prop, value);\r\n        if (prop === varName) {\r\n          window.clearTimeout(tmt);\r\n          window.setTimeout(() => {\r\n            resolve(window.Rai[varName]);\r\n          }, 0);\r\n        }\r\n\r\n        return setted;\r\n      },\r\n    });\r\n    if (needTimeout) {\r\n      tmt = window.setTimeout(() => {\r\n        resolve(undefined);\r\n      }, timeout || 1000);\r\n    }\r\n  });\r\n}\r\n\r\nasync function getRaiAdvManager() {\r\n  if (window.Rai?.raiAdv) {\r\n    return window.Rai.raiAdv;\r\n  }\r\n\r\n  return new Promise(resolve => {\r\n    window.Rai = new Proxy(window.Rai ?? {}, {\r\n      set(target, prop, val) {\r\n        const setted = Reflect.set(target, prop, val);\r\n        if (prop === "raiAdv") {\r\n          setTimeout(() => {\r\n            resolve(window.Rai.raiAdv);\r\n          });\r\n        }\r\n\r\n        return setted;\r\n      },\r\n    });\r\n  });\r\n}\r\n\r\nasync function getRaisso() {\r\n  if (window.Rai?.Raisso) {\r\n    return window.Rai.Raisso;\r\n  }\r\n\r\n  return new Promise(resolve => {\r\n    window.Rai = new Proxy(window.Rai ?? {}, {\r\n      set(target, prop, val) {\r\n        const setted = Reflect.set(target, prop, val);\r\n        if (prop === "Raisso") {\r\n          setTimeout(() => {\r\n            resolve(window.Rai.Raisso);\r\n          });\r\n        }\r\n\r\n        return setted;\r\n      },\r\n    });\r\n  });\r\n}\r\n\n;// ../../../webcomponents/src/utils/player-events.ts\nvar SoundPlayerEvents;\n(function (SoundPlayerEvents) {\n    SoundPlayerEvents["FIRSTPLAY"] = "player:rai:firstplay";\n    SoundPlayerEvents["TIMEUPDATE"] = "player:rai:TIME_UPDATE";\n    SoundPlayerEvents["ENDED"] = "player:rai:ENDED";\n    SoundPlayerEvents["CLOSED"] = "player:rai:CLOSED";\n    SoundPlayerEvents["FIRSTPLAY_CUSTOM"] = "player:rai:firstplay_update";\n    SoundPlayerEvents["TIMEUPDATE_CUSTOM"] = "player:rai:TIME_UPDATE_UPDATE";\n    SoundPlayerEvents["ENDED_CUSTOM"] = "player:rai:ENDED_UPDATE";\n    SoundPlayerEvents["CLOSED_CUSTOM"] = "player:rai:CLOSED_UPDATE";\n})(SoundPlayerEvents || (SoundPlayerEvents = {}));\n\n;// ../../../../../../../common/assets-src-ts/common/libs/sso-widget/src/shared/events.ts\nvar SSOEvent;\n(function (SSOEvent) {\n    SSOEvent["CHECKBOX_SELECT"] = "sso-widget-checkbox-select";\n    SSOEvent["CLOSED"] = "rai:ssoWidget-closed";\n    SSOEvent["CLOSE_REQUEST"] = "rai:ssoWidget-closeRequest";\n    SSOEvent["CHANGE_VIEW"] = "sso-widget-change-view";\n    SSOEvent["CLICK"] = "sso-widget-click";\n    SSOEvent["INPUT_FOCUS_OUT"] = "sso-widget-input-focusout";\n    SSOEvent["INPUT_KEY_UP"] = "sso-widget-input-keyup";\n    SSOEvent["LINK_BUTTON_CLICK"] = "sso-widget-link-button-click";\n    SSOEvent["LOGIN"] = "raissoUserLogin";\n    SSOEvent["LOGOUT_INIT"] = "raissoUserLogout.init";\n    SSOEvent["LOGOUT"] = "raissoUserLogout";\n    SSOEvent["OPEN_REQUEST"] = "rai:ssoWidget-openRequest";\n    SSOEvent["OPENED"] = "rai:ssoWidget-opened";\n    SSOEvent["SOCIAL_CLICK"] = "sso-widget-social-click";\n    SSOEvent["SELECT_CHANGE"] = "sso-widget-select-change";
1\n    SSOEvent["SHOW_RESPONSE"] = "sso-widget-server-error";\n    SSOEvent["TABBAR_CLICK"] = "sso-widget-tabbar-click";\n    SSOEvent["TRACKING_PAGE_EVENT"] = "rai-tracker:tracking-page";\n    SSOEvent["TRACKING_USER_EVENT"] = "rai-tracker:tracking-user";\n    SSOEvent["USER_UPDATE"] = "sso-widget-user-update";\n    SSOEvent["REQUEST_CLOSE_BUTTON"] = "request-close-button";\n})(SSOEvent || (SSOEvent = {}));\n\n;// ../../../../../../raiplay/assets-src/js/webcomponents/src/utils/utils.ts\n/* unused harmony import specifier */ var utils_SSOEvent;\n/* @ts-ignore */\n\nclass Rai {\n    static get trailerPlayablePromise() {\n        return window.Rai.trailerPlayablePromise;\n    }\n    static get ThePlayer() {\n        return window.ThePlayer;\n    }\n    static set raiAdv(_raiAdv) {\n        window.Rai.raiAdv = _raiAdv;\n    }\n    static get raiAdv() {\n        return window.Rai.raiAdv;\n    }\n    ;\n    static get raisso() {\n        return window.Rai.Raisso;\n    }\n    static get policyManager() {\n        return window.Rai.PolicyManager;\n    }\n    static get profileManager() {\n        return window.Rai.ProfileManager;\n    }\n    static get raiPredict() {\n        return window.Rai.RaiPredict;\n    }\n    static set raiPredict(_raiPredict) {\n        window.Rai.RaiPredict = _raiPredict;\n    }\n    static get settingsManager() {\n        return window.Rai.SettingsManager;\n    }\n    static get trackEnqueue() {\n        return window.Rai._trackEnqueue;\n    }\n    static get services() {\n        return window.Rai.servizi;\n    }\n    static get serviceManager() {\n        return self.Rai.ExternalServiceManager;\n    }\n    static get externalService() {\n        return window.Rai.ExternalServiceManager;\n    }\n    static get seekLoadPromise() {\n        return window.Rai.seekLoadPromise;\n    }\n    static set seekLoadPromise(_s) {\n        window.Rai.seekLoadPromise = _s;\n    }\n}\nconst openLoginWidget = (options) => {\n    return _openWidget(\'login\', options);\n};\nconst closeLoginWidget = () => {\n    const requestCloseEvent = new CustomEvent(utils_SSOEvent.CLOSE_REQUEST, {\n        bubbles: true,\n        composed: true,\n    });\n    document.dispatchEvent(requestCloseEvent);\n};\nfunction checkLogin() {\n    return Rai.raisso.checkLogin();\n}\nasync function checkAsyncLogin() {\n    return Rai.raisso.checkAsyncLogin();\n}\nconst openRegistrationWidget = () => {\n    return _openWidget(\'signin\');\n};\nconst _openWidget = (mode, options) => {\n    checkIsAutomotive();\n    const requestOpenEvent = new CustomEvent(utils_SSOEvent.OPEN_REQUEST, {\n        bubbles: true,\n        composed: true,\n        detail: { mode, redirectUrl: options?.redirectUrl ?? location.href },\n    });\n    document.dispatchEvent(requestOpenEvent);\n};\nconst stopwords = (/* unused pure expression or super */ null && ([\'il\', \'lo\', \'la\', \'gli\', \'le\', \'un\', \'uno\', \'una\']));\nconst tokenize = (value) => {\n    const tokens = value.replace(/\'/, \' \').split(\' \');\n    const token = stopwords.includes(tokens[0])\n        ? tokens.length > 1\n            ? tokens[1]\n            : tokens[0]\n        : tokens[0];\n    return token[0].toUpperCase();\n};\nconst createArrayAtoZ = () => {\n    //@ts-ignore\n    return Array.apply(null, { length: 26 }).map((x, i) => String.fromCharCode(65 + i));\n};\nconst letters = [...createArrayAtoZ(), \'0-9\'];\nfunction isCar() {\n    let result = false;\n    const REGEXs = [/bmw/i, /Faurecia Aptoide/i, /Harman Automotive/i];\n    REGEXs.forEach(auto => {\n        if (auto.test(navigator.userAgent))\n            result = true;\n    });\n    return result;\n}\nfunction checkIsAutomotive() {\n    if (isCar() && !window.Rai.Raisso.checkLogin()) {\n        window.location.href = `/associa/codice?return_url=${document.location.pathname}`;\n        return;\n    }\n}\nfunction isTouchScreen() {\n    return document.querySelector(\'html\')?.classList.contains(\'touch\');\n}\nfunction isSmallScreen() {\n    return window.matchMedia(\'(max-width: 980px)\').matches;\n}\n/**\n * Verifica se l\'elemento slider passato come argomento ha come genitore una\n * <section> con il data-attribute `data-functional-type="Recommendation"`.\n * Utilizza il metodo `closest()` per risalire nella gerarchia DOM fino a trovare\n * la prima <section> che soddisfa il criterio. Se trovata, restituisce l\'elemento\n * <section>, altrimenti restituisce `null`.\n *\n * @param {HTMLElement} slider - L\'elemento DOM del tipo slider da cui iniziare la ricerca.\n * @returns {HTMLElement | null} - La sezione genitore con l\'attributo specificato, oppure null se non trovata.\n */\nfunction checkIfSectionReccomendation(slider) {\n    return slider.closest(\'section[data-functional-type="Recommendation"]\');\n}\n\n;// ./src/prediction.ts\n\n\n //@ts-ignore\n //@ts-ignore\n\n\n//@ts-ignore\n\nlet initialized = false;\nconst HOST = "/atomatic";\nconst SESSION_COOKIE = "raiPredictionSessionCookie";\nconst TRACK_COOKIE = "raiPredictionTrackCookie";\nconst PENDING_TRACK_STATE = "pendingTrackState";\nconst STORAGE_SERVICE = storage_service.getService();\nclass RaiPrediction {\n    /** GETTER/SETTER */\n    get userContext() {\n        if (isCar())\n            return "auto";\n        const browser = es5_default().getParser(window.navigator.userAgent);\n        let context;\n        switch (browser.getPlatformType()) {\n            case "mobile":\n            case "tablet":\n                context = "mobile";\n                break;\n            case "tv":\n                context = "tv";\n                break;\n            default:\n                context = "pc";\n        }\n        return context;\n    }\n    get trackUrl() {\n        return `${HOST}/sound-prediction-service/protected/track`;\n    }\n    get sidebarBaseUrl() {\n        return `${HOST}/prediction-service/sidebar`;\n    }\n    get sidebarFallbackUrl() {\n        return `${this.sidebarBaseUrl}/relatedfb`;\n    }\n    get programRelatedFallback() {\n        return `${this.sidebarBaseUrl}/program/relatedfb`;\n    }\n    get sidebarRecommendedUrl() {\n        return `${this.sidebarBaseUrl}/related`;\n    }\n    get predictHpMode() {\n        return typeof window.predictHpType === "string"\n            ? window.predictHpType\n            : "homepage";\n    }\n    get recommendedHPUrl() {\n        return `${HOST}/sound-prediction-service`;\n    }\n    get recommendedHeroUrl() {\n        return `${HOST}/sound-prediction-service/page/section/hero`;\n    }\n    get recommendedTipologiaUrl() {\n        return `${HOST}/sound-prediction-service/page/section/hero/typology/<nometipologia>`;\n    }\n    get recommendedAlternariveHeroUrl() {\n        return `${HOST}/sound-prediction-service/page/section/hero/custom`;\n    }\n    get recommendedHPLazyUrl() {\n        return `/predict/page/${this.predictHpMode}/lazy`;\n    }\n    constructor() {\n        this._currentTrackingState = null;\n        this._exitTrackSentForCurrentState = false;\n        this.destroy = this.destroy.bind(this);\n        this.initListenerHandlers = this.initListenerHandlers.bind(this);\n        this.initPredictionTracking();\n    }\n    async checkUser() {\n        if (typeof Rai.raisso === "undefined")\n            return false;\n        return await Rai.raisso.checkAsyncLogin();\n    }\n    checkTrackId() {\n        var trackObj = STORAGE_SERVICE.get
1Storage(TRACK_COOKIE);\n        if (trackObj === null)\n            return false;\n        this.trackId = trackObj.trackId;\n        STORAGE_SERVICE.deleteStorage(TRACK_COOKIE);\n    }\n    init() {\n        if (initialized)\n            return false;\n        initialized = true;\n        if (!this.checkUser()) {\n            document.addEventListener(SSOEvent.LOGOUT_INIT, this.initListenerHandlers, { once: true });\n        }\n        else {\n            this.checkTrackId();\n            this.percentageActivation();\n        }\n        document.addEventListener(SSOEvent.LOGOUT_INIT, this.destroy, {\n            once: true,\n        });\n    }\n    initListenerHandlers() {\n        this.checkTrackId();\n        this.percentageActivation();\n    }\n    destroy() {\n        document.removeEventListener(SSOEvent.LOGOUT_INIT, this.initListenerHandlers);\n        document.removeEventListener(SSOEvent.LOGOUT_INIT, this.destroy);\n        STORAGE_SERVICE.deleteStorage(TRACK_COOKIE);\n    }\n    async getSidebarRelatedFallback(contentId, pathID) {\n        //servizio elastic\n        if (typeof contentId !== "string")\n            throw new Error("Missing mandatory oarameters");\n        const payload = {\n            contentItemId: contentId,\n            pathID,\n        };\n        try {\n            const resp = await fetch(this.sidebarFallbackUrl, {\n                method: "POST",\n                body: JSON.stringify(payload),\n                headers: {\n                    "Content-Type": "application/json",\n                },\n            });\n            if (resp.ok) {\n                const data = await resp.json();\n                return data;\n            }\n            throw new Error(resp.statusText);\n        }\n        catch (e) {\n            console.error(e);\n            throw e;\n        }\n    }\n    async getProgramRelatedFallback(contentId, pathID) {\n        //servizio elastic\n        if (typeof contentId !== "string")\n            throw new Error("Missing mandatory parameters");\n        try {\n            const resp = await fetch(`${this.programRelatedFallback}/${contentId}`, {\n                headers: {\n                    "Content-Type": "application/json",\n                    pathID,\n                },\n            });\n            if (resp.ok) {\n                const data = await resp.json();\n                return data;\n            }\n            throw new Error(resp.statusText);\n        }\n        catch (e) {\n            console.error(e);\n            throw e;\n        }\n    }\n    async getHeroRecommended(sourceInformation) {\n        /* GET URL */\n        let url = sourceInformation.mode === "tipologia"\n            ? this.recommendedTipologiaUrl.replace("<nometipologia>", sourceInformation.name)\n            : this.recommendedHeroUrl;\n        const checkLogin = await this.checkUser();\n        if (checkLogin) {\n            const profile = Rai.profileManager.getUserProfile();\n            const identifierService = await getIdentifierService();\n            const heroSessionId = (await identifierService.getSid()).s_id;\n            const headers = {\n                headers: {\n                    customization: profile.personalizzazione,\n                    gender: profile.gender,\n                    age: profile.age,\n                    ua: profile.ua,\n                    sessionId: heroSessionId,\n                    context: this.userContext,\n                },\n            };\n            return Rai.raisso.callAuthService(`${url}/user`, "get", undefined, headers);\n        }\n        else {\n            const FETCH_TIMEOUT = 3000;\n            let didTimeout = false;\n            const p = new Promise((resolve, reject) => {\n                const timeout = setTimeout(() => {\n                    didTimeout = true;\n                    reject(new Error("Request timed out"));\n                }, FETCH_TIMEOUT);\n                fetch(`${url}/default`)\n                    .then((response) => {\n                    clearTimeout(timeout);\n                    if (!didTimeout) {\n                        resolve(response);\n                    }\n                })\n                    .catch((err) => {\n                    if (didTimeout)\n                        return; // already rejected\n                    reject(err);\n                });\n            });\n            try {\n                const response = await p;\n                if (response.ok) {\n                    const data = await response.json();
1\n                    if (!data) {\n                        throw new Error("Invalid data");\n                    }\n                    return data;\n                }\n                throw new Error(response.statusText);\n            }\n            catch (e) {\n                console.error(e);\n                throw e;\n            }\n        }\n    }\n    async getAlternativeHeroRecommended(hero_path_id) {\n        if (!hero_path_id)\n            throw new Error("Hero path_id non specificata");\n        const url = this.recommendedAlternariveHeroUrl;\n        const FETCH_TIMEOUT = 3000;\n        let didTimeout = false;\n        const p = new Promise((resolve, reject) => {\n            const timeout = setTimeout(() => {\n                didTimeout = true;\n                reject(new Error("Request timed out"));\n            }, FETCH_TIMEOUT);\n            fetch(url, {\n                method: "GET",\n                headers: {\n                    "Content-Type": "application/json",\n                },\n            })\n                .then((response) => {\n                clearTimeout(timeout);\n                if (!didTimeout) {\n                    resolve(response);\n                }\n            })\n                .catch((err) => {\n                if (didTimeout)\n                    return; // already rejected\n                reject(err);\n            });\n        });\n        try {\n            const response = await p;\n            if (response.ok) {\n                const data = await response.json();\n                if (!data) {\n                    throw new Error("Invalid data");\n                }\n                return data;\n            }\n            throw new Error(response.statusText);\n        }\n        catch (e) {\n            console.error(e);\n            throw e;\n        }\n    }\n    async getAlternativeHeroRecommendedByURL(hero_path_id) {\n        if (!hero_path_id)\n            throw new Error("Hero path_id non specificata");\n        const url = this.recommendedAlternariveHeroUrl;\n        const payload = {\n            url: hero_path_id,\n        };\n        const FETCH_TIMEOUT = 3000;\n        let didTimeout = false;\n        const p = new Promise((resolve, reject) => {\n            const timeout = setTimeout(() => {\n                didTimeout = true;\n                reject(new Error("Request timed out"));\n            }, FETCH_TIMEOUT);\n            fetch(url, {\n                method: "POST",\n                body: JSON.stringify(payload),\n                headers: {\n                    "Content-Type": "application/json",\n                },\n            })\n                .then((response) => {\n                clearTimeout(timeout);\n                if (!didTimeout) {\n                    resolve(response);\n                }\n            })\n                .catch((err) => {\n                if (didTimeout)\n                    return; // already rejected\n                reject(err);\n            });\n        });\n        try {\n            const response = await p;\n            if (response.ok) {\n                const data = await response.json();\n                if (!data) {\n                    throw new Error("Invalid data");\n                }\n                return data;\n            }\n            throw new Error(response.statusText);\n        }\n        catch (e) {\n            console.error(e);\n            throw e;\n        }\n    }\n    getSidebarRelatedRecommended(contentId, pathID, forma) {\n        if (!this.checkUser())\n            throw new Error("User not logged in");\n        if (typeof contentId !== "string")\n            throw new Error("Missing mandatory parameters");\n        if (!this.percActivation) {\n            //fallback\n            return this.getSidebarRelatedFallback(contentId, pathID);\n        }\n        else {\n            const profile = Rai.profileManager.getUserProfile();\n            const payload = {\n                section: "VOD/UC2-Related",\n                contentItemId: contentId,\n                sessionId: profile.ua,\n                age: profile.age || null,\n                shape: forma,\n                gender: profile.gender ? profile.gender.toUpperCase() : null,\n            };\n            return Rai.raisso.callAuthService(`${this.sidebarRecommendedUrl}`, "post", payload, {\n                params: { ua: profile.ua },\n                headers: { "x-name": profile.firstName },\n            });\n        }\n    }\n    async getRecommendedLazyForHomepage(numSection) {\n        numSection = Number(numSection);\n        if (isNaN(numSection)) {\n            numSection = 1;\n        }\n        if (!(await this.checkUser()))\n            throw new Error("User is not logged in");\n        const user = Rai.profileManager.getUserProfile();\n        if (!user || !user.personalizzazione)\n            return Promise.reject();\n        const firstName = user.firstName || "";
1\n        const session = STORAGE_SERVICE.getStorage(SESSION_COOKIE);\n        const payload = {\n            ua: user.ua,\n            sessionId: (session && session.sessionId) || "",\n            numSection: numSection,\n        };\n        return Rai.raisso.callAuthService(this.recommendedHPLazyUrl, "get", payload, {\n            headers: { "x-name": firstName, "Cache-Control": "max-age=60" },\n        });\n    }\n    /**\n     * Metodo privato per gestire la logica comune delle chiamate al servizio di predizione\n     */\n    async _callPredictionService(endpoint, payload, headers = {}, params = {}) {\n        if (!this.checkUser())\n            throw new Error("User is not logged in");\n        const identifierService = await getIdentifierService();\n        const sessionId = (await identifierService.getSid()).s_id;\n        const profile = Rai.profileManager.getUserProfile();\n        // Payload comune per tutte le chiamate\n        const commonPayload = {\n            sessionId: sessionId,\n            context: this.userContext,\n            ...payload,\n        };\n        const firstName = profile.firstName || "";\n        const defaultHeaders = {\n            "x-name": firstName,\n            ...headers,\n        };\n        const defaultParams = {\n            ua: profile.ua,\n            v2: 1,\n            ...params,\n        };\n        const predictUrlService = `${this.recommendedHPUrl}${endpoint}`;\n        try {\n            const response = await Rai.raisso.callAuthService(predictUrlService, "post", commonPayload, {\n                params: defaultParams,\n                headers: defaultHeaders,\n            });\n            return response;\n        }\n        catch (error) {\n            console.error(`Error in prediction service call to ${endpoint}:`, error);\n            throw error;\n        }\n    }\n    /**\n     *\n     * @param {Object<any>} data\n     * @param {string} data.usecase\n     * @param {string} data.type\n     * @param {string} data.fallback\n     * @param {string} data.contentItemId\n     * @param {string} data.sectionUniqueName\n     */\n    async getRecommendedPage(data) {\n        if (data == null || !data.useCase)\n            throw new Error("Missing mandatory parameters");\n        const payload = {\n            section: data.useCase,\n            engine: data.engine,\n            contentItemId: data.contentItemId,\n        };\n        const headers = {\n            fallback: data.fallbackUrl,\n        };\n        try {\n            const response = await this._callPredictionService("/api/page", payload, headers);\n            return response;\n        }\n        catch (error) {\n            console.error("Error in getRecommendedPage:", error);\n            throw error;\n        }\n    }\n    /**\n     * Ottiene una sezione specifica per recommendation\n     * @param {string} sectionId - ID della sezione da caricare\n     * @param {Object<any>} data - Dati per la sezione (stesso formato di getRecommendedPage)\n     * @param {string} data.usecase\n     * @param {string} data.contentItemId\n     * @param {string} data.fallback\n     */\n    async getRecommendedSection(sectionId, data) {\n        if (!sectionId || typeof sectionId !== "string") {\n            throw new Error("Missing mandatory parameter: sectionId");\n        }\n        if (data == null || !data.useCase) {\n            throw new Error("Missing mandatory parameters");\n        }\n        const payload = {\n            section: data.useCase,\n            contentItemId: data.contentItemId,\n        };\n        const headers = {\n            fallback: data.fallbackUrl,\n        };\n        try {\n            const response = await this._callPredictionService(`/api/section/${sectionId}`, payload, headers);\n            return response;\n        }\n        catch (error) {\n            console.error("Error in getRecommendedSection:", error);\n            throw error;\n        }\n    }\n    async getRecommendedSectionForHomepage(data) {\n        if (data === null || !data.url)\n            throw new Error("Missing mandatory parameters");\n        if (!this.checkUser())\n            throw new Error("User is not logged in");\n        const profile = Rai.profileManager.getUserProfile();\n        const firstName = profile.firstName || "";\n        return Rai.raisso.callAuthService(data.url, "get", undefined, {\n            params: { typeData: data.type },\n            headers: {\n                fallback: data.fallback,\n                "x-name": firstName,\n                "Cache-Control": "max-age=60",\n            },\n        });\n    }\n    setTrackId(id) {\n        if (!id || typeof id !== "string")\n            throw new Error("Missing mandatory parameter");\n        this.trackId = id;\n        STORAGE_SERVICE.setStorage(TRACK_COOKIE, { trackId: id });\n    }
1\n    percentageActivation() {\n        if (typeof this.percActivation !== "undefined") {\n            return this.percActivation;\n        }\n        return true;\n    }\n    async trackUserAction(contentId, programId, type, action, actionType, forma = "", vFactor = false) {\n        if (!(await this.checkUser()))\n            throw new Error("User is not logged in");\n        const profile = Rai.profileManager.getUserProfile();\n        if (!profile.personalizzazione) {\n            throw new Error("Cannot use predict tracking");\n        }\n        if (typeof contentId !== "string" ||\n            typeof type !== "string" ||\n            typeof action !== "string" ||\n            typeof actionType !== "string") {\n            throw new Error("Missing mandatory parameters");\n        }\n        if (contentId.length < 1 ||\n            type.length < 1 ||\n            action.length < 1 ||\n            actionType.length < 1) {\n            throw new Error("Missing mandatory parameters");\n        }\n        if (typeof vFactor !== "number") {\n            vFactor = false;\n        }\n        if (typeof forma !== "string") {\n            forma = "";\n        }\n        const userAgent = (window.navigator && window.navigator.userAgent) || "";\n        const domain = document.location.hostname.indexOf("sound") > -1\n            ? "raiplaysound"\n            : "raiplay";\n        const clickedRecommendedCards = STORAGE_SERVICE.getStorage(STORAGE_KEYS.RECOMMENDATION_CARD_CLICKS, true) || [];\n        const recommendedSections = STORAGE_SERVICE.getStorage(STORAGE_KEYS.RECOMMENDATION_SECTIONS, true);\n        const identifierService = await getIdentifierService();\n        const sessionIdFromProfile = (await identifierService.getSid()).s_id;\n        let trackId = null;\n        // Cerca la card cliccata usando programId o contentId\n        const clickedCard = clickedRecommendedCards.find((card) => card.id === programId || card.id === contentId);\n        if (clickedCard && recommendedSections) {\n            const sectionUniqueName = clickedCard.sectionUniqueName;\n            const sectionId = clickedCard.sectionId;\n            // Naviga nella nuova struttura: uniquename -> sections -> sectionId -> data\n            const uniqueNameData = recommendedSections[sectionUniqueName];\n            if (uniqueNameData?.sections?.[sectionId]?.data?.cards) {\n                const matchingCard = uniqueNameData.sections[sectionId].data.cards.find((card) => card.ID === programId ||\n                    card.ID === contentId ||\n                    card.uniquename === programId ||\n                    card.uniquename === contentId);\n                if (matchingCard) {\n                    trackId = matchingCard.trackId;\n                }\n            }\n        }\n        const payload = {\n            user: {\n                client: "browser",\n                version: userAgent,\n                network: 0,\n                id: profile.uid,\n                ua: profile.ua,\n                sessionId: sessionIdFromProfile,\n                trackId: trackId || undefined,\n            },\n            action: {\n                domain,\n                verb: action,\n                type: actionType,\n            },\n            content: {\n                itemId: contentId,\n                type,\n                shape: forma,\n            },\n        };\n        if (programId)\n            payload.content.parentId = programId;\n        if (vFactor !== false) {\n            payload.action.vision_factor = vFactor;\n        }\n        return Rai.raisso.callAuthService(this.trackUrl, "post", payload);\n    }\n    _bindPlayerEvents() {\n        let playerEventTrackList = [\n            SoundPlayerEvents.FIRSTPLAY_CUSTOM,\n            SoundPlayerEvents.TIMEUPDATE_CUSTOM,\n            SoundPlayerEvents.ENDED_CUSTOM,\n        ];\n        playerEventTrackList.forEach((event) => {\n            document.addEventListener(event, (e) => {\n                this._trackPlayerActions(e.detail);\n            });\n        });\n        const savePendingState = (visionFactor) => {\n            if (!this._currentTrackingState)\n                return;\n            const stateToSave = {\n                ...this._currentTrackingState,\n                visionFactor,\n                trackId: this._currentTrackingState.trackId || "",\n            };\n            STORAGE_SERVICE.setStorage(PENDING_TRACK_STATE, stateToSave);\n        };\n        const handlePageExit = (event) => {\n            if (event?.type === "pagehide" && event.persisted)\n                return;\n            if (this._currentTrackingState &&\n                !this._currentTrackingState.isCompleted &&\n                !this._exitTrackSentForCurrentState) {\n                this._exitTrackSentForCurrentState = true;\n                const visionFactor = Math.floor((this._currentTrackingState.currentTime /\n                    this._currentTrackingState.duration) *\n                    100) / 100;\n                savePendingState(visionFactor);\n            }\n        };\n        window.addEventListener("beforeunload", handlePageExit);\n        window.addEventListener("pagehide", handlePageExit);\n        // Safari fallback: su alcune navigazioni `pagehide` puo` non essere affidabile.\n        window.addEventListener("unload", handlePageExit);\n    }\n    _trackPlayerActions(lme) {\n        if (lme?.is_live) {\n            return;\n        }\n        let contentId = "";\n        let programId = "";\n        let tipologia = "";\n        let forma = lme?.form || "";\n        try {\n            contentId = lme.mediaInfo?.id || lme.mediaInfo?.trackInfo.id;\n            programId =\n                lme.parentInfo?.contextUniquename ||\n                    lme.mediaInfo?.program_info?.id ||\n                    lme.mediaInfo?.program_info?.uniquename;\n            tipologia =\n                lme.mediaInfo?.typology ||\n                    lme.mediaInfo?.program_info?.typology ||\n                    lme.mediaInfo?.trackInfo?.typology;\n            tipologia = tipologia.toLowerCase();\n        }\n        catch (e) {\n            throw new Error("_trackPlayerActions" + e);\n        }\n        if (lme.eventData && lme.eventData.mediaType == "content") {\n            switch (lme.eventData.eventName) {\n                case SoundPlayerEvents.FIRSTPLAY_CUSTOM:\n                    this._currentTrackingState = {\n                        contentId,\n                        programId,\n                        tipologia,\n                        forma,\n                        currentTime: 0,\n                        duration: lme.eventData.mediaDuration,\n                        isCompleted: false,\n                        hasTrackedHalfVision: false,\n                    };\n                    this._exitTrackSentForCurrentState = false;\n                    const visionFactor = Math.floor((this._currentTrackingState.currentTime /\n                        this._currentTrackingState.duration) *\n                        100) / 100;\n                    this.trackUserAction(contentId, programId, tipologia, "play", "execute", forma, visionFactor).catch(console.warn);\n                    break;\n                case SoundPlayerEvents.TIMEUPDATE_CUSTOM:\n                    if (this._currentTrackingState) {\n                        this._currentTrackingState.currentTime = lme.eventData.currentTime;\n                        const { duration, currentTime, hasTrackedHalfVision } = this._currentTrackingState;\n                        if (!hasTrackedHalfVision && duration > 0) {\n                            const visionFactor = Math.floor((currentTime / duration) * 100) / 100;\n                            if (visionFactor >= 0.5) {\n                                this.trackUserAction(contentId, programId, tipologia, "play", "execute", forma, 0.5).catch(console.warn);\n                                this._currentTrackingState.hasTrackedHalfVision = true;\n                            }\n                        }\n                    }\n                    break;\n                case SoundPlayerEvents.ENDED_CUSTOM:\n                    if (this._currentTrackingState) {\n                        this._currentTrackingState.isCompleted = true; // Marca come completato\n                        const visionFactor = 1; // Se è ended, abbiamo visto il 100%\n                        const profile = Rai.profileManager.getUserProfile();\n                        const userAgent = (window.navigator && window.navigator.userAgent) || "";\n                        const domain = document.location.hostname.indexOf("sound") > -1\n                            ? "raiplaysound"\n                            : "raiplay";
1\n                        const session = STORAGE_SERVICE.getStorage(SESSION_COOKIE);\n                        const payload = {\n                            user: {\n                                client: "browser",\n                                version: userAgent,\n                                network: 0,\n                                id: profile.uid,\n                                ua: profile.ua,\n                                sessionId: (session && session.sessionId) || "",\n                            },\n                            action: {\n                                domain,\n                                verb: "play",\n                                type: "execute",\n                                vision_factor: visionFactor,\n                            },\n                            content: {\n                                itemId: contentId,\n                                parentId: programId,\n                                type: tipologia,\n                                shape: forma,\n                            },\n                        };\n                        let sent = false;\n                        if (navigator.sendBeacon) {\n                            const blob = new Blob([JSON.stringify(payload)], {\n                                type: "application/json",\n                            });\n                            sent = navigator.sendBeacon(this.trackUrl, blob);\n                        }\n                        if (!sent) {\n                            const stateToSave = {\n                                contentId,\n                                programId,\n                                tipologia,\n                                forma,\n                                currentTime: this._currentTrackingState.currentTime,\n                                duration: this._currentTrackingState.duration,\n                                isCompleted: true,\n                                hasTrackedHalfVision: this._currentTrackingState.hasTrackedHalfVision,\n                                visionFactor,\n                                trackId: this._currentTrackingState.trackId || "",\n                            };\n                            STORAGE_SERVICE.setStorage(PENDING_TRACK_STATE, stateToSave);\n                        }\n                        this._currentTrackingState = null;\n                    }\n                    break;\n                /* case SoundPlayerEvents.CLOSED:\n                  if (\n                    this._currentTrackingState &&\n                    !this._currentTrackingState.isCompleted\n                  ) {\n                    // Verifica che currentTime e mediaDuration siano validi prima di calcolare il visionFactor\n                    const currentTime = lme.eventData.currentTime;\n                    const mediaDuration = lme.eventData.mediaDuration;\n        \n                    if (\n                      currentTime != null &&\n                      mediaDuration != null &&\n                      mediaDuration > 0\n                    ) {\n                      const visionFactor =\n                        Math.floor((currentTime / mediaDuration) * 100) / 100;\n                      this.trackUserAction(\n                        contentId,\n                        programId,\n                        tipologia,\n                        "play",\n                        "execute",\n                        forma,\n                        visionFactor,\n                      ).catch(console.warn);\n                    } else {\n                      // Log per debug: non inviamo il tracciamento se i dati non sono validi\n                      console.warn(\n                        "RaiPredict: Skipping tracking for CLOSED event - invalid currentTime or mediaDuration",\n                        {\n                          currentTime,\n                          mediaDuration,\n                        },\n                      );\n                    }\n        \n                    this._currentTrackingState.isCompleted = true;\n                    this._currentTrackingState = null;\n                  }\n                  break; */\n            }\n        }\n    }\n    async initPredictionTracking() {\n        const isLoggedIn = await Rai.raisso.checkAsyncLogin();\n        if (!isLoggedIn) {\n            console.log("Utente non loggato. Recommendation disabilitato");\n            return false;\n        }\n        if (Rai.profileManager.getUserProfile() &&\n            !Rai.profileManager.getUserProfile().personalizzazione) {\n            console.log("Personalizzazione negata. Predict tracking disabilitato");\n            return false;\n        }\n        // Consuma e invia il tracking pendente una sola volta (at-most-once).\n        const pendingState = STORAGE_SERVICE.get
1Storage(PENDING_TRACK_STATE);\n        if (pendingState) {\n            // Delete-before-send: evita doppi invii su re-init o reload.\n            STORAGE_SERVICE.deleteStorage(PENDING_TRACK_STATE);\n            this.trackUserAction(pendingState.contentId, pendingState.programId, pendingState.tipologia, "play", "execute", pendingState.forma, pendingState.visionFactor).catch((error) => {\n                console.warn("RaiPredict: pending track send failed", error);\n            });\n        }\n        this._bindPlayerEvents();\n    }\n}\n\n;// ./src/index.ts\n// import \'whatwg-fetch\';\n\n\nconst predict = new RaiPrediction();\nsetRaiGlobalProperty("RaiPredict", predict);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIOzs7Ozs7QUMzZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSx5REFBeUQ7QUFDekQ7QU
1FDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxFQUFFO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUCw0Q0FBNEMsMEJBQTBCO0FBQ3RFO0FBQ087QUFDUCxvQkFBb0IsNEJBQTRCO0FBQ2hEOzs7QUM3REE7QUFDd0Y7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksR0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixHQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxNQUFZLFNBQVMsMkNBQTJDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFlLHFCQUFxQixFQUFDOzs7QUMzRDlCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7OztBQ0pBO0FBQ0E7QUFDQSxtQkFBbUIsNERBQVk7QUFDL0I7QUFDQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsS0FBSztBQUNoQjtBQUNPLFNBQVMsc0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDZCQUE2QjtBQUMxQyxhQUFhLGlCQUFpQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ08sU0FBUyw4QkFBd0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ08sU0FBUyxrQkFBWTtBQUM1QixjQUFjO0FBQ2QsYUFBYSxnQkFBZ0I7QUFDN0I7QUFDQSxhQUFhLHNCQUFzQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ08sU0FBUyx3QkFBa0I7QUFDbEMsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsa0JBQWtCLGdCQUFnQixvQkFBb0I7QUFDbkU7QUFDTyxTQUFTLDBCQUFvQjtBQUNwQyxhQUFhLGdCQUFnQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLDhCQUF3QjtBQUN4QywyRUFBMkUsS0FBSztBQUNoRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELEtBQUs7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHdCQUF3QixVQUFVLFVBQVUsV0FBVyxXQUFXLFVBQVUsY0FBYyxlQUFlLGdCQUFnQixxQkFBcUI7QUFDM0o7QUFDTyxTQUFTLDBCQUFvQjtBQUNwQyxhQUFhLEtBQUs7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNPLFNBQVMsZ0JBQVU7QUFDMUI7QUFDQTtBQUNBO0FBQ08sU0FBUyxrQkFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDTyxTQUFTLG1CQUFhO0FBQzdCLFNBQVMsa0JBQVk7QUFDckI7QUFDQTtBQUNBO0FBQ0EsYUFBYSxjQUFjLGlCQUFpQjtBQUM1QztBQUNPLFNBQVMsc0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLG9CQUFvQixjQUFjLGlCQUFpQjtBQUNoRTtBQUNPLFNBQVMseUJBQW1CO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLGFBQWEsc0JBQWdCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsZ0JBQVU7QUFDMUI7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyx5QkFBbUI7QUFDbkMsYUFBYSxLQUFLO0FBQ2xCO0FBQ0Esa0RBQWtEO0FBQ2xELHVFQUF1RTtBQUN2RSxNQUFNLGdCQUFVLE1BQU07QUFDdEIsTUFBTSxrQkFBWSxNQUFNO0FBQ3hCLDBEQUEwRDtBQUMxRDtBQUNBO0FBQ0E7QUFDTyxTQUFTLGtCQUFZO0FBQzVCO0FBQ0E7QUFDQTtBQUNPLFNBQVMsc0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0JBQVU7QUFDcEIsaUJBQWlCLEtBQUs7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNPLFNBQVMscUJBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMEJBQTBCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ08sU0FBUyxzQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsWUFBWTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxlQUFlLG9CQUFjO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNPLGVBQWUsdUJBQWlCO0FBQ3ZDLDRCQUE0QixvQkFBYztBQUMxQztBQUNBLDhDQUE4QyxPQUFPO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEd
1BQUc7QUFDSDtBQUNBO0FBQ08sZUFBZSwwQkFBb0I7QUFDMUMsNEJBQTRCLG9CQUFjO0FBQzFDO0FBQ0EsOENBQThDLE9BQU87QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDTyxlQUFlLGlCQUFXO0FBQ2pDLDRCQUE0QixvQkFBYztBQUMxQztBQUNBLDhDQUE4QyxPQUFPO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ087QUFDUCw0QkFBNEIsb0JBQWM7QUFDMUM7QUFDQSw4Q0FBOEMsT0FBTztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDTyxNQUFNLGdCQUFVLGVBQWUsUUFBUTtBQUM5QztBQUNBLGVBQWU7QUFDZixjQUFjO0FBQ2QsY0FBYztBQUNkLGVBQWU7QUFDZixnQkFBZ0I7QUFDaEIsR0FBRztBQUNIO0FBQ08sTUFBTSxXQUFLLGVBQWUsT0FBTyxrQ0FBa0MsT0FBTztBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLHdEQUF3RDtBQUNuRTtBQUNPLFNBQVMsZUFBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsaUNBQWlDO0FBQzVDO0FBQ08sU0FBUyxpQkFBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHlCQUF5QjtBQUNwQyxXQUFXLEtBQUs7QUFDaEI7QUFDTyxTQUFTLDBCQUFvQjtBQUNwQyxpQ0FBaUM7QUFDakMseUNBQXlDLEtBQUssSUFBSTtBQUNsRDtBQUNBO0FBQ0E7QUFDQT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TtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLDRCQUE0QixHQUFHLFVBQVU7QUFDakY7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsR0FBRztBQUMvQiw0Q0FBNEMsb0JBQW9CO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLG1CQUFtQixHQUFHLDJCQUEyQixJQUFJO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIseUJBQXlCLElBQUk7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsR0FBRztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLEdBQUcsMkJBQTJCLDJCQUEyQjtBQUM1RSwwQkFBMEIsZ0JBQWdCO0FBQzFDLDJCQUEyQiw2QkFBNkI7QUFDeEQsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixHQUFHO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsR0FBRztBQUNsQix1QkFBdUIsb0RBQW9EO0FBQzNFLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxhQUFhO0FBQzdFO0FBQ0E7QUFDQSx3Q0FBd0Msb0JBQW9CO0FBQzVEO0FBQ0Esd0JBQXdCLEdBQUc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsc0JBQXNCLEVBQUUsU0FBUztBQUN0RTtBQUNBLG1DQUFtQyxHQUFHO0FBQ3RDO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxhQUFhO0FBQzVCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0VBQStFLFVBQVU7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEdBQUc7QUFDM0I7QUFDQSxlQUFlLEdBQUc7QUFDbEIsc0JBQXNCLHFCQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxhQUFhO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEdBQUc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRUFBbUUsWUFBWTtBQUMvRSwrREFBK0QsWUFBWTtBQUMzRSx3Q0FBd0Msb0JBQW9CO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsR0FBRztBQUNsQjtBQUNBO0FBQ0E7QUFDQSxZQUFZLGlCQUFpQjtBQUM3QixZQUFZLGlCQUFpQjtBQUM3QixZQUFZLGlCQUFpQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsaUJBQWlCO0FBQ3RDO0FBQ0E7QUFDQSxnQ0FBZ0MsOENBQThDO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQSx1RUFBdUU7QUFDdkUsZ0RBQWdEO0FBQ2hELHdDQUF3QyxHQUFHO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLEdBQUc7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEd
1BQUc7QUFDZixhQUFhLEdBQUc7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7OztBQ2h4QkE7QUFDaUU7QUFDcEI7QUFDN0Msb0JBQW9CLGFBQWE7QUFDakMsb0JBQW9CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmFpLXByZWRpY3QvLi4vLi4vZXh0ZW5zaW9ucy91dGlscy5qcz81MGIxIiwid2VicGFjazovL3JhaS1wcmVkaWN0Ly4vbm9kZV9tb2R1bGVzL2VzLWNvb2tpZS9zcmMvZXMtY29va2llLmpzP2VlNDEiLCJ3ZWJwYWNrOi8vcmFpLXByZWRpY3QvLi9zcmMvc3RvcmFnZS1zZXJ2aWNlLnRzP2ZiMDkiLCJ3ZWJwYWNrOi8vcmFpLXByZWRpY3QvLi9zcmMvdXRpbHMvZGVmaW5pdGlvbnMudHM/ZjQyMSIsIndlYnBhY2s6Ly9yYWktcHJlZGljdC8uLi8uLi8uLi8uLi8uLi8uLi9yYWlwbGF5L2Fzc2V0cy1zcmMvanMvdXRpbGl0aWVzL3V0aWxzLmpzPzhmYzgiLCJ3ZWJwYWNrOi8vcmFpLXByZWRpY3QvLi4vLi4vLi4vd2ViY29tcG9uZW50cy9zcmMvdXRpbHMvcGxheWVyLWV2ZW50cy50cz9iM2ExIiwid2VicGFjazovL3JhaS1wcmVkaWN0Ly4uLy4uLy4uLy4uLy4uLy4uLy4uL2NvbW1vbi9hc3NldHMtc3JjLXRzL2NvbW1vbi9saWJzL3Nzby13aWRnZXQvc3JjL3NoYXJlZC9ldmVudHMudHM/YmVhNCIsIndlYnBhY2s6Ly9yYWktcHJlZGljdC8uLi8uLi8uLi8uLi8uLi8uLi9yYWlwbGF5L2Fzc2V0cy1zcmMvanMvd2ViY29tcG9uZW50cy9zcmMvdXRpbHMvdXRpbHMudHM/ZDEyOSIsIndlYnBhY2s6Ly9yYWktcHJlZGljdC8uL3NyYy9wcmVkaWN0aW9uLnRzP2ZiMmYiLCJ3ZWJwYWNrOi8vcmFpLXByZWRpY3QvLi9zcmMvaW5kZXgudHM/MzNiYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vbGlicmFyaWVzL3BhY2thZ2VzL3JhaS1iZG8vc3JjL2luZGV4JykuUG9saWN5TWFuYWdlcn0gUG9saWN5TWFuYWdlclxyXG4gKi9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUZyb21Kc29uKGtleXMsIGpzb24pIHtcclxuICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5cykpIHtcclxuICAgIGtleXMgPSBrZXlzLnNwbGl0KFwiLlwiKTtcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdldEtleVZhbChvYmosIGtleSkge1xyXG4gICAgY29uc3QgayA9IHBhcnNlSW50KGtleSwgMTApO1xyXG4gICAgaWYgKGsudG9TdHJpbmcoKSA9PT0ga2V5KSB7XHJcbiAgICAgIGtleSA9IGs7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gXCJudW1iZXJcIiAmJiBvYmoubGVuZ3RoID4ga2V5ID8gb2JqW2tleV0gOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAob2JqPy5ba2V5XSA/PyBudWxsKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHZhbCA9IGtleXMucmVkdWNlKGdldEtleVZhbCwganNvbik7XHJcbiAgcmV0dXJuIHZhbDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VTcGVjaWFsQ2hhcmFjdGVycyh2YWwpIHtcclxuICByZXR1cm4gdmFsXHJcbiAgICAucmVwbGFjZSgvJUMzJUEwL2csIFwiYVwiKVxyXG4gICAgLnJlcGxhY2UoLyVDMyU4MC9nLCBcIkFcIilcclxuICAgIC5yZXBsYWNlKC8lQzMlQTgvZywgXCJlXCIpXHJcbiAgICAucmVwbGFjZSgvJUMzJTg4L2csIFwiRVwiKVxyXG4gICAgLnJlcGxhY2UoLyVDMyVBQy9nLCBcImlcIilcclxuICAgIC5yZXBsYWNlKC8lQzMlOEMvZywgXCJJXCIpXHJcbiAgICAucmVwbGFjZSgvJUMzJUIyL2csIFwib1wiKVxyXG4gICAgLnJlcGxhY2UoLyVDMyU5Mi9nLCBcIk9cIilcclxuICAgIC5yZXBsYWNlKC8lQzMlQjkvZywgXCJ1XCIpXHJcbiAgICAucmVwbGFjZSgvJUMzJTk5L2csIFwiVVwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGFWYWx1ZShuYW1lKSB7XHJcbiAgaWYgKCFuYW1lKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgY29uc3QgbWV0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW3Byb3BlcnR5PVwiICsgbmFtZSArIFwiXVwiKTtcclxuICByZXMgPSAoISFtZXRhICYmIG1ldGEuY29udGVudCkgfHwgZmFsc2U7XHJcbiAgcmV0dXJuIHJlcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldF92aWRlb19kdXJhdGlvbihobXMpIHtcclxuICBpZiAoIWhtcykge3JldHVybiBudWxsO31cclxuICBjb25zdCBhID0gaG1zLnNwbGl0KFwiOlwiKTtcclxuICBjb25zdCBtaW51dGVzID0gYS5sZW5ndGggPiAxID8gKCthWzBdICogNjApICsgK2FbMV0gOiBhWzBdO1xyXG4gIHJldHVybiBtaW51dGVzICsgXCIgbWluXCI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZFVuaXRJZnJhbWVPdmVycmlkZSh2aWRlb0l0ZW1Kc29uKSB7XHJcbiAgbGV0IG92ZXJyaWRlID0gZmFsc2U7XHJcbiAgaWYgKGRvY3VtZW50LnJlZmVycmVyLmluZGV4T2YoXCJtc24uY29tXCIpID4gLTEpIHtcclxuICAgIHN3aXRjaCAobG9jYXRpb24uaG9zdC5yZXBsYWNlKC93d3cufC5jb218Lml0L2csIFwiXCIpKSB7XHJcbiAgICBjYXNlIFwicmFpcGxheVwiOlxyXG4gICAgICBvdmVycmlkZSA9IFwiL3Jtc253L3Byb2dyL3NwZXR0L3ZpZGVvXCI7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSBcInJhaW5ld3NcIjpcclxuICAgICAgb3ZlcnJpZGUgPSBcIi9ybXNudy9wcm9nci9uZXdzeC92aWRlb1wiO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgXCJyYWlzcG9ydFwiOlxyXG4gICAgICBvdmVycmlkZSA9IFwiL3Jtc253L3Byb2dyL3Nwb3J0L3ZpZGVvXCI7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZpZGVvSXRlbUpzb24udHlwb2xvZ3kgPT09IFwicHJvZ3JhbW1pIHR2XCIgfHwgdmlkZW9JdGVtSnNvbi50eXBvbG9neSA9PT0gXCJmaWN0aW9uXCIpIHtcclxuICAgICAgb3ZlcnJpZGUgPSBcIi9ybXNudy9wcm9nci9zcGV0dC92aWRlb1wiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2aWRlb0l0ZW1Kc29uLnByb2dyYW1faW5mby5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcInNhbnJlbW9cIikgPj0gMCkge1xyXG4gICAgICBvdmVycmlkZSA9IFwiL3Jtc253L3Byb2dyL3NhbnJtL3ZpZGVvXCI7X
1HJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZpZGVvSXRlbUpzb24ucHJvZ3JhbV9pbmZvLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiYWx0cm8gZmVzdGl2YWxcIikgPj0gMCkge1xyXG4gICAgICBvdmVycmlkZSA9IFwiL3Jtc253L3Byb2dyL3NhbnJtL3ZpZGVvXCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZpZGVvSXRlbUpzb24ucHJvZ3JhbV9pbmZvLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwidml2YXJhaXBsYXlcIikgPj0gMCkge1xyXG4gICAgICBvdmVycmlkZSA9IFwiL3Jtc253L3Byb2dyL3ZpdmFyL3ZpZGVvXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb3ZlcnJpZGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpbmdPcGVyYXRpbmdTeXN0ZW0oKSB7XHJcbiAgY29uc3QgdXNlckFnZW50ID0gbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCBuYXZpZ2F0b3IudmVuZG9yIHx8IHdpbmRvdy5vcGVyYTtcclxuXHJcbiAgaWYgKC9hbmRyb2lkL2kudGVzdCh1c2VyQWdlbnQpKSB7XHJcbiAgICByZXR1cm4gXCJhbmRyb2lkXCI7XHJcbiAgfVxyXG5cclxuICBpZiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QodXNlckFnZW50KSAmJiAhd2luZG93Lk1TU3RyZWFtKSB7XHJcbiAgICByZXR1cm4gXCJpb3NcIjtcclxuICB9XHJcblxyXG4gIHJldHVybiBcIndlYlwiO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBNc25Qb3N0TWVzc2FnZXMocmFpUGxheWVyKSB7XHJcbiAgY29uc3Qgb2JqVG9TZW5kID0ge307XHJcbiAgb2JqVG9TZW5kLnJlZmVycmVyID0gXCJtaWNyb3NvZnRcIjtcclxuICBvYmpUb1NlbmQuZXZlbnQgPSBcImxvYWRcIjtcclxuICBwYXJlbnQucG9zdE1lc3NhZ2Uob2JqVG9TZW5kLCBkb2N1bWVudC5yZWZlcnJlcik7XHJcbiAgcmFpUGxheWVyLm9uKHJhaVBsYXllci5ldmVudHMuRXZlbnRzVHlwZS5DUkVBVElPTiwgKCkgPT4ge1xyXG4gICAgb2JqVG9TZW5kLmV2ZW50ID0gXCJsb2FkXCI7XHJcbiAgICBwYXJlbnQucG9zdE1lc3NhZ2Uob2JqVG9TZW5kLCBkb2N1bWVudC5yZWZlcnJlcik7XHJcbiAgfSk7XHJcbiAgcmFpUGxheWVyLm9uKHJhaVBsYXllci5ldmVudHMuRXZlbnRzVHlwZS5GSVJTVFBMQVksICgpID0+IHtcclxuICAgIG9ialRvU2VuZC5ldmVudCA9IFwic3RhcnRcIjtcclxuICAgIG9ialRvU2VuZC52aWRlb1R5cGUgPSBcImNvbnRlbnRcIjtcclxuICAgIHBhcmVudC5wb3N0TWVzc2FnZShvYmpUb1NlbmQsIGRvY3VtZW50LnJlZmVycmVyKTtcclxuICB9KTtcclxuICByYWlQbGF5ZXIub24ocmFpUGxheWVyLmV2ZW50cy5FdmVudHNUeXBlLkVOREVELCAoKSA9PiB7XHJcbiAgICBvYmpUb1NlbmQuZXZlbnQgPSBcImVuZFwiO1xyXG4gICAgb2JqVG9TZW5kLnZpZGVvVHlwZSA9IFwiY29udGVudFwiO1xyXG4gICAgcGFyZW50LnBvc3RNZXNzYWdlKG9ialRvU2VuZCwgZG9jdW1lbnQucmVmZXJyZXIpO1xyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJbklmcmFtZSgpIHtcclxuICByZXR1cm4gdG9wICE9PSBzZWxmO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJZnJhbWVQYWdlKCkge1xyXG4gIHJldHVybiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyhcImlmcmFtZVwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5Nc25JZnJhbWUoKSB7XHJcbiAgcmV0dXJuIGlzSWZyYW1lUGFnZSgpICYmIGRvY3VtZW50LnJlZmVycmVyLmluZGV4T2YoXCJtc24uY29tXCIpID49IDA7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VtYmVkZGFibGVGb3JtKHZpZGVvSXRlbUpzb24pIHtcclxuICBjb25zdCBmb3JtID0gdmlkZW9JdGVtSnNvbi5mb3JtLnRvTG93ZXJDYXNlKCk7XHJcbiAgcmV0dXJuIGZvcm0gPT09IFwiY2xpcFwiIHx8IGZvcm0gPT09IFwiZXh0cmFcIiB8fCB2aWRlb0l0ZW1Kc29uLmlzX2xpdmU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VtYmVkZGFibGVDb250ZW50KHZpZGVvSXRlbUpzb24pIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgcHJvZ3JhbU5hbWVcclxuICAgICAgPSAhIXZpZGVvSXRlbUpzb24ucHJvZ3JhbV9pbmZvICYmICEhdmlkZW9JdGVtSnNvbi5wcm9ncmFtX2luZm8ubmFtZSA/IHZpZGVvSXRlbUpzb24ucHJvZ3JhbV9pbmZvLm5hbWUudG9Mb3dlckNhc2UoKSA6IFwiXCI7XHJcbiAgICBpZiAoXHJcbiAgICAgIHByb2dyYW1OYW1lLmluZGV4T2YoXCJzYW5yZW1vXCIpID49IDBcclxuICAgICAgfHwgcHJvZ3JhbU5hbWUuaW5kZXhPZihcImFsdHJvIGZlc3RpdmFsXCIpID49IDBcclxuICAgICAgfHwgcHJvZ3JhbU5hbWUuaW5kZXhPZihcIkwnQWx0cm9GZXN0aXZhbFwiKSA+PSAwXHJcbiAgICAgIHx8IHByb2dyYW1OYW1lLmluZGV4T2YoXCJsJ2FsdHJvZmVzdGl2YWxcIikgPj0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBpc0VtYmVkZGFibGVGb3JtKHZpZGVvSXRlbUpzb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwibm90IGVtYmVkZGFibGVcIik7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgY29uc29sZS5sb2coXCJub3QgZW1iZWRkYWJsZSBjYXRjaFwiKTtcclxuICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSG9tZXBhZ2UoKSB7XHJcbiAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmFpLWhvbWVcIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBZHZMYWJlbEZyb21QYWdlKCkge1xyXG4gIGlmICghIXdpbmRvdy5yYWlfYWR2ICYmICEhd2luZG93LnJhaV9hZHYuYWR2X2xhYmVsKSB7cmV0dXJuIHdpbmRvdy5yYWlfYWR2LmFkdl9sYWJlbDt9XHJcbiAgaWYgKCEhd2luZG93LnJhaV9hZHYgJiYgISF3aW5kb3cucmFpX2Fkdi5kZnAgJiYgISF3aW5kb3cucmFpX2Fkdi5kZnAubGFiZWwpIHtyZXR1cm4gd2luZG93LnJhaV9hZHYuZGZwLmxhYmVsO31cclxuICBpZiAoaXNIb21lcGFnZSgpKSB7cmV0dXJuIFwiaG9tcGcvaG9tcGdcIjt9XHJcbiAgaWYgKGlzTmF0aXZlUGFnZSgpKSB7cmV0dXJuIFwiaG9tcGcvaG9tcGdcIjt9XHJcbiAgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFwibXktbGlzdC1wYWdlXCIpKSB7cmV0dXJuIFwicHJvZ3IvbG1sc3RcIjt9XHJcbiAgcmV0dXJuIFwicnBseXcvZ2VucmNcIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTmF0aXZlUGFnZSgpIHtcclxuICByZXR1cm4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoXCJyYWktbmF0aXZlXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWR2UG9ydGFsQ29kZSgpIHtcclxuICBjb25zdCBkb21haW4gPSBkb2N1bWVudC5kb21haW4uaW5kZXhPZihcInd3dy5cIikgPiAtMSA/IGRvY3VtZW50LmRvbWFpbi5zcGxpdChcIi5cIilbMV0gOiBkb2N1bWVudC5kb21haW4uc3BsaXQoXCIuXCIpWzBdO1xyXG4gIGxldCBwb3J0YWxDb2RlID0gXCJycGx5d1wiO1xyXG4gIHN3aXRjaCAo
1ZG9tYWluKSB7XHJcbiAgY2FzZSBcInJhaXBsYXlcIjpcclxuICAgIHBvcnRhbENvZGUgPSBcInJwbHl3XCI7XHJcbiAgICBicmVhaztcclxuICBjYXNlIFwicmFpbmV3c1wiOlxyXG4gIGNhc2UgXCJyYWluZXdzLWRldlwiOlxyXG4gIGNhc2UgXCJyYWluZXdzLXByZVwiOlxyXG4gIGNhc2UgXCJyYWluZXdzLWludFwiOlxyXG4gICAgcG9ydGFsQ29kZSA9IFwicm53c3dcIjtcclxuICAgIGJyZWFrO1xyXG4gIGNhc2UgXCJyYWlcIjpcclxuICAgIGlmIChpc0luSWZyYW1lKCkgJiYgZG9jdW1lbnQucmVmZXJyZXIuaW5kZXhPZihcIm1zbi5jb21cIikgPiAtMSkge1xyXG4gICAgICBwb3J0YWxDb2RlID0gXCJycGx5d1wiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgd2luZG93LnJhaUFkdi5kZnAuY29kaWNlUG9ydGFsZSA9IFwicmFpdHdcIjtcclxuICAgIH1cclxuXHJcbiAgICBicmVhaztcclxuICBjYXNlIFwicmFpc3BvcnRcIjpcclxuICAgIHBvcnRhbENvZGUgPSBcInJzcHR3XCI7XHJcbiAgICBicmVhaztcclxuICBkZWZhdWx0OlxyXG4gICAgYnJlYWs7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcG9ydGFsQ29kZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybFBhcmFtZXRlcihzUGFyYW0pIHtcclxuICBjb25zdCBzUGFnZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpO1xyXG4gIGNvbnN0IHNVUkxWYXJpYWJsZXMgPSBzUGFnZVVSTC5zcGxpdChcIiZcIik7XHJcbiAgbGV0IHNQYXJhbWV0ZXJOYW1lO1xyXG4gIGxldCBpO1xyXG5cclxuICBmb3IgKGkgPSAwOyBpIDwgc1VSTFZhcmlhYmxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgc1BhcmFtZXRlck5hbWUgPSBzVVJMVmFyaWFibGVzW2ldLnNwbGl0KFwiPVwiKTtcclxuXHJcbiAgICBpZiAoc1BhcmFtZXRlck5hbWVbMF0gPT09IHNQYXJhbSkge1xyXG4gICAgICByZXR1cm4gc1BhcmFtZXRlck5hbWVbMV0gPT09IHVuZGVmaW5lZCA/IHRydWUgOiBkZWNvZGVVUklDb21wb25lbnQoc1BhcmFtZXRlck5hbWVbMV0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBhc3N3b3JkKGxlbmd0aCwgcHJlZml4KSB7XHJcbiAgaWYgKHR5cGVvZiBsZW5ndGggIT09IFwibnVtYmVyXCIpIHtsZW5ndGggPSA4O31cclxuICBpZiAodHlwZW9mIHByZWZpeCAhPT0gXCJzdHJpbmdcIikge3ByZWZpeCA9IFwiXCI7fVxyXG4gIGNvbnN0IGNoYXJzZXQgPSBcImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5QF8kISpcIjtcclxuICBsZXQgcmV0VmFsID0gcHJlZml4O1xyXG4gIGZvciAobGV0IGkgPSAwLCBuID0gY2hhcnNldC5sZW5ndGg7IGkgPCBsZW5ndGg7ICsraSkge1xyXG4gICAgcmV0VmFsICs9IGNoYXJzZXQuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG4pKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByZXRWYWw7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRHRFBSTWFuYWdlcigpIHtcclxuICBpZiAod2luZG93LlJhaT8uUG9saWN5TWFuYWdlcikge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5SYWkuUG9saWN5TWFuYWdlcjtcclxuICB9XHJcblxyXG4gIHJldHVybiBuZXcgUHJvbWlzZS
1hyZXNvbHZlID0+IHtcclxuICAgIHdpbmRvdy5SYWkgPSBuZXcgUHJveHkod2luZG93LlJhaSA/PyB7fSwge1xyXG4gICAgICBzZXQodGFyZ2V0LCBwcm9wLCB2YWwpIHtcclxuICAgICAgICBjb25zdCBzZXR0ZWQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3AsIHZhbCk7XHJcbiAgICAgICAgaWYgKHByb3AgPT09IFwiUG9saWN5TWFuYWdlclwiKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh3aW5kb3cuUmFpLlBvbGljeU1hbmFnZXIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2V0dGVkO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcml2YWN5Q29uc2VudCgpIHtcclxuICBjb25zdCBHRFBSTWFuYWdlciA9IGF3YWl0IGdldEdEUFJNYW5hZ2VyKCk7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgR0RQUk1hbmFnZXIuZXZlbnRzJC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gR0RQUk1hbmFnZXIuZXZlbnRzLlBPTElDWV9NQU5BR0VSX0RFRklORURfRVZFTlQpIHtcclxuICAgICAgICBjb25zdCBfbWFuYWdlciA9IHdpbmRvdy5SYWkuUG9saWN5TWFuYWdlcjtcclxuICAgICAgICByZXNvbHZlKF9tYW5hZ2VyLmhhc09wdEluKCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFkdlByaXZhY3lDb25zZW50KCkge1xyXG4gIGNvbnN0IEdEUFJNYW5hZ2VyID0gYXdhaXQgZ2V0R0RQUk1hbmFnZXIoKTtcclxuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICBHRFBSTWFuYWdlci5ldmVudHMkLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBHRFBSTWFuYWdlci5ldmVudHMuUE9MSUNZX01BTkFHRVJfREVGSU5FRF9FVkVOVCkge1xyXG4gICAgICAgIGNvbnN0IF9tYW5hZ2VyID0gd2luZG93LlJhaS5Qb2xpY3lNYW5hZ2VyO1xyXG4gICAgICAgIHJlc29sdmUoX21hbmFnZXIuaGFzR29vZ2xlVmVuZG9yQXZhaWxhYmxlKCkgJiYgX21hbmFnZXIuaGFzQWR2Q29uc2VudHMoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGNTdHJpbmcoKSB7XHJcbiAgY29uc3QgR0RQUk1hbmFnZXIgPSBhd2FpdCBnZXRHRFBSTWFuYWdlcigpO1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZS
1hyZXNvbHZlID0+IHtcclxuICAgIEdEUFJNYW5hZ2VyLmV2ZW50cyQuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IEdEUFJNYW5hZ2VyLmV2ZW50cy5QT0xJQ1lfTUFOQUdFUl9ERUZJTkVEX0VWRU5UKSB7XHJcbiAgICAgICAgY29uc3QgX21hbmFnZXIgPSB3aW5kb3cuUmFpLlBvbGljeU1hbmFnZXI7XHJcbiAgICAgICAgcmVzb2x2ZShfbWFuYWdlci5nZXRUY1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBlc2NhcGVIVE1MID0gc3RyID0+XHJcbiAgc3RyLnJlcGxhY2UoXHJcbiAgICAvWyY8PidcIl0vZyxcclxuICAgIHRhZyA9PlxyXG4gICAgICAoe1xyXG4gICAgICAgIFwiJlwiOiBcIiZhbXA7XCIsXHJcbiAgICAgICAgXCI8XCI6IFwiJmx0O1wiLFxyXG4gICAgICAgIFwiPlwiOiBcIiZndDtcIixcclxuICAgICAgICBcIidcIjogXCImIzM5O1wiLFxyXG4gICAgICAgICdcIic6IFwiJnF1b3Q7XCIsXHJcbiAgICAgIH1bdGFnXSB8fCB0YWcpLFxyXG4gICk7XHJcblxyXG5leHBvcnQgY29uc3QgY2h1bmsgPSAoYXJyLCBjaHVua1NpemUgPSAxLCBjYWNoZSA9IFtdKSA9PiB7XHJcbiAgY29uc3QgdG1wID0gWy4uLmFycl07XHJcbiAgaWYgKGNodW5rU2l6ZSA8PSAwKSB7cmV0dXJuIGNhY2hlO31cclxuICB3aGlsZSAodG1wLmxlbmd0aCkge2NhY2hlLnB1c2godG1wLnNwbGljZSgwLCBjaHVua1NpemUpKTt9XHJcbiAgcmV0dXJuIGNhY2hlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjcmlwdCh1cmwsIGNhbGxiYWNrKSB7XHJcbiAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcclxuICBzY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XHJcbiAgc2NyaXB0LnNyYyA9IHVybDtcclxuICAvLyBNb3N0IGJyb3dzZXJzXHJcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICBzY3JpcHQub25sb2FkID0gY2FsbGJhY2s7XHJcbiAgICAvLyBJRSA2ICYgN1xyXG4gICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENoYW5JbmZvKGNoYW4sIGtleSkge1xyXG4gIGNvbnN0IGNoYW5JbmZvID0ge1xyXG4gICAgXCJSYWkgMVwiOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpMS5qc29uXCIsXHJcbiAgICAgIHdlYmxpbms6IFwiL2RpcmV0dGUvcmFpMVwiLFxyXG4gICAgICBjbGFzczogXCJyYWktMVwiLFxyXG4gICAgfSxcclxuICAgIFwiUmFpIDJcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaTIuanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaTJcIixcclxuICAgICAgY2xhc3M6IFwicmFpLTJcIixcclxuICAgIH0sXHJcbiAgICBcIlJhaSAzXCI6IHtcclxuICAgICAgcGF0aF9pZDogXCIvZGlyZXR0ZS9yYWkzLmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWkzXCIsXHJcbiAgICAgIGNsYXNzOiBcInJhaS0zXCIsXHJcbiAgICB9LFxyXG4gICAgXCJSYWkgNFwiOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpNC5qc29uXCIsXHJcbiAgICAgIHdlYmxpbms6IFwiL2RpcmV0dGUvcmFpNFwiLFxyXG4gICAgICBjbGFzczogXCJyYWktNFwiLFxyXG4gICAgfSxcclxuICAgIFwiUmFpIDVcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaTUuanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaTVcIixcclxuICAgICAgY2xhc3M6IFwicmFpLTVcIixcclxuICAgIH0sXHJcbiAgICBcIlJhaSBNb3ZpZVwiOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpbW92aWUuanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaW1vdmllXCIsXHJcbiAgICAgIGNsYXNzOiBcInJhaS1tb3ZpZVwiLFxyXG4gICAgfSxcclxuICAgIFwiUmFpIFByZW1pdW1cIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaXByZW1pdW0uanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaXByZW1pdW1cIixcclxuICAgICAgY2xhc3M6IFwicmFpLXByZW1pdW1cIixcclxuICAgIH0sXHJcbiAgICBcIlJhaSBHdWxwXCI6IHtcclxuICAgICAgcGF0aF9pZDogXCIvZGlyZXR0ZS9yYWlndWxwLmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlndWxwXCIsXHJcbiAgICAgIGNsYXNzOiBcInJhaS1ndWxwXCIsXHJcbiAgICB9LFxyXG4gICAgXCJSYWkgWW95b1wiOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpeW95by5qc29uXCIsXHJcbiAgICAgIHdlYmxpbms6IFwiL2RpcmV0dGUvcmFpeW95b1wiLFxyXG4gICAgICBjbGFzczogXCJyYWkteW95b1wiLFxyXG4gICAgfSxcclxuICAgIFwiUmFpIFN0b3JpYVwiOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpc3RvcmlhLmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlzdG9yaWFcIixcclxuICAgICAgY2xhc3M6IFwicmFpLXN0b3JpYVwiLFxyXG4gICAgfSxcclxuICAgIFwiUmFpIFNjdW9sYVwiOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpc2N1b2xhLmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlzY3VvbGFcIixcclxuICAgICAgY2xhc3M6IFwicmFpLXNjdW9sYVwiLFxyXG4gICAgfSxcclxuICAgIFwiUmFpIE5ld3MgMjRcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaW5ld3MyNC5qc29uXCIsXHJcbiAgICAgIHdlYmxpbms6IFwiL2RpcmV0dGUvcmFpbmV3czI0XCIsXHJcbiAgICAgIGNsYXNzOiBcInJhaW5ld3NcIixcclxuICAgIH0sXHJcbiAgICBcIlJhaSBTcG9ydCBwaXUgSERcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaXNwb3J0cGl1aGQuanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaXNwb3J0cGl1aGRcIixcclxuICAgICAgY2xhc3M6IFwicmFpc3BvcnQtLWhkXCIsXHJcbiAgICB9LFxyXG4gICAgXCJSYWkgU3BvcnRcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaXNwb3J0Lmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlzcG9ydFwiLFxyXG4gICAgICBjbGFzczogXCJyYWlzcG9ydC0yXCIsXHJcbiAgICB9LFxyXG4gICAgXCJSYWkgU3BvcnQgSERcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaXNwb3J0aGQuanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaXNwb3J0aGRcIixcclxuICAgICAgY2xhc3M6IFwicmFpc3BvcnRoZFwiLFxyXG4gICAgfSxcclxuICAgIFJhaXBsYXk6IHtcclxuICAgICAgcGF0aF9pZDogXCIvZGlyZXR0ZS9yYWlwbGF5Lmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlwbGF5XCIsXHJcbiAgICAgIGNsYXNzOiBcInJhaXBsYXlcIixcclxuICAgIH0sXHJcbiAgICBSYWlQbGF5OiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpcGxheS5qc29uXCIsXHJcbiAgICAgIHdlYmxpbms6IFwiL2RpcmV0dGUvcmFpcGxheVwiLFxyXG4gICAgICBjbGFzczogXCJyYWlwbGF5XCIsXHJcbiAgICB9LFxyXG4gICAgXCJSYWlwbGF5IDJcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaXBsYXkyLmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlwbGF5MlwiLFxyXG4gICAgICBjbGFzczogXCJyYWlwbGF5MlwiLFxyXG4gICAgfSxcclxuICAgIFJhaXBsYXkyOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpcGxheTIuanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaXBsYXkyXCIsXHJcbiAgICAgIGNsYXNzOiBcInJhaXBsYXkyXCIsXHJcbiAgICB9LFxyXG4gICAgXCJSYWlQbGF5IDJcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaXBsYXkyLmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlwbGF5MlwiLFxyXG4gICAgICBjbGFzczogXCJyYWlwbGF5MlwiLFxyXG4gICAgfSxcclxuICAgIFJhaVBsYXkyOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpcGxheTIuanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaXBsYXkyXCIsXHJcbiAgICAgIGNsYXNzOiBcInJhaXBsYXkyXCIsXHJcbiAgICB9LFxyXG4gICAgXCJSYWlQbGF5IDNcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaXBsYXkzLmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlwbGF5M1wiLFxyXG4gICAgICBjbGFzczogXCJyYWlwbGF5M1wiLFxyXG4gICAgfSxcclxuICAgIFJhaVBsYXkzOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpcGxheTMuanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaXBsYXkzXCIsXHJcbiAgICAgIGNsYXNzOiBcInJhaXBsYXkzXCIsXHJcbiAgICB9LFxyXG4gICAgXCJSYWlwbGF5IFNwb3J0IDJcIjoge1xyXG4gICAgICBwYXRoX2lkOiBcIi9kaXJldHRlL3JhaXBsYXlzcG9ydDIuanNvblwiLFxyXG4gICAgICB3ZWJsaW5rOiBcIi9kaXJldHRlL3JhaXBsYXlzcG9ydDJcIixcclxuICAgICAgY2xhc3M6IFwicmFpcGxheXNwb3J0MlwiLFxyXG4gICAgfSxcclxuICAgIFwiUmFpcGxheSBTcG9ydFwiOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpcGxheXNwb3J0Lmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlwbGF5c3BvcnRcIixcclxuICAgICAgY2xhc3M6IFwicmFpcGxheXNwb3J0XCIsXHJcbiAgICB9LFxyXG4gICAgXCJSYWkgUmFkaW8gMlwiOiB7XHJcbiAgICAgIHBhdGhfaWQ6IFwiL2RpcmV0dGUvcmFpcmFkaW8yLmpzb25cIixcclxuICAgICAgd2VibGluazogXCIvZGlyZXR0ZS9yYWlyYWRpbzJcIixcclxuICAgICAgY2xhc3M6IFwicmFpcmFkaW8yXCIsXHJcbiAgICB9LFxyXG4gIH07XHJcbiAgaWYgKCEhY2hhbkluZm9bY2hhbl0gJiYgISFjaGFuSW5mb1tjaGFuXVtrZXldKSB7XHJcbiAgICByZXR1cm4gY2hhbkluZm9bY2hhbl1ba2V5XTtcclxuICB9XHJcblxyXG4gIHJldHVybi
1BcIlwiO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UmFpR2xvYmFsUHJvcGVydHkoa2V5LCB2YWx1ZSkge1xyXG4gIGlmICh0eXBlb2Yga2V5ICE9PSBcInN0cmluZ1wiKSB7cmV0dXJuO31cclxuICB3aW5kb3cuUmFpID0gd2luZG93LlJhaSB8fCB7fTtcclxuICB3aW5kb3cuUmFpW2tleV0gPSB2YWx1ZTtcclxuICByZXR1cm4gdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRSYWlHbG9iYWxQcm9wZXJ0eShrZXkpIHtcclxuICBpZiAodHlwZW9mIGtleSAhPT0gXCJzdHJpbmdcIikge3JldHVybiBudWxsO31cclxuICByZXR1cm4gd2luZG93LlJhaSA/IHdpbmRvdy5SYWlba2V5XSA6IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0UmFpR2xvYmFsUHJvcGVydHkodmFyTmFtZSwgbmVlZFRpbWVvdXQsIHRpbWVvdXQpIHtcclxuICBpZiAod2luZG93LlJhaT8uW3Zhck5hbWVdKSB7XHJcbiAgICByZXR1cm4gd2luZG93LlJhaVt2YXJOYW1lXTtcclxuICB9XHJcblxyXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgIGxldCB0bXQ7XHJcbiAgICB3aW5kb3cuUmFpID0gbmV3IFByb3h5KHdpbmRvdy5SYWkgPz8ge30sIHtcclxuICAgICAgc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcclxuICAgICAgICBjb25zdCBzZXR0ZWQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3AsIHZhbHVlKTtcclxuICAgICAgICBpZiAocHJvcCA9PT0gdmFyTmFtZSkge1xyXG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0bXQpO1xyXG4gICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHdpbmRvdy5SYWlbdmFyTmFtZV0pO1xyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2V0dGVkO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAobmVlZFRpbWVvdXQpIHtcclxuICAgICAgdG10ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgICAgfSwgdGltZW91dCB8fCAxMDAwKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4iLCJmdW5jdGlvbiBzdHJpbmdpZnlBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgbGV0IHN0cmluZ2lmaWVkID0gJzsgJyArIG5hbWU7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdpZmllZDsgLy8gYm9vbGVhbiBhdHRyaWJ1dGVzIHNob3VsZG4ndCBoYXZlIGEgdmFsdWVcbiAgICB9XG4gICAgcmV0dXJuIHN0cmluZ2lmaWVkICsgJz0nICsgdmFsdWU7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpIHtcbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzID0gTWF0aC5taW4oRGF0ZS5ub3coKSArIGF0dHJpYnV0ZXMuZXhwaXJlcyAqIDg2NGUrNSwgODY0ZSsxMyk7XG4gICAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKG1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmdpZnlBdHRyaWJ1dGUoJ0V4cGlyZXMnLCBhdHRyaWJ1dGVzLmV4cGlyZXMgPyBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKSA6ICcnKVxuICAgICAgICArIHN0cmluZ2lmeUF0dHJpYnV0ZSgnRG9tYWluJywgYXR0cmlidXRlcy5kb21haW4pXG4gICAgICAgICsgc3RyaW5naWZ5QXR0cmlidXRlKCdQYXRoJywgYXR0cmlidXRlcy5wYXRoKVxuICAgICAgICArIHN0cmluZ2lmeUF0dHJpYnV0ZSgnU2VjdXJlJywgYXR0cmlidXRlcy5zZWN1cmUpXG4gICAgICAgICsgc3RyaW5naWZ5QXR0cmlidXRlKCdQYXJ0aXRpb25lZCcsIGF0dHJpYnV0ZXMucGFydGl0aW9uZWQpXG4gICAgICAgICsgc3RyaW5naWZ5QXR0cmlidXRlKCdTYW1lU2l0ZScsIGF0dHJpYnV0ZXMuc2FtZVNpdGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShuYW1lLCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQobmFtZSlcbiAgICAgICAgLnJlcGxhY2UoLyUoMlszNDZCXXw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KSAvLyBhbGxvd2VkIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgICAgICAucmVwbGFjZSgvXFwoL2csICclMjgnKS5yZXBsYWNlKC9cXCkvZywgJyUyOScpIC8vIHJlcGxhY2Ugb3BlbmluZyBhbmQgY2xvc2luZyBwYXJlbnNcbiAgICAgICAgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpXG4gICAgICAgIC8vIGFsbG93ZWQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgICAgIC5yZXBsYWNlKC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICAgICAgICArIHN0cmluZ2lmeUF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoY29va2llU3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IGNvb2tpZXMgPSBjb29raWVTdHJpbmcgPyBjb29raWVTdHJpbmcuc3BsaXQoJzsgJykgOiBbXTtcbiAgICBmb3IgKGxldCBjb29raWUgb2YgY29va2llcykge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGNvb2tpZS5zcGxpdCgnPScpO1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG4gICAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gdmFsdWUucmVwbGFjZSgvKCVbXFxkQS1GXXsyfSkrL2dpLCBkZWNvZGVVUklDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgY29va2llcyB3aXRoIGludmFsaWQgbmFtZS92YWx1ZSBlbmNvZGluZ1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybi
1ByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsKCkge1xuICAgIHJldHVybiBwYXJzZShkb2N1bWVudC5jb29raWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldChuYW1lKSB7XG4gICAgcmV0dXJuIGdldEFsbCgpW25hbWVdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldChuYW1lLCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGVuY29kZShuYW1lLCB2YWx1ZSwgeyBwYXRoOiAnLycsIC4uLmF0dHJpYnV0ZXMgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlKG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgICBzZXQobmFtZSwgJycsIHsgLi4uYXR0cmlidXRlcywgZXhwaXJlczogLTEgfSk7XG59XG4iLCIvL0B0cy1pZ25vcmVcbmltcG9ydCB7IGdldCBhcyBnZXRDb29raWUsIHNldCBhcyBzZXRDb29raWUsIHJlbW92ZSBhcyByZW1vdmVDb29raWUsIH0gZnJvbSBcImVzLWNvb2tpZVwiO1xubGV0IGluc3RhbmNlO1xuY2xhc3MgU3RvcmFnZVNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICBzZXRTdG9yYWdlKG5hbWUsIG9iaiwgdXNlU2Vzc2lvbiA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAhb2JqKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBtYW5kYXRvcnkgcGFyYW1ldGVyc1wiKTtcbiAgICAgICAgaWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UgJiYgKHVzZVNlc3Npb24gPyB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UgOiB0cnVlKSkge1xuICAgICAgICAgICAgaWYgKHVzZVNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRDb29raWUobmFtZSwgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG9iaikpLCB7XG4gICAgICAgICAgICAgICAgZG9tYWluOiBkb2N1bWVudC5sb2NhdGlvbi5ob3N0LFxuICAgICAgICAgICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgICAgICAgICAgIGV4cGlyZXM6IHVzZVNlc3Npb24gPyB1bmRlZmluZWQgOiAzNjAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTdG9yYWdlKG5hbWUsIHVzZVNlc3Npb24gPSBmYWxzZSkge1xuICAgICAgICBpZiAoIW5hbWUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG1hbmRhdG9yeSBwYXJhbWV0ZXJzXCIpO1xuICAgICAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZSAmJiAodXNlU2Vzc2lvbiA/IHdpbmRvdy5zZXNzaW9uU3RvcmFnZSA6IHRydWUpKSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlID0gdXNlU2Vzc2lvbiA/IHNlc3Npb25TdG9yYWdlIDogbG9jYWxTdG9yYWdlO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gc3RvcmFnZS5nZXRJdGVtKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcyA/IEpTT04ucGFyc2UocmVzKSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBnZXRDb29raWUobmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzID8gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQocmVzKSkgOiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZVN0b3JhZ2UobmFtZSwgdXNlU2Vzc2lvbiA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh3aW5kb3cubG9jYWxTdG9yYWdlICYmICh1c2VTZXNzaW9uID8gd2luZG93LnNlc3Npb25TdG9yYWdlIDogdHJ1ZSkpIHtcbiAgICAgICAgICAgIGlmICh1c2VTZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlQ29va2llKG5hbWUsIHsgcGF0aDogXCIvXCIsIGRvbWFpbjogZG9jdW1lbnQubG9jYXRpb24uaG9zdCB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNvbnN0IFN0b3JhZ2VTZXJ2aWNlRmFjdG9yeSA9IHtcbiAgICBnZXRTZXJ2aWNlOiAoKSA9PiBuZXcgU3RvcmFnZVNlcnZpY2UoKSxcbn07XG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlU2VydmljZUZhY3Rvcnk7XG4iLCJleHBvcnQgY29uc3QgU1RPUkFHRV9LRVlTID0ge1xuICAgIFJFQ09NTUVOREFUSU9OX1NFQ1RJT05TOiBcInJwczpyZWNvbW1lbmRhdGlvbi1zZWN0aW9uc1wiLFxuICAgIFJFQ09NTUVOREFUSU9OX0NBUkRfQ0xJQ0tTOiBcInJwczpyZWNvbW1lbmRhdGlvbi1jYXJkLWNsaWNrc1wiLFxuICAgIFJFQ09NTUVOREFUSU9OX01BSU5fUEFHRV9DQUNIRTogXCJycHM6cmVjb21tZW5kYXRpb24tbWFpbi1wYWdlXCIsXG59O1xuIiwiLy8gQ29waWEgZGVsIGZpbGUgY29tbW9uXFxhc3NldHMtc3JjXFxqc1xcdXRpbGl0aWVzXFx1dGlscy5qc1xyXG5cclxuY29uc3QgYXZvaWRUeXBlcyA9IFsncmFjY29sdGEnXVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBrZXlzXHJcbiAqIEBwYXJhbSB7YW55fSBqc29uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVGcm9tSnNvbihrZXlzLCBqc29uKSB7XHJcbiAgaWYgKCFBcnJheS5pc0FycmF5KGtleXMpKSB7XHJcbiAgICBrZXlzID0ga2V5cy5zcGxpdCgnLicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYW55W119IG9ialxyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXlcclxuICAgKi9cclxuICBmdW5jdGlvbiBnZXRLZXlWYWwob2JqLCBrZXkpIHtcclxuICAgIGNvbnN0IGsgPSBwYXJzZUludChrZXkudG9TdHJpbmc
1oKSwgMTApO1xyXG4gICAgaWYgKGsudG9TdHJpbmcoKSA9PT0ga2V5KSB7XHJcbiAgICAgIGtleSA9IGs7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gJ251bWJlcicgJiYgb2JqLmxlbmd0aCA+IGtleSA/IG9ialtrZXldXHJcbiAgICAgICAgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmo/LltrZXldID8gb2JqW2tleV0gOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdmFsID0ga2V5cy5yZWR1Y2UoZ2V0S2V5VmFsLCBqc29uKTtcclxuICByZXR1cm4gdmFsO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VTcGVjaWFsQ2hhcmFjdGVycyh2YWwpIHtcclxuICByZXR1cm4gdmFsLnJlcGxhY2UoLyVDMyVBMC9nLCAnYScpXHJcbiAgICAucmVwbGFjZSgvJUMzJTgwL2csICdBJylcclxuICAgIC5yZXBsYWNlKC8lQzMlQTgvZywgJ2UnKVxyXG4gICAgLnJlcGxhY2UoLyVDMyU4OC9nLCAnRScpXHJcbiAgICAucmVwbGFjZSgvJUMzJUFDL2csICdpJylcclxuICAgIC5yZXBsYWNlKC8lQzMlOEMvZywgJ0knKVxyXG4gICAgLnJlcGxhY2UoLyVDMyVCMi9nLCAnbycpXHJcbiAgICAucmVwbGFjZSgvJUMzJTkyL2csICdPJylcclxuICAgIC5yZXBsYWNlKC8lQzMlQjkvZywgJ3UnKVxyXG4gICAgLnJlcGxhY2UoLyVDMyU5OS9nLCAnVScpO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IF9wYXRoXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGF0aFRvQXZvaWQoX3BhdGgpe1xyXG4gIHZhciByZXMgPSBmYWxzZTtcclxuICBhdm9pZFR5cGVzLmZvckVhY2godHlwZSA9PiB7XHJcbiAgICBpZihfcGF0aC5pbmRleE9mKHR5cGUpIT0tMSlcclxuICAgICAgcmVzID0gdHJ1ZTtcclxuICB9KTtcclxuICByZXR1cm4gcmVzO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXRhVmFsdWUobmFtZSkge1xyXG4gIGlmICghbmFtZSkge3JldHVybiBmYWxzZTt9XHJcbiAgLyoqIEB0eXBlIHtzdHJpbmd8Ym9vbGVhbn0gKi9cclxuICBsZXQgcmVzID0gZmFsc2U7XHJcbiAgLyoqIEB0eXBlIHtIVE1MTWV0YUVsZW1lbnR8bnVsbH0gKi9jb25zdCBtZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtwcm9wZXJ0eT0nICsgbmFtZSArICddJyk7XHJcbiAgcmVzID0gKCEhbWV0YSAmJiBtZXRhLmNvbnRlbnQpIHx8IGZhbHNlO1xyXG4gIHJldHVybiByZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gaG1zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0X3ZpZGVvX2R1cmF0aW9uKGhtcykge1xyXG4gIGlmICghaG1zKSB7cmV0dXJuIG51bGw7fVxyXG4gIGNvbnN0IGEgPSBobXMuc3BsaXQoJzonKTtcclxuICBjb25zdCBtaW51dGVzID0gYS5sZW5ndGggPiAxID8gKCgrYVswXSkgKiA2MCkgKyAoK2FbMV0pIDogYVswXTtcclxuICByZXR1cm4gbWludXRlcyArICcgbWluJztcclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7eyB0eXBvbG9neTogc3RyaW5nOyBwcm9ncmFtX2luZm86IHsgbmFtZTogc3RyaW5nOyB9OyB9fSB2aWRlb0l0ZW1Kc29uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYWRVbml0SWZyYW1lT3ZlcnJpZGUodmlkZW9JdGVtSnNvbikge1xyXG4gIC8qKiBAdHlwZSB7Ym9vbGVhbnxzdHJpbmd9ICovXHJcbiAgbGV0IG92ZXJyaWRlID0gZmFsc2U7XHJcbiAgaWYgKGRvY3VtZW50LnJlZmVycmVyLmluZGV4T2YoXCJtc24uY29tXCIpID4gLTEpIHtcclxuICAgIHN3aXRjaCAobG9jYXRpb24uaG9zdC5yZXBsYWNlKC93d3cufC5jb218Lml0L2csICcnKSkge1xyXG4gICAgY2FzZSBcInJhaXBsYXlcIjpcclxuICAgICAgb3ZlcnJpZGUgPSAnL3Jtc253L3Byb2dyL3NwZXR0L3ZpZGVvJztcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlIFwicmFpbmV3c1wiOlxyXG4gICAgICBvdmVycmlkZSA9ICcvcm1zbncvcHJvZ3IvbmV3c3gvdmlkZW8nO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgXCJyYWlzcG9ydFwiOlxyXG4gICAgICBvdmVycmlkZSA9ICcvcm1zbncvcHJvZ3Ivc3BvcnQvdmlkZW8nO1xyXG4gICAgICBicmVhaztcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2aWRlb0l0ZW1Kc29uLnR5cG9sb2d5ID09PSBcInByb2dyYW1taSB0dlwiIHx8IHZpZGVvSXRlbUpzb24udHlwb2xvZ3kgPT09IFwiZmljdGlvblwiKSB7XHJcbiAgICAgIG92ZXJyaWRlID0gJy9ybXNudy9wcm9nci9zcGV0dC92aWRlbyc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZpZGVvSXRlbUpzb24ucHJvZ3JhbV9pbmZvLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwic2FucmVtb1wiKSA+PSAwKSB7XHJcbiAgICAgIG92ZXJyaWRlID0gJy9ybXNudy9wcm9nci9zYW5ybS92aWRlbyc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZpZGVvSXRlbUpzb24ucHJvZ3JhbV9pbmZvLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiYWx0cm8gZmVzdGl2YWxcIikgPj0gMCkge1xyXG4gICAgICBvdmVycmlkZSA9ICcvcm1zbncvcHJvZ3Ivc2Fucm0vdmlkZW8nO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2aWRlb0l0ZW1Kc29uLnByb2dyYW1faW5mby5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcInZpdmFyYWlwbGF5XCIpID49IDApIHtcclxuICAgICAgb3ZlcnJpZGUgPSAnL3Jtc253L3Byb2dyL3ZpdmFyL3ZpZGVvJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBvdmVycmlkZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZ09wZXJhdGluZ1N5c3RlbSgpIHtcclxuICBjb25zdCB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgKC8qKiBAdHlwZSB7YW55fSAqLyh3aW5kb3cpKS5vcGVyYTtcclxuXHJcbiAgaWYgKC9hbmRyb2lkL2kudGVzdCh1c2VyQWdlbnQpKSB7XHJcbiAgICByZXR1cm4gXCJhbmRyb2lkXCI7XHJcbiAgfVxyXG5cclxuICBpZiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QodXNlckFnZW50KSAmJiAhKC8qKiBAdHlwZSB7YW55fSAqLyh3aW5kb3cpKS5NU1N0cmVhbSkge1xyXG4gICAgcmV0dXJuIFwiaW9zXCI7X
1HJcbiAgfVxyXG5cclxuICByZXR1cm4gXCJ3ZWJcIjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7eyBvbjogKGFyZzA6IGFueSwgYXJnMTogeyAoKTogdm9pZDsgKCk6IHZvaWQ7ICgpOiB2b2lkOyB9KSA9PiB2b2lkOyBldmVudHM6IHsgRXZlbnRzVHlwZTogeyBDUkVBVElPTjogYW55OyBGSVJTVFBMQVk6IGFueTsgRU5ERUQ6IGFueTsgfTsgfTsgfX0gcmFpUGxheWVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBNc25Qb3N0TWVzc2FnZXMocmFpUGxheWVyKSB7XHJcbiAgLyoqIEB0eXBlIHthbnl9ICovXHJcbiAgY29uc3Qgb2JqVG9TZW5kID0ge307XHJcbiAgb2JqVG9TZW5kLnJlZmVycmVyID0gJ21pY3Jvc29mdCc7XHJcbiAgb2JqVG9TZW5kLmV2ZW50ID0gJ2xvYWQnO1xyXG4gIHBhcmVudC5wb3N0TWVzc2FnZShvYmpUb1NlbmQsIGRvY3VtZW50LnJlZmVycmVyKTtcclxuICByYWlQbGF5ZXIub24ocmFpUGxheWVyLmV2ZW50cy5FdmVudHNUeXBlLkNSRUFUSU9OLCAoKSA9PiB7XHJcbiAgICBvYmpUb1NlbmQuZXZlbnQgPSAnbG9hZCc7XHJcbiAgICBwYXJlbnQucG9zdE1lc3NhZ2Uob2JqVG9TZW5kLCBkb2N1bWVudC5yZWZlcnJlcik7XHJcbiAgfSk7XHJcbiAgcmFpUGxheWVyLm9uKHJhaVBsYXllci5ldmVudHMuRXZlbnRzVHlwZS5GSVJTVFBMQVksICgpID0+IHtcclxuICAgIG9ialRvU2VuZC5ldmVudCA9ICdzdGFydCc7XHJcbiAgICBvYmpUb1NlbmQudmlkZW9UeXBlID0gJ2NvbnRlbnQnO1xyXG4gICAgcGFyZW50LnBvc3RNZXNzYWdlKG9ialRvU2VuZCwgZG9jdW1lbnQucmVmZXJyZXIpO1xyXG4gIH0pO1xyXG4gIHJhaVBsYXllci5vbihyYWlQbGF5ZXIuZXZlbnRzLkV2ZW50c1R5cGUuRU5ERUQsICgpID0+IHtcclxuICAgIG9ialRvU2VuZC5ldmVudCA9ICdlbmQnO1xyXG4gICAgb2JqVG9TZW5kLnZpZGVvVHlwZSA9ICdjb250ZW50JztcclxuICAgIHBhcmVudC5wb3N0TWVzc2FnZShvYmpUb1NlbmQsIGRvY3VtZW50LnJlZmVycmVyKTtcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5JZnJhbWUoKSB7XHJcbiAgcmV0dXJuIHRvcCAhPT0gc2VsZjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSWZyYW1lUGFnZSgpIHtcclxuICByZXR1cm4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ2lmcmFtZScpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNJbk1zbklmcmFtZSgpIHtcclxuICByZXR1cm4gaXNJZnJhbWVQYWdlKCkgJiYgZG9jdW1lbnQucmVmZXJyZXIuaW5kZXhPZignbXNuLmNvbScpID49IDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3sgZm9ybTogc3RyaW5nOyBpc19saXZlOiBhbnk7IH19IHZpZGVvSXRlbUpzb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VtYmVkZGFibGVGb3JtKHZpZGVvSXRlbUpzb24pIHtcclxuICBjb25zdCBmb3JtID0gdmlkZW9JdGVtSnNvbi5mb3JtLnRvTG93ZXJDYXNlKCk7XHJcbiAgcmV0dXJuIChmb3JtID09PSAnY2xpcCcgfHwgZm9ybSA9PT0gJ2V4dHJhJyB8fCB2aWRlb0l0ZW1Kc29uLmlzX2xpdmUpO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHt7IHByb2dyYW1faW5mbz86IGFueTsgZm9ybTogc3RyaW5nOyBpc19saXZlOiBhbnk7IH19IHZpZGVvSXRlbUpzb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0VtYmVkZGFibGVDb250ZW50KHZpZGVvSXRlbUpzb24pIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgcHJvZ3JhbU5hbWUgPSAhIXZpZGVvSXRlbUpzb24ucHJvZ3JhbV9pbmZvICYmICEhdmlkZW9JdGVtSnNvbi5wcm9ncmFtX2luZm8ubmFtZSA/IHZpZGVvSXRlbUpzb24ucHJvZ3JhbV9pbmZvLm5hbWUudG9Mb3dlckNhc2UoKSA6ICcnO1xyXG4gICAgaWYgKHByb2dyYW1OYW1lLmluZGV4T2YoXCJzYW5yZW1vXCIpID49IDAgfHwgcHJvZ3JhbU5hbWUuaW5kZXhPZihcImFsdHJvIGZlc3RpdmFsXCIpID49IDAgfHwgcHJvZ3JhbU5hbWUuaW5kZXhPZihcIkwnQWx0cm9GZXN0aXZhbFwiKSA+PSAwIHx8IHByb2dyYW1OYW1lLmluZGV4T2YoXCJsJ2FsdHJvZmVzdGl2YWxcIikgPj0gMCkge1xyXG4gICAgICByZXR1cm4gaXNFbWJlZGRhYmxlRm9ybSh2aWRlb0l0ZW1Kc29uKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZygnbm90IGVtYmVkZGFibGUnKTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICBjb25zb2xlLmxvZygnbm90IGVtYmVkZGFibGUgY2F0Y2gnKTtcclxuICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSG9tZXBhZ2UoKSB7XHJcbiAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdyYWktaG9tZScpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNNb2JpbGVPUygpe1xyXG4gIGNvbnN0IHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDtcclxuICBpZiAoL2FuZHJvaWQvaS50ZXN0KHVhKSkgXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICBpZiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QodWEpIHx8IG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDApXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBZHZMYWJlbEZyb21QYWdlKCkge1xyXG4gIC8qKiBAdHlwZSB7YW55fSAqL1xyXG4gIGNvbnN0IHdpbiA9IHdpbmRvdztcclxuICBpZiAoISF3aW4ucmFpX2FkdiAmJiAhIXdpbi5yYWlfYWR2LmFkdl9sYWJlbCkgeyByZXR1cm4gd2luLnJhaV9hZHYuYWR2X2xhYmVsOyB9XHJcbiAgaWYgKCEhd2luLnJhaV9hZHYgJiYgISF3aW4ucmFpX2Fkdi5kZnAgJiYgISF3aW4ucmFpX2Fkdi5kZnAubGFiZWwpIHsgcmV0dXJuIHdpbi5yYWlfYWR2LmRmcC5sYWJlbDsgfVxyXG4gIGlmIChpc0hvbWVwYWdlKCkpIHsgcmV0dXJuIFwiaG9tcGcvaG9tcGdcIjsgfVxyXG4gIGlmIChpc05hdGl2ZVBhZ2UoKSkgeyByZXR1cm4gXCJob21wZy9ob21wZ1wiOyB9XHJcbiAgaWYgKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKFwibXktbGlzdC1wYWdlXCIpKSB7IHJldHVybi
1BcInByb2dyL2xtbHN0XCI7IH1cclxuICByZXR1cm4gXCJycGx5dy9nZW5yY1wiO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNOYXRpdmVQYWdlKCkge1xyXG4gIHJldHVybiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyhcInJhaS1uYXRpdmVcIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBZHZQb3J0YWxDb2RlKCkge1xyXG4gIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmRvbWFpbi5pbmRleE9mKFwid3d3LlwiKSA+IC0xID8gZG9jdW1lbnQuZG9tYWluLnNwbGl0KFwiLlwiKVsxXSA6IGRvY3VtZW50LmRvbWFpbi5zcGxpdChcIi5cIilbMF07XHJcbiAgbGV0IHBvcnRhbENvZGUgPSBcInJwbHl3XCI7XHJcbiAgc3dpdGNoIChkb21haW4pIHtcclxuICBjYXNlIFwicmFpcGxheVwiOlxyXG4gICAgYnJlYWs7XHJcbiAgY2FzZSBcInJhaW5ld3NcIjpcclxuICBjYXNlIFwicmFpbmV3cy1kZXZcIjpcclxuICBjYXNlIFwicmFpbmV3cy1wcmVcIjpcclxuICBjYXNlIFwicmFpbmV3cy1pbnRcIjpcclxuICAgIHBvcnRhbENvZGUgPSBcInJud3N3XCI7XHJcbiAgICBicmVhaztcclxuICBjYXNlIFwicmFpXCI6XHJcbiAgICBpZiAoIShpc0luSWZyYW1lKCkgJiYgZG9jdW1lbnQucmVmZXJyZXIuaW5kZXhPZihcIm1zbi5jb21cIikgPiAtMSkpIHtcclxuICAgICAgLyoqIEB0eXBlIHthbnl9ICovKHdpbmRvdykucmFpQWR2LmRmcC5jb2RpY2VQb3J0YWxlID0gXCJyYWl0d1wiO1xyXG4gICAgfVxyXG5cclxuICAgIGJyZWFrO1xyXG4gIGNhc2UgXCJyYWlzcG9ydFwiOlxyXG4gICAgcG9ydGFsQ29kZSA9IFwicnNwdHdcIjtcclxuICAgIGJyZWFrO1xyXG4gIGRlZmF1bHQ6XHJcbiAgICBicmVhaztcclxuICB9XHJcblxyXG4gIHJldHVybiBwb3J0YWxDb2RlO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IHNQYXJhbVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybFBhcmFtZXRlcihzUGFyYW0pIHtcclxuICBjb25zdCBzUGFnZVVSTCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpO1xyXG4gIGNvbnN0IHNVUkxWYXJpYWJsZXMgPSBzUGFnZVVSTC5zcGxpdCgnJicpO1xyXG4gIGxldCBzUGFyYW1ldGVyTmFtZTtcclxuICBsZXQgaTtcclxuXHJcbiAgZm9yIChpID0gMDsgaSA8IHNVUkxWYXJpYWJsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgIHNQYXJhbWV0ZXJOYW1lID0gc1VSTFZhcmlhYmxlc1tpXS5zcGxpdCgnPScpO1xyXG5cclxuICAgIGlmIChzUGFyYW1ldGVyTmFtZVswXSA9PT0gc1BhcmFtKSB7XHJcbiAgICAgIHJldHVybiBzUGFyYW1ldGVyTmFtZVsxXSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGRlY29kZVVSSUNvbXBvbmVudChzUGFyYW1ldGVyTmFtZVsxXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcclxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUGFzc3dvcmQobGVuZ3RoLCBwcmVmaXgpIHtcclxuICBpZiAodHlwZW9mIGxlbmd0aCAhPT0gJ251bWJlcicpIHtcclxuICAgIGxlbmd0aCA9IDg7XHJcbiAgfVxyXG5cclxuICBpZiAodHlwZW9mIHByZWZpeCAhPT0gJ3N0cmluZycpIHtcclxuICAgIHByZWZpeCA9ICcnO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY2hhcnNldCA9IFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlAXyQhKlwiO1xyXG4gIGxldCByZXRWYWwgPSBwcmVmaXg7XHJcbiAgZm9yIChsZXQgaSA9IDAsIG4gPSBjaGFyc2V0Lmxlbmd0aDsgaSA8IGxlbmd0aDsgKytpKSB7XHJcbiAgICByZXRWYWwgKz0gY2hhcnNldC5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbikpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJldFZhbDtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEdEUFJNYW5hZ2VyKCkge1xyXG4gIGlmICh3aW5kb3cuUmFpPy5Qb2xpY3lNYW5hZ2VyKSB7XHJcbiAgICByZXR1cm4gd2luZG93LlJhaS5Qb2xpY3lNYW5hZ2VyO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgd2luZG93LlJhaSA9IG5ldyBQcm94eSh3aW5kb3cuUmFpID8/IHt9LCB7XHJcbiAgICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRlZCA9IFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsKTtcclxuICAgICAgICBpZiAocHJvcCA9PT0gXCJQb2xpY3lNYW5hZ2VyXCIpIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHdpbmRvdy5SYWkuUG9saWN5TWFuYWdlcik7XHJcbiAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZXR0ZWQ7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldElkZW50aWZpZXJTZXJ2aWNlKCkge1xyXG4gIGlmICh3aW5kb3cuUmFpPy5JZGVudGlmaWVyU2VydmljZSkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5SYWkuSWRlbnRpZmllclNlcnZpY2U7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICB3aW5kb3cuUmFpID0gbmV3IFByb3h5KHdpbmRvdy5SYWkgPz8ge30sIHtcclxuICAgICAgc2V0KHRhcmdldCwgcHJvcCwgdmFsKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGVkID0gUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wLCB2YWwpO1xyXG4gICAgICAgIGlmIChwcm9wID09PSBcIklkZW50aWZpZXJTZXJ2aWNlXCIpIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHdpbmRvdy5SYWkuSWRlbnRpZmllclNlcnZpY2UpO1xyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2V0dGVkO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcml2YWN5Q29uc2VudCgpIHtcclxuICBjb25zdCBHRFBSTWFuYWdlciA9IGF3YWl0IGdldEdEUFJNYW5hZ2VyKCk7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgR0RQUk1hbmFnZXIuZXZlbnRzJC5zdWJzY3JpYmUoKC8qKiBAdHlwZSB7RXZlbn
1R9ICovIGV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBHRFBSTWFuYWdlci5ldmVudHMuUE9MSUNZX01BTkFHRVJfREVGSU5FRF9FVkVOVCkge1xyXG4gICAgICAgIGNvbnN0IF9tYW5hZ2VyID0gd2luZG93LlJhaS5Qb2xpY3lNYW5hZ2VyO1xyXG4gICAgICAgIHJlc29sdmUoX21hbmFnZXIuaGFzT3B0SW4oKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWR2UHJpdmFjeUNvbnNlbnQoKSB7XHJcbiAgY29uc3QgR0RQUk1hbmFnZXIgPSBhd2FpdCBnZXRHRFBSTWFuYWdlcigpO1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgIEdEUFJNYW5hZ2VyLmV2ZW50cyQuc3Vic2NyaWJlKCgvKiogQHR5cGUge0V2ZW50fSAqL2V2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBHRFBSTWFuYWdlci5ldmVudHMuUE9MSUNZX01BTkFHRVJfREVGSU5FRF9FVkVOVCkge1xyXG4gICAgICAgIGNvbnN0IF9tYW5hZ2VyID0gd2luZG93LlJhaS5Qb2xpY3lNYW5hZ2VyO1xyXG4gICAgICAgIHJlc29sdmUoX21hbmFnZXIuaGFzR29vZ2xlVmVuZG9yQXZhaWxhYmxlKCkgJiYgX21hbmFnZXIuaGFzQWR2Q29uc2VudHMoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGNTdHJpbmcoKSB7XHJcbiAgY29uc3QgR0RQUk1hbmFnZXIgPSBhd2FpdCBnZXRHRFBSTWFuYWdlcigpO1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZS
1hyZXNvbHZlID0+IHtcclxuICAgIEdEUFJNYW5hZ2VyLmV2ZW50cyQuc3Vic2NyaWJlKCgvKiogQHR5cGUge0V2ZW50fSAqLyBldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gR0RQUk1hbmFnZXIuZXZlbnRzLlBPTElDWV9NQU5BR0VSX0RFRklORURfRVZFTlQpIHtcclxuICAgICAgICBjb25zdCBfbWFuYWdlciA9IHdpbmRvdy5SYWkuUG9saWN5TWFuYWdlcjtcclxuICAgICAgICByZXNvbHZlKF9tYW5hZ2VyLmdldFRjU3RyaW5nKCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEN1c3RvbVB1cnBvc2VzQ29uc2VudHMoKSB7XHJcbiAgY29uc3QgR0RQUk1hbmFnZXIgPSBhd2FpdCBnZXRHRFBSTWFuYWdlcigpO1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgIEdEUFJNYW5hZ2VyLmV2ZW50cyQuc3Vic2NyaWJlKCgvKiogQHR5cGUge0V2ZW50fSAqL2V2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBHRFBSTWFuYWdlci5ldmVudHMuUE9MSUNZX01BTkFHRVJfREVGSU5FRF9FVkVOVCkge1xyXG4gICAgICAgIGNvbnN0IF9tYW5hZ2VyID0gd2luZG93LlJhaS5Qb2xpY3lNYW5hZ2VyO1xyXG4gICAgICAgIHJlc29sdmUoX21hbmFnZXIuZ2V0Q3VzdG9tUHVycG9zZXNDb25zZW50cygpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGaW5nZXJQcmludE1hbmFnZXIoKSB7XHJcbiAgaWYgKHdpbmRvdy5SYWk/LkZpbmdlclByaW50TWFuYWdlcikge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5SYWkuRmluZ2VyUHJpbnRNYW5hZ2VyO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgd2luZG93LlJhaSA9IG5ldyBQcm94eSh3aW5kb3cuUmFpID8/IHt9LCB7XHJcbiAgICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRlZCA9IFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsKTtcclxuICAgICAgICBpZiAocHJvcCA9PT0gXCJGaW5nZXJQcmludE1hbmFnZXJcIikge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUod2luZG93LlJhaS5GaW5nZXJQcmludE1hbmFnZXIpO1xyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2V0dGVkO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBlc2NhcGVIVE1MID0gKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBzdHIpID0+IHN0ci5yZXBsYWNlKC9bJjw+J1wiXS9nLFxyXG4gIHRhZyA9PiAoe1xyXG4gICAgJyYnOiAnJmFtcDsnLFxyXG4gICAgJzwnOiAnJmx0OycsXHJcbiAgICAnPic6ICcmZ3Q7JyxcclxuICAgIFwiJ1wiOiAnJiMzOTsnLFxyXG4gICAgJ1wiJzogJyZxdW90OycsXHJcbiAgfVt0YWddIHx8IHRhZykpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNodW5rID0gKC8qKiBAdHlwZSB7YW55W119ICovIGFyciwgY2h1bmtTaXplID0gMSwgLyoqIEB0eXBlIHthbnlbXX0gKi9jYWNoZSA9IFtdKSA9PiB7XHJcbiAgY29uc3QgdG1wID0gWy4uLmFycl07XHJcbiAgaWYgKGNodW5rU2l6ZSA8PSAwKSB7XHJcbiAgICByZXR1cm4gY2FjaGU7XHJcbiAgfVxyXG5cclxuICB3aGlsZSAodG1wLmxlbmd0aCkge1xyXG4gICAgY2FjaGUucHVzaCh0bXAuc3BsaWNlKDAsIGNodW5rU2l6ZSkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNhY2hlO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcclxuICogQHBhcmFtIHsoKHRoaXM6IEdsb2JhbEV2ZW50SGFuZGxlcnMsIGV2OiBFdmVudCkgPT4gYW55KSB8IG51bGx9IGNhbGxiYWNrXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NyaXB0KHVybCwgY2FsbGJhY2spIHtcclxuICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xyXG4gIHNjcmlwdC5zcmMgPSB1cmw7XHJcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgc2NyaXB0Lm9ubG9hZCA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtzdHJpbmd9IGNoYW5cclxuICogQHBhcmFtIHsncGF0aF9pZCcgfCAnd2VibGluaycgfCAnY2xhc3MnfSBrZXlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFuSW5mbyhjaGFuLCBrZXkpIHtcclxuICBjb25zdCBjaGFuSW5mbyA9IHtcclxuICAgICdSYWkgMSc6IHtcclxuICAgICAgcGF0aF9pZDogJy9kaXJldHRlL3JhaTEuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWkxJyxcclxuICAgICAgY2xhc3M6ICdyYWktMScsXHJcbiAgICB9LFxyXG4gICAgJ1JhaSAyJzoge1xyXG4gICAgICBwYXRoX2lkOiAnL2RpcmV0dGUvcmFpMi5qc29uJyxcclxuICAgICAgd2VibGluazogJy9kaXJldHRlL3JhaTInLFxyXG4gICAgICBjbGFzczogJ3JhaS0yJyxcclxuICAgIH0sXHJcbiAgICAnUmFpIDMnOiB7XHJcbiAgICAgIHBhdGhfaWQ6ICcvZGlyZXR0ZS9yYWkzLmpzb24nLFxyXG4gICAgICB3ZWJsaW5rOiAnL2RpcmV0dGUvcmFpMycsXHJcbiAgICAgIGNsYXNzOiAncmFpLTMnLFxyXG4gICAgfSxcclxuICAgICdSYWkgNCc6IHtcclxuICAgICAgcGF0aF9pZDogJy9kaXJldHRlL3JhaTQuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWk0JyxcclxuICAgICAgY2xhc3M6ICdyYWktNCcsXHJcbiAgICB9LFxyXG4gICAgJ1JhaSA1Jzoge1xyXG4gICAgICBwYXRoX2lkOiAnL2RpcmV0dGUvcmFpNS5qc29uJyxcclxuICAgICAgd2VibGluazogJy9kaXJldHRlL3JhaTUnLFxyXG4gICAgICBjbGFzczogJ3JhaS01JyxcclxuICAgIH0sXHJcbiAgICAnUmFpIE1vdmllJzoge1xyXG4gICAgICBwYXRoX2lkOiAnL2RpcmV0dGUvcmFpbW92aWUuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWltb3ZpZScsXHJcbiAgICAgIGNsYXNzOiAncmFpLW1vdmllJyxcclxuICAgIH0sXHJcbiAgICAnUmFpIFByZW1pdW0nOiB7XHJcbiAgICAgIHBhdGhfaWQ6ICcvZGlyZXR0ZS9yYWlwcmVtaXVtLmpzb24nLFxyXG4gICAgICB3ZWJsaW5rOiAnL2RpcmV0dGUvcmFpcHJlbWl1bScsXHJcbiAgICAgIGNsYXNzOiAncmFpLXByZW1pdW0nLFxyXG4gICAgfSxcclxuICAgICdSYWkgR3VscCc6IHtcclxuICAgICAgcGF0aF9pZDogJy9kaXJldHRlL3JhaWd1bHAuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWlndWxwJyxcclxuICAgICAgY2xhc3M6ICdyYWktZ3VscCcsXHJcbiAgICB9LFxyXG4gICAgJ1JhaSBZb3lvJzoge1xyXG4gICAgICBwYXRoX2lkOiAnL2RpcmV0dGUvcmFpeW95by5qc29uJyxcclxuICAgICAgd2VibGluazogJy9kaXJldHRlL3JhaXlveW8nLFxyXG4gICAgICBjbGFzczogJ3JhaS15b3lvJyxcclxuICAgIH0sXHJcbiAgICAnUmFpIFN0b3JpYSc6IHtcclxuICAgICAgcGF0aF9pZDogJy9kaXJldHRlL3JhaXN0b3JpYS5qc29uJyxcclxuICAgICAgd2VibGluazogJy9kaXJldHRlL3JhaXN0b3JpYScsXHJcbiAgICAgIGNsYXNzOiAncmFpLXN0b3JpYScsXHJcbiAgICB9LFxyXG4gICAgJ1JhaSBTY3VvbGEnOiB7XHJcbiAgICAgIHBhdGhfaWQ6ICcvZGlyZXR0ZS9yYWlzY3VvbGEuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWlzY3VvbGEnLFxyXG4gICAgICBjbGFzczogJ3JhaS1zY3VvbGEnLFxyXG4gICAgfSxcclxuICAgICdSYWkgTmV3cyAyNCc6IHtcclxuICAgICAgcGF0aF9pZDogJy9kaXJldHRlL3JhaW5ld3MyNC5qc29uJyxcclxuICAgICAgd2VibGluazogJy9kaXJldHRlL3JhaW5ld3MyNCcsXHJcbiAgICAgIGNsYXNzOiAncmFpbmV3cycsXHJcbiAgICB9LFxyXG4gICAgJ1JhaSBTcG9ydCBwaXUgSEQnOiB7XHJcbiAgICAgIHBhdGhfaWQ6ICcvZGlyZXR0ZS9yYWlzcG9ydHBpdWhkLmpzb24nLFxyXG4gICAgICB3ZWJsaW5rOiAnL2RpcmV0dGUvcmFpc3BvcnRwaXVoZCcsXHJcbiAgICAgIGNsYXNzOiAncmFpc3BvcnQtLWhkJyxcclxuICAgIH0sXHJcbiAgICAnUmFpIFNwb3J0Jzoge1xyXG4gICAgICBwYXRoX2lkOiAnL2RpcmV0dGUvcmFpc3BvcnQuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWlzcG9ydCcsXHJcbiAgICAgIGNsYXNzOiAncmFpc3BvcnQtMicsXHJcbiAgICB9LFxyXG4gICAgJ1JhaSBTcG9ydCBIRCc6IHtcclxuICAgICAgcGF0aF9pZDogJy9kaXJldHRlL3JhaXNwb3J0aGQuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWlzcG9ydGhkJyxcclxuICAgICAgY2xhc3M6ICdyYWlzcG9ydGhkJyxcclxuICAgIH0sXHJcbiAgICBSYWlwbGF5OiB7XHJcbiAgICAgIHBhdGhfaWQ6ICcvZGlyZXR0ZS9yYWlwbGF5Lmpzb24nLFxyXG4gICAgICB3ZWJsaW5rOiAnL2RpcmV0dGUvcmFpcGxheScsXHJcbiAgICAgIGNsYXNzOiAncmFpcGxheScsXHJcbiAgICB9LFxyXG4gICAgUmFpUGxheToge1xyXG4gICAgICBwYXRoX2lkOiAnL2RpcmV0dGUvcmFpcGxheS5qc29uJyxcclxuICAgICAgd2VibGluazogJy9kaXJldHRlL3JhaXBsYXknLFxyXG4gICAgICBjbGFzczogJ3JhaXBsYXknLFxyXG4gICAgfSxcclxuICAgICdSYWlwbGF5IDInOiB7XHJcbiAgICAgIHBhdGhfaWQ6ICcvZGlyZXR0ZS9yYWlwbGF5Mi5qc29uJyxcclxuICAgICAgd2VibGluazogJy9kaXJldHRlL3JhaXBsYXkyJyxcclxuICAgICAgY2xhc3M6ICdyYWlwbGF5MicsXHJcbiAgICB9LFxyXG4gICAgUmFpcGxheTI6IHtcclxuICAgICAgcGF0aF9pZDogJy9kaXJldHRlL3JhaXBsYXkyLmpzb24nLFxyXG4gICAgICB3ZWJsaW5rOiAnL2RpcmV0dGUvcmFpcGxheTInLFxyXG4gICAgICBjbGFzczogJ3JhaXBsYXkyJyxcclxuICAgIH0sXHJcbiAgICAnUmFpUGxheSAyJzoge1xyXG4gICAgICBwYXRoX2lkOiAnL2RpcmV0dGUvcmFpcGxheTIuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWlwbGF5MicsXHJcbiAgICAgIGNsYXNzOiAncmFpcGxheTInLFxyXG4gICAgfSxcclxuICAgIFJhaVBsYXkyOiB7XHJcbiAgICAgIHBhdGhfaWQ6ICcvZGlyZXR0ZS9yYWlwbGF5Mi5qc29uJyxcclxuICAgICAgd2VibGluazogJy9kaXJldHRlL3JhaXBsYXkyJyxcclxuICAgICAgY2xhc3M6ICdyYWlwbGF5MicsXHJcbiAgICB9LFxyXG4gICAgJ1JhaVBsYXkgMyc6IHtcclxuICAgICAgcGF0aF9pZDogJy9kaXJldHRlL3JhaXBsYXkzLmpzb24nLFxyXG4gICAgICB3ZWJsaW5rOiAnL2RpcmV0dGUvcmFpcGxheTMnLFxyXG4gICAgICBjbGFzczogJ3JhaXBsYXkzJyxcclxuICAgIH0sXHJcbiAgICBSYWlQbGF5Mzoge1xyXG4gICAgICBwYXRoX2lkOiAnL2RpcmV0dGUvcmFpcGxheTMuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWlwbGF5MycsXHJcbiAgICAgIGNsYXNzOiAncmFpcGxheTMnLFxyXG4gICAgfSxcclxuICAgICdSYWlwbGF5IFNwb3J0IDInOiB7XHJcbiAgICAgIHBhdGhfaWQ6ICcvZGlyZXR0ZS9yYWlwbGF5c3BvcnQyLmpzb24nLFxyXG4gICAgICB3ZWJsaW5rOiAnL2RpcmV0dGUvcmFpcGxheXNwb3J0MicsXHJcbiAgICAgIGNsYXNzOiAncmFpcGxheXNwb3J0MicsXHJcbiAgICB9LFxyXG4gICAgJ1JhaXBsYXkgU3BvcnQnOiB7XHJcbiAgICAgIHBhdGhfaWQ6ICcvZGlyZXR0ZS9yYWlwbGF5c3BvcnQuanNvbicsXHJcbiAgICAgIHdlYmxpbms6ICcvZGlyZXR0ZS9yYWlwbGF5c3BvcnQnLFxyXG4gICAgICBjbGFzczogJ3JhaXBsYXlzcG9ydCcsXHJcbiAgICB9LFxyXG4gICAgJ1JhaSBSYWRpbyAyJzoge1xyXG4gICAgICBwYXRoX2lkOiAnL2RpcmV0dGUvcmFpcmFkaW8yLmpzb24nLFxyXG4gICAgICB3ZWJsaW5rOiAnL2RpcmV0dGUvcmFpcmFkaW8yJyxcclxuICAgICAgY2xhc3M6ICdyYWlyYWRpbzInLFxyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICBjb25zdCBjaCA9IC8qKiBAdHlwZSB7a2V5b2YgdHlwZW9mIGNoYW5JbmZvfSAqLyhjaGFuKTtcclxuICBpZiAoISFjaGFuSW5mb1tjaF0gJiYgISFjaGFuSW5mb1tjaF1ba2V5XSkge1xyXG4gICAgcmV0dXJuIGNoYW5JbmZvW2NoXVtrZXldO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICcnO1xyXG59XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtrZXlvZiB0eXBlb2Ygd2luZG93LlJhaX0ga2V5XHJcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFJhaUdsb2JhbFByb3BlcnR5KGtleSwgdmFsdWUpIHtcclxuICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHsgcmV0dXJuOyB9XHJcbiAgd2luZG93LlJhaSA9IHdpbmRvdy5SYWkgfHwgKC8qKiBAdHlwZSB7YW55fSAqL3t9KTtcclxuICB3aW5kb3cuUmFpW2tleV0gPSB2YWx1ZTtcclxuICByZXR1cm4gdmFsdWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge2tleW9mIHR5cGVvZiB3aW5kb3cuUmFpfSBrZXlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRSYWlHbG9iYWxQcm9wZXJ0eShrZXkpIHtcclxuICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHsgcmV0dXJuIG51bGw7IH1cclxuICByZXR1cm4gd2luZG93LlJhaSA/IHdpbmRvdy5SYWlba2V5XSA6IG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge2tleW9mIHR5cGVvZiB3aW5kb3cuUmFpfSB2YXJOYW1lXHJcbiAqIEBwYXJhbSB7YW55fSBuZWVkVGltZW91dFxyXG4gKiBAcGFyYW0ge2FueX0gdGltZW91dFxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRSYWlHbG9iYWxQcm9wZXJ0eSh2YXJOYW1lLCBuZWVkVGltZW91dCwgdGltZW91dCkge1xyXG4gIGlmICh3aW5kb3cuUmFpPy5bdmFyTmFtZV0pIHtcclxuICAgIHJldHVybi
1B3aW5kb3cuUmFpW3Zhck5hbWVdO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyIHwgdW5kZWZpbmVkfVxyXG4gICAgICovXHJcbiAgICBsZXQgdG10O1xyXG4gICAgd2luZG93LlJhaSA9IG5ldyBQcm94eSgod2luZG93LlJhaSA/PyB7fSksIHtcclxuICAgICAgc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcclxuICAgICAgICBjb25zdCBzZXR0ZWQgPSBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3AsIHZhbHVlKTtcclxuICAgICAgICBpZiAocHJvcCA9PT0gdmFyTmFtZSkge1xyXG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0bXQpO1xyXG4gICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHdpbmRvdy5SYWlbdmFyTmFtZV0pO1xyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2V0dGVkO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgICBpZiAobmVlZFRpbWVvdXQpIHtcclxuICAgICAgdG10ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcclxuICAgICAgfSwgdGltZW91dCB8fCAxMDAwKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJhaUFkdk1hbmFnZXIoKSB7XHJcbiAgaWYgKHdpbmRvdy5SYWk/LnJhaUFkdikge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5SYWkucmFpQWR2O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgd2luZG93LlJhaSA9IG5ldyBQcm94eSh3aW5kb3cuUmFpID8/IHt9LCB7XHJcbiAgICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRlZCA9IFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsKTtcclxuICAgICAgICBpZiAocHJvcCA9PT0gXCJyYWlBZHZcIikge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUod2luZG93LlJhaS5yYWlBZHYpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2V0dGVkO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSYWlzc28oKSB7XHJcbiAgaWYgKHdpbmRvdy5SYWk/LlJhaXNzbykge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5SYWkuUmFpc3NvO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgd2luZG93LlJhaSA9IG5ldyBQcm94eSh3aW5kb3cuUmFpID8/IHt9LCB7XHJcbiAgICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRlZCA9IFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsKTtcclxuICAgICAgICBpZiAocHJvcCA9PT0gXCJSYWlzc29cIikge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUod2luZG93LlJhaS5SYWlzc28pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2V0dGVkO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuIiwiZXhwb3J0IHZhciBTb3VuZFBsYXllckV2ZW50cztcbihmdW5jdGlvbiAoU291bmRQbGF5ZXJFdmVudHMpIHtcbiAgICBTb3VuZFBsYXllckV2ZW50c1tcIkZJUlNUUExBWVwiXSA9IFwicGxheWVyOnJhaTpmaXJzdHBsYXlcIjtcbiAgICBTb3VuZFBsYXllckV2ZW50c1tcIlRJTUVVUERBVEVcIl0gPSBcInBsYXllcjpyYWk6VElNRV9VUERBVEVcIjtcbiAgICBTb3VuZFBsYXllckV2ZW50c1tcIkVOREVEXCJdID0gXCJwbGF5ZXI6cmFpOkVOREVEXCI7XG4gICAgU291bmRQbGF5ZXJFdmVudHNbXCJDTE9TRURcIl0gPSBcInBsYXllcjpyYWk6Q0xPU0VEXCI7XG4gICAgU291bmRQbGF5ZXJFdmVudHNbXCJGSVJTVFBMQVlfQ1VTVE9NXCJdID0gXCJwbGF5ZXI6cmFpOmZpcnN0cGxheV91cGRhdGVcIjtcbiAgICBTb3VuZFBsYXllckV2ZW50c1tcIlRJTUVVUERBVEVfQ1VTVE9NXCJdID0gXCJwbGF5ZXI6cmFpOlRJTUVfVVBEQVRFX1VQREFURVwiO1xuICAgIFNvdW5kUGxheWVyRXZlbnRzW1wiRU5ERURfQ1VTVE9NXCJdID0gXCJwbGF5ZXI6cmFpOkVOREVEX1VQREFURVwiO1xuICAgIFNvdW5kUGxheWVyRXZlbnRzW1wiQ0xPU0VEX0NVU1RPTVwiXSA9IFwicGxheWVyOnJhaTpDTE9TRURfVVBEQVRFXCI7XG59KShTb3VuZFBsYXllckV2ZW50cyB8fCAoU291bmRQbGF5ZXJFdmVudHMgPSB7fSkpO1xuIiwiZXhwb3J0IHZhciBTU09FdmVudDtcbihmdW5jdGlvbiAoU1NPRXZlbnQpIHtcbiAgICBTU09FdmVudFtcIkNIRUNLQk9YX1NFTEVDVFwiXSA9IFwic3NvLXdpZGdldC1jaGVja2JveC1zZWxlY3RcIjtcbiAgICBTU09FdmVudFtcIkNMT1NFRFwiXSA9IFwicmFpOnNzb1dpZGdldC1jbG9zZWRcIjtcbiAgICBTU09FdmVudFtcIkNMT1NFX1JFUVVFU1RcIl0gPSBcInJhaTpzc29XaWRnZXQtY2xvc2VSZXF1ZXN0XCI7XG4gICAgU1NPRXZlbnRbXCJDSEFOR0VfVklFV1wiXSA9IFwic3NvLXdpZGdldC1jaGFuZ2Utdmlld1wiO1xuICAgIFNTT0V2ZW50W1wiQ0xJQ0tcIl0gPSBcInNzby13aWRnZXQtY2xpY2tcIjtcbiAgICBTU09FdmVudFtcIklOUFVUX0ZPQ1VTX09VVFwiXSA9IFwic3NvLXdpZGdldC1pbnB1dC1mb2N1c291dFwiO1xuICAgIFNTT0V2ZW50W1wiSU5QVVRfS0VZX1VQXCJdID0gXCJzc28td2lkZ2V0LWlucHV0LWtleXVwXCI7XG4gICAgU1NPRXZlbnRbXCJMSU5LX0JVVFRPTl9DTElDS1wiXSA9IFwic3NvLXdpZGdldC1saW5rLWJ1dHRvbi1jbGlja1wiO1xuICAgIFNTT0V2ZW50W1wiTE9HSU5cIl0gPSBcInJhaXNzb1VzZXJMb2dpblwiO1xuICAgIFNTT0V2ZW50W1wiTE9HT1VUX0lOSVRcIl0gPSBcInJhaXNzb1VzZXJMb2dvdXQuaW5pdFwiO1xuICAgIFNTT0V2ZW50W1wiTE9HT1VUXCJdID0gXCJyYWlzc29Vc2VyTG9nb3V0XCI7XG4gICAgU1NPRXZlbnRbXCJPUEVOX1JFUVVFU1RcIl0gPSBcInJhaTpzc29XaWRnZXQtb3BlblJlcXVlc3RcIjtcbiAgICBTU09FdmVudFtcIk9QRU5FRFwiXSA9IFwicmFpOnNzb1dpZGdldC1vcGVuZWRcIjtcbiAgICBTU09FdmVudFtcIlNPQ0lBTF9DTElDS1wiXSA9IFwic3NvLXdpZGdldC1zb2NpYWwtY2xpY2tcIjtcbiAgICBTU09FdmVudFtcIlNFTEVDVF9DSEFOR0VcIl0gPSBcInNzby13aWRnZXQtc2VsZWN0LWNoYW5nZVwiO1xuICAgIFNTT0V2ZW50W1wiU0hPV19S
1RVNQT05TRVwiXSA9IFwic3NvLXdpZGdldC1zZXJ2ZXItZXJyb3JcIjtcbiAgICBTU09FdmVudFtcIlRBQkJBUl9DTElDS1wiXSA9IFwic3NvLXdpZGdldC10YWJiYXItY2xpY2tcIjtcbiAgICBTU09FdmVudFtcIlRSQUNLSU5HX1BBR0VfRVZFTlRcIl0gPSBcInJhaS10cmFja2VyOnRyYWNraW5nLXBhZ2VcIjtcbiAgICBTU09FdmVudFtcIlRSQUNLSU5HX1VTRVJfRVZFTlRcIl0gPSBcInJhaS10cmFja2VyOnRyYWNraW5nLXVzZXJcIjtcbiAgICBTU09FdmVudFtcIlVTRVJfVVBEQVRFXCJdID0gXCJzc28td2lkZ2V0LXVzZXItdXBkYXRlXCI7XG4gICAgU1NPRXZlbnRbXCJSRVFVRVNUX0NMT1NFX0JVVFRPTlwiXSA9IFwicmVxdWVzdC1jbG9zZS1idXR0b25cIjtcbn0pKFNTT0V2ZW50IHx8IChTU09FdmVudCA9IHt9KSk7XG4iLCIvKiBAdHMtaWdub3JlICovXG5pbXBvcnQgeyBTU09FdmVudCB9IGZyb20gJ0NvbW1vbi9hc3NldHMtc3JjLXRzL2NvbW1vbi9saWJzL3Nzby13aWRnZXQvc3JjL3NoYXJlZC9ldmVudHMnO1xuZXhwb3J0IGNsYXNzIFJhaSB7XG4gICAgc3RhdGljIGdldCB0cmFpbGVyUGxheWFibGVQcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlJhaS50cmFpbGVyUGxheWFibGVQcm9taXNlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IFRoZVBsYXllcigpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5UaGVQbGF5ZXI7XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgcmFpQWR2KF9yYWlBZHYpIHtcbiAgICAgICAgd2luZG93LlJhaS5yYWlBZHYgPSBfcmFpQWR2O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHJhaUFkdigpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5SYWkucmFpQWR2O1xuICAgIH1cbiAgICA7XG4gICAgc3RhdGljIGdldCByYWlzc28oKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuUmFpLlJhaXNzbztcbiAgICB9XG4gICAgc3RhdGljIGdldCBwb2xpY3lNYW5hZ2VyKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlJhaS5Qb2xpY3lNYW5hZ2VyO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHByb2ZpbGVNYW5hZ2VyKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlJhaS5Qcm9maWxlTWFuYWdlcjtcbiAgICB9XG4gICAgc3RhdGljIGdldCByYWlQcmVkaWN0KCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlJhaS5SYWlQcmVkaWN0O1xuICAgIH1cbiAgICBzdGF0aWMgc2V0IHJhaVByZWRpY3QoX3JhaVByZWRpY3QpIHtcbiAgICAgICAgd2luZG93LlJhaS5SYWlQcmVkaWN0ID0gX3JhaVByZWRpY3Q7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgc2V0dGluZ3NNYW5hZ2VyKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlJhaS5TZXR0aW5nc01hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgdHJhY2tFbnF1ZXVlKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlJhaS5fdHJhY2tFbnF1ZXVlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHNlcnZpY2VzKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlJhaS5zZXJ2aXppO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHNlcnZpY2VNYW5hZ2VyKCkge1xuICAgICAgICByZXR1cm4gc2VsZi5SYWkuRXh0ZXJuYWxTZXJ2aWNlTWFuYWdlcjtcbiAgICB9XG4gICAgc3RhdGljIGdldCBleHRlcm5hbFNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuUmFpLkV4dGVybmFsU2VydmljZU1hbmFnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgc2Vla0xvYWRQcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LlJhaS5zZWVrTG9hZFByb21pc2U7XG4gICAgfVxuICAgIHN0YXRpYyBzZXQgc2Vla0xvYWRQcm9taXNlKF9zKSB7XG4gICAgICAgIHdpbmRvdy5SYWkuc2Vla0xvYWRQcm9taXNlID0gX3M7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IG9wZW5Mb2dpbldpZGdldCA9IChvcHRpb25zKSA9PiB7XG4gICAgcmV0dXJuIF9vcGVuV2lkZ2V0KCdsb2dpbicsIG9wdGlvbnMpO1xufTtcbmV4cG9ydCBjb25zdCBjbG9zZUxvZ2luV2lkZ2V0ID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3RDbG9zZUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KFNTT0V2ZW50LkNMT1NFX1JFUVVFU1QsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgfSk7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChyZXF1ZXN0Q2xvc2VFdmVudCk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTG9naW4oKSB7XG4gICAgcmV0dXJuIFJhaS5yYWlzc28uY2hlY2tMb2dpbigpO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQXN5bmNMb2dpbigpIHtcbiAgICByZXR1cm4gUmFpLnJhaXNzby5jaGVja0FzeW5jTG9naW4oKTtcbn1cbmV4cG9ydCBjb25zdCBvcGVuUmVnaXN0cmF0aW9uV2lkZ2V0ID0gKCkgPT4ge1xuICAgIHJldHVybiBfb3BlbldpZGdldCgnc2lnbmluJyk7XG59O1xuY29uc3QgX29wZW5XaWRnZXQgPSAobW9kZSwgb3B0aW9ucykgPT4ge1xuICAgIGNoZWNrSXNBdXRvbW90aXZlKCk7XG4gICAgY29uc3QgcmVxdWVzdE9wZW5FdmVudCA9IG5ldyBDdXN0b21FdmVudChTU09FdmVudC5PUEVOX1JFUVVFU1QsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBtb2RlLCByZWRpcmVjdFVybDogb3B0aW9ucz8ucmVkaXJlY3RVcmwgPz8gbG9jYXRpb24uaHJlZiB9LFxuICAgIH0pO1xuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQocmVxdWVzdE9wZW5FdmVudCk7XG59O1xuZXhwb3J0IGNvbnN0IHN0b3B3b3JkcyA9IFsnaWwnLCAnbG8nLCAnbGEnLCAnZ2xpJywgJ2xlJywgJ3VuJywgJ3VubycsICd1bmEnXTtcbmV4cG9ydCBjb25zdCB0b2tlbml6ZSA9ICh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHRva2VucyA9IHZhbHVlLnJlcGxhY2UoLycvLCAnICcpLnNwbGl0KCcgJyk7XG4gICAgY29uc3QgdG9rZW4gPSBzdG9wd29yZHMuaW5jbHVkZXModG9rZW5zWzBdKVxuICAgICAgICA/IHRva2Vucy5sZW5ndGggPiAxXG4gICAgICAgICAgICA/IHRva2Vuc1sxXVxuICAgICAgICAgICAgOiB0b2tlbnNbMF1cbiAgICAgICAgOiB0b2tlbnNbMF07XG4gICAgcmV0dXJuIHRva2VuWzBdLnRvVXBwZXJDYXNlKCk7XG59O1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUFycmF
15QXRvWiA9ICgpID0+IHtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICByZXR1cm4gQXJyYXkuYXBwbHkobnVsbCwgeyBsZW5ndGg6IDI2IH0pLm1hcCgoeCwgaSkgPT4gU3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIGkpKTtcbn07XG5leHBvcnQgY29uc3QgbGV0dGVycyA9IFsuLi5jcmVhdGVBcnJheUF0b1ooKSwgJzAtOSddO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FyKCkge1xuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICBjb25zdCBSRUdFWHMgPSBbL2Jtdy9pLCAvRmF1cmVjaWEgQXB0b2lkZS9pLCAvSGFybWFuIEF1dG9tb3RpdmUvaV07XG4gICAgUkVHRVhzLmZvckVhY2goYXV0byA9PiB7XG4gICAgICAgIGlmIChhdXRvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpXG4gICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0F1dG9tb3RpdmUoKSB7XG4gICAgaWYgKGlzQ2FyKCkgJiYgIXdpbmRvdy5SYWkuUmFpc3NvLmNoZWNrTG9naW4oKSkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAvYXNzb2NpYS9jb2RpY2U/cmV0dXJuX3VybD0ke2RvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lfWA7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNUb3VjaFNjcmVlbigpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCcpPy5jbGFzc0xpc3QuY29udGFpbnMoJ3RvdWNoJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTbWFsbFNjcmVlbigpIHtcbiAgICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDk4MHB4KScpLm1hdGNoZXM7XG59XG4vKipcbiAqIFZlcmlmaWNhIHNlIGwnZWxlbWVudG8gc2xpZGVyIHBhc3NhdG8gY29tZSBhcmdvbWVudG8gaGEgY29tZSBnZW5pdG9yZSB1bmFcbiAqIDxzZWN0aW9uPiBjb24gaWwgZGF0YS1hdHRyaWJ1dGUgYGRhdGEtZnVuY3Rpb25hbC10eXBlPVwiUmVjb21tZW5kYXRpb25cImAuXG4gKiBVdGlsaXp6YSBpbCBtZXRvZG8gYGNsb3Nlc3QoKWAgcGVyIHJpc2FsaXJlIG5lbGxhIGdlcmFyY2hpYSBET00gZmlubyBhIHRyb3ZhcmVcbiAqIGxhIHByaW1hIDxzZWN0aW9uPiBjaGUgc29kZGlzZmEgaWwgY3JpdGVyaW8uIFNlIHRyb3ZhdGEsIHJlc3RpdHVpc2NlIGwnZWxlbWVudG9cbiAqIDxzZWN0aW9uPiwgYWx0cmltZW50aSByZXN0aXR1aXNjZSBgbnVsbGAuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gc2xpZGVyIC0gTCdlbGVtZW50byBET00gZGVsIHRpcG8gc2xpZGVyIGRhIGN1aSBpbml6aWFyZSBsYSByaWNlcmNhLlxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0gLSBMYSBzZXppb25lIGdlbml0b3JlIGNvbiBsJ2F0dHJpYnV0byBzcGVjaWZpY2F0bywgb3BwdXJlIG51bGwgc2Ugbm9uIHRyb3ZhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lmU2VjdGlvblJlY2NvbWVuZGF0aW9uKHNsaWRlcikge1xuICAgIHJldHVybiBzbGlkZXIuY2xvc2VzdCgnc2VjdGlvbltkYXRhLWZ1bmN0aW9uYWwtdHlwZT1cIlJlY29tbWVuZGF0aW9uXCJdJyk7XG59XG4iLCJpbXBvcnQgQm93c2VyIGZyb20gXCJib3dzZXJcIjtcbmltcG9ydCBTdG9yYWdlU2VydmljZSBmcm9tIFwiLi9zdG9yYWdlLXNlcnZpY2VcIjtcbmltcG9ydCB7IFNUT1JBR0VfS0VZUywgfSBmcm9tIFwiLi91dGlscy9kZWZpbml0aW9uc1wiOyAvL0B0cy1pZ25vcmVcbmltcG9ydCB7IGdldElkZW50aWZpZXJTZXJ2aWNlIH0gZnJvbSBcIlJhaXBsYXkvYXNzZXRzLXNyYy9qcy91dGlsaXRpZXMvdXRpbHNcIjsgLy9AdHMtaWdub3JlXG5pbXBvcnQgeyBTb3VuZFBsYXllckV2ZW50cyB9IGZyb20gXCIuLi8uLi8uLi8uLi93ZWJjb21wb25lbnRzL3NyYy91dGlscy9wbGF5ZXItZXZlbnRzXCI7XG5pbXBvcnQgeyBpc0NhciwgUmFpLFxuLy9AdHMtaWdub3JlXG4gfSBmcm9tIFwiUmFpcGxheS9hc3NldHMtc3JjL2pzL3dlYmNvbXBvbmVudHMvc3JjL3V0aWxzL3V0aWxzXCI7XG4vL0B0cy1pZ25vcmVcbmltcG9ydCB7IFNTT0V2ZW50IH0gZnJvbSBcIkNvbW1vbi9hc3NldHMtc3JjLXRzL2NvbW1vbi9saWJzL3Nzby13aWRnZXQvc3JjL3NoYXJlZC9ldmVudHNcIjtcbmxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuY29uc3QgSE9TVCA9IFwiL2F0b21hdGljXCI7XG5jb25zdCBTRVNTSU9OX0NPT0tJRSA9IFwicmFpUHJlZGljdGlvblNlc3Npb25Db29raWVcIjtcbmNvbnN0IFRSQUNLX0NPT0tJRSA9IFwicmFpUHJlZGljdGlvblRyYWNrQ29va2llXCI7XG5jb25zdCBQRU5ESU5HX1RSQUNLX1NUQVRFID0gXCJwZW5kaW5nVHJhY2tTdGF0ZVwiO1xuY29uc3QgU1RPUkFHRV9TRVJWSUNFID0gU3RvcmFnZVNlcnZpY2UuZ2V0U2VydmljZSgpO1xuZXhwb3J0IGNsYXNzIFJhaVByZWRpY3Rpb24ge1xuICAgIC8qKiBHRVRURVIvU0VUVEVSICovXG4gICAgZ2V0IHVzZXJDb250ZXh0KCkge1xuICAgICAgICBpZiAoaXNDYXIoKSlcbiAgICAgICAgICAgIHJldHVybiBcImF1dG9cIjtcbiAgICAgICAgY29uc3QgYnJvd3NlciA9IEJvd3Nlci5nZXRQYXJzZXIod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgICBsZXQgY29udGV4dDtcbiAgICAgICAgc3dpdGNoIChicm93c2VyLmdldFBsYXRmb3JtVHlwZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwibW9iaWxlXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFibGV0XCI6XG4gICAgICAgICAgICAgICAgY29udGV4dCA9IFwibW9iaWxlXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidHZcIjpcbiAgICAgICAgICAgICAgICBjb250ZXh0ID0gXCJ0dlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb250ZXh0ID0gXCJwY1wiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICBnZXQgdHJhY2tVcmwoKSB7XG4gICAgICAgIHJldHVybiBgJHtIT1NUfS9zb3VuZC1wcmVkaWN0aW9uLXNlcnZpY2UvcHJvdGVjdGVkL3RyYWNrYDtcbiAgICB9XG4gICAgZ2V0IHNpZGViYXJCYXNlVXJsKCkge1xuICAgICAgICByZXR1cm4gYCR7SE9TVH0vcHJlZGljdGlvbi1zZXJ2aWNlL3NpZGViYXJgO1xuICAgIH1cbiAgICBnZXQgc2lkZWJhckZhbGxiYWNrVXJsKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5zaWRlYmFyQmFzZVVybH0vcmVsYXRlZGZiYDtcbiAgICB9XG4gICAgZ2V0IHByb2dyYW1SZWxhdGVkRmFsbGJhY2soKSB7XG4gICAgICAgI
1HJldHVybiBgJHt0aGlzLnNpZGViYXJCYXNlVXJsfS9wcm9ncmFtL3JlbGF0ZWRmYmA7XG4gICAgfVxuICAgIGdldCBzaWRlYmFyUmVjb21tZW5kZWRVcmwoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnNpZGViYXJCYXNlVXJsfS9yZWxhdGVkYDtcbiAgICB9XG4gICAgZ2V0IHByZWRpY3RIcE1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93LnByZWRpY3RIcFR5cGUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gd2luZG93LnByZWRpY3RIcFR5cGVcbiAgICAgICAgICAgIDogXCJob21lcGFnZVwiO1xuICAgIH1cbiAgICBnZXQgcmVjb21tZW5kZWRIUFVybCgpIHtcbiAgICAgICAgcmV0dXJuIGAke0hPU1R9L3NvdW5kLXByZWRpY3Rpb24tc2VydmljZWA7XG4gICAgfVxuICAgIGdldCByZWNvbW1lbmRlZEhlcm9VcmwoKSB7XG4gICAgICAgIHJldHVybiBgJHtIT1NUfS9zb3VuZC1wcmVkaWN0aW9uLXNlcnZpY2UvcGFnZS9zZWN0aW9uL2hlcm9gO1xuICAgIH1cbiAgICBnZXQgcmVjb21tZW5kZWRUaXBvbG9naWFVcmwoKSB7XG4gICAgICAgIHJldHVybiBgJHtIT1NUfS9zb3VuZC1wcmVkaWN0aW9uLXNlcnZpY2UvcGFnZS9zZWN0aW9uL2hlcm8vdHlwb2xvZ3kvPG5vbWV0aXBvbG9naWE+YDtcbiAgICB9XG4gICAgZ2V0IHJlY29tbWVuZGVkQWx0ZXJuYXJpdmVIZXJvVXJsKCkge1xuICAgICAgICByZXR1cm4gYCR7SE9TVH0vc291bmQtcHJlZGljdGlvbi1zZXJ2aWNlL3BhZ2Uvc2VjdGlvbi9oZXJvL2N1c3RvbWA7XG4gICAgfVxuICAgIGdldCByZWNvbW1lbmRlZEhQTGF6eVVybCgpIHtcbiAgICAgICAgcmV0dXJuIGAvcHJlZGljdC9wYWdlLyR7dGhpcy5wcmVkaWN0SHBNb2RlfS9sYXp5YDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZXhpdFRyYWNrU2VudEZvckN1cnJlbnRTdGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3Ryb3kgPSB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pbml0TGlzdGVuZXJIYW5kbGVycyA9IHRoaXMuaW5pdExpc3RlbmVySGFuZGxlcnMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pbml0UHJlZGljdGlvblRyYWNraW5nKCk7XG4gICAgfVxuICAgIGFzeW5jIGNoZWNrVXNlcigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBSYWkucmFpc3NvID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgUmFpLnJhaXNzby5jaGVja0FzeW5jTG9naW4oKTtcbiAgICB9XG4gICAgY2hlY2tUcmFja0lkKCkge1xuICAgICAgICB2Y
1XIgdHJhY2tPYmogPSBTVE9SQUdFX1NFUlZJQ0UuZ2V0U3RvcmFnZShUUkFDS19DT09LSUUpO1xuICAgICAgICBpZiAodHJhY2tPYmogPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudHJhY2tJZCA9IHRyYWNrT2JqLnRyYWNrSWQ7XG4gICAgICAgIFNUT1JBR0VfU0VSVklDRS5kZWxldGVTdG9yYWdlKFRSQUNLX0NPT0tJRSk7XG4gICAgfVxuICAgIGluaXQoKSB7XG4gICAgICAgIGlmIChpbml0aWFsaXplZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tVc2VyKCkpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoU1NPRXZlbnQuTE9HT1VUX0lOSVQsIHRoaXMuaW5pdExpc3RlbmVySGFuZGxlcnMsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tUcmFja0lkKCk7XG4gICAgICAgICAgICB0aGlzLnBlcmNlbnRhZ2VBY3RpdmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTU09FdmVudC5MT0dPVVRfSU5JVCwgdGhpcy5kZXN0cm95LCB7XG4gICAgICAgICAgICBvbmNlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5pdExpc3RlbmVySGFuZGxlcnMoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tUcmFja0lkKCk7XG4gICAgICAgIHRoaXMucGVyY2VudGFnZUFjdGl2YXRpb24oKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTU09FdmVudC5MT0dPVVRfSU5JVCwgdGhpcy5pbml0TGlzdGVuZXJIYW5kbGVycyk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU1NPRXZlbnQuTE9HT1VUX0lOSVQsIHRoaXMuZGVzdHJveSk7XG4gICAgICAgIFNUT1JBR0VfU0VSVklDRS5kZWxldGVTdG9yYWdlKFRSQUNLX0NPT0tJRSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFNpZGViYXJSZWxhdGVkRmFsbGJhY2soY29udGVudElkLCBwYXRoSUQpIHtcbiAgICAgICAgLy9zZXJ2aXppbyBlbGFzdGljXG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudElkICE9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBtYW5kYXRvcnkgb2FyYW1ldGVyc1wiKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtSWQ6IGNvbnRlbnRJZCxcbiAgICAgICAgICAgIHBhdGhJRCxcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCh0aGlzLnNpZGViYXJGYWxsYmFja1VybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcC5vaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwLnN0YXR1c1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRQcm9ncmFtUmVsYXRlZEZhbGxiYWNrKGNvbnRlbnRJZCwgcGF0aElEKSB7XG4gICAgICAgIC8vc2Vydml6aW8gZWxhc3RpY1xuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnRJZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlcnNcIik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5wcm9ncmFtUmVsYXRlZEZhbGxiYWNrfS8ke2NvbnRlbnRJZH1gLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgICAgcGF0aElELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3Auc3RhdHVzVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldEhlcm9SZWNvbW1lbmRlZChzb3VyY2VJbmZvcm1hdGlvbikge1xuICAgICAgICAvKiBHRVQgVVJMICovXG4gICAgICAgIGxldCB1cmwgPSBzb3VyY2VJbmZvcm1hdGlvbi5tb2RlID09PSBcInRpcG9sb2dpYVwiXG4gICAgICAgICAgICA/IHRoaXMucmVjb21tZW5kZWRUaXBvbG9naWFVcmwucmVwbGFjZShcIjxub21ldGlwb2xvZ2lhPlwiLCBzb3VyY2VJbmZvcm1hdGlvbi5uYW1lKVxuICAgICAgICAgICAgOiB0aGlzLnJlY29tbWVuZGVkSGVyb1VybDtcbiAgICAgICAgY29uc3QgY2hlY2tMb2dpbiA9IGF3YWl0IHRoaXMuY2hlY2tVc2VyKCk7XG4gICAgICAgIGlmIChjaGVja0xvZ2luKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9maWxlID0gUmFpLnByb2ZpbGVNYW5hZ2VyLmdldFVzZXJQcm9maWxlKCk7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyU2VydmljZSA9IGF3YWl0IGdldElkZW50aWZpZXJTZXJ2aWNlKCk7XG4gICAgICAgICAgICBjb25zdCBoZXJvU2Vzc2lvbklkID0gKGF3YWl0IGlkZW50aWZpZXJTZXJ2aWNlLmdldFNpZCgpKS5zX2lkO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbWl6YXRpb246IHByb2ZpbGUucGVyc29uYWxpenphemlvbmUsXG4gICAgICAgICAgICAgICAgICAgIGdlbmRlcjogcHJvZmlsZS5nZW5kZXIsXG4gICAgICAgICAgICAgICAgICAgIGFnZTogcHJvZmlsZS5hZ2UsXG4gICAgICAgICAgICAgICAgICAgI
1HVhOiBwcm9maWxlLnVhLFxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGhlcm9TZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMudXNlckNvbnRleHQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gUmFpLnJhaXNzby5jYWxsQXV0aFNlcnZpY2UoYCR7dXJsfS91c2VyYCwgXCJnZXRcIiwgdW5kZWZpbmVkLCBoZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IEZFVENIX1RJTUVPVVQgPSAzMDAwO1xuICAgICAgICAgICAgbGV0IGRpZFRpbWVvdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkaWRUaW1lb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlJlcXVlc3QgdGltZWQgb3V0XCIpKTtcbiAgICAgICAgICAgICAgICB9LCBGRVRDSF9USU1FT1VUKTtcbiAgICAgICAgICAgICAgICBmZXRjaChgJHt1cmx9L2RlZmF1bHRgKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpZFRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgcmVqZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGF0YVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZ2V0QWx0ZXJuYXRpdmVIZXJvUmVjb21tZW5kZWQoaGVyb19wYXRoX2lkKSB7XG4gICAgICAgIGlmICghaGVyb19wYXRoX2lkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVybyBwYXRoX2lkIG5vbiBzcGVjaWZpY2F0YVwiKTtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5yZWNvbW1lbmRlZEFsdGVybmFyaXZlSGVyb1VybDtcbiAgICAgICAgY29uc3QgRkVUQ0hfVElNRU9VVCA9IDMwMDA7XG4gICAgICAgIGxldCBkaWRUaW1lb3V0ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGlkVGltZW91dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlJlcXVlc3QgdGltZWQgb3V0XCIpKTtcbiAgICAgICAgICAgIH0sIEZFVENIX1RJTUVPVVQpO1xuICAgICAgICAgICAgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGlmICghZGlkVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpZFRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSByZWplY3RlZFxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkYXRhXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZ2V0QWx0ZXJuYXRpdmVIZXJvUmVjb21tZW5kZWRCeVVSTChoZXJvX3BhdGhfaWQpIHtcbiAgICAgICAgaWYgKCFoZXJvX3BhdGhfaWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIZXJvIHBhdGhfaWQgbm9uIHNwZWNpZmljYXRhXCIpO1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLnJlY29tbWVuZGVkQWx0ZXJuYXJpdmVIZXJvVXJsO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgdXJsOiBoZXJvX3BhdGhfaWQsXG4gICAgICAgI
1H07XG4gICAgICAgIGNvbnN0IEZFVENIX1RJTUVPVVQgPSAzMDAwO1xuICAgICAgICBsZXQgZGlkVGltZW91dCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBwID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRpZFRpbWVvdXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJSZXF1ZXN0IHRpbWVkIG91dFwiKSk7XG4gICAgICAgICAgICB9LCBGRVRDSF9USU1FT1VUKTtcbiAgICAgICAgICAgIGZldGNoKHVybCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGlkVGltZW91dClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IHJlamVjdGVkXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHA7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGFcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTaWRlYmFyUmVsYXRlZFJlY29tbWVuZGVkKGNvbnRlbnRJZCwgcGF0aElELCBmb3JtYSkge1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tVc2VyKCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2VyIG5vdCBsb2dnZWQgaW5cIik7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudElkICE9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyc1wiKTtcbiAgICAgICAgaWYgKCF0aGlzLnBlcmNBY3RpdmF0aW9uKSB7XG4gICAgICAgICAgICAvL2ZhbGxiYWNrXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTaWRlYmFyUmVsYXRlZEZhbGxiYWNrKGNvbnRlbnRJZCwgcGF0aElEKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSBSYWkucHJvZmlsZU1hbmFnZXIuZ2V0VXNlclByb2ZpbGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJWT0QvVUMyLVJlbGF0ZWRcIixcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbUlkOiBjb250ZW50SWQsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwcm9maWxlLnVhLFxuICAgICAgICAgICAgICAgIGFnZTogcHJvZmlsZS5hZ2UgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzaGFwZTogZm9ybWEsXG4gICAgICAgICAgICAgICAgZ2VuZGVyOiBwcm9maWxlLmdlbmRlciA/IHByb2ZpbGUuZ2VuZGVyLnRvVXBwZXJDYXNlKCkgOiBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBSYWkucmFpc3NvLmNhbGxBdXRoU2VydmljZShgJHt0aGlzLnNpZGViYXJSZWNvbW1lbmRlZFVybH1gLCBcInBvc3RcIiwgcGF5bG9hZCwge1xuICAgICAgICAgICAgICAgIHBhcmFtczogeyB1YTogcHJvZmlsZS51YSB9LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgXCJ4LW5hbWVcIjogcHJvZmlsZS5maXJzdE5hbWUgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldFJlY29tbWVuZGVkTGF6eUZvckhvbWVwYWdlKG51bVNlY3Rpb24pIHtcbiAgICAgICAgbnVtU2VjdGlvbiA9IE51bWJlcihudW1TZWN0aW9uKTtcbiAgICAgICAgaWYgKGlzTmFOKG51bVNlY3Rpb24pKSB7XG4gICAgICAgICAgICBudW1TZWN0aW9uID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVXNlcigpKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZXIgaXMgbm90IGxvZ2dlZCBpblwiKTtcbiAgICAgICAgY29uc3QgdXNlciA9IFJhaS5wcm9maWxlTWFuYWdlci5nZXRVc2VyUHJvZmlsZSgpO1xuICAgICAgICBpZiAoIXVzZXIgfHwgIXVzZXIucGVyc29uYWxpenphemlvbmUpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgICAgY29uc3QgZmlyc3ROYW1lID0gdXNlci5maXJzdE5hbWUgfHwgXCJcIjtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IFNUT1JBR0VfU0VSVklDRS5nZXRTdG9yYWdlKFNFU1NJT05fQ09PS0lFKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHVhOiB1c2VyLnVhLFxuICAgICAgICAgICAgc2Vzc2lvbklkOiAoc2Vzc2lvbiAmJiBzZXNzaW9uLnNlc3Npb25JZCkgfHwgXCJcIixcbiAgICAgICAgICAgIG51bVNlY3Rpb246IG51bVNlY3Rpb24sXG4gICAgICAgI
1H07XG4gICAgICAgIHJldHVybiBSYWkucmFpc3NvLmNhbGxBdXRoU2VydmljZSh0aGlzLnJlY29tbWVuZGVkSFBMYXp5VXJsLCBcImdldFwiLCBwYXlsb2FkLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7IFwieC1uYW1lXCI6IGZpcnN0TmFtZSwgXCJDYWNoZS1Db250cm9sXCI6IFwibWF4LWFnZT02MFwiIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZXRvZG8gcHJpdmF0byBwZXIgZ2VzdGlyZSBsYSBsb2dpY2EgY29tdW5lIGRlbGxlIGNoaWFtYXRlIGFsIHNlcnZpemlvIGRpIHByZWRpemlvbmVcbiAgICAgKi9cbiAgICBhc3luYyBfY2FsbFByZWRpY3Rpb25TZXJ2aWNlKGVuZHBvaW50LCBwYXlsb2FkLCBoZWFkZXJzID0ge30sIHBhcmFtcyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVja1VzZXIoKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZXIgaXMgbm90IGxvZ2dlZCBpblwiKTtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllclNlcnZpY2UgPSBhd2FpdCBnZXRJZGVudGlmaWVyU2VydmljZSgpO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSAoYXdhaXQgaWRlbnRpZmllclNlcnZpY2UuZ2V0U2lkKCkpLnNfaWQ7XG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSBSYWkucHJvZmlsZU1hbmFnZXIuZ2V0VXNlclByb2ZpbGUoKTtcbiAgICAgICAgLy8gUGF5bG9hZCBjb211bmUgcGVyIHR1dHRlIGxlIGNoaWFtYXRlXG4gICAgICAgIGNvbnN0IGNvbW1vblBheWxvYWQgPSB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMudXNlckNvbnRleHQsXG4gICAgICAgICAgICAuLi5wYXlsb2FkLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaXJzdE5hbWUgPSBwcm9maWxlLmZpcnN0TmFtZSB8fCBcIlwiO1xuICAgICAgICBjb25zdCBkZWZhdWx0SGVhZGVycyA9IHtcbiAgICAgICAgICAgIFwieC1uYW1lXCI6IGZpcnN0TmFtZSxcbiAgICAgICAgICAgIC4uLmhlYWRlcnMsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQYXJhbXMgPSB7XG4gICAgICAgICAgICB1YTogcHJvZmlsZS51YSxcbiAgICAgICAgICAgIHYyOiAxLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwcmVkaWN0VXJsU2VydmljZSA9IGAke3RoaXMucmVjb21tZW5kZWRIUFVybH0ke2VuZHBvaW50fWA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFJhaS5yYWlzc28uY2FsbEF1dGhTZXJ2aWNlKHByZWRpY3RVcmxTZXJ2aWNlLCBcInBvc3RcIiwgY29tbW9uUGF5bG9hZCwge1xuICAgICAgICAgICAgICAgIHBhcmFtczogZGVmYXVsdFBhcmFtcyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBkZWZhdWx0SGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gcHJlZGljdGlvbiBzZXJ2aWNlIGNhbGwgdG8gJHtlbmRwb2ludH06YCwgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdDxhbnk+fSBkYXRhXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEudXNlY2FzZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLnR5cGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YS5mYWxsYmFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLmNvbnRlbnRJdGVtSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YS5zZWN0aW9uVW5pcXVlTmFtZVxuICAgICAqL1xuICAgIGFzeW5jIGdldFJlY29tbWVuZGVkUGFnZShkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhID09IG51bGwgfHwgIWRhdGEudXNlQ2FzZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlcnNcIik7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICBzZWN0aW9uOiBkYXRhLnVzZUNhc2UsXG4gICAgICAgICAgICBlbmdpbmU6IGRhdGEuZW5naW5lLFxuICAgICAgICAgICAgY29udGVudEl0ZW1JZDogZGF0YS5jb250ZW50SXRlbUlkLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgZmFsbGJhY2s6IGRhdGEuZmFsbGJhY2tVcmwsXG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2NhbGxQcmVkaWN0aW9uU2VydmljZShcIi9hcGkvcGFnZVwiLCBwYXlsb2FkLCBoZWFkZXJzKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBnZXRSZWNvbW1lbmRlZFBhZ2U6XCIsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE90dGllbmUgdW5hIHNlemlvbmUgc3BlY2lmaWNhIHBlciByZWNvbW1lbmRhdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWN0aW9uSWQgLSBJRCBkZWxsYSBzZXppb25lIGRhIGNhcmljYXJlXG4gICAgICogQHBhcmFtIHtPYmplY3Q8YW55Pn0gZGF0YSAtIERhdGkgcGVyIGxhIHNlemlvbmUgKHN0ZXNzbyBmb3JtYXRvIGRpIGdldFJlY29tbWVuZGVkUGFnZSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YS51c2VjYXNlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEuY29udGVudEl0ZW1JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhLmZhbGxiYWNrXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmVjb21tZW5kZWRTZWN0aW9uKHNlY3Rpb25JZCwgZGF0YSkge1xuICAgICAgICBpZiAoIXNlY3Rpb25JZCB8fCB0eXBlb2Ygc2VjdGlvbklkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXI6IHNlY3Rpb25JZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8ICFkYXRhLnVzZUNhc2UpIHtcbiAgICAgICAgICAgI
1HRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlcnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHNlY3Rpb246IGRhdGEudXNlQ2FzZSxcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtSWQ6IGRhdGEuY29udGVudEl0ZW1JZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgIGZhbGxiYWNrOiBkYXRhLmZhbGxiYWNrVXJsLFxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9jYWxsUHJlZGljdGlvblNlcnZpY2UoYC9hcGkvc2VjdGlvbi8ke3NlY3Rpb25JZH1gLCBwYXlsb2FkLCBoZWFkZXJzKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBnZXRSZWNvbW1lbmRlZFNlY3Rpb246XCIsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldFJlY29tbWVuZGVkU2VjdGlvbkZvckhvbWVwYWdlKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEgPT09IG51bGwgfHwgIWRhdGEudXJsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyc1wiKTtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrVXNlcigpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlciBpcyBub3QgbG9nZ2VkIGluXCIpO1xuICAgICAgICBjb25zdCBwcm9maWxlID0gUmFpLnByb2ZpbGVNYW5hZ2VyLmdldFVzZXJQcm9maWxlKCk7XG4gICAgICAgIGNvbnN0IGZpcnN0TmFtZSA9IHByb2ZpbGUuZmlyc3ROYW1lIHx8IFwiXCI7XG4gICAgICAgIHJldHVybiBSYWkucmFpc3NvLmNhbGxBdXRoU2VydmljZShkYXRhLnVybCwgXCJnZXRcIiwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBwYXJhbXM6IHsgdHlwZURhdGE6IGRhdGEudHlwZSB9LFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIGZhbGxiYWNrOiBkYXRhLmZhbGxiYWNrLFxuICAgICAgICAgICAgICAgIFwieC1uYW1lXCI6IGZpcnN0TmFtZSxcbiAgICAgICAgICAgICAgICBcIkNhY2hlLUNvbnRyb2xcIjogXCJtYXgtYWdlPTYwXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0VHJhY2tJZChpZCkge1xuICAgICAgICBpZiAoIWlkIHx8IHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlclwiKTtcbiAgICAgICAgdGhpcy50cmFja0lkID0gaWQ7XG4gICAgICAgIFNUT1JBR0VfU0VSVklDRS5zZXRTdG9yYWdlKFRSQUNLX0NPT0tJRSwgeyB0cmFja0lkOiBpZCB9KTtcbiAgICB9XG4gICAgcGVyY2VudGFnZUFjdGl2YXRpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wZXJjQWN0aXZhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVyY0FjdGl2YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzeW5jIHRyYWNrVXNlckFjdGlvbihjb250ZW50SWQsIHByb2dyYW1JZCwgdHlwZSwgYWN0aW9uLCBhY3Rpb25UeXBlLCBmb3JtYSA9IFwiXCIsIHZGYWN0b3IgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVXNlcigpKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZXIgaXMgbm90IGxvZ2dlZCBpblwiKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZSA9IFJhaS5wcm9maWxlTWFuYWdlci5nZXRVc2VyUHJvZmlsZSgpO1xuICAgICAgICBpZiAoIXByb2ZpbGUucGVyc29uYWxpenphemlvbmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgcHJlZGljdCB0cmFja2luZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnRJZCAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBhY3Rpb24gIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBhY3Rpb25UeXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXJzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZW50SWQubGVuZ3RoIDwgMSB8fFxuICAgICAgICAgICAgdHlwZS5sZW5ndGggPCAxIHx8XG4gICAgICAgICAgICBhY3Rpb24ubGVuZ3RoIDwgMSB8fFxuICAgICAgICAgICAgYWN0aW9uVHlwZS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXJzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdkZhY3RvciAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdkZhY3RvciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZm9ybWEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGZvcm1hID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyQWdlbnQgPSAod2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgXCJcIjtcbiAgICAgICAgY29uc3QgZG9tYWluID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUuaW5kZXhPZihcInNvdW5kXCIpID4gLTFcbiAgICAgICAgICAgID8gXCJyYWlwbGF5c291bmRcIlxuICAgICAgICAgICAgOiBcInJhaXBsYXlcIjtcbiAgICAgICAgY29uc3QgY2xpY2tlZFJlY29tbWVuZGVkQ2FyZHMgPSBTVE9SQUdFX1NFUlZJQ0UuZ2V0U3RvcmFnZShTVE9SQUdFX0tFWVMuUkVDT01NRU5EQVRJT05fQ0FSRF9DTElDS1MsIHRydWUpIHx8IFtdO1xuICAgICAgICBjb25zdCByZWNvbW1lbmRlZFNlY3Rpb25zID0gU1RPUkFHRV9TRVJWSUNFLmdldFN0b3JhZ2UoU1RPUkFHRV9LRVlTLlJFQ09NTUVOREFUSU9OX1NFQ1RJT05TLCB0cnVlKTtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllclNlcnZpY2UgPSBhd2FpdCBnZXRJZGVudGlmaWVyU2VydmljZSgpO1xuICAgICAgICBjb25zdCBzZXNzaW9uSWRGcm9tUHJvZmlsZSA9IChhd2FpdCBpZGVudGlmaWVyU2VydmljZS5nZXRTaWQoKSkuc19pZDtcbiAgICAgICAgbGV0IHRyYWNrSWQgPSBudWxsO1xuICAgICAgICAvLyBDZXJjYSBsYSBjYXJkIGNsaWNjYXRhIHVzYW5kbyBwcm9ncmFtSWQgbyBjb250ZW50SWRcbiAgICAgICAgY29uc3QgY2xpY2tlZENhcmQgPSBjbGlja2VkUmVjb21tZW5kZWRDYXJkcy5maW5kKChjYXJkKSA9PiBjYXJkLmlkID09PSBwcm9ncmFtSWQgfHwgY2FyZC5pZCA9PT0gY29udGVudElkKTtcbiAgICAgICAgaWYgKGNsaWNrZWRDYXJkICYmIHJlY29tbWVuZGVkU2VjdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25VbmlxdWVOYW1lID0gY2xpY2tlZENhcmQuc2VjdGlvblVuaXF1ZU5hbWU7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSWQgPSBjbGlja2VkQ2FyZC5zZWN0aW9uSWQ7XG4gICAgICAgICAgICAvLyBOYXZpZ2EgbmVsbGEgbnVvdmEgc3RydXR0dXJhOiB1bmlxdWVuYW1lIC0+IHNlY3Rpb25zIC0+IHNlY3Rpb25JZCAtPiBkYXRhXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVOYW1lRGF0YSA9IHJlY29tbWVuZGVkU2VjdGlvbnNbc2VjdGlvblVuaXF1ZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHVuaXF1ZU
15hbWVEYXRhPy5zZWN0aW9ucz8uW3NlY3Rpb25JZF0/LmRhdGE/LmNhcmRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdDYXJkID0gdW5pcXVlTmFtZURhdGEuc2VjdGlvbnNbc2VjdGlvbklkXS5kYXRhLmNhcmRzLmZpbmQoKGNhcmQpID0+IGNhcmQuSUQgPT09IHByb2dyYW1JZCB8fFxuICAgICAgICAgICAgICAgICAgICBjYXJkLklEID09PSBjb250ZW50SWQgfHxcbiAgICAgICAgICAgICAgICAgICAgY2FyZC51bmlxdWVuYW1lID09PSBwcm9ncmFtSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgY2FyZC51bmlxdWVuYW1lID09PSBjb250ZW50SWQpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ0NhcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCA9IG1hdGNoaW5nQ2FyZC50cmFja0lkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICAgIGNsaWVudDogXCJicm93c2VyXCIsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogdXNlckFnZW50LFxuICAgICAgICAgICAgICAgIG5ldHdvcms6IDAsXG4gICAgICAgICAgICAgICAgaWQ6IHByb2ZpbGUudWlkLFxuICAgICAgICAgICAgICAgIHVhOiBwcm9maWxlLnVhLFxuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkRnJvbVByb2ZpbGUsXG4gICAgICAgICAgICAgICAgdHJhY2tJZDogdHJhY2tJZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgZG9tYWluLFxuICAgICAgICAgICAgICAgIHZlcmI6IGFjdGlvbixcbiAgICAgICAgICAgICAgICB0eXBlOiBhY3Rpb25UeXBlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IGNvbnRlbnRJZCxcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIHNoYXBlOiBmb3JtYSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwcm9ncmFtSWQpXG4gICAgICAgICAgICBwYXlsb2FkLmNvbnRlbnQucGFyZW50SWQgPSBwcm9ncmFtSWQ7XG4gICAgICAgIGlmICh2RmFjdG9yICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgcGF5bG9hZC5hY3Rpb24udmlzaW9uX2ZhY3RvciA9IHZGYWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJhaS5yYWlzc28uY2FsbEF1dGhTZXJ2aWNlKHRoaXMudHJhY2tVcmwsIFwicG9zdFwiLCBwYXlsb2FkKTtcbiAgICB9XG4gICAgX2JpbmRQbGF5ZXJFdmVudHMoKSB7XG4gICAgICAgIGxldCBwbGF5ZXJFdmVudFRyYWNrTGlzdCA9IFtcbiAgICAgICAgICAgIFNvdW5kUGxheWVyRXZlbnRzLkZJUlNUUExBWV9DVVNUT00sXG4gICAgICAgICAgICBTb3VuZFBsYXllckV2ZW50cy5USU1FVVBEQVRFX0NVU1RPTSxcbiAgICAgICAgICAgIFNvdW5kUGxheWVyRXZlbnRzLkVOREVEX0NVU1RPTSxcbiAgICAgICAgXTtcbiAgICAgICAgcGxheWVyRXZlbnRUcmFja0xpc3QuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhY2tQbGF5ZXJBY3Rpb25zKGUuZGV0YWlsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2F2ZVBlbmRpbmdTdGF0ZSA9ICh2aXNpb25GYWN0b3IpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY3VycmVudFRyYWNraW5nU3RhdGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVUb1NhdmUgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fY3VycmVudFRyYWNraW5nU3RhdGUsXG4gICAgICAgICAgICAgICAgdmlzaW9uRmFjdG9yLFxuICAgICAgICAgICAgICAgIHRyYWNrSWQ6IHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlLnRyYWNrSWQgfHwgXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBTVE9SQUdFX1NFUlZJQ0Uuc2V0U3RvcmFnZShQRU5ESU5HX1RSQUNLX1NUQVRFLCBzdGF0ZVRvU2F2ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZVBhZ2VFeGl0ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQ/LnR5cGUgPT09IFwicGFnZWhpZGVcIiAmJiBldmVudC5wZXJzaXN0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlLmlzQ29tcGxldGVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuX2V4aXRUcmFja1NlbnRGb3JDdXJyZW50U3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9leGl0VHJhY2tTZW50Rm9yQ3VycmVudFN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB2aXNpb25GYWN0b3IgPSBNYXRoLmZsb29yKCh0aGlzLl9jdXJyZW50VHJhY2tpbmdTdGF0ZS5jdXJyZW50VGltZSAvXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlLmR1cmF0aW9uKSAqXG4gICAgICAgICAgICAgICAgICAgIDEwMCkgLyAxMDA7XG4gICAgICAgICAgICAgICAgc2F2ZVBlbmRpbmdTdGF0ZSh2aXNpb25GYWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBoYW5kbGVQYWdlRXhpdCk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgaGFuZGxlUGFnZUV4aXQpO1xuICAgICAgICAvLyBTYWZhcmkgZmFsbGJhY2s6IHN1IGFsY3VuZSBuYXZpZ2F6aW9uaSBgcGFnZWhpZGVgIHB1b2Agbm9uIGVzc2VyZSBhZmZpZGFiaWxlLlxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInVubG9hZFwiLCBoYW5kbGVQYWdlRXhpdCk7XG4gICAgfVxuICAgIF90cmFja1BsYXllckFjdGlvbnMobG1lKSB7XG4gICAgICAgIGlmIChsbWU/LmlzX2xpdmUpIHtcbiAgICAgICAgICAgI
1HJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGVudElkID0gXCJcIjtcbiAgICAgICAgbGV0IHByb2dyYW1JZCA9IFwiXCI7XG4gICAgICAgIGxldCB0aXBvbG9naWEgPSBcIlwiO1xuICAgICAgICBsZXQgZm9ybWEgPSBsbWU/LmZvcm0gfHwgXCJcIjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnRlbnRJZCA9IGxtZS5tZWRpYUluZm8/LmlkIHx8IGxtZS5tZWRpYUluZm8/LnRyYWNrSW5mby5pZDtcbiAgICAgICAgICAgIHByb2dyYW1JZCA9XG4gICAgICAgICAgICAgICAgbG1lLnBhcmVudEluZm8/LmNvbnRleHRVbmlxdWVuYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgIGxtZS5tZWRpYUluZm8/LnByb2dyYW1faW5mbz8uaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgbG1lLm1lZGlhSW5mbz8ucHJvZ3JhbV9pbmZvPy51bmlxdWVuYW1lO1xuICAgICAgICAgICAgdGlwb2xvZ2lhID1cbiAgICAgICAgICAgICAgICBsbWUubWVkaWFJbmZvPy50eXBvbG9neSB8fFxuICAgICAgICAgICAgICAgICAgICBsbWUubWVkaWFJbmZvPy5wcm9ncmFtX2luZm8/LnR5cG9sb2d5IHx8XG4gICAgICAgICAgICAgICAgICAgIGxtZS5tZWRpYUluZm8/LnRyYWNrSW5mbz8udHlwb2xvZ3k7XG4gICAgICAgICAgICB0aXBvbG9naWEgPSB0aXBvbG9naWEudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiX3RyYWNrUGxheWVyQWN0aW9uc1wiICsgZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxtZS5ldmVudERhdGEgJiYgbG1lLmV2ZW50RGF0YS5tZWRpYVR5cGUgPT0gXCJjb250ZW50XCIpIHtcbiAgICAgICAgICAgIHN3aXRjaCAobG1lLmV2ZW50RGF0YS5ldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFNvdW5kUGxheWVyRXZlbnRzLkZJUlNUUExBWV9DVVNUT006XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGlwb2xvZ2lhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGltZTogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBsbWUuZXZlbnREYXRhLm1lZGlhRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNUcmFja2VkSGFsZlZpc2lvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V4aXRUcmFja1NlbnRGb3JDdXJyZW50U3RhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaW9uRmFjdG9yID0gTWF0aC5mbG9vcigodGhpcy5fY3VycmVudFRyYWNraW5nU3RhdGUuY3VycmVudFRpbWUgL1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRyYWNraW5nU3RhdGUuZHVyYXRpb24pICpcbiAgICAgICAgICAgICAgICAgICAgICAgIDEwMCkgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhY2tVc2VyQWN0aW9uKGNvbnRlbnRJZCwgcHJvZ3JhbUlkLCB0aXBvbG9naWEsIFwicGxheVwiLCBcImV4ZWN1dGVcIiwgZm9ybWEsIHZpc2lvbkZhY3RvcikuY2F0Y2goY29uc29sZS53YXJuKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBTb3VuZFBsYXllckV2ZW50cy5USU1FVVBEQVRFX0NVU1RPTTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VHJhY2tpbmdTdGF0ZS5jdXJyZW50VGltZSA9IGxtZS5ldmVudERhdGEuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGR1cmF0aW9uLCBjdXJyZW50VGltZSwgaGFzVHJhY2tlZEhhbGZWaXNpb24gfSA9IHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNUcmFja2VkSGFsZlZpc2lvbiAmJiBkdXJhdGlvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpb25GYWN0b3IgPSBNYXRoLmZsb29yKChjdXJyZW50VGltZSAvIGR1cmF0aW9uKSAqIDEwMCkgLyAxMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpc2lvbkZhY3RvciA+PSAwLjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFja1VzZXJBY3Rpb24oY29udGVudElkLCBwcm9ncmFtSWQsIHRpcG9sb2dpYSwgXCJwbGF5XCIsIFwiZXhlY3V0ZVwiLCBmb3JtYSwgMC41KS5jYXRjaChjb25zb2xlLndhcm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VHJhY2tpbmdTdGF0ZS5oYXNUcmFja2VkSGFsZlZpc2lvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgU291bmRQbGF5ZXJFdmVudHMuRU5ERURfQ1VTVE9NOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRyYWNraW5nU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlLmlzQ29tcGxldGVkID0gdHJ1ZTsgLy8gTWFyY2EgY29tZSBjb21wbGV0YXRvXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpb25GYWN0b3IgPSAxOyAvLyBTZSDDqCBlbmRlZCwgYWJiaWFtbyB2aXN0byBpbCAxMDAlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlID0gUmFpLnByb2ZpbGVNYW5hZ2VyLmdldFVzZXJQcm9maWxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VyQWdlbnQgPSAod2luZG93Lm5hdmlnYXRvciAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lLmluZGV4T2YoXCJzb3VuZFwiKSA+IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcInJhaXBsYXlzb3
1VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInJhaXBsYXlcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBTVE9SQUdFX1NFUlZJQ0UuZ2V0U3RvcmFnZShTRVNTSU9OX0NPT0tJRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50OiBcImJyb3dzZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdXNlckFnZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcHJvZmlsZS51aWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVhOiBwcm9maWxlLnVhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IChzZXNzaW9uICYmIHNlc3Npb24uc2Vzc2lvbklkKSB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYjogXCJwbGF5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXhlY3V0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpb25fZmFjdG9yOiB2aXNpb25GYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogY29udGVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZDogcHJvZ3JhbUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aXBvbG9naWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlOiBmb3JtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLnNlbmRCZWFjb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHBheWxvYWQpXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50ID0gbmF2aWdhdG9yLnNlbmRCZWFjb24odGhpcy50cmFja1VybCwgYmxvYik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZVRvU2F2ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcG9sb2dpYSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lOiB0aGlzLl9jdXJyZW50VHJhY2tpbmdTdGF0ZS5jdXJyZW50VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVHJhY2tlZEhhbGZWaXNpb246IHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlLmhhc1RyYWNrZWRIYWxmVmlzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpb25GYWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQ6IHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlLnRyYWNrSWQgfHwgXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JBR0VfU0VSVklDRS5zZXRTdG9yYWdlKFBFTkRJTkdfVFJBQ0tfU1RBVEUsIHN0YXRlVG9TYXZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAvKiBjYXNlIFNvdW5kUGxheWVyRXZlbnRzLkNMT1NFRDpcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRyYWNraW5nU3RhdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlLmlzQ29tcGxldGVkXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZpY2EgY2hlIGN1cnJlbnRUaW1lIGUgbWVkaWFEdXJhdGlvbiBzaWFubyB2YWxpZGkgcHJpbWEgZGkgY2FsY29sYXJlIGlsIHZpc2lvbkZhY3RvclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VGltZSA9IGxtZS5ldmVudERhdGEuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhRHVyYXRpb24gPSBsbWUuZXZlbnREYXRhLm1lZGlhRHVyYXRpb247XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRHVyYXRpb24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRHVyYXRpb24gPiAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpc2lvbkZhY3RvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKChjdXJyZW50VGltZSAvIG1lZGlhRHVyYXRpb24pICogMTAwKSAvIDEwMDtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNrVXNlckFjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbn
1RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW1JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpcG9sb2dpYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGxheVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJleGVjdXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2lvbkZhY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICApLmNhdGNoKGNvbnNvbGUud2Fybik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIHBlciBkZWJ1Zzogbm9uIGludmlhbW8gaWwgdHJhY2NpYW1lbnRvIHNlIGkgZGF0aSBub24gc29ubyB2YWxpZGlcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlJhaVByZWRpY3Q6IFNraXBwaW5nIHRyYWNraW5nIGZvciBDTE9TRUQgZXZlbnQgLSBpbnZhbGlkIGN1cnJlbnRUaW1lIG9yIG1lZGlhRHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUcmFja2luZ1N0YXRlLmlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRyYWNraW5nU3RhdGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7ICovXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgaW5pdFByZWRpY3Rpb25UcmFja2luZygpIHtcbiAgICAgICAgY29uc3QgaXNMb2dnZWRJbiA9IGF3YWl0IFJhaS5yYWlzc28uY2hlY2tBc3luY0xvZ2luKCk7XG4gICAgICAgIGlmICghaXNMb2dnZWRJbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJVdGVudGUgbm9uIGxvZ2dhdG8uIFJlY29tbWVuZGF0aW9uIGRpc2FiaWxpdGF0b1wiKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUmFpLnByb2ZpbGVNYW5hZ2VyLmdldFVzZXJQcm9maWxlKCkgJiZcbiAgICAgICAgICAgICFSYWkucHJvZmlsZU1hbmFnZXIuZ2V0VXNlclByb2ZpbGUoKS5wZXJzb25hbGl6emF6aW9uZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJQZXJzb25hbGl6emF6aW9uZSBuZWdhdGEuIFByZWRpY3QgdHJhY2tpbmcgZGlzYWJpbGl0YXRvXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbnN1bWEgZSBpbnZpYSBpbCB0cmFja2luZyBwZW5kZW50ZSB1bmEgc29sYSB2b2x0YSAoYXQtbW9zdC1vbmNlKS5cbiAgICAgICAgY29uc3QgcGVuZGluZ1N0YXRlID0gU1RPUkFHRV9TRVJWSUNFLmdldFN0b3JhZ2UoUEVORElOR19UUkFDS19TVEFURSk7XG4gICAgICAgIGlmIChwZW5kaW5nU3RhdGUpIHtcbiAgICAgICAgICAgIC8vIERlbGV0ZS1iZWZvcmUtc2VuZDogZXZpdGEgZG9wcGkgaW52aWkgc3UgcmUtaW5pdCBvIHJlbG9hZC5cbiAgICAgICAgICAgIFNUT1JBR0VfU0VSVklDRS5kZWxldGVTdG9yYWdlKFBFTkRJTkdfVFJBQ0tfU1RBVEUpO1xuICAgICAgICAgICAgdGhpcy50cmFja1VzZXJBY3Rpb24ocGVuZGluZ1N0YXRlLmNvbnRlbnRJZCwgcGVuZGluZ1N0YXRlLnByb2dyYW1JZCwgcGVuZGluZ1N0YXRlLnRpcG9sb2dpYSwgXCJwbGF5XCIsIFwiZXhlY3V0ZVwiLCBwZW5kaW5nU3RhdGUuZm9ybWEsIHBlbmRpbmdTdGF0ZS52aXNpb25GYWN0b3IpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlJhaVByZWRpY3Q6IHBlbmRpbmcgdHJhY2sgc2VuZCBmYWlsZWRcIiwgZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYmluZFBsYXllckV2ZW50cygpO1xuICAgIH1cbn1cbiIsIi8vIGltcG9ydCAnd2hhdHdnLWZldGNoJztcbmltcG9ydCB7IHNldFJhaUdsb2JhbFByb3BlcnR5IH0gZnJvbSBcIi4uLy4uLy4uL2V4dGVuc2lvbnMvdXRpbHNcIjtcbmltcG9ydCB7IFJhaVByZWRpY3Rpb24gfSBmcm9tIFwiLi9wcmVkaWN0aW9uXCI7XG5jb25zdCBwcmVkaWN0ID0gbmV3IFJhaVByZWRpY3Rpb24oKTtcbnNldFJhaUdsb2JhbFByb3BlcnR5KFwiUmFpUHJlZGljdFwiLCBwcmVkaWN0KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///807\n\n}')}},__webpack_module_cache__={};function __webpack_require__(c){var n=__webpack_module_cache__[c];if(void 0!==n)return n.exports;var t=__webpack_module_cache__[c]={exports:{}};return __webpack_modules__[c].call(t.exports,t,t.exports,__webpack_require__),t.exports}__webpack_require__.n=function(c){var n=c&&c.__esModule?function(){return c.default}:function(){return c};return __webpack_require__.d(n,{a:n}),n},__webpack_require__.d=function(c,n){for(var t in n)__webpack_require__.o(n,t)&&!__webpack_require__.o(c,t)&&Object.defineProperty(c,t,{enumerable:!0,get:n[t]})},__webpack_require__.o=function(c,n){return Object.prototype.hasOwnProperty.call(c,n)};var __webpack_exports__=__webpack_require__(807)})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.