@untemps/react-vocal 2.0.0-beta.1 → 2.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","names":["e"],"sources":["../node_modules/@untemps/vocal/dist/index.es.js","../node_modules/@untemps/utils/dist/function/isFunction.js","../src/hooks/useVocal.js","../src/hooks/useTimeout.js","../node_modules/fuse.js/dist/fuse.mjs","../src/hooks/useCommands.js","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/components/Icon.jsx","../src/components/Vocal.jsx","../src/index.js"],"sourcesContent":["var t=function(t,e,r){return t(r={path:e,exports:{},require:function(t,e){return function(){throw new Error(\"Dynamic requires are not currently supported by @rollup/plugin-commonjs\")}(null==e&&r.path)}},r.exports),r.exports}((function(t){var e=function(t){var e=Object.prototype,r=e.hasOwnProperty,n=\"function\"==typeof Symbol?Symbol:{},o=n.iterator||\"@@iterator\",i=n.asyncIterator||\"@@asyncIterator\",a=n.toStringTag||\"@@toStringTag\";function c(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},\"\")}catch(t){c=function(t,e,r){return t[e]=r}}function u(t,e,r,n){var o=e&&e.prototype instanceof f?e:f,i=Object.create(o.prototype),a=new _(n||[]);return i._invoke=function(t,e,r){var n=\"suspendedStart\";return function(o,i){if(\"executing\"===n)throw new Error(\"Generator is already running\");if(\"completed\"===n){if(\"throw\"===o)throw i;return S()}for(r.method=o,r.arg=i;;){var a=r.delegate;if(a){var c=b(a,r);if(c){if(c===l)continue;return c}}if(\"next\"===r.method)r.sent=r._sent=r.arg;else if(\"throw\"===r.method){if(\"suspendedStart\"===n)throw n=\"completed\",r.arg;r.dispatchException(r.arg)}else\"return\"===r.method&&r.abrupt(\"return\",r.arg);n=\"executing\";var u=s(t,e,r);if(\"normal\"===u.type){if(n=r.done?\"completed\":\"suspendedYield\",u.arg===l)continue;return{value:u.arg,done:r.done}}\"throw\"===u.type&&(n=\"completed\",r.method=\"throw\",r.arg=u.arg)}}}(t,r,a),i}function s(t,e,r){try{return{type:\"normal\",arg:t.call(e,r)}}catch(t){return{type:\"throw\",arg:t}}}t.wrap=u;var l={};function f(){}function h(){}function p(){}var v={};v[o]=function(){return this};var y=Object.getPrototypeOf,d=y&&y(y(x([])));d&&d!==e&&r.call(d,o)&&(v=d);var m=p.prototype=f.prototype=Object.create(v);function g(t){[\"next\",\"throw\",\"return\"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){var n;this._invoke=function(o,i){function a(){return new e((function(n,a){!function n(o,i,a,c){var u=s(t[o],t,i);if(\"throw\"!==u.type){var l=u.arg,f=l.value;return f&&\"object\"==typeof f&&r.call(f,\"__await\")?e.resolve(f.__await).then((function(t){n(\"next\",t,a,c)}),(function(t){n(\"throw\",t,a,c)})):e.resolve(f).then((function(t){l.value=t,a(l)}),(function(t){return n(\"throw\",t,a,c)}))}c(u.arg)}(o,i,n,a)}))}return n=n?n.then(a,a):a()}}function b(t,e){var r=t.iterator[e.method];if(void 0===r){if(e.delegate=null,\"throw\"===e.method){if(t.iterator.return&&(e.method=\"return\",e.arg=void 0,b(t,e),\"throw\"===e.method))return l;e.method=\"throw\",e.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return l}var n=s(r,t.iterator,e.arg);if(\"throw\"===n.type)return e.method=\"throw\",e.arg=n.arg,e.delegate=null,l;var o=n.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,\"return\"!==e.method&&(e.method=\"next\",e.arg=void 0),e.delegate=null,l):o:(e.method=\"throw\",e.arg=new TypeError(\"iterator result is not an object\"),e.delegate=null,l)}function E(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type=\"normal\",delete e.arg,t.completion=e}function _(t){this.tryEntries=[{tryLoc:\"root\"}],t.forEach(E,this),this.reset(!0)}function x(t){if(t){var e=t[o];if(e)return e.call(t);if(\"function\"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function e(){for(;++n<t.length;)if(r.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return i.next=i}}return{next:S}}function S(){return{value:void 0,done:!0}}return h.prototype=m.constructor=p,p.constructor=h,h.displayName=c(p,a,\"GeneratorFunction\"),t.isGeneratorFunction=function(t){var e=\"function\"==typeof t&&t.constructor;return!!e&&(e===h||\"GeneratorFunction\"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,p):(t.__proto__=p,c(t,a,\"GeneratorFunction\")),t.prototype=Object.create(m),t},t.awrap=function(t){return{__await:t}},g(w.prototype),w.prototype[i]=function(){return this},t.AsyncIterator=w,t.async=function(e,r,n,o,i){void 0===i&&(i=Promise);var a=new w(u(e,r,n,o),i);return t.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},g(m),c(m,a,\"Generator\"),m[o]=function(){return this},m.toString=function(){return\"[object Generator]\"},t.keys=function(t){var e=[];for(var r in t)e.push(r);return e.reverse(),function r(){for(;e.length;){var n=e.pop();if(n in t)return r.value=n,r.done=!1,r}return r.done=!0,r}},t.values=x,_.prototype={constructor:_,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=void 0,this.tryEntries.forEach(O),!t)for(var e in this)\"t\"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(r,n){return a.type=\"throw\",a.arg=t,e.next=r,n&&(e.method=\"next\",e.arg=void 0),!!n}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],a=i.completion;if(\"root\"===i.tryLoc)return n(\"end\");if(i.tryLoc<=this.prev){var c=r.call(i,\"catchLoc\"),u=r.call(i,\"finallyLoc\");if(c&&u){if(this.prev<i.catchLoc)return n(i.catchLoc,!0);if(this.prev<i.finallyLoc)return n(i.finallyLoc)}else if(c){if(this.prev<i.catchLoc)return n(i.catchLoc,!0)}else{if(!u)throw new Error(\"try statement without catch or finally\");if(this.prev<i.finallyLoc)return n(i.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,\"finallyLoc\")&&this.prev<o.finallyLoc){var i=o;break}}i&&(\"break\"===t||\"continue\"===t)&&i.tryLoc<=e&&e<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=e,i?(this.method=\"next\",this.next=i.finallyLoc,l):this.complete(a)},complete:function(t,e){if(\"throw\"===t.type)throw t.arg;return\"break\"===t.type||\"continue\"===t.type?this.next=t.arg:\"return\"===t.type?(this.rval=this.arg=t.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===t.type&&e&&(this.next=e),l},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),O(r),l}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if(\"throw\"===n.type){var o=n.arg;O(r)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(t,e,r){return this.delegate={iterator:x(t),resultName:e,nextLoc:r},\"next\"===this.method&&(this.arg=void 0),l}},t}(t.exports);try{regeneratorRuntime=e}catch(t){Function(\"r\",\"regeneratorRuntime = r\")(e)}}));function e(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}var r=function(t){return function(){var r=this,n=arguments;return new Promise((function(o,i){var a=t.apply(r,n);function c(t){e(a,o,i,c,u,\"next\",t)}function u(t){e(a,o,i,c,u,\"throw\",t)}c(void 0)}))}};var n=function(t){if(Array.isArray(t))return t};var o=function(t,e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,o=!1,i=void 0;try{for(var a,c=t[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==c.return||c.return()}finally{if(o)throw i}}return r}};var i=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n};var a=function(t,e){if(t){if(\"string\"==typeof t)return i(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return\"Object\"===r&&t.constructor&&(r=t.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(t):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,e):void 0}};var c=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")};var u=function(t,e){return n(t)||o(t,e)||a(t,e)||c()};var s=function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")};function l(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var f=function(t,e,r){return e&&l(t.prototype,e),r&&l(t,r),t};var h=function(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t},p=function(){return!!navigator.permissions},v=function(){return!!navigator.mediaDevices};function y(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}function d(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){y(i,n,o,a,c,\"next\",t)}function c(t){y(i,n,o,a,c,\"throw\",t)}a(void 0)}))}}function m(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,o=!1,i=void 0;try{for(var a,c=t[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==c.return||c.return()}finally{if(o)throw i}}return r}}(t,e)||function(t,e){if(t){if(\"string\"==typeof t)return g(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return\"Object\"===r&&t.constructor&&(r=t.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(t):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?g(t,e):void 0}}(t,e)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function g(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}var w=function(){var t=d(regeneratorRuntime.mark((function t(e){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt(\"return\",new Promise(function(){var t=d(regeneratorRuntime.mark((function t(r,n){var o,i;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p()||n(new DOMException(\"Navigator API: permissions not supported\",\"NOT_SUPPORTED_ERR\")),t.prev=1,t.next=4,navigator.permissions.query({name:e});case 4:o=t.sent,i=function t(e){o.removeEventListener(\"change\",t),b(e.target.state,r,n)},o.addEventListener(\"change\",i),b(o.state,r,n),t.next=13;break;case 10:t.prev=10,t.t0=t.catch(1),n(t.t0);case 13:case\"end\":return t.stop()}}),t,null,[[1,10]])})));return function(e,r){return t.apply(this,arguments)}}()));case 1:case\"end\":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),b=function(t,e,r){switch(t){case\"denied\":r(new DOMException(\"Permission denied\",\"NOT_ALLOWED_ERR\"));break;default:e(t)}},E=function(){var t=d(regeneratorRuntime.mark((function t(e,r){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt(\"return\",new Promise(function(){var t=d(regeneratorRuntime.mark((function t(n,o){var i,a,c;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p()&&v()||o(new DOMException(\"Navigator API: permissions or Navigator API: mediaDevices not supported\",\"NOT_SUPPORTED_ERR\")),t.prev=1,t.t0=Promise,t.next=5,w(e);case 5:return t.t1=t.sent,t.next=8,navigator.mediaDevices.getUserMedia(r);case 8:return t.t2=t.sent,t.t3=[t.t1,t.t2],t.next=12,t.t0.all.call(t.t0,t.t3);case 12:i=t.sent,a=m(i,2),c=a[1],n(c),t.next=21;break;case 18:t.prev=18,t.t4=t.catch(1),o(t.t4);case 21:case\"end\":return t.stop()}}),t,null,[[1,18]])})));return function(e,r){return t.apply(this,arguments)}}()));case 1:case\"end\":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}();function O(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function _(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?O(Object(r),!0).forEach((function(e){h(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):O(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}var x=function(){function e(t){var r=this;s(this,e),h(this,\"_instance\",null),h(this,\"_listeners\",null);var n=e._resolveSpeechRecognition();if(!n)throw new DOMException(\"SpeechRecognition not supported\",\"NOT_SUPPORTED_ERR\");this._instance=new n,this._listeners={},Object.entries(_(_({},e.defaultOptions),t||{})).forEach((function(t){var n=u(t,2),o=n[0],i=n[1];if(\"grammars\"===o&&!i){var a=e._resolveSpeechGrammarList();a&&(i=new a)}r._instance[o]=i}))}var n;return f(e,null,[{key:\"isSupported\",get:function(){return!!e._resolveSpeechRecognition()&&!!p()&&!!v()},set:function(t){throw new Error(\"You cannot set isSupported directly.\")}}]),f(e,[{key:\"start\",value:(n=r(t.mark((function e(){var r;return t.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!this._instance){t.next=14;break}return t.prev=1,t.next=4,E(\"microphone\",{audio:!0});case 4:if(t.sent){t.next=7;break}throw new Error(\"Unable to retrieve the stream from media device\");case 7:this._instance.start(),t.next=14;break;case 10:t.prev=10,t.t0=t.catch(1),(r=this._listeners.error)&&r(t.t0);case 14:return t.abrupt(\"return\",this);case 15:case\"end\":return t.stop()}}),e,this,[[1,10]])}))),function(){return n.apply(this,arguments)})},{key:\"stop\",value:function(){return this._instance&&this._instance.stop(),this}},{key:\"abort\",value:function(){return this._instance&&this._instance.abort(),this}},{key:\"addEventListener\",value:function(t,r){var n=this;if(this._instance&&this._includesEventType(t)){this._listeners[t]&&this.removeEventListener(t);var o=function(o){var i=[];t===e.eventTypes.RESULT&&o.results&&o.results.length>0&&i.push(o.results[0][0].transcript),r&&r.apply(n,[o].concat(i))};this._instance.addEventListener(t,o),this._listeners[t]=o}return this}},{key:\"removeEventListener\",value:function(t){var e=this._listeners[t];return this._instance.removeEventListener(t,e),delete this._listeners[t],this}},{key:\"cleanup\",value:function(){var t=this;return this.stop(),Object.keys(this._listeners).forEach((function(e){return t.removeEventListener(e)})),this._instance=null,this}},{key:\"_includesEventType\",value:function(t){return!!Object.values(e.eventTypes).find((function(e){return e===t}))}},{key:\"instance\",get:function(){return this._instance},set:function(t){throw new Error(\"You cannot set instance directly.\")}}],[{key:\"_resolveSpeechRecognition\",value:function(){return window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.msSpeechRecognition}},{key:\"_resolveSpeechGrammarList\",value:function(){return window.SpeechGrammarList||window.webkitSpeechGrammarList||window.mozSpeechGrammarList||window.msSpeechGrammarList}}]),e}();h(x,\"defaultOptions\",{grammars:null,lang:\"en-US\",continuous:!1,interimResults:!1,maxAlternatives:1,serviceURI:null}),h(x,\"eventTypes\",{AUDIO_END:\"audioend\",AUDIO_START:\"audiostart\",END:\"end\",ERROR:\"error\",NO_MATCH:\"nomatch\",RESULT:\"result\",SOUND_END:\"soundend\",SOUND_START:\"soundstart\",SPEECH_END:\"speechend\",SPEECH_START:\"speechstart\",START:\"start\"});export{x as Vocal};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQHVudGVtcHMvdXNlci1wZXJtaXNzaW9ucy11dGlscy9kaXN0L2luZGV4LmVzLmpzIiwiLi4vc3JjL1ZvY2FsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGluZm8uZG9uZSkge1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICB9XG5cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3I7IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlczsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0OyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheTsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdDsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXRcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0XCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5OyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5OyIsInZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuISFuYXZpZ2F0b3IucGVybWlzc2lvbnN9LHI9ZnVuY3Rpb24oKXtyZXR1cm4hIW5hdmlnYXRvci5tZWRpYURldmljZXN9O2Z1bmN0aW9uIHQoZSxyLHQsbixhLGksbyl7dHJ5e3ZhciB1PWVbaV0obyksYz11LnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIHQoZSl9dS5kb25lP3IoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4obixhKX1mdW5jdGlvbiBuKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihhLGkpe3ZhciBvPWUuYXBwbHkocixuKTtmdW5jdGlvbiB1KGUpe3QobyxhLGksdSxjLFwibmV4dFwiLGUpfWZ1bmN0aW9uIGMoZSl7dChvLGEsaSx1LGMsXCJ0aHJvd1wiLGUpfXUodm9pZCAwKX0pKX19ZnVuY3Rpb24gYShlLHIpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfShlKXx8ZnVuY3Rpb24oZSxyKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKXJldHVybjt2YXIgdD1bXSxuPSEwLGE9ITEsaT12b2lkIDA7dHJ5e2Zvcih2YXIgbyx1PWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEobj0obz11Lm5leHQoKSkuZG9uZSkmJih0LnB1c2goby52YWx1ZSksIXJ8fHQubGVuZ3RoIT09cik7bj0hMCk7fWNhdGNoKGUpe2E9ITAsaT1lfWZpbmFsbHl7dHJ5e258fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYoYSl0aHJvdyBpfX1yZXR1cm4gdH0oZSxyKXx8ZnVuY3Rpb24oZSxyKXtpZighZSlyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpcmV0dXJuIGkoZSxyKTt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PXQmJmUuY29uc3RydWN0b3ImJih0PWUuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PXR8fFwiU2V0XCI9PT10KXJldHVybiBBcnJheS5mcm9tKGUpO2lmKFwiQXJndW1lbnRzXCI9PT10fHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSlyZXR1cm4gaShlLHIpfShlLHIpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gaShlLHIpeyhudWxsPT1yfHxyPmUubGVuZ3RoKSYmKHI9ZS5sZW5ndGgpO2Zvcih2YXIgdD0wLG49bmV3IEFycmF5KHIpO3Q8cjt0Kyspblt0XT1lW3RdO3JldHVybiBufXZhciBvPWZ1bmN0aW9uKCl7dmFyIHI9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gcih0KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIHI9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gcihuLGEpe3ZhciBpLG87cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gZSgpfHxhKG5ldyBET01FeGNlcHRpb24oXCJOYXZpZ2F0b3IgQVBJOiBwZXJtaXNzaW9ucyBub3Qgc3VwcG9ydGVkXCIsXCJOT1RfU1VQUE9SVEVEX0VSUlwiKSksci5wcmV2PTEsci5uZXh0PTQsbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtuYW1lOnR9KTtjYXNlIDQ6aT1yLnNlbnQsbz1mdW5jdGlvbiBlKHIpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLGUpLHUoci50YXJnZXQuc3RhdGUsbixhKX0saS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsbyksdShpLnN0YXRlLG4sYSksci5uZXh0PTEzO2JyZWFrO2Nhc2UgMTA6ci5wcmV2PTEwLHIudDA9ci5jYXRjaCgxKSxhKHIudDApO2Nhc2UgMTM6Y2FzZVwiZW5kXCI6cmV0dXJuIHIuc3RvcCgpfX0pLHIsbnVsbCxbWzEsMTBdXSl9KSkpO3JldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDE6Y2FzZVwiZW5kXCI6cmV0dXJuIHIuc3RvcCgpfX0pLHIpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSx1PWZ1bmN0aW9uKGUscix0KXtzd2l0Y2goZSl7Y2FzZVwiZGVuaWVkXCI6dChuZXcgRE9NRXhjZXB0aW9uKFwiUGVybWlzc2lvbiBkZW5pZWRcIixcIk5PVF9BTExPV0VEX0VSUlwiKSk7YnJlYWs7ZGVmYXVsdDpyKGUpfX0sYz1mdW5jdGlvbigpe3ZhciB0PW4ocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIHQoaSx1KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0LmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIHQ9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gdChuLGMpe3ZhciBzLGYscDtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiBlKCkmJnIoKXx8YyhuZXcgRE9NRXhjZXB0aW9uKFwiTmF2aWdhdG9yIEFQSTogcGVybWlzc2lvbnMgb3IgTmF2aWdhdG9yIEFQSTogbWVkaWFEZXZpY2VzIG5vdCBzdXBwb3J0ZWRcIixcIk5PVF9TVVBQT1JURURfRVJSXCIpKSx0LnByZXY9MSx0LnQwPVByb21pc2UsdC5uZXh0PTUsbyhpKTtjYXNlIDU6cmV0dXJuIHQudDE9dC5zZW50LHQubmV4dD04LG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHUpO2Nhc2UgODpyZXR1cm4gdC50Mj10LnNlbnQsdC50Mz1bdC50MSx0LnQyXSx0Lm5leHQ9MTIsdC50MC5hbGwuY2FsbCh0LnQwLHQudDMpO2Nhc2UgMTI6cz10LnNlbnQsZj1hKHMsMikscD1mWzFdLG4ocCksdC5uZXh0PTIxO2JyZWFrO2Nhc2UgMTg6dC5wcmV2PTE4LHQudDQ9dC5jYXRjaCgxKSxjKHQudDQpO2Nhc2UgMjE6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsbnVsbCxbWzEsMThdXSl9KSkpO3JldHVybiBmdW5jdGlvbihlLHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDE6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpO2V4cG9ydHtvIGFzIGdldFBlcm1pc3Npb24sYyBhcyBnZXRVc2VyTWVkaWFTdHJlYW0sciBhcyBpc05hdmlnYXRvck1lZGlhRGV2aWNlc1N1cHBvcnRlZCxlIGFzIGlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lhVzVrWlhndVpYTXVhbk1pTENKemIzVnlZMlZ6SWpwYklpNHVMM055WXk5cGMwNWhkbWxuWVhSdmNsQmxjbTFwYzNOcGIyNXpVM1Z3Y0c5eWRHVmtMbXB6SWl3aUxpNHZjM0pqTDJselRtRjJhV2RoZEc5eVRXVmthV0ZFWlhacFkyVnpVM1Z3Y0c5eWRHVmtMbXB6SWl3aUxpNHZjM0pqTDJkbGRGQmxjbTFwYzNOcGIyNHVhbk1pTENJdUxpOXpjbU12WjJWMFZYTmxjazFsWkdsaFUzUnlaV0Z0TG1weklsMHNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dRMmhsWTJzZ2QyaGxkR2hsY2lCT1lYWnBaMkYwYjNJZ1FWQkpPaUJ3WlhKdGFYTnphVzl1Y3lCcGN5QnpkWEJ3YjNKMFpXUWdZbmtnZEdobElHTjFjbkpsYm5RZ1luSnZkM05sY2x4dUlDb2dRSEpsZEhWeWJuTWdlMkp2YjJ4bFlXNTlYRzRnS2k5Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUNncElEMCtJQ0VoYm1GMmFXZGhkRzl5TG5CbGNtMXBjM05wYjI1elhHNGlMQ0l2S2lwY2JpQXFJRU5vWldOcklIZG9aWFJvWlhJZ1RtRjJhV2RoZEc5eUlFRlFTVG9nYldWa2FXRkVaWFpwWTJWeklHbHpJSE4xY0hCdmNuUmxaQ0JpZVNCMGFHVWdZM1Z5Y21WdWRDQmljbTkzYzJWeVhHNGdLaUJBY21WMGRYSnVjeUI3WW05dmJHVmhibjFjYmlBcUwxeHVaWGh3YjNKMElHUmxabUYxYkhRZ0tDa2dQVDRnSVNGdVlYWnBaMkYwYjNJdWJXVmthV0ZFWlhacFkyVnpYRzRpTENKcGJYQnZjblFnYVhOT1lYWnBaMkYwYjNKUVpYSnRhWE56YVc5dWMxTjFjSEJ2Y25SbFpDQm1jbTl0SUNjdUwybHpUbUYyYVdkaGRHOXlVR1Z5YldsemMybHZibk5UZFhCd2IzSjBaV1FuWEc1Y2JpOHFLbHh1SUNvZ1VtVjBkWEp1Y3lCaElIQnliMjFwYzJVZ2NtVnpiMngyWldRZ2QyaGxiaUIwYUdVZ2NHVnliV2x6YzJsdmJpQnBjeUJuY21GdWRHVmtJR0o1SUhSb1pTQjFjMlZ5WEc0Z0tpQkFjR0Z5WVcwZ2NHVnliV2x6YzJsdmJrNWhiV1VnSUNBZ0lDQWdJQ0FnSUNCT1lXMWxJRzltSUhSb1pTQndaWEp0YVhOemFXOXVMaUJBYzJWbElHaDBkSEJ6T2k4dmR6TmpMbWRwZEdoMVlpNXBieTl3WlhKdGFYTnphVzl1Y3k4alpXNTFiV1JsWmkxd1pYSnRhWE56YVc5dWJtRnRaVnh1SUNvZ1FISmxkSFZ5Ym5NZ2UxQnliMjFwYzJWOVhHNGdLaTljYm1WNGNHOXlkQ0JrWldaaGRXeDBJR0Z6ZVc1aklDaHdaWEp0YVhOemFXOXVUbUZ0WlNrZ1BUNGdlMXh1WEhSeVpYUjFjbTRnYm1WM0lGQnliMjFwYzJVb1lYTjVibU1nS0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnUFQ0Z2UxeHVYSFJjZEdsbUlDZ2hhWE5PWVhacFoyRjBiM0pRWlhKdGFYTnphVzl1YzFOMWNIQnZjblJsWkNncEtTQjdYRzVjZEZ4MFhIUnlaV3BsWTNRb2JtVjNJRVJQVFVWNFkyVndkR2x2YmlnblRtRjJhV2RoZEc5eUlFRlFTVG9nY0dWeWJXbHpjMmx2Ym5NZ2JtOTBJSE4xY0hCdmNuUmxaQ2NzSUNkT1QxUmZVMVZRVUU5U1ZFVkVYMFZTVWljcEtWeHVYSFJjZEgxY2JseHVYSFJjZEhSeWVTQjdYRzVjZEZ4MFhIUmpiMjV6ZENCd1pYSnRhWE56YVc5dVUzUmhkSFZ6SUQwZ1lYZGhhWFFnYm1GMmFXZGhkRzl5TG5CbGNtMXBjM05wYjI1ekxuRjFaWEo1S0hzZ2JtRnRaVG9nY0dWeWJXbHpjMmx2Yms1aGJXVWdmU2xjYmx4MFhIUmNkR052Ym5OMElHOXVRMmhoYm1kbElEMGdLR1YyWlc1MEtTQTlQaUI3WEc1Y2RGeDBYSFJjZEhCbGNtMXBjM05wYjI1VGRHRjBkWE11Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lnblkyaGhibWRsSnl3Z2IyNURhR0Z1WjJVcFhHNWNkRngwWEhSY2RISmxjMjlzZG1WUGNsSmxhbVZqZEVKaGMyVmtUMjVUZEdGMFpTaGxkbVZ1ZEM1MFlYSm5aWFF1YzNSaGRHVXNJSEpsYzI5c2RtVXNJSEpsYW1WamRDbGNibHgwWEhSY2RIMWNibHgwWEhSY2RIQmxjbTFwYzNOcGIyNVRkR0YwZFhNdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnblkyaGhibWRsSnl3Z2IyNURhR0Z1WjJVcFhHNWNkRngwWEhSeVpYTnZiSFpsVDNKU1pXcGxZM1JDWVhObFpFOXVVM1JoZEdVb2NHVnliV2x6YzJsdmJsTjBZWFIxY3k1emRHRjBaU3dnY21WemIyeDJaU3dnY21WcVpXTjBLVnh1WEhSY2RIMGdZMkYwWTJnZ0tHVnljbTl5S1NCN1hHNWNkRngwWEhSeVpXcGxZM1FvWlhKeWIzSXBYRzVjZEZ4MGZWeHVYSFI5S1Z4dWZWeHVYRzVqYjI1emRDQnlaWE52YkhabFQzSlNaV3BsWTNSQ1lYTmxaRTl1VTNSaGRHVWdQU0FvYzNSaGRHVXNJSEpsYzI5c2RtVXNJSEpsYW1WamRDa2dQVDRnZTF4dVhIUnpkMmwwWTJnZ0tITjBZWFJsS1NCN1hHNWNkRngwWTJGelpTQW5aR1Z1YVdWa0p6cGNibHgwWEhSY2RISmxhbVZqZENodVpYY2dSRTlOUlhoalpYQjBhVzl1S0NkUVpYSnRhWE56YVc5dUlHUmxibWxsWkNjc0lDZE9UMVJmUVV4TVQxZEZSRjlGVWxJbktTbGNibHgwWEhSY2RHSnlaV0ZyWEc1Y2RGeDBaR1ZtWVhWc2REcGNibHgwWEhSY2RISmxjMjlzZG1Vb2MzUmhkR1VwWEc1Y2RIMWNibjFjYmlJc0ltbHRjRzl5ZENCcGMwNWhkbWxuWVhSdmNsQmxjbTFwYzNOcGIyNXpVM1Z3Y0c5eWRHVmtJR1p5YjIwZ0p5NHZhWE5PWVhacFoyRjBiM0pRWlhKdGFYTnphVzl1YzFOMWNIQnZjblJsWkNkY2JtbHRjRzl5ZENCcGMwNWhkbWxuWVhSdmNrMWxaR2xoUkdWMmFXTmxjMU4xY0hCdmNuUmxaQ0JtY205dElDY3VMMmx6VG1GMmFXZGhkRzl5VFdWa2FXRkVaWFpwWTJWelUzVndjRzl5ZEdWa0oxeHVhVzF3YjNKMElHZGxkRkJsY20xcGMzTnBiMjRnWm5KdmJTQW5MaTluWlhSUVpYSnRhWE56YVc5dUoxeHVYRzR2S2lwY2JpQXFJRkpsZEhWeWJuTWdZU0J3Y205dGFYTmxJSEpsYzI5c2RtVmtJSGRvWlc0Z2RHaGxJSEJsY20xcGMzTnBiMjRnYVhNZ1ozSmhiblJsWkNCaWVTQjBhR1VnZFhObGNpQmhibVFnZEdobElITjBjbVZoYlNCcGN5QnlaWFJ5YVdWMlpXUmNiaUFxSUVCd1lYSmhiU0J3WlhKdGFYTnphVzl1VG1GdFpTQWdJQ0FnSUNBZ0lDQWdJRTVoYldVZ2IyWWdkR2hsSUhCbGNtMXBjM05wYjI0dUlFQnpaV1VnYUhSMGNITTZMeTkzTTJNdVoybDBhSFZpTG1sdkwzQmxjbTFwYzNOcGIyNXpMeU5sYm5WdFpHVm1MWEJsY20xcGMzTnBiMjV1WVcxbFhHNGdLaUJBY0dGeVlXMGdiV1ZrYVdGVGRISmxZVzFEYjI1emRISmhhVzUwY3lBZ0lDQkRiMjV6ZEhKaGFXNTBjeUJ2WW1wbFkzUXVJRUJ6WldVZ2FIUjBjSE02THk5a1pYWmxiRzl3WlhJdWJXOTZhV3hzWVM1dmNtY3ZaVzR0VlZNdlpHOWpjeTlYWldJdlFWQkpMMDFsWkdsaFUzUnlaV0Z0UTI5dWMzUnlZV2x1ZEhOY2JpQXFJRUJ5WlhSMWNtNXpJSHRRY205dGFYTmxmVnh1SUNvdlhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCaGMzbHVZeUFvY0dWeWJXbHpjMmx2Yms1aGJXVXNJRzFsWkdsaFUzUnlaV0Z0UTI5dWMzUnlZV2x1ZEhNcElEMCtJSHRjYmx4MGNtVjBkWEp1SUc1bGR5QlFjbTl0YVhObEtHRnplVzVqSUNoeVpYTnZiSFpsTENCeVpXcGxZM1FwSUQwK0lIdGNibHgwWEhScFppQW9JV2x6VG1GMmFXZGhkRzl5VUdWeWJXbHpjMmx2Ym5OVGRYQndiM0owWldRb0tTQjhmQ0FoYVhOT1lYWnBaMkYwYjNKTlpXUnBZVVJsZG1salpYTlRkWEJ3YjNKMFpXUW9LU2tnZTF4dVhIUmNkRngwY21WcVpXTjBLRzVsZHlCRVQwMUZlR05sY0hScGIyNG9KMDVoZG1sbllYUnZjaUJCVUVrNklIQmxjbTFwYzNOcGIyNXpJRzl5SUU1aGRtbG5ZWFJ2Y2lCQlVFazZJRzFsWkdsaFJHVjJhV05sY3lCdWIzUWdjM1Z3Y0c5eWRHVmtKeXdnSjA1UFZGOVRWVkJRVDFKVVJVUmZSVkpTSnlrcFhHNWNkRngwZlZ4dVhHNWNkRngwZEhKNUlIdGNibHgwWEhSY2RHTnZibk4wSUZzc0lITjBjbVZoYlYwZ1BTQmhkMkZwZENCUWNtOXRhWE5sTG1Gc2JDaGJYRzVjZEZ4MFhIUmNkR0YzWVdsMElHZGxkRkJsY20xcGMzTnBiMjRvY0dWeWJXbHpjMmx2Yms1aGJXVXBMRnh1WEhSY2RGeDBYSFJoZDJGcGRDQnVZWFpwWjJGMGIzSXViV1ZrYVdGRVpYWnBZMlZ6TG1kbGRGVnpaWEpOWldScFlTaHRaV1JwWVZOMGNtVmhiVU52Ym5OMGNtRnBiblJ6S1N4Y2JseDBYSFJjZEYwcFhHNWNkRngwWEhSeVpYTnZiSFpsS0hOMGNtVmhiU2xjYmx4MFhIUjlJR05oZEdOb0lDaGxjbkp2Y2lrZ2UxeHVYSFJjZEZ4MGNtVnFaV04wS0dWeWNtOXlLVnh1WEhSY2RIMWNibHgwZlNsY2JuMWNiaUpkTENKdVlXMWxjeUk2V3lKdVlYWnBaMkYwYjNJaUxDSndaWEp0YVhOemFXOXVjeUlzSW0xbFpHbGhSR1YyYVdObGN5SXNJbkJsY20xcGMzTnBiMjVPWVcxbElpd2lVSEp2YldselpTSXNJbkpsYzI5c2RtVWlMQ0p5WldwbFkzUWlMQ0pwYzA1aGRtbG5ZWFJ2Y2xCbGNtMXBjM05wYjI1elUzVndjRzl5ZEdWa0lpd2lSRTlOUlhoalpYQjBhVzl1SWl3aWNYVmxjbmtpTENKdVlXMWxJaXdpY0dWeWJXbHpjMmx2YmxOMFlYUjFjeUlzSW05dVEyaGhibWRsSWl3aVpYWmxiblFpTENKeVpXMXZkbVZGZG1WdWRFeHBjM1JsYm1WeUlpd2ljbVZ6YjJ4MlpVOXlVbVZxWldOMFFtRnpaV1JQYmxOMFlYUmxJaXdpZEdGeVoyVjBJaXdpYzNSaGRHVWlMQ0poWkdSRmRtVnVkRXhwYzNSbGJtVnlJaXdpYldWa2FXRlRkSEpsWVcxRGIyNXpkSEpoYVc1MGN5SXNJbWx6VG1GMmFXZGhkRzl5VFdWa2FXRkVaWFpwWTJWelUzVndjRzl5ZEdWa0lpd2laMlYwVUdWeWJXbHpjMmx2YmlJc0ltZGxkRlZ6WlhKTlpXUnBZU0lzSW1Gc2JDSXNJbk4wY21WaGJTSmRMQ0p0WVhCd2FXNW5jeUk2SWtGQlNVRXNlVUpCUVhWQ1FTeFZRVUZWUXl4clEwTkJWa1FzVlVGQlZVVXNhWGhEUTBkcVF5eHJSRUZCWlN4WFFVRlBReXcwUjBGRFpDeEpRVUZKUXl4dlJFRkJVU3hYUVVGUFF5eEZRVUZUUXl4clIwRkROMEpETEV0QlEwcEVMRVZCUVU4c1NVRkJTVVVzWVVGQllTd3lRMEZCTkVNc2QwTkJTWEpEVWl4VlFVRlZReXhaUVVGWlVTeE5RVUZOTEVOQlFVVkRMRXRCUVUxUUxGZEJRVGRFVVN4VFFVTkJReXhGUVVGWExGTkJRVmhCTEVWQlFWbERMRWRCUTJwQ1JpeEZRVUZwUWtjc2IwSkJRVzlDTEZOQlFWVkdMRWRCUXk5RFJ5eEZRVUUwUWtZc1JVRkJUVWNzVDBGQlQwTXNUVUZCVDFvc1JVRkJVME1zU1VGRk1VUkxMRVZCUVdsQ1R5eHBRa0ZCYVVJc1UwRkJWVTRzUjBGRE5VTkhMRVZCUVRSQ1NpeEZRVUZwUWswc1RVRkJUMW9zUlVGQlUwTXNjVVJCUlRkRVFTdzJUa0ZMUjFNc1JVRkJPRUlzVTBGQlEwVXNSVUZCVDFvc1JVRkJVME1zVlVGRE5VTlhMRTlCUTBZc1UwRkRTbGdzUlVGQlR5eEpRVUZKUlN4aFFVRmhMRzlDUVVGeFFpeHJRMEZITjBOSUxFVkJRVkZaTEcxRVEzWkNTU3hYUVVGUFpDeEZRVUZuUW1kQ0xEUkhRVU01UWl4SlFVRkpaaXh2UkVGQlVTeFhRVUZQUXl4RlFVRlRReXh2UjBGRE4wSkRMRXRCUVhORFlTeExRVU14UTJRc1JVRkJUeXhKUVVGSlJTeGhRVUZoTERCRlFVRXlSU3h2UTBGSk1VVktMR2xDUVVOc1FtbENMRVZCUVdOc1FpeHpRMEZEWkVnc1ZVRkJWVVVzWVVGQllXOUNMR0ZCUVdGSUxEWkVRVVpXU1N3NFEwRkJlRUpETEU5QlNWUnVRaXhGUVVGUmJVSXNjVVJCUlZKc1FpSjlcbiIsImltcG9ydCB7IGlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWQsIGlzTmF2aWdhdG9yTWVkaWFEZXZpY2VzU3VwcG9ydGVkLCBnZXRVc2VyTWVkaWFTdHJlYW0gfSBmcm9tICdAdW50ZW1wcy91c2VyLXBlcm1pc3Npb25zLXV0aWxzJ1xuXG5jbGFzcyBWb2NhbCB7XG5cdHN0YXRpYyBkZWZhdWx0T3B0aW9ucyA9IHtcblx0XHRncmFtbWFyczogbnVsbCxcblx0XHRsYW5nOiAnZW4tVVMnLFxuXHRcdGNvbnRpbnVvdXM6IGZhbHNlLFxuXHRcdGludGVyaW1SZXN1bHRzOiBmYWxzZSxcblx0XHRtYXhBbHRlcm5hdGl2ZXM6IDEsXG5cdFx0c2VydmljZVVSSTogbnVsbCxcblx0fVxuXG5cdHN0YXRpYyBldmVudFR5cGVzID0ge1xuXHRcdEFVRElPX0VORDogJ2F1ZGlvZW5kJyxcblx0XHRBVURJT19TVEFSVDogJ2F1ZGlvc3RhcnQnLFxuXHRcdEVORDogJ2VuZCcsXG5cdFx0RVJST1I6ICdlcnJvcicsXG5cdFx0Tk9fTUFUQ0g6ICdub21hdGNoJyxcblx0XHRSRVNVTFQ6ICdyZXN1bHQnLFxuXHRcdFNPVU5EX0VORDogJ3NvdW5kZW5kJyxcblx0XHRTT1VORF9TVEFSVDogJ3NvdW5kc3RhcnQnLFxuXHRcdFNQRUVDSF9FTkQ6ICdzcGVlY2hlbmQnLFxuXHRcdFNQRUVDSF9TVEFSVDogJ3NwZWVjaHN0YXJ0Jyxcblx0XHRTVEFSVDogJ3N0YXJ0Jyxcblx0fVxuXG5cdHN0YXRpYyBnZXQgaXNTdXBwb3J0ZWQoKSB7XG5cdFx0cmV0dXJuICEhVm9jYWwuX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbigpICYmICEhaXNOYXZpZ2F0b3JQZXJtaXNzaW9uc1N1cHBvcnRlZCgpICYmICEhaXNOYXZpZ2F0b3JNZWRpYURldmljZXNTdXBwb3J0ZWQoKVxuXHR9XG5cblx0c3RhdGljIHNldCBpc1N1cHBvcnRlZChfKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNldCBpc1N1cHBvcnRlZCBkaXJlY3RseS4nKVxuXHR9XG5cblx0X2luc3RhbmNlID0gbnVsbFxuXHRfbGlzdGVuZXJzID0gbnVsbFxuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRjb25zdCBTcGVlY2hSZWNvZ25pdGlvbiA9IFZvY2FsLl9yZXNvbHZlU3BlZWNoUmVjb2duaXRpb24oKVxuXHRcdGlmICghU3BlZWNoUmVjb2duaXRpb24pIHtcblx0XHRcdHRocm93IG5ldyBET01FeGNlcHRpb24oJ1NwZWVjaFJlY29nbml0aW9uIG5vdCBzdXBwb3J0ZWQnLCAnTk9UX1NVUFBPUlRFRF9FUlInKVxuXHRcdH1cblxuXHRcdHRoaXMuX2luc3RhbmNlID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKClcblx0XHR0aGlzLl9saXN0ZW5lcnMgPSB7fVxuXG5cdFx0T2JqZWN0LmVudHJpZXMoe1xuXHRcdFx0Li4uVm9jYWwuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHQuLi4ob3B0aW9ucyB8fCB7fSksXG5cdFx0fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRpZiAoa2V5ID09PSAnZ3JhbW1hcnMnICYmICF2YWx1ZSkge1xuXHRcdFx0XHRjb25zdCBTcGVlY2hHcmFtbWFyTGlzdCA9IFZvY2FsLl9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QoKVxuXHRcdFx0XHRpZiAoISFTcGVlY2hHcmFtbWFyTGlzdCkge1xuXHRcdFx0XHRcdHZhbHVlID0gbmV3IFNwZWVjaEdyYW1tYXJMaXN0KClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5faW5zdGFuY2Vba2V5XSA9IHZhbHVlXG5cdFx0fSlcblx0fVxuXG5cdGdldCBpbnN0YW5jZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5faW5zdGFuY2Vcblx0fVxuXG5cdHNldCBpbnN0YW5jZShfKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNldCBpbnN0YW5jZSBkaXJlY3RseS4nKVxuXHR9XG5cblx0YXN5bmMgc3RhcnQoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHN0cmVhbSA9IGF3YWl0IGdldFVzZXJNZWRpYVN0cmVhbSgnbWljcm9waG9uZScsIHsgYXVkaW86IHRydWUgfSlcblx0XHRcdFx0aWYgKCFzdHJlYW0pIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXRyaWV2ZSB0aGUgc3RyZWFtIGZyb20gbWVkaWEgZGV2aWNlJylcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9pbnN0YW5jZS5zdGFydCgpXG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvckhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnMuZXJyb3Jcblx0XHRcdFx0aWYgKCEhZXJyb3JIYW5kbGVyKSB7XG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyKGVycm9yKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdHN0b3AoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRoaXMuX2luc3RhbmNlLnN0b3AoKVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRhYm9ydCgpIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSkge1xuXHRcdFx0dGhpcy5faW5zdGFuY2UuYWJvcnQoKVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSAmJiB0aGlzLl9pbmNsdWRlc0V2ZW50VHlwZShldmVudFR5cGUpKSB7XG5cdFx0XHRpZiAoISF0aGlzLl9saXN0ZW5lcnNbZXZlbnRUeXBlXSkge1xuXHRcdFx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGxldCBhZGRpdGlvbmFsQXJncyA9IFtdXG5cdFx0XHRcdGlmIChldmVudFR5cGUgPT09IFZvY2FsLmV2ZW50VHlwZXMuUkVTVUxUKSB7XG5cdFx0XHRcdFx0aWYgKCEhZXZlbnQucmVzdWx0cyAmJiBldmVudC5yZXN1bHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFkZGl0aW9uYWxBcmdzLnB1c2goZXZlbnQucmVzdWx0c1swXVswXS50cmFuc2NyaXB0KVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCEhY2FsbGJhY2sgJiYgY2FsbGJhY2suYXBwbHkodGhpcywgW2V2ZW50LCAuLi5hZGRpdGlvbmFsQXJnc10pXG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlcilcblxuXHRcdFx0dGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV0gPSBoYW5kbGVyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKSB7XG5cdFx0Y29uc3QgaGFuZGxlciA9IHRoaXMuX2xpc3RlbmVyc1tldmVudFR5cGVdXG5cdFx0dGhpcy5faW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIpXG5cblx0XHRkZWxldGUgdGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRjbGVhbnVwKCkge1xuXHRcdHRoaXMuc3RvcCgpXG5cblx0XHRPYmplY3Qua2V5cyh0aGlzLl9saXN0ZW5lcnMpLmZvckVhY2goKGtleSkgPT4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGtleSkpXG5cdFx0dGhpcy5faW5zdGFuY2UgPSBudWxsXG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0X2luY2x1ZGVzRXZlbnRUeXBlKGV2ZW50VHlwZSkge1xuXHRcdHJldHVybiAhIU9iamVjdC52YWx1ZXMoVm9jYWwuZXZlbnRUeXBlcykuZmluZCgodHlwZSkgPT4gdHlwZSA9PT0gZXZlbnRUeXBlKVxuXHR9XG5cblx0c3RhdGljIF9yZXNvbHZlU3BlZWNoUmVjb2duaXRpb24oKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5TcGVlY2hSZWNvZ25pdGlvbiB8fFxuXHRcdFx0d2luZG93LndlYmtpdFNwZWVjaFJlY29nbml0aW9uIHx8XG5cdFx0XHR3aW5kb3cubW96U3BlZWNoUmVjb2duaXRpb24gfHxcblx0XHRcdHdpbmRvdy5tc1NwZWVjaFJlY29nbml0aW9uXG5cdFx0KVxuXHR9XG5cblx0c3RhdGljIF9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5TcGVlY2hHcmFtbWFyTGlzdCB8fFxuXHRcdFx0d2luZG93LndlYmtpdFNwZWVjaEdyYW1tYXJMaXN0IHx8XG5cdFx0XHR3aW5kb3cubW96U3BlZWNoR3JhbW1hckxpc3QgfHxcblx0XHRcdHdpbmRvdy5tc1NwZWVjaEdyYW1tYXJMaXN0XG5cdFx0KVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZvY2FsXG4iXSwibmFtZXMiOlsicnVudGltZSIsImV4cG9ydHMiLCJPcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093biIsImhhc093blByb3BlcnR5IiwiJFN5bWJvbCIsIlN5bWJvbCIsIml0ZXJhdG9yU3ltYm9sIiwiaXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJvYmoiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIl9pbnZva2UiLCJzdGF0ZSIsIm1ldGhvZCIsImFyZyIsIkVycm9yIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwiQ29udGludWVTZW50aW5lbCIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwicmVjb3JkIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiZG9uZSIsIm1ha2VJbnZva2VNZXRob2QiLCJmbiIsImNhbGwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJ0aGlzIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJyZXNvbHZlIiwicmVqZWN0IiwiaW52b2tlIiwicmVzdWx0IiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInVuZGVmaW5lZCIsIlR5cGVFcnJvciIsImluZm8iLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImxlbmd0aCIsImkiLCJjb25zdHJ1Y3RvciIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJpdGVyIiwidG9TdHJpbmciLCJrZXlzIiwib2JqZWN0IiwicmV2ZXJzZSIsInBvcCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsImNhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsIm1vZHVsZSIsInJlZ2VuZXJhdG9yUnVudGltZSIsImFjY2lkZW50YWxTdHJpY3RNb2RlIiwiRnVuY3Rpb24iLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJfbmV4dCIsIl90aHJvdyIsImFyZ3MiLCJhcmd1bWVudHMiLCJhcHBseSIsImFyciIsIkFycmF5IiwiaXNBcnJheSIsIl9hcnIiLCJfbiIsIl9kIiwiX2UiLCJfcyIsIl9pIiwibGVuIiwiYXJyMiIsIm8iLCJtaW5MZW4iLCJhcnJheUxpa2VUb0FycmF5IiwibiIsImZyb20iLCJ0ZXN0IiwiYXJyYXlXaXRoSG9sZXMiLCJpdGVyYWJsZVRvQXJyYXlMaW1pdCIsInVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5Iiwibm9uSXRlcmFibGVSZXN0IiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwidGFyZ2V0IiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiZSIsIm5hdmlnYXRvciIsInBlcm1pc3Npb25zIiwiciIsIm1lZGlhRGV2aWNlcyIsInQiLCJhIiwidSIsImMiLCJyZXR1cm4iLCJET01FeGNlcHRpb24iLCJxdWVyeSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwidDAiLCJzIiwiZiIsInAiLCJ0MSIsImdldFVzZXJNZWRpYSIsInQyIiwidDMiLCJhbGwiLCJ0NCIsIlZvY2FsIiwib3B0aW9ucyIsIlNwZWVjaFJlY29nbml0aW9uIiwiX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbiIsIl9pbnN0YW5jZSIsIl9saXN0ZW5lcnMiLCJlbnRyaWVzIiwiZGVmYXVsdE9wdGlvbnMiLCJTcGVlY2hHcmFtbWFyTGlzdCIsIl9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QiLCJfdGhpcyIsImlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWQiLCJpc05hdmlnYXRvck1lZGlhRGV2aWNlc1N1cHBvcnRlZCIsIl8iLCJnZXRVc2VyTWVkaWFTdHJlYW0iLCJhdWRpbyIsInN0YXJ0IiwiZXJyb3JIYW5kbGVyIiwiYWJvcnQiLCJldmVudFR5cGUiLCJjYWxsYmFjayIsIl9pbmNsdWRlc0V2ZW50VHlwZSIsImhhbmRsZXIiLCJldmVudCIsImFkZGl0aW9uYWxBcmdzIiwiZXZlbnRUeXBlcyIsIlJFU1VMVCIsInJlc3VsdHMiLCJ0cmFuc2NyaXB0IiwiX3RoaXMyIiwiX3RoaXMzIiwiZmluZCIsIndpbmRvdyIsIndlYmtpdFNwZWVjaFJlY29nbml0aW9uIiwibW96U3BlZWNoUmVjb2duaXRpb24iLCJtc1NwZWVjaFJlY29nbml0aW9uIiwid2Via2l0U3BlZWNoR3JhbW1hckxpc3QiLCJtb3pTcGVlY2hHcmFtbWFyTGlzdCIsIm1zU3BlZWNoR3JhbW1hckxpc3QiLCJncmFtbWFycyIsImxhbmciLCJjb250aW51b3VzIiwiaW50ZXJpbVJlc3VsdHMiLCJtYXhBbHRlcm5hdGl2ZXMiLCJzZXJ2aWNlVVJJIiwiQVVESU9fRU5EIiwiQVVESU9fU1RBUlQiLCJFTkQiLCJFUlJPUiIsIk5PX01BVENIIiwiU09VTkRfRU5EIiwiU09VTkRfU1RBUlQiLCJTUEVFQ0hfRU5EIiwiU1BFRUNIX1NUQVJUIiwiU1RBUlQiXSwibWFwcGluZ3MiOiI4T0FPQSxJQUFJQSxFQUFXLFNBQVVDLEdBR3ZCLElBQUlDLEVBQUtDLE9BQU9DLFVBQ1pDLEVBQVNILEVBQUdJLGVBRVpDLEVBQTRCLG1CQUFYQyxPQUF3QkEsT0FBUyxHQUNsREMs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\n","//#region src/function/isFunction.ts\nvar e = (e) => typeof e == \"function\";\n//#endregion\nexport { e as isFunction };\n","import { useCallback, useEffect, useRef } from 'react'\nimport { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'\n\nconst useVocal = (lang = 'en-US', grammars = null, __rsInstance = null) => {\n\tconst ref = useRef(null)\n\n\tuseEffect(() => {\n\t\tif (SpeechRecognitionWrapper.isSupported) {\n\t\t\tref.current = __rsInstance || new SpeechRecognitionWrapper({ lang, grammars })\n\t\t\treturn () => {\n\t\t\t\tref.current.abort()\n\t\t\t\tref.current.cleanup()\n\t\t\t}\n\t\t}\n\t}, [lang, grammars, __rsInstance])\n\n\tconst start = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.start()\n\t\t}\n\t}, [])\n\n\tconst stop = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.stop()\n\t\t}\n\t}, [])\n\n\tconst abort = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.abort()\n\t\t}\n\t}, [])\n\n\tconst subscribe = useCallback((eventType, handler) => {\n\t\tif (ref.current) {\n\t\t\tref.current.addEventListener(eventType, handler)\n\t\t}\n\t}, [])\n\n\tconst unsubscribe = useCallback((eventType, handler) => {\n\t\tif (ref.current) {\n\t\t\tref.current.removeEventListener(eventType, handler)\n\t\t}\n\t}, [])\n\n\tconst clean = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.cleanup()\n\t\t}\n\t}, [])\n\n\treturn [ref, { start, stop, abort, subscribe, unsubscribe, clean }]\n}\n\nexport default useVocal\n","import { useCallback, useEffect, useRef } from 'react'\n\nconst useTimeout = (handler, timeout = 0) => {\n\tconst ref = useRef(-1)\n\n\tconst stop = useCallback(() => {\n\t\tclearTimeout(ref.current)\n\t\tref.current = -1\n\t}, [])\n\n\tconst start = useCallback(() => {\n\t\tstop()\n\t\tref.current = setTimeout(handler, timeout)\n\t}, [handler, timeout, stop])\n\n\tuseEffect(() => stop, [stop])\n\n\treturn [start, stop]\n}\n\nexport default useTimeout\n","/**\n * Fuse.js v7.3.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2026 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray ? getTag(value) === '[object Array]' : Array.isArray(value);\n}\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (typeof value === 'bigint') {\n return value.toString();\n }\n const result = value + '';\n return result == '0' && 1 / value == -Infinity ? '-0' : result;\n}\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\nfunction isString(value) {\n return typeof value === 'string';\n}\nfunction isNumber(value) {\n return typeof value === 'number';\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return value === true || value === false || isObjectLike(value) && getTag(value) == '[object Boolean]';\n}\nfunction isObject(value) {\n return typeof value === 'object';\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null;\n}\nfunction isDefined(value) {\n return value !== undefined && value !== null;\n}\nfunction isBlank(value) {\n return !value.trim().length;\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null ? value === undefined ? '[object Undefined]' : '[object Null]' : Object.prototype.toString.call(value);\n}\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = key => `Invalid value for key ${key}`;\nconst PATTERN_LENGTH_TOO_LARGE = max => `Pattern length exceeds max of ${max}.`;\nconst MISSING_KEY_PROPERTY = name => `Missing ${name} property in key`;\nconst INVALID_KEY_WEIGHT_VALUE = key => `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n let totalWeight = 0;\n keys.forEach(key => {\n const obj = createKey(key);\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach(key => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId];\n }\n keys() {\n return this._keys;\n }\n toJSON() {\n return JSON.stringify(this._keys);\n }\n}\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'));\n }\n const name = key.name;\n src = name;\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name));\n }\n }\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n return {\n path: path,\n id: id,\n weight,\n src: src,\n getFn\n };\n}\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.');\n}\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key;\n}\n\nfunction get(obj, path) {\n const list = [];\n let arr = false;\n const deepGet = (obj, path, index, arrayIndex) => {\n if (!isDefined(obj)) {\n return;\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(arrayIndex !== undefined ? {\n v: obj,\n i: arrayIndex\n } : obj);\n } else {\n const key = path[index];\n const value = obj[key];\n if (!isDefined(value)) {\n return;\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (index === path.length - 1 && (isString(value) || isNumber(value) || isBoolean(value) || typeof value === 'bigint')) {\n list.push(arrayIndex !== undefined ? {\n v: toString(value),\n i: arrayIndex\n } : toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1, i);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1, arrayIndex);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n return arr ? list : list[0];\n}\n\nconst MatchOptions = {\n includeMatches: false,\n findAllMatches: false,\n minMatchCharLength: 1\n};\nconst BasicOptions = {\n isCaseSensitive: false,\n ignoreDiacritics: false,\n includeScore: false,\n keys: [],\n shouldSort: true,\n sortFn: (a, b) => a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1\n};\nconst FuzzyOptions = {\n location: 0,\n threshold: 0.6,\n distance: 100\n};\nconst AdvancedOptions = {\n useExtendedSearch: false,\n useTokenSearch: false,\n getFn: get,\n ignoreLocation: false,\n ignoreFieldNorm: false,\n fieldNormWeight: 1\n};\nconst Config = Object.freeze({\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n});\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n if (cache.has(numTokens)) {\n return cache.get(numTokens);\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n cache.set(numTokens, n);\n return n;\n },\n clear() {\n cache.clear();\n }\n };\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n this.docs = [];\n this.keys = [];\n this._keysMap = {};\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return;\n }\n this.isCreated = true;\n\n // List is Array<String>\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array<Object>\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n // Removes docs at the specified indices (must be sorted ascending)\n removeAll(indices) {\n // Remove in reverse order to avoid index shifting during splice\n for (let i = indices.length - 1; i >= 0; i -= 1) {\n this.records.splice(indices[i], 1);\n }\n // Single re-index pass\n for (let i = 0, len = this.records.length; i < len; i += 1) {\n this.records[i].i = i;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]];\n }\n size() {\n return this.records.length;\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return;\n }\n const record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n const record = {\n i: docIndex,\n $: {}\n };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n const value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n if (!isDefined(value)) {\n return;\n }\n if (isArray(value)) {\n const subRecords = [];\n for (let i = 0, len = value.length; i < len; i += 1) {\n const item = value[i];\n if (!isDefined(item)) {\n continue;\n }\n if (isString(item)) {\n // Custom getFn returning plain string array (backward compat)\n if (!isBlank(item)) {\n const subRecord = {\n v: item,\n i: i,\n n: this.norm.get(item)\n };\n subRecords.push(subRecord);\n }\n } else if (isDefined(item.v)) {\n // Default get() returns {v, i} objects with original array indices\n const text = isString(item.v) ? item.v : toString(item.v);\n if (!isBlank(text)) {\n const subRecord = {\n v: text,\n i: item.i,\n n: this.norm.get(text)\n };\n subRecords.push(subRecord);\n }\n }\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n const subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n record.$[keyIndex] = subRecord;\n }\n });\n this.records.push(record);\n }\n toJSON() {\n return {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n keys: this.keys.map(({\n getFn,\n ...key\n }) => key),\n records: this.records\n };\n }\n}\nfunction createIndex(keys, docs, {\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n} = {}) {\n const myIndex = new FuseIndex({\n getFn,\n fieldNormWeight\n });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex;\n}\nfunction parseIndex(data, {\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n} = {}) {\n const {\n keys,\n records\n } = data;\n const myIndex = new FuseIndex({\n getFn,\n fieldNormWeight\n });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex;\n}\n\nfunction convertMaskToIndices(matchmask = [], minMatchCharLength = Config.minMatchCharLength) {\n const indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n for (let len = matchmask.length; i < len; i += 1) {\n const match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n return indices;\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(text, pattern, patternAlphabet, {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n} = {}) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS));\n }\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Inlined score computation — avoids object allocation per call in hot loops.\n // See ./computeScore.ts for the documented version of this formula.\n const calcScore = (errors, currentLocation) => {\n const accuracy = errors / patternLen;\n if (ignoreLocation) return accuracy;\n const proximity = Math.abs(expectedLocation - currentLocation);\n if (!distance) return proximity ? 1.0 : accuracy;\n return accuracy + proximity / distance;\n };\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n const score = calcScore(0, index);\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n const mask = 1 << patternLen - 1;\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n while (binMin < binMid) {\n const score = calcScore(i, expectedLocation + binMid);\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n let start = Math.max(1, expectedLocation - binMid + 1);\n const finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n const bitArr = Array(finish + 2);\n bitArr[finish + 1] = (1 << i) - 1;\n for (let j = finish; j >= start; j -= 1) {\n const currentLocation = j - 1;\n const charMatch = patternAlphabet[text[currentLocation]];\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1];\n }\n if (bitArr[j] & mask) {\n finalScore = calcScore(i, currentLocation);\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break;\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = calcScore(i + 1, expectedLocation);\n if (score > currentThreshold) {\n break;\n }\n lastBitArr = bitArr;\n }\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n return result;\n}\n\nfunction createPatternAlphabet(pattern) {\n const mask = {};\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | 1 << len - i - 1;\n }\n return mask;\n}\n\nfunction mergeIndices(indices) {\n if (indices.length <= 1) return indices;\n indices.sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n const merged = [indices[0]];\n for (let i = 1, len = indices.length; i < len; i += 1) {\n const last = merged[merged.length - 1];\n const curr = indices[i];\n if (curr[0] <= last[1] + 1) {\n last[1] = Math.max(last[1], curr[1]);\n } else {\n merged.push(curr);\n }\n }\n return merged;\n}\n\n// Characters that survive NFD normalization unchanged and need explicit mapping\nconst NON_DECOMPOSABLE_MAP = {\n '\\u0142': 'l',\n // ł\n '\\u0141': 'L',\n // Ł\n '\\u0111': 'd',\n // đ\n '\\u0110': 'D',\n // Đ\n '\\u00F8': 'o',\n // ø\n '\\u00D8': 'O',\n // Ø\n '\\u0127': 'h',\n // ħ\n '\\u0126': 'H',\n // Ħ\n '\\u0167': 't',\n // ŧ\n '\\u0166': 'T',\n // Ŧ\n '\\u0131': 'i',\n // ı\n '\\u00DF': 'ss' // ß\n};\nconst NON_DECOMPOSABLE_RE = new RegExp('[' + Object.keys(NON_DECOMPOSABLE_MAP).join('') + ']', 'g');\nconst stripDiacritics = String.prototype.normalize ? str => str.normalize('NFD').replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, '').replace(NON_DECOMPOSABLE_RE, ch => NON_DECOMPOSABLE_MAP[ch]) : str => str;\n\nclass BitapSearch {\n constructor(pattern, {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n };\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n this.chunks = [];\n if (!this.pattern.length) {\n return;\n }\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n const len = this.pattern.length;\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n searchIn(text) {\n const {\n isCaseSensitive,\n ignoreDiacritics,\n includeMatches\n } = this.options;\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n // Exact match\n if (this.pattern === text) {\n const result = {\n isMatch: true,\n score: 0\n };\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n return result;\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n const allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n this.chunks.forEach(({\n pattern,\n alphabet,\n startIndex\n }) => {\n const {\n isMatch,\n score,\n indices\n } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n if (isMatch) {\n hasMatches = true;\n }\n totalScore += score;\n if (isMatch && indices) {\n allIndices.push(...indices);\n }\n });\n const result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n if (hasMatches && includeMatches) {\n result.indices = mergeIndices(allIndices);\n }\n return result;\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex);\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n search(_text) {\n return {\n isMatch: false,\n score: 1\n };\n }\n}\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null;\n}\n\n// Token: 'file\n// Match type: exact-match\n// Description: Items that are `file`\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact';\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^=(.*)$/;\n }\n search(text) {\n const isMatch = text === this.pattern;\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n };\n }\n}\n\n// Token: !fire\n// Match type: inverse-exact-match\n// Description: Items that do not include `fire`\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact';\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^!(.*)$/;\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n };\n }\n}\n\n// Token: ^file\n// Match type: prefix-exact-match\n// Description: Items that start with `file`\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact';\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^\\^(.*)$/;\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n };\n }\n}\n\n// Token: !^fire\n// Match type: inverse-prefix-exact-match\n// Description: Items that do not start with `fire`\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact';\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^!\\^(.*)$/;\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n };\n }\n}\n\n// Token: .file$\n// Match type: suffix-exact-match\n// Description: Items that end with `.file`\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact';\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/;\n }\n static get singleRegex() {\n return /^(.*)\\$$/;\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n };\n }\n}\n\n// Token: !.file$\n// Match type: inverse-suffix-exact-match\n// Description: Items that do not end with `.file`\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact';\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/;\n }\n static get singleRegex() {\n return /^!(.*)\\$$/;\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n };\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(pattern, {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy';\n }\n static get multiRegex() {\n return /^\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^(.*)$/;\n }\n search(text) {\n return this._bitapSearch.searchIn(text);\n }\n}\n\n// Token: 'file\n// Match type: include-match\n// Description: Items that include `file`\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include';\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^'(.*)$/;\n }\n search(text) {\n let location = 0;\n let index;\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n const isMatch = !!indices.length;\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n };\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [ExactMatch, IncludeMatch, PrefixExactMatch, InversePrefixExactMatch, InverseSuffixExactMatch, SuffixExactMatch, InverseExactMatch, FuzzyMatch];\nconst searchersLen = searchers.length;\nconst ESCAPED_PIPE = '\\u0000'; // placeholder for escaped \\|\nconst OR_TOKEN = '|';\n\n// Tokenize a query string into individual search terms.\n// Respects multi-match quoted tokens like =\"said \"test\"\" or ^\"hello world\"$\n// where inner spaces and quotes are part of the token.\nfunction tokenize(pattern) {\n const tokens = [];\n const len = pattern.length;\n let i = 0;\n while (i < len) {\n // Skip spaces\n while (i < len && pattern[i] === ' ') i++;\n if (i >= len) break;\n\n // Scan past prefix characters (=, !, ^, ') to see if a quote follows\n let j = i;\n while (j < len && pattern[j] !== ' ' && pattern[j] !== '\"') j++;\n if (j < len && pattern[j] === '\"') {\n // Multi-match token: prefix + \"content\" (possibly with inner quotes)\n // Find the closing \" that ends this token:\n // it must be followed by optional $, then space or end-of-string\n j++; // skip opening quote\n while (j < len) {\n if (pattern[j] === '\"') {\n // Check if this is the closing quote\n const next = j + 1;\n if (next >= len || pattern[next] === ' ') {\n j++; // include closing quote\n break;\n }\n if (pattern[next] === '$' && (next + 1 >= len || pattern[next + 1] === ' ')) {\n j += 2; // include \"$\n break;\n }\n }\n j++;\n }\n tokens.push(pattern.substring(i, j));\n i = j;\n } else {\n // Regular (unquoted) token: read until space or end\n while (j < len && pattern[j] !== ' ') j++;\n tokens.push(pattern.substring(i, j));\n i = j;\n }\n }\n return tokens;\n}\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n // Replace escaped \\| with placeholder before splitting on |\n const escaped = pattern.replace(/\\\\\\|/g, ESCAPED_PIPE);\n return escaped.split(OR_TOKEN).map(item => {\n // Restore escaped pipes in each OR group\n const restored = item.replace(/\\u0000/g, '|');\n const query = tokenize(restored.trim()).filter(item => item && !!item.trim());\n const results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n const token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n if (found) {\n continue;\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n const token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break;\n }\n }\n }\n return results;\n });\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\nclass ExtendedSearch {\n constructor(pattern, {\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n ignoreDiacritics,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n this.query = parseQuery(this.pattern, this.options);\n }\n static condition(_, options) {\n return options.useExtendedSearch;\n }\n\n // Note: searchIn operates on a single text value and sets hasInverse on the\n // result when inverse patterns are involved. _searchObjectList uses this to\n // switch from \"ANY key\" to \"ALL keys\" aggregation. See #712.\n searchIn(text) {\n const query = this.query;\n if (!query) {\n return {\n isMatch: false,\n score: 1\n };\n }\n const {\n includeMatches,\n isCaseSensitive,\n ignoreDiacritics\n } = this.options;\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n let numMatches = 0;\n const allIndices = [];\n let totalScore = 0;\n let hasInverse = false;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n hasInverse = false;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const {\n isMatch,\n indices,\n score\n } = searcher.search(text);\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n const type = searcher.constructor.type;\n if (type.startsWith('inverse')) {\n hasInverse = true;\n }\n if (includeMatches) {\n if (MultiMatchSet.has(type)) {\n allIndices.push(...indices);\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n hasInverse = false;\n break;\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n const result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n if (hasInverse) {\n result.hasInverse = true;\n }\n if (includeMatches) {\n result.indices = mergeIndices(allIndices);\n }\n return result;\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n };\n }\n}\n\nconst registeredSearchers = [];\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n const searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options);\n }\n }\n return new BitapSearch(pattern, options);\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\nconst isExpression = query => !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\nconst isPath = query => !!query[KeyType.PATH];\nconst isLeaf = query => !isArray(query) && isObject(query) && !isExpression(query);\nconst convertToExplicit = query => ({\n [LogicalOperator.AND]: Object.keys(query).map(key => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, {\n auto = true\n} = {}) {\n const next = query => {\n // Keyless string entry: search across all keys\n if (isString(query)) {\n const obj = {\n keyId: null,\n pattern: query\n };\n if (auto) {\n obj.searcher = createSearcher(query, options);\n }\n return obj;\n }\n const keys = Object.keys(query);\n const isQueryPath = isPath(query);\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query));\n }\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key));\n }\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n return obj;\n }\n const node = {\n children: [],\n operator: keys[0]\n };\n keys.forEach(key => {\n const value = query[key];\n if (isArray(value)) {\n value.forEach(item => {\n node.children.push(next(item));\n });\n }\n });\n return node;\n };\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n return next(query);\n}\n\nfunction computeScoreSingle(matches, {\n ignoreFieldNorm = Config.ignoreFieldNorm\n}) {\n let totalScore = 1;\n matches.forEach(({\n key,\n norm,\n score\n }) => {\n const weight = key ? key.weight : null;\n totalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm));\n });\n return totalScore;\n}\nfunction computeScore(results, {\n ignoreFieldNorm = Config.ignoreFieldNorm\n}) {\n results.forEach(result => {\n result.score = computeScoreSingle(result.matches, {\n ignoreFieldNorm\n });\n });\n}\n\n// Max-heap by score: keeps the worst (highest) score at the top\n// so we can efficiently evict it when a better result arrives.\nclass MaxHeap {\n constructor(limit) {\n this.limit = limit;\n this.heap = [];\n }\n get size() {\n return this.heap.length;\n }\n shouldInsert(score) {\n return this.size < this.limit || score < this.heap[0].score;\n }\n insert(item) {\n if (this.size < this.limit) {\n this.heap.push(item);\n this._bubbleUp(this.size - 1);\n } else if (item.score < this.heap[0].score) {\n this.heap[0] = item;\n this._sinkDown(0);\n }\n }\n extractSorted(sortFn) {\n return this.heap.sort(sortFn);\n }\n _bubbleUp(i) {\n const heap = this.heap;\n while (i > 0) {\n const parent = i - 1 >> 1;\n if (heap[i].score <= heap[parent].score) break;\n const tmp = heap[i];\n heap[i] = heap[parent];\n heap[parent] = tmp;\n i = parent;\n }\n }\n _sinkDown(i) {\n const heap = this.heap;\n const len = heap.length;\n let largest = i;\n do {\n i = largest;\n const left = 2 * i + 1;\n const right = 2 * i + 2;\n if (left < len && heap[left].score > heap[largest].score) {\n largest = left;\n }\n if (right < len && heap[right].score > heap[largest].score) {\n largest = right;\n }\n if (largest !== i) {\n const tmp = heap[i];\n heap[i] = heap[largest];\n heap[largest] = tmp;\n }\n } while (largest !== i);\n }\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n if (!isDefined(matches)) {\n return;\n }\n matches.forEach(match => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return;\n }\n const {\n indices,\n value\n } = match;\n const obj = {\n indices,\n value\n };\n if (match.key) {\n obj.key = match.key.src;\n }\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(results, docs, {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n} = {}) {\n const transformers = [];\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n return results.map(result => {\n const {\n idx\n } = result;\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n if (transformers.length) {\n transformers.forEach(transformer => {\n transformer(result, data);\n });\n }\n return data;\n });\n}\n\nconst WORD = /\\b\\w+\\b/g;\nfunction createAnalyzer({\n isCaseSensitive = false,\n ignoreDiacritics = false\n} = {}) {\n return {\n tokenize(text) {\n if (!isCaseSensitive) {\n text = text.toLowerCase();\n }\n if (ignoreDiacritics) {\n text = stripDiacritics(text);\n }\n return text.match(WORD) || [];\n }\n };\n}\n\nfunction buildInvertedIndex(records, keyCount, analyzer) {\n const terms = new Map();\n const df = new Map();\n let fieldCount = 0;\n function addField(text, docIdx, keyIdx, subIdx) {\n const tokens = analyzer.tokenize(text);\n if (!tokens.length) return;\n fieldCount++;\n\n // Count term frequencies in this field\n const termFreqs = new Map();\n for (const token of tokens) {\n termFreqs.set(token, (termFreqs.get(token) || 0) + 1);\n }\n\n // Track which terms we've already counted for df in this field\n for (const [term, tf] of termFreqs) {\n const posting = {\n docIdx,\n keyIdx,\n subIdx,\n tf\n };\n let postings = terms.get(term);\n if (!postings) {\n postings = [];\n terms.set(term, postings);\n }\n postings.push(posting);\n df.set(term, (df.get(term) || 0) + 1);\n }\n }\n for (const record of records) {\n const {\n i: docIdx,\n v,\n $: fields\n } = record;\n\n // String list\n if (v !== undefined) {\n addField(v, docIdx, -1, -1);\n continue;\n }\n\n // Object list\n if (fields) {\n for (let keyIdx = 0; keyIdx < keyCount; keyIdx++) {\n const value = fields[keyIdx];\n if (!value) continue;\n if (Array.isArray(value)) {\n for (const sub of value) {\n addField(sub.v, docIdx, keyIdx, sub.i ?? -1);\n }\n } else {\n addField(value.v, docIdx, keyIdx, -1);\n }\n }\n }\n }\n return {\n terms,\n fieldCount,\n df\n };\n}\nfunction addToInvertedIndex(index, record, keyCount, analyzer) {\n const {\n i: docIdx,\n v,\n $: fields\n } = record;\n function addField(text, keyIdx, subIdx) {\n const tokens = analyzer.tokenize(text);\n if (!tokens.length) return;\n index.fieldCount++;\n const termFreqs = new Map();\n for (const token of tokens) {\n termFreqs.set(token, (termFreqs.get(token) || 0) + 1);\n }\n for (const [term, tf] of termFreqs) {\n const posting = {\n docIdx,\n keyIdx,\n subIdx,\n tf\n };\n let postings = index.terms.get(term);\n if (!postings) {\n postings = [];\n index.terms.set(term, postings);\n }\n postings.push(posting);\n index.df.set(term, (index.df.get(term) || 0) + 1);\n }\n }\n if (v !== undefined) {\n addField(v, -1, -1);\n return;\n }\n if (fields) {\n for (let keyIdx = 0; keyIdx < keyCount; keyIdx++) {\n const value = fields[keyIdx];\n if (!value) continue;\n if (Array.isArray(value)) {\n for (const sub of value) {\n addField(sub.v, keyIdx, sub.i ?? -1);\n }\n } else {\n addField(value.v, keyIdx, -1);\n }\n }\n }\n}\nfunction removeFromInvertedIndex(index, docIdx) {\n for (const [term, postings] of index.terms) {\n const filtered = postings.filter(p => p.docIdx !== docIdx);\n const removed = postings.length - filtered.length;\n if (removed > 0) {\n index.fieldCount -= removed;\n index.df.set(term, (index.df.get(term) || 0) - removed);\n if (filtered.length === 0) {\n index.terms.delete(term);\n index.df.delete(term);\n } else {\n index.terms.set(term, filtered);\n }\n }\n }\n}\n\nclass Fuse {\n // Statics are assigned in entry.ts\n\n constructor(docs, options, index) {\n this.options = {\n ...Config,\n ...options\n };\n if (this.options.useExtendedSearch && false) ;\n if (this.options.useTokenSearch && false) ;\n this._keyStore = new KeyStore(this.options.keys);\n this._docs = docs;\n this._myIndex = null;\n this._invertedIndex = null;\n this.setCollection(docs, index);\n this._lastQuery = null;\n this._lastSearcher = null;\n }\n _getSearcher(query) {\n if (this._lastQuery === query) {\n return this._lastSearcher;\n }\n const opts = this._invertedIndex ? {\n ...this.options,\n _invertedIndex: this._invertedIndex\n } : this.options;\n const searcher = createSearcher(query, opts);\n this._lastQuery = query;\n this._lastSearcher = searcher;\n return searcher;\n }\n setCollection(docs, index) {\n this._docs = docs;\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE);\n }\n this._myIndex = index || createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n if (this.options.useTokenSearch) {\n const analyzer = createAnalyzer({\n isCaseSensitive: this.options.isCaseSensitive,\n ignoreDiacritics: this.options.ignoreDiacritics\n });\n this._invertedIndex = buildInvertedIndex(this._myIndex.records, this._myIndex.keys.length, analyzer);\n }\n }\n add(doc) {\n if (!isDefined(doc)) {\n return;\n }\n this._docs.push(doc);\n this._myIndex.add(doc);\n if (this._invertedIndex) {\n const record = this._myIndex.records[this._myIndex.records.length - 1];\n const analyzer = createAnalyzer({\n isCaseSensitive: this.options.isCaseSensitive,\n ignoreDiacritics: this.options.ignoreDiacritics\n });\n addToInvertedIndex(this._invertedIndex, record, this._myIndex.keys.length, analyzer);\n }\n }\n remove(predicate = () => false) {\n const results = [];\n const indicesToRemove = [];\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n if (predicate(this._docs[i], i)) {\n results.push(this._docs[i]);\n indicesToRemove.push(i);\n }\n }\n if (indicesToRemove.length) {\n if (this._invertedIndex) {\n for (const idx of indicesToRemove) {\n removeFromInvertedIndex(this._invertedIndex, idx);\n }\n }\n\n // Remove from docs in reverse to preserve indices\n for (let i = indicesToRemove.length - 1; i >= 0; i -= 1) {\n this._docs.splice(indicesToRemove[i], 1);\n }\n this._myIndex.removeAll(indicesToRemove);\n }\n return results;\n }\n removeAt(idx) {\n if (this._invertedIndex) {\n removeFromInvertedIndex(this._invertedIndex, idx);\n }\n const doc = this._docs.splice(idx, 1)[0];\n this._myIndex.removeAt(idx);\n return doc;\n }\n getIndex() {\n return this._myIndex;\n }\n search(query, options) {\n const {\n limit = -1\n } = options || {};\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n // Empty string query returns all docs (useful for search UIs)\n if (isString(query) && !query.trim()) {\n let docs = this._docs.map((item, idx) => ({\n item,\n refIndex: idx\n }));\n if (isNumber(limit) && limit > -1) {\n docs = docs.slice(0, limit);\n }\n return docs;\n }\n const useHeap = isNumber(limit) && limit > 0 && isString(query);\n let results;\n if (useHeap) {\n const heap = new MaxHeap(limit);\n if (isString(this._docs[0])) {\n this._searchStringList(query, {\n heap,\n ignoreFieldNorm\n });\n } else {\n this._searchObjectList(query, {\n heap,\n ignoreFieldNorm\n });\n }\n results = heap.extractSorted(sortFn);\n } else {\n results = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query) : this._searchLogical(query);\n computeScore(results, {\n ignoreFieldNorm\n });\n if (shouldSort) {\n results.sort(sortFn);\n }\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n }\n return format(results, this._docs, {\n includeMatches,\n includeScore\n });\n }\n _searchStringList(query, {\n heap,\n ignoreFieldNorm\n } = {}) {\n const searcher = this._getSearcher(query);\n const {\n records\n } = this._myIndex;\n const results = heap ? null : [];\n\n // Iterate over every string in the index\n records.forEach(({\n v: text,\n i: idx,\n n: norm\n }) => {\n if (!isDefined(text)) {\n return;\n }\n const {\n isMatch,\n score,\n indices\n } = searcher.searchIn(text);\n if (isMatch) {\n const result = {\n item: text,\n idx,\n matches: [{\n score,\n value: text,\n norm: norm,\n indices\n }]\n };\n if (heap) {\n result.score = computeScoreSingle(result.matches, {\n ignoreFieldNorm\n });\n if (heap.shouldInsert(result.score)) {\n heap.insert(result);\n }\n } else {\n results.push(result);\n }\n }\n });\n return results;\n }\n _searchLogical(query) {\n const expression = parse(query, this.options);\n const evaluate = (node, item, idx) => {\n if (!('children' in node)) {\n const {\n keyId,\n searcher\n } = node;\n let matches;\n if (keyId === null) {\n // Keyless entry: search across all keys\n matches = [];\n this._myIndex.keys.forEach((key, keyIndex) => {\n matches.push(...this._findMatches({\n key,\n value: item[keyIndex],\n searcher: searcher\n }));\n });\n } else {\n matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher: searcher\n });\n }\n if (matches && matches.length) {\n return [{\n idx,\n item,\n matches\n }];\n }\n return [];\n }\n const {\n children,\n operator\n } = node;\n const res = [];\n for (let i = 0, len = children.length; i < len; i += 1) {\n const child = children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (operator === LogicalOperator.AND) {\n return [];\n }\n }\n return res;\n };\n const records = this._myIndex.records;\n const resultMap = new Map();\n const results = [];\n records.forEach(({\n $: item,\n i: idx\n }) => {\n if (isDefined(item)) {\n const expResults = evaluate(expression, item, idx);\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap.has(idx)) {\n resultMap.set(idx, {\n idx,\n item,\n matches: []\n });\n results.push(resultMap.get(idx));\n }\n expResults.forEach(({\n matches\n }) => {\n resultMap.get(idx).matches.push(...matches);\n });\n }\n }\n });\n return results;\n }\n\n // When a search involves inverse patterns (e.g. !Syrup), the aggregation\n // across keys switches from \"ANY key matches\" to \"ALL keys must match.\"\n // This is signaled by hasInverse on the SearchResult from ExtendedSearch.\n //\n // For mixed patterns like \"^hello !Syrup\", a key failure is ambiguous —\n // it could be the positive or inverse term that failed. In that case we\n // conservatively exclude the item, which is strictly better than the old\n // behavior of including it. See: https://github.com/krisk/Fuse/issues/712\n _searchObjectList(query, {\n heap,\n ignoreFieldNorm\n } = {}) {\n const searcher = this._getSearcher(query);\n const {\n keys,\n records\n } = this._myIndex;\n const results = heap ? null : [];\n\n // List is Array<Object>\n records.forEach(({\n $: item,\n i: idx\n }) => {\n if (!isDefined(item)) {\n return;\n }\n const matches = [];\n let anyKeyFailed = false;\n let hasInverse = false;\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n const keyMatches = this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n });\n if (keyMatches.length) {\n matches.push(...keyMatches);\n if (keyMatches[0].hasInverse) {\n hasInverse = true;\n }\n } else {\n anyKeyFailed = true;\n }\n });\n\n // If the search involves inverse patterns, ALL keys must match\n if (hasInverse && anyKeyFailed) {\n return;\n }\n if (matches.length) {\n const result = {\n idx,\n item,\n matches\n };\n if (heap) {\n result.score = computeScoreSingle(result.matches, {\n ignoreFieldNorm\n });\n if (heap.shouldInsert(result.score)) {\n heap.insert(result);\n }\n } else {\n results.push(result);\n }\n }\n });\n return results;\n }\n _findMatches({\n key,\n value,\n searcher\n }) {\n if (!isDefined(value)) {\n return [];\n }\n const matches = [];\n if (isArray(value)) {\n value.forEach(({\n v: text,\n i: idx,\n n: norm\n }) => {\n if (!isDefined(text)) {\n return;\n }\n const {\n isMatch,\n score,\n indices,\n hasInverse\n } = searcher.searchIn(text);\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices,\n hasInverse\n });\n }\n });\n } else {\n const {\n v: text,\n n: norm\n } = value;\n const {\n isMatch,\n score,\n indices,\n hasInverse\n } = searcher.searchIn(text);\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n norm,\n indices,\n hasInverse\n });\n }\n }\n return matches;\n }\n}\n\nclass TokenSearch {\n static condition(_, options) {\n return options.useTokenSearch;\n }\n constructor(pattern, options) {\n this.options = options;\n this.analyzer = createAnalyzer({\n isCaseSensitive: options.isCaseSensitive,\n ignoreDiacritics: options.ignoreDiacritics\n });\n const queryTerms = this.analyzer.tokenize(pattern);\n const invertedIndex = options._invertedIndex;\n const {\n df,\n fieldCount\n } = invertedIndex;\n this.termSearchers = [];\n this.idfWeights = [];\n for (const term of queryTerms) {\n this.termSearchers.push(new BitapSearch(term, {\n location: options.location,\n threshold: options.threshold,\n distance: options.distance,\n includeMatches: options.includeMatches,\n findAllMatches: options.findAllMatches,\n minMatchCharLength: options.minMatchCharLength,\n isCaseSensitive: options.isCaseSensitive,\n ignoreDiacritics: options.ignoreDiacritics,\n ignoreLocation: true\n }));\n const docFreq = df.get(term) || 0;\n const idf = Math.log(1 + (fieldCount - docFreq + 0.5) / (docFreq + 0.5));\n this.idfWeights.push(idf);\n }\n }\n searchIn(text) {\n if (!this.termSearchers.length) {\n return {\n isMatch: false,\n score: 1\n };\n }\n const allIndices = [];\n let weightedScore = 0;\n let maxPossibleScore = 0;\n let matchedCount = 0;\n for (let i = 0; i < this.termSearchers.length; i++) {\n const result = this.termSearchers[i].searchIn(text);\n const idf = this.idfWeights[i];\n maxPossibleScore += idf;\n if (result.isMatch) {\n matchedCount++;\n weightedScore += idf * (1 - result.score);\n if (result.indices) {\n allIndices.push(...result.indices);\n }\n }\n }\n if (matchedCount === 0) {\n return {\n isMatch: false,\n score: 1\n };\n }\n const normalized = maxPossibleScore > 0 ? 1 - weightedScore / maxPossibleScore : 0;\n const searchResult = {\n isMatch: true,\n score: Math.max(0.001, normalized)\n };\n if (this.options.includeMatches && allIndices.length) {\n searchResult.indices = mergeIndices(allIndices);\n }\n return searchResult;\n }\n}\n\nFuse.version = '7.3.0';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\nFuse.match = function (pattern, text, options) {\n const searcher = createSearcher(pattern, {\n ...Config,\n ...options\n });\n return searcher.searchIn(text);\n};\n{\n Fuse.parseQuery = parse;\n}\n{\n register(ExtendedSearch);\n}\n{\n register(TokenSearch);\n}\nFuse.use = function (...plugins) {\n plugins.forEach(plugin => register(plugin));\n};\n\n// Re-export public types\n\nexport { Fuse as default };\n","import Fuse from 'fuse.js'\n\nconst useCommands = (commands, precision = 0.4) => {\n\tcommands = !!commands\n\t\t? Object.entries(commands)?.reduce((acc, [key, value]) => ({ [key.toLowerCase()]: value }), {})\n\t\t: {}\n\n\tconst triggerCommand = (input) => {\n\t\tconst fuse = new Fuse(Object.keys(commands), { includeScore: true, ignoreLocation: true })\n\t\tconst result = fuse.search(input).filter((r) => r.score < precision)\n\t\tif (!!result?.length) {\n\t\t\tconst key = result[0].item.toLowerCase()\n\t\t\treturn commands[key]?.(input)\n\t\t}\n\t\treturn null\n\t}\n\n\treturn triggerCommand\n}\n\nexport default useCommands\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react'\n\nconst Icon = ({ color = 'black', activeColor = 'red', isActive = false }) => {\n\treturn (\n\t\t<svg\n\t\t\tdata-testid=\"__icon-root__\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t>\n\t\t\t<g>\n\t\t\t\t<path\n\t\t\t\t\tdata-testid=\"__icon-path__\"\n\t\t\t\t\tfill={color}\n\t\t\t\t\td=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\"\n\t\t\t\t/>\n\t\t\t\t{isActive && <circle data-testid=\"__icon-active__\" fill={activeColor} cx=\"16\" cy=\"4\" r=\"4\" />}\n\t\t\t</g>\n\t\t</svg>\n\t)\n}\n\nexport default Icon\n","import React, { cloneElement, isValidElement, useRef, useState } from 'react'\nimport { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'\nimport { isFunction } from '@untemps/utils/function/isFunction'\n\nimport useVocal from '../hooks/useVocal'\nimport useTimeout from '../hooks/useTimeout'\nimport useCommands from '../hooks/useCommands'\n\nimport Icon from './Icon'\n\nconst Vocal = ({\n\tchildren,\n\tcommands = null,\n\tlang = 'en-US',\n\tgrammars = null,\n\ttimeout = 3000,\n\tariaLabel = 'start recognition',\n\tstyle = null,\n\tclassName = null,\n\toutlineStyle = '2px solid',\n\tonStart = null,\n\tonEnd = null,\n\tonSpeechStart = null,\n\tonSpeechEnd = null,\n\tonResult = null,\n\tonError = null,\n\tonNoMatch = null,\n\t__rsInstance,\n}) => {\n\tconst buttonRef = useRef(null)\n\tconst [isListening, setIsListening] = useState(false)\n\n\tconst [, { start, stop, subscribe, unsubscribe }] = useVocal(lang, grammars, __rsInstance)\n\tconst triggerCommand = useCommands(commands)\n\n\tconst _onEnd = (e) => {\n\t\tstopTimer()\n\t\tstopRecognition()\n\t\tunsubscribeAll()\n\t\tonEnd?.(e)\n\t}\n\n\tconst [startTimer, stopTimer] = useTimeout(_onEnd, timeout)\n\n\tconst startRecognition = () => {\n\t\ttry {\n\t\t\tsetIsListening(true)\n\t\t\tsubscribeAll()\n\t\t\tstart()\n\t\t} catch (error) {\n\t\t\t_onError(error)\n\t\t}\n\t}\n\n\tconst stopRecognition = () => {\n\t\ttry {\n\t\t\tsetIsListening(false)\n\t\t\tstop()\n\t\t} catch (error) {\n\t\t\tonError?.(error)\n\t\t}\n\t}\n\n\tconst _onFocus = () => {\n\t\tif (!className && outlineStyle) {\n\t\t\tbuttonRef.current.style.outline = outlineStyle\n\t\t}\n\t}\n\n\tconst _onBlur = () => {\n\t\tif (!className && outlineStyle) {\n\t\t\tbuttonRef.current.style.outline = 'none'\n\t\t}\n\t}\n\n\tconst _onStart = (e) => {\n\t\tstartTimer()\n\t\tonStart?.(e)\n\t}\n\n\tconst _onSpeechStart = (e) => {\n\t\tstopTimer()\n\t\tonSpeechStart?.(e)\n\t}\n\n\tconst _onSpeechEnd = (e) => {\n\t\tstartTimer()\n\t\tonSpeechEnd?.(e)\n\t}\n\n\tconst _onResult = (event, result) => {\n\t\tstopTimer()\n\t\tstopRecognition()\n\t\ttriggerCommand(result)\n\t\tonResult?.(result, event)\n\t}\n\n\tconst _onError = (error) => {\n\t\tstopRecognition()\n\t\tonError?.(error)\n\t}\n\n\tconst _onNoMatch = (e) => {\n\t\tstopTimer()\n\t\tstopRecognition()\n\t\tonNoMatch?.(e)\n\t}\n\n\tconst HANDLERS = {\n\t\tstart: _onStart,\n\t\tend: _onEnd,\n\t\tspeechstart: _onSpeechStart,\n\t\tspeechend: _onSpeechEnd,\n\t\tresult: _onResult,\n\t\terror: _onError,\n\t\tnomatch: _onNoMatch,\n\t}\n\n\tconst subscribeAll = () => Object.entries(HANDLERS).forEach(([event, handler]) => subscribe(event, handler))\n\tconst unsubscribeAll = () => Object.entries(HANDLERS).forEach(([event, handler]) => unsubscribe(event, handler))\n\n\tconst _renderDefault = () => (\n\t\t<button\n\t\t\tdata-testid=\"__vocal-root__\"\n\t\t\tref={buttonRef}\n\t\t\trole=\"button\"\n\t\t\taria-label={ariaLabel}\n\t\t\tstyle={\n\t\t\t\tclassName\n\t\t\t\t\t? null\n\t\t\t\t\t: {\n\t\t\t\t\t\t\twidth: 24,\n\t\t\t\t\t\t\theight: 24,\n\t\t\t\t\t\t\tbackgroundColor: 'transparent', // `background: none` shorthand resets all sub-properties; jsdom 29 + jest-dom v6 don't reflect that correctly via getComputedStyle\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tcursor: !isListening ? 'pointer' : 'default',\n\t\t\t\t\t\t\t...style,\n\t\t\t\t\t }\n\t\t\t}\n\t\t\tclassName={className}\n\t\t\tonFocus={_onFocus}\n\t\t\tonBlur={_onBlur}\n\t\t\tonClick={startRecognition}\n\t\t>\n\t\t\t<Icon isActive={isListening} color=\"#aaa\" />\n\t\t</button>\n\t)\n\n\tconst _renderChildren = () => {\n\t\tif (SpeechRecognitionWrapper.isSupported) {\n\t\t\tif (isFunction(children)) {\n\t\t\t\treturn children(startRecognition, stopRecognition, isListening)\n\t\t\t} else if (isValidElement(children)) {\n\t\t\t\treturn cloneElement(children, {\n\t\t\t\t\t...(!isListening && { onClick: startRecognition }),\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\treturn _renderDefault()\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\treturn _renderChildren()\n}\n\nexport default Vocal\n","import Vocal from './components/Vocal'\nimport { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'\n\nexport { default as useVocal } from './hooks/useVocal'\nexport const isSupported = SpeechRecognitionWrapper.isSupported\n\nexport default Vocal\n"],"x_google_ignoreList":[0,1,4,6,7,8],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","names":["e"],"sources":["../node_modules/@untemps/vocal/dist/index.es.js","../node_modules/@untemps/utils/dist/function/isFunction.js","../src/hooks/useVocal.js","../src/hooks/useTimeout.js","../node_modules/fuse.js/dist/fuse.mjs","../src/hooks/useCommands.js","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/components/Icon.jsx","../src/components/Vocal.jsx","../src/index.js"],"sourcesContent":["var t=function(t,e,r){return t(r={path:e,exports:{},require:function(t,e){return function(){throw new Error(\"Dynamic requires are not currently supported by @rollup/plugin-commonjs\")}(null==e&&r.path)}},r.exports),r.exports}((function(t){var e=function(t){var e=Object.prototype,r=e.hasOwnProperty,n=\"function\"==typeof Symbol?Symbol:{},o=n.iterator||\"@@iterator\",i=n.asyncIterator||\"@@asyncIterator\",a=n.toStringTag||\"@@toStringTag\";function c(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},\"\")}catch(t){c=function(t,e,r){return t[e]=r}}function u(t,e,r,n){var o=e&&e.prototype instanceof f?e:f,i=Object.create(o.prototype),a=new _(n||[]);return i._invoke=function(t,e,r){var n=\"suspendedStart\";return function(o,i){if(\"executing\"===n)throw new Error(\"Generator is already running\");if(\"completed\"===n){if(\"throw\"===o)throw i;return S()}for(r.method=o,r.arg=i;;){var a=r.delegate;if(a){var c=b(a,r);if(c){if(c===l)continue;return c}}if(\"next\"===r.method)r.sent=r._sent=r.arg;else if(\"throw\"===r.method){if(\"suspendedStart\"===n)throw n=\"completed\",r.arg;r.dispatchException(r.arg)}else\"return\"===r.method&&r.abrupt(\"return\",r.arg);n=\"executing\";var u=s(t,e,r);if(\"normal\"===u.type){if(n=r.done?\"completed\":\"suspendedYield\",u.arg===l)continue;return{value:u.arg,done:r.done}}\"throw\"===u.type&&(n=\"completed\",r.method=\"throw\",r.arg=u.arg)}}}(t,r,a),i}function s(t,e,r){try{return{type:\"normal\",arg:t.call(e,r)}}catch(t){return{type:\"throw\",arg:t}}}t.wrap=u;var l={};function f(){}function h(){}function p(){}var v={};v[o]=function(){return this};var y=Object.getPrototypeOf,d=y&&y(y(x([])));d&&d!==e&&r.call(d,o)&&(v=d);var m=p.prototype=f.prototype=Object.create(v);function g(t){[\"next\",\"throw\",\"return\"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){var n;this._invoke=function(o,i){function a(){return new e((function(n,a){!function n(o,i,a,c){var u=s(t[o],t,i);if(\"throw\"!==u.type){var l=u.arg,f=l.value;return f&&\"object\"==typeof f&&r.call(f,\"__await\")?e.resolve(f.__await).then((function(t){n(\"next\",t,a,c)}),(function(t){n(\"throw\",t,a,c)})):e.resolve(f).then((function(t){l.value=t,a(l)}),(function(t){return n(\"throw\",t,a,c)}))}c(u.arg)}(o,i,n,a)}))}return n=n?n.then(a,a):a()}}function b(t,e){var r=t.iterator[e.method];if(void 0===r){if(e.delegate=null,\"throw\"===e.method){if(t.iterator.return&&(e.method=\"return\",e.arg=void 0,b(t,e),\"throw\"===e.method))return l;e.method=\"throw\",e.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return l}var n=s(r,t.iterator,e.arg);if(\"throw\"===n.type)return e.method=\"throw\",e.arg=n.arg,e.delegate=null,l;var o=n.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,\"return\"!==e.method&&(e.method=\"next\",e.arg=void 0),e.delegate=null,l):o:(e.method=\"throw\",e.arg=new TypeError(\"iterator result is not an object\"),e.delegate=null,l)}function E(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type=\"normal\",delete e.arg,t.completion=e}function _(t){this.tryEntries=[{tryLoc:\"root\"}],t.forEach(E,this),this.reset(!0)}function x(t){if(t){var e=t[o];if(e)return e.call(t);if(\"function\"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function e(){for(;++n<t.length;)if(r.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return i.next=i}}return{next:S}}function S(){return{value:void 0,done:!0}}return h.prototype=m.constructor=p,p.constructor=h,h.displayName=c(p,a,\"GeneratorFunction\"),t.isGeneratorFunction=function(t){var e=\"function\"==typeof t&&t.constructor;return!!e&&(e===h||\"GeneratorFunction\"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,p):(t.__proto__=p,c(t,a,\"GeneratorFunction\")),t.prototype=Object.create(m),t},t.awrap=function(t){return{__await:t}},g(w.prototype),w.prototype[i]=function(){return this},t.AsyncIterator=w,t.async=function(e,r,n,o,i){void 0===i&&(i=Promise);var a=new w(u(e,r,n,o),i);return t.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},g(m),c(m,a,\"Generator\"),m[o]=function(){return this},m.toString=function(){return\"[object Generator]\"},t.keys=function(t){var e=[];for(var r in t)e.push(r);return e.reverse(),function r(){for(;e.length;){var n=e.pop();if(n in t)return r.value=n,r.done=!1,r}return r.done=!0,r}},t.values=x,_.prototype={constructor:_,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=void 0,this.tryEntries.forEach(O),!t)for(var e in this)\"t\"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(r,n){return a.type=\"throw\",a.arg=t,e.next=r,n&&(e.method=\"next\",e.arg=void 0),!!n}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],a=i.completion;if(\"root\"===i.tryLoc)return n(\"end\");if(i.tryLoc<=this.prev){var c=r.call(i,\"catchLoc\"),u=r.call(i,\"finallyLoc\");if(c&&u){if(this.prev<i.catchLoc)return n(i.catchLoc,!0);if(this.prev<i.finallyLoc)return n(i.finallyLoc)}else if(c){if(this.prev<i.catchLoc)return n(i.catchLoc,!0)}else{if(!u)throw new Error(\"try statement without catch or finally\");if(this.prev<i.finallyLoc)return n(i.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,\"finallyLoc\")&&this.prev<o.finallyLoc){var i=o;break}}i&&(\"break\"===t||\"continue\"===t)&&i.tryLoc<=e&&e<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=e,i?(this.method=\"next\",this.next=i.finallyLoc,l):this.complete(a)},complete:function(t,e){if(\"throw\"===t.type)throw t.arg;return\"break\"===t.type||\"continue\"===t.type?this.next=t.arg:\"return\"===t.type?(this.rval=this.arg=t.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===t.type&&e&&(this.next=e),l},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),O(r),l}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if(\"throw\"===n.type){var o=n.arg;O(r)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(t,e,r){return this.delegate={iterator:x(t),resultName:e,nextLoc:r},\"next\"===this.method&&(this.arg=void 0),l}},t}(t.exports);try{regeneratorRuntime=e}catch(t){Function(\"r\",\"regeneratorRuntime = r\")(e)}}));function e(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}var r=function(t){return function(){var r=this,n=arguments;return new Promise((function(o,i){var a=t.apply(r,n);function c(t){e(a,o,i,c,u,\"next\",t)}function u(t){e(a,o,i,c,u,\"throw\",t)}c(void 0)}))}};var n=function(t){if(Array.isArray(t))return t};var o=function(t,e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,o=!1,i=void 0;try{for(var a,c=t[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==c.return||c.return()}finally{if(o)throw i}}return r}};var i=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n};var a=function(t,e){if(t){if(\"string\"==typeof t)return i(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return\"Object\"===r&&t.constructor&&(r=t.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(t):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,e):void 0}};var c=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")};var u=function(t,e){return n(t)||o(t,e)||a(t,e)||c()};var s=function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")};function l(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var f=function(t,e,r){return e&&l(t.prototype,e),r&&l(t,r),t};var h=function(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t},p=function(){return!!navigator.permissions},v=function(){return!!navigator.mediaDevices};function y(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}function d(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){y(i,n,o,a,c,\"next\",t)}function c(t){y(i,n,o,a,c,\"throw\",t)}a(void 0)}))}}function m(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,o=!1,i=void 0;try{for(var a,c=t[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==c.return||c.return()}finally{if(o)throw i}}return r}}(t,e)||function(t,e){if(t){if(\"string\"==typeof t)return g(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return\"Object\"===r&&t.constructor&&(r=t.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(t):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?g(t,e):void 0}}(t,e)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function g(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}var w=function(){var t=d(regeneratorRuntime.mark((function t(e){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt(\"return\",new Promise(function(){var t=d(regeneratorRuntime.mark((function t(r,n){var o,i;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p()||n(new DOMException(\"Navigator API: permissions not supported\",\"NOT_SUPPORTED_ERR\")),t.prev=1,t.next=4,navigator.permissions.query({name:e});case 4:o=t.sent,i=function t(e){o.removeEventListener(\"change\",t),b(e.target.state,r,n)},o.addEventListener(\"change\",i),b(o.state,r,n),t.next=13;break;case 10:t.prev=10,t.t0=t.catch(1),n(t.t0);case 13:case\"end\":return t.stop()}}),t,null,[[1,10]])})));return function(e,r){return t.apply(this,arguments)}}()));case 1:case\"end\":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),b=function(t,e,r){switch(t){case\"denied\":r(new DOMException(\"Permission denied\",\"NOT_ALLOWED_ERR\"));break;default:e(t)}},E=function(){var t=d(regeneratorRuntime.mark((function t(e,r){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt(\"return\",new Promise(function(){var t=d(regeneratorRuntime.mark((function t(n,o){var i,a,c;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p()&&v()||o(new DOMException(\"Navigator API: permissions or Navigator API: mediaDevices not supported\",\"NOT_SUPPORTED_ERR\")),t.prev=1,t.t0=Promise,t.next=5,w(e);case 5:return t.t1=t.sent,t.next=8,navigator.mediaDevices.getUserMedia(r);case 8:return t.t2=t.sent,t.t3=[t.t1,t.t2],t.next=12,t.t0.all.call(t.t0,t.t3);case 12:i=t.sent,a=m(i,2),c=a[1],n(c),t.next=21;break;case 18:t.prev=18,t.t4=t.catch(1),o(t.t4);case 21:case\"end\":return t.stop()}}),t,null,[[1,18]])})));return function(e,r){return t.apply(this,arguments)}}()));case 1:case\"end\":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}();function O(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function _(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?O(Object(r),!0).forEach((function(e){h(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):O(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}var x=function(){function e(t){var r=this;s(this,e),h(this,\"_instance\",null),h(this,\"_listeners\",null);var n=e._resolveSpeechRecognition();if(!n)throw new DOMException(\"SpeechRecognition not supported\",\"NOT_SUPPORTED_ERR\");this._instance=new n,this._listeners={},Object.entries(_(_({},e.defaultOptions),t||{})).forEach((function(t){var n=u(t,2),o=n[0],i=n[1];if(\"grammars\"===o&&!i){var a=e._resolveSpeechGrammarList();a&&(i=new a)}r._instance[o]=i}))}var n;return f(e,null,[{key:\"isSupported\",get:function(){return!!e._resolveSpeechRecognition()&&!!p()&&!!v()},set:function(t){throw new Error(\"You cannot set isSupported directly.\")}}]),f(e,[{key:\"start\",value:(n=r(t.mark((function e(){var r;return t.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!this._instance){t.next=14;break}return t.prev=1,t.next=4,E(\"microphone\",{audio:!0});case 4:if(t.sent){t.next=7;break}throw new Error(\"Unable to retrieve the stream from media device\");case 7:this._instance.start(),t.next=14;break;case 10:t.prev=10,t.t0=t.catch(1),(r=this._listeners.error)&&r(t.t0);case 14:return t.abrupt(\"return\",this);case 15:case\"end\":return t.stop()}}),e,this,[[1,10]])}))),function(){return n.apply(this,arguments)})},{key:\"stop\",value:function(){return this._instance&&this._instance.stop(),this}},{key:\"abort\",value:function(){return this._instance&&this._instance.abort(),this}},{key:\"addEventListener\",value:function(t,r){var n=this;if(this._instance&&this._includesEventType(t)){this._listeners[t]&&this.removeEventListener(t);var o=function(o){var i=[];t===e.eventTypes.RESULT&&o.results&&o.results.length>0&&i.push(o.results[0][0].transcript),r&&r.apply(n,[o].concat(i))};this._instance.addEventListener(t,o),this._listeners[t]=o}return this}},{key:\"removeEventListener\",value:function(t){var e=this._listeners[t];return this._instance.removeEventListener(t,e),delete this._listeners[t],this}},{key:\"cleanup\",value:function(){var t=this;return this.stop(),Object.keys(this._listeners).forEach((function(e){return t.removeEventListener(e)})),this._instance=null,this}},{key:\"_includesEventType\",value:function(t){return!!Object.values(e.eventTypes).find((function(e){return e===t}))}},{key:\"instance\",get:function(){return this._instance},set:function(t){throw new Error(\"You cannot set instance directly.\")}}],[{key:\"_resolveSpeechRecognition\",value:function(){return window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.msSpeechRecognition}},{key:\"_resolveSpeechGrammarList\",value:function(){return window.SpeechGrammarList||window.webkitSpeechGrammarList||window.mozSpeechGrammarList||window.msSpeechGrammarList}}]),e}();h(x,\"defaultOptions\",{grammars:null,lang:\"en-US\",continuous:!1,interimResults:!1,maxAlternatives:1,serviceURI:null}),h(x,\"eventTypes\",{AUDIO_END:\"audioend\",AUDIO_START:\"audiostart\",END:\"end\",ERROR:\"error\",NO_MATCH:\"nomatch\",RESULT:\"result\",SOUND_END:\"soundend\",SOUND_START:\"soundstart\",SPEECH_END:\"speechend\",SPEECH_START:\"speechstart\",START:\"start\"});export{x as Vocal};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQHVudGVtcHMvdXNlci1wZXJtaXNzaW9ucy11dGlscy9kaXN0L2luZGV4LmVzLmpzIiwiLi4vc3JjL1ZvY2FsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGluZm8uZG9uZSkge1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICB9XG5cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3I7IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlczsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0OyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheTsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdDsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXRcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0XCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5OyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5OyIsInZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuISFuYXZpZ2F0b3IucGVybWlzc2lvbnN9LHI9ZnVuY3Rpb24oKXtyZXR1cm4hIW5hdmlnYXRvci5tZWRpYURldmljZXN9O2Z1bmN0aW9uIHQoZSxyLHQsbixhLGksbyl7dHJ5e3ZhciB1PWVbaV0obyksYz11LnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIHQoZSl9dS5kb25lP3IoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4obixhKX1mdW5jdGlvbiBuKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihhLGkpe3ZhciBvPWUuYXBwbHkocixuKTtmdW5jdGlvbiB1KGUpe3QobyxhLGksdSxjLFwibmV4dFwiLGUpfWZ1bmN0aW9uIGMoZSl7dChvLGEsaSx1LGMsXCJ0aHJvd1wiLGUpfXUodm9pZCAwKX0pKX19ZnVuY3Rpb24gYShlLHIpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfShlKXx8ZnVuY3Rpb24oZSxyKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKXJldHVybjt2YXIgdD1bXSxuPSEwLGE9ITEsaT12b2lkIDA7dHJ5e2Zvcih2YXIgbyx1PWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEobj0obz11Lm5leHQoKSkuZG9uZSkmJih0LnB1c2goby52YWx1ZSksIXJ8fHQubGVuZ3RoIT09cik7bj0hMCk7fWNhdGNoKGUpe2E9ITAsaT1lfWZpbmFsbHl7dHJ5e258fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYoYSl0aHJvdyBpfX1yZXR1cm4gdH0oZSxyKXx8ZnVuY3Rpb24oZSxyKXtpZighZSlyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpcmV0dXJuIGkoZSxyKTt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PXQmJmUuY29uc3RydWN0b3ImJih0PWUuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PXR8fFwiU2V0XCI9PT10KXJldHVybiBBcnJheS5mcm9tKGUpO2lmKFwiQXJndW1lbnRzXCI9PT10fHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSlyZXR1cm4gaShlLHIpfShlLHIpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gaShlLHIpeyhudWxsPT1yfHxyPmUubGVuZ3RoKSYmKHI9ZS5sZW5ndGgpO2Zvcih2YXIgdD0wLG49bmV3IEFycmF5KHIpO3Q8cjt0Kyspblt0XT1lW3RdO3JldHVybiBufXZhciBvPWZ1bmN0aW9uKCl7dmFyIHI9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gcih0KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIHI9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gcihuLGEpe3ZhciBpLG87cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gZSgpfHxhKG5ldyBET01FeGNlcHRpb24oXCJOYXZpZ2F0b3IgQVBJOiBwZXJtaXNzaW9ucyBub3Qgc3VwcG9ydGVkXCIsXCJOT1RfU1VQUE9SVEVEX0VSUlwiKSksci5wcmV2PTEsci5uZXh0PTQsbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtuYW1lOnR9KTtjYXNlIDQ6aT1yLnNlbnQsbz1mdW5jdGlvbiBlKHIpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLGUpLHUoci50YXJnZXQuc3RhdGUsbixhKX0saS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsbyksdShpLnN0YXRlLG4sYSksci5uZXh0PTEzO2JyZWFrO2Nhc2UgMTA6ci5wcmV2PTEwLHIudDA9ci5jYXRjaCgxKSxhKHIudDApO2Nhc2UgMTM6Y2FzZVwiZW5kXCI6cmV0dXJuIHIuc3RvcCgpfX0pLHIsbnVsbCxbWzEsMTBdXSl9KSkpO3JldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDE6Y2FzZVwiZW5kXCI6cmV0dXJuIHIuc3RvcCgpfX0pLHIpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSx1PWZ1bmN0aW9uKGUscix0KXtzd2l0Y2goZSl7Y2FzZVwiZGVuaWVkXCI6dChuZXcgRE9NRXhjZXB0aW9uKFwiUGVybWlzc2lvbiBkZW5pZWRcIixcIk5PVF9BTExPV0VEX0VSUlwiKSk7YnJlYWs7ZGVmYXVsdDpyKGUpfX0sYz1mdW5jdGlvbigpe3ZhciB0PW4ocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIHQoaSx1KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0LmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIHQ9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gdChuLGMpe3ZhciBzLGYscDtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiBlKCkmJnIoKXx8YyhuZXcgRE9NRXhjZXB0aW9uKFwiTmF2aWdhdG9yIEFQSTogcGVybWlzc2lvbnMgb3IgTmF2aWdhdG9yIEFQSTogbWVkaWFEZXZpY2VzIG5vdCBzdXBwb3J0ZWRcIixcIk5PVF9TVVBQT1JURURfRVJSXCIpKSx0LnByZXY9MSx0LnQwPVByb21pc2UsdC5uZXh0PTUsbyhpKTtjYXNlIDU6cmV0dXJuIHQudDE9dC5zZW50LHQubmV4dD04LG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHUpO2Nhc2UgODpyZXR1cm4gdC50Mj10LnNlbnQsdC50Mz1bdC50MSx0LnQyXSx0Lm5leHQ9MTIsdC50MC5hbGwuY2FsbCh0LnQwLHQudDMpO2Nhc2UgMTI6cz10LnNlbnQsZj1hKHMsMikscD1mWzFdLG4ocCksdC5uZXh0PTIxO2JyZWFrO2Nhc2UgMTg6dC5wcmV2PTE4LHQudDQ9dC5jYXRjaCgxKSxjKHQudDQpO2Nhc2UgMjE6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsbnVsbCxbWzEsMThdXSl9KSkpO3JldHVybiBmdW5jdGlvbihlLHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDE6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpO2V4cG9ydHtvIGFzIGdldFBlcm1pc3Npb24sYyBhcyBnZXRVc2VyTWVkaWFTdHJlYW0sciBhcyBpc05hdmlnYXRvck1lZGlhRGV2aWNlc1N1cHBvcnRlZCxlIGFzIGlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lhVzVrWlhndVpYTXVhbk1pTENKemIzVnlZMlZ6SWpwYklpNHVMM055WXk5cGMwNWhkbWxuWVhSdmNsQmxjbTFwYzNOcGIyNXpVM1Z3Y0c5eWRHVmtMbXB6SWl3aUxpNHZjM0pqTDJselRtRjJhV2RoZEc5eVRXVmthV0ZFWlhacFkyVnpVM1Z3Y0c5eWRHVmtMbXB6SWl3aUxpNHZjM0pqTDJkbGRGQmxjbTFwYzNOcGIyNHVhbk1pTENJdUxpOXpjbU12WjJWMFZYTmxjazFsWkdsaFUzUnlaV0Z0TG1weklsMHNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dRMmhsWTJzZ2QyaGxkR2hsY2lCT1lYWnBaMkYwYjNJZ1FWQkpPaUJ3WlhKdGFYTnphVzl1Y3lCcGN5QnpkWEJ3YjNKMFpXUWdZbmtnZEdobElHTjFjbkpsYm5RZ1luSnZkM05sY2x4dUlDb2dRSEpsZEhWeWJuTWdlMkp2YjJ4bFlXNTlYRzRnS2k5Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUNncElEMCtJQ0VoYm1GMmFXZGhkRzl5TG5CbGNtMXBjM05wYjI1elhHNGlMQ0l2S2lwY2JpQXFJRU5vWldOcklIZG9aWFJvWlhJZ1RtRjJhV2RoZEc5eUlFRlFTVG9nYldWa2FXRkVaWFpwWTJWeklHbHpJSE4xY0hCdmNuUmxaQ0JpZVNCMGFHVWdZM1Z5Y21WdWRDQmljbTkzYzJWeVhHNGdLaUJBY21WMGRYSnVjeUI3WW05dmJHVmhibjFjYmlBcUwxeHVaWGh3YjNKMElHUmxabUYxYkhRZ0tDa2dQVDRnSVNGdVlYWnBaMkYwYjNJdWJXVmthV0ZFWlhacFkyVnpYRzRpTENKcGJYQnZjblFnYVhOT1lYWnBaMkYwYjNKUVpYSnRhWE56YVc5dWMxTjFjSEJ2Y25SbFpDQm1jbTl0SUNjdUwybHpUbUYyYVdkaGRHOXlVR1Z5YldsemMybHZibk5UZFhCd2IzSjBaV1FuWEc1Y2JpOHFLbHh1SUNvZ1VtVjBkWEp1Y3lCaElIQnliMjFwYzJVZ2NtVnpiMngyWldRZ2QyaGxiaUIwYUdVZ2NHVnliV2x6YzJsdmJpQnBjeUJuY21GdWRHVmtJR0o1SUhSb1pTQjFjMlZ5WEc0Z0tpQkFjR0Z5WVcwZ2NHVnliV2x6YzJsdmJrNWhiV1VnSUNBZ0lDQWdJQ0FnSUNCT1lXMWxJRzltSUhSb1pTQndaWEp0YVhOemFXOXVMaUJBYzJWbElHaDBkSEJ6T2k4dmR6TmpMbWRwZEdoMVlpNXBieTl3WlhKdGFYTnphVzl1Y3k4alpXNTFiV1JsWmkxd1pYSnRhWE56YVc5dWJtRnRaVnh1SUNvZ1FISmxkSFZ5Ym5NZ2UxQnliMjFwYzJWOVhHNGdLaTljYm1WNGNHOXlkQ0JrWldaaGRXeDBJR0Z6ZVc1aklDaHdaWEp0YVhOemFXOXVUbUZ0WlNrZ1BUNGdlMXh1WEhSeVpYUjFjbTRnYm1WM0lGQnliMjFwYzJVb1lYTjVibU1nS0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnUFQ0Z2UxeHVYSFJjZEdsbUlDZ2hhWE5PWVhacFoyRjBiM0pRWlhKdGFYTnphVzl1YzFOMWNIQnZjblJsWkNncEtTQjdYRzVjZEZ4MFhIUnlaV3BsWTNRb2JtVjNJRVJQVFVWNFkyVndkR2x2YmlnblRtRjJhV2RoZEc5eUlFRlFTVG9nY0dWeWJXbHpjMmx2Ym5NZ2JtOTBJSE4xY0hCdmNuUmxaQ2NzSUNkT1QxUmZVMVZRVUU5U1ZFVkVYMFZTVWljcEtWeHVYSFJjZEgxY2JseHVYSFJjZEhSeWVTQjdYRzVjZEZ4MFhIUmpiMjV6ZENCd1pYSnRhWE56YVc5dVUzUmhkSFZ6SUQwZ1lYZGhhWFFnYm1GMmFXZGhkRzl5TG5CbGNtMXBjM05wYjI1ekxuRjFaWEo1S0hzZ2JtRnRaVG9nY0dWeWJXbHpjMmx2Yms1aGJXVWdmU2xjYmx4MFhIUmNkR052Ym5OMElHOXVRMmhoYm1kbElEMGdLR1YyWlc1MEtTQTlQaUI3WEc1Y2RGeDBYSFJjZEhCbGNtMXBjM05wYjI1VGRHRjBkWE11Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lnblkyaGhibWRsSnl3Z2IyNURhR0Z1WjJVcFhHNWNkRngwWEhSY2RISmxjMjlzZG1WUGNsSmxhbVZqZEVKaGMyVmtUMjVUZEdGMFpTaGxkbVZ1ZEM1MFlYSm5aWFF1YzNSaGRHVXNJSEpsYzI5c2RtVXNJSEpsYW1WamRDbGNibHgwWEhSY2RIMWNibHgwWEhSY2RIQmxjbTFwYzNOcGIyNVRkR0YwZFhNdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnblkyaGhibWRsSnl3Z2IyNURhR0Z1WjJVcFhHNWNkRngwWEhSeVpYTnZiSFpsVDNKU1pXcGxZM1JDWVhObFpFOXVVM1JoZEdVb2NHVnliV2x6YzJsdmJsTjBZWFIxY3k1emRHRjBaU3dnY21WemIyeDJaU3dnY21WcVpXTjBLVnh1WEhSY2RIMGdZMkYwWTJnZ0tHVnljbTl5S1NCN1hHNWNkRngwWEhSeVpXcGxZM1FvWlhKeWIzSXBYRzVjZEZ4MGZWeHVYSFI5S1Z4dWZWeHVYRzVqYjI1emRDQnlaWE52YkhabFQzSlNaV3BsWTNSQ1lYTmxaRTl1VTNSaGRHVWdQU0FvYzNSaGRHVXNJSEpsYzI5c2RtVXNJSEpsYW1WamRDa2dQVDRnZTF4dVhIUnpkMmwwWTJnZ0tITjBZWFJsS1NCN1hHNWNkRngwWTJGelpTQW5aR1Z1YVdWa0p6cGNibHgwWEhSY2RISmxhbVZqZENodVpYY2dSRTlOUlhoalpYQjBhVzl1S0NkUVpYSnRhWE56YVc5dUlHUmxibWxsWkNjc0lDZE9UMVJmUVV4TVQxZEZSRjlGVWxJbktTbGNibHgwWEhSY2RHSnlaV0ZyWEc1Y2RGeDBaR1ZtWVhWc2REcGNibHgwWEhSY2RISmxjMjlzZG1Vb2MzUmhkR1VwWEc1Y2RIMWNibjFjYmlJc0ltbHRjRzl5ZENCcGMwNWhkbWxuWVhSdmNsQmxjbTFwYzNOcGIyNXpVM1Z3Y0c5eWRHVmtJR1p5YjIwZ0p5NHZhWE5PWVhacFoyRjBiM0pRWlhKdGFYTnphVzl1YzFOMWNIQnZjblJsWkNkY2JtbHRjRzl5ZENCcGMwNWhkbWxuWVhSdmNrMWxaR2xoUkdWMmFXTmxjMU4xY0hCdmNuUmxaQ0JtY205dElDY3VMMmx6VG1GMmFXZGhkRzl5VFdWa2FXRkVaWFpwWTJWelUzVndjRzl5ZEdWa0oxeHVhVzF3YjNKMElHZGxkRkJsY20xcGMzTnBiMjRnWm5KdmJTQW5MaTluWlhSUVpYSnRhWE56YVc5dUoxeHVYRzR2S2lwY2JpQXFJRkpsZEhWeWJuTWdZU0J3Y205dGFYTmxJSEpsYzI5c2RtVmtJSGRvWlc0Z2RHaGxJSEJsY20xcGMzTnBiMjRnYVhNZ1ozSmhiblJsWkNCaWVTQjBhR1VnZFhObGNpQmhibVFnZEdobElITjBjbVZoYlNCcGN5QnlaWFJ5YVdWMlpXUmNiaUFxSUVCd1lYSmhiU0J3WlhKdGFYTnphVzl1VG1GdFpTQWdJQ0FnSUNBZ0lDQWdJRTVoYldVZ2IyWWdkR2hsSUhCbGNtMXBjM05wYjI0dUlFQnpaV1VnYUhSMGNITTZMeTkzTTJNdVoybDBhSFZpTG1sdkwzQmxjbTFwYzNOcGIyNXpMeU5sYm5WdFpHVm1MWEJsY20xcGMzTnBiMjV1WVcxbFhHNGdLaUJBY0dGeVlXMGdiV1ZrYVdGVGRISmxZVzFEYjI1emRISmhhVzUwY3lBZ0lDQkRiMjV6ZEhKaGFXNTBjeUJ2WW1wbFkzUXVJRUJ6WldVZ2FIUjBjSE02THk5a1pYWmxiRzl3WlhJdWJXOTZhV3hzWVM1dmNtY3ZaVzR0VlZNdlpHOWpjeTlYWldJdlFWQkpMMDFsWkdsaFUzUnlaV0Z0UTI5dWMzUnlZV2x1ZEhOY2JpQXFJRUJ5WlhSMWNtNXpJSHRRY205dGFYTmxmVnh1SUNvdlhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCaGMzbHVZeUFvY0dWeWJXbHpjMmx2Yms1aGJXVXNJRzFsWkdsaFUzUnlaV0Z0UTI5dWMzUnlZV2x1ZEhNcElEMCtJSHRjYmx4MGNtVjBkWEp1SUc1bGR5QlFjbTl0YVhObEtHRnplVzVqSUNoeVpYTnZiSFpsTENCeVpXcGxZM1FwSUQwK0lIdGNibHgwWEhScFppQW9JV2x6VG1GMmFXZGhkRzl5VUdWeWJXbHpjMmx2Ym5OVGRYQndiM0owWldRb0tTQjhmQ0FoYVhOT1lYWnBaMkYwYjNKTlpXUnBZVVJsZG1salpYTlRkWEJ3YjNKMFpXUW9LU2tnZTF4dVhIUmNkRngwY21WcVpXTjBLRzVsZHlCRVQwMUZlR05sY0hScGIyNG9KMDVoZG1sbllYUnZjaUJCVUVrNklIQmxjbTFwYzNOcGIyNXpJRzl5SUU1aGRtbG5ZWFJ2Y2lCQlVFazZJRzFsWkdsaFJHVjJhV05sY3lCdWIzUWdjM1Z3Y0c5eWRHVmtKeXdnSjA1UFZGOVRWVkJRVDFKVVJVUmZSVkpTSnlrcFhHNWNkRngwZlZ4dVhHNWNkRngwZEhKNUlIdGNibHgwWEhSY2RHTnZibk4wSUZzc0lITjBjbVZoYlYwZ1BTQmhkMkZwZENCUWNtOXRhWE5sTG1Gc2JDaGJYRzVjZEZ4MFhIUmNkR0YzWVdsMElHZGxkRkJsY20xcGMzTnBiMjRvY0dWeWJXbHpjMmx2Yms1aGJXVXBMRnh1WEhSY2RGeDBYSFJoZDJGcGRDQnVZWFpwWjJGMGIzSXViV1ZrYVdGRVpYWnBZMlZ6TG1kbGRGVnpaWEpOWldScFlTaHRaV1JwWVZOMGNtVmhiVU52Ym5OMGNtRnBiblJ6S1N4Y2JseDBYSFJjZEYwcFhHNWNkRngwWEhSeVpYTnZiSFpsS0hOMGNtVmhiU2xjYmx4MFhIUjlJR05oZEdOb0lDaGxjbkp2Y2lrZ2UxeHVYSFJjZEZ4MGNtVnFaV04wS0dWeWNtOXlLVnh1WEhSY2RIMWNibHgwZlNsY2JuMWNiaUpkTENKdVlXMWxjeUk2V3lKdVlYWnBaMkYwYjNJaUxDSndaWEp0YVhOemFXOXVjeUlzSW0xbFpHbGhSR1YyYVdObGN5SXNJbkJsY20xcGMzTnBiMjVPWVcxbElpd2lVSEp2YldselpTSXNJbkpsYzI5c2RtVWlMQ0p5WldwbFkzUWlMQ0pwYzA1aGRtbG5ZWFJ2Y2xCbGNtMXBjM05wYjI1elUzVndjRzl5ZEdWa0lpd2lSRTlOUlhoalpYQjBhVzl1SWl3aWNYVmxjbmtpTENKdVlXMWxJaXdpY0dWeWJXbHpjMmx2YmxOMFlYUjFjeUlzSW05dVEyaGhibWRsSWl3aVpYWmxiblFpTENKeVpXMXZkbVZGZG1WdWRFeHBjM1JsYm1WeUlpd2ljbVZ6YjJ4MlpVOXlVbVZxWldOMFFtRnpaV1JQYmxOMFlYUmxJaXdpZEdGeVoyVjBJaXdpYzNSaGRHVWlMQ0poWkdSRmRtVnVkRXhwYzNSbGJtVnlJaXdpYldWa2FXRlRkSEpsWVcxRGIyNXpkSEpoYVc1MGN5SXNJbWx6VG1GMmFXZGhkRzl5VFdWa2FXRkVaWFpwWTJWelUzVndjRzl5ZEdWa0lpd2laMlYwVUdWeWJXbHpjMmx2YmlJc0ltZGxkRlZ6WlhKTlpXUnBZU0lzSW1Gc2JDSXNJbk4wY21WaGJTSmRMQ0p0WVhCd2FXNW5jeUk2SWtGQlNVRXNlVUpCUVhWQ1FTeFZRVUZWUXl4clEwTkJWa1FzVlVGQlZVVXNhWGhEUTBkcVF5eHJSRUZCWlN4WFFVRlBReXcwUjBGRFpDeEpRVUZKUXl4dlJFRkJVU3hYUVVGUFF5eEZRVUZUUXl4clIwRkROMEpETEV0QlEwcEVMRVZCUVU4c1NVRkJTVVVzWVVGQllTd3lRMEZCTkVNc2QwTkJTWEpEVWl4VlFVRlZReXhaUVVGWlVTeE5RVUZOTEVOQlFVVkRMRXRCUVUxUUxGZEJRVGRFVVN4VFFVTkJReXhGUVVGWExGTkJRVmhCTEVWQlFWbERMRWRCUTJwQ1JpeEZRVUZwUWtjc2IwSkJRVzlDTEZOQlFWVkdMRWRCUXk5RFJ5eEZRVUUwUWtZc1JVRkJUVWNzVDBGQlQwTXNUVUZCVDFvc1JVRkJVME1zU1VGRk1VUkxMRVZCUVdsQ1R5eHBRa0ZCYVVJc1UwRkJWVTRzUjBGRE5VTkhMRVZCUVRSQ1NpeEZRVUZwUWswc1RVRkJUMW9zUlVGQlUwTXNjVVJCUlRkRVFTdzJUa0ZMUjFNc1JVRkJPRUlzVTBGQlEwVXNSVUZCVDFvc1JVRkJVME1zVlVGRE5VTlhMRTlCUTBZc1UwRkRTbGdzUlVGQlR5eEpRVUZKUlN4aFFVRmhMRzlDUVVGeFFpeHJRMEZITjBOSUxFVkJRVkZaTEcxRVEzWkNTU3hYUVVGUFpDeEZRVUZuUW1kQ0xEUkhRVU01UWl4SlFVRkpaaXh2UkVGQlVTeFhRVUZQUXl4RlFVRlRReXh2UjBGRE4wSkRMRXRCUVhORFlTeExRVU14UTJRc1JVRkJUeXhKUVVGSlJTeGhRVUZoTERCRlFVRXlSU3h2UTBGSk1VVktMR2xDUVVOc1FtbENMRVZCUVdOc1FpeHpRMEZEWkVnc1ZVRkJWVVVzWVVGQllXOUNMR0ZCUVdGSUxEWkVRVVpXU1N3NFEwRkJlRUpETEU5QlNWUnVRaXhGUVVGUmJVSXNjVVJCUlZKc1FpSjlcbiIsImltcG9ydCB7IGlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWQsIGlzTmF2aWdhdG9yTWVkaWFEZXZpY2VzU3VwcG9ydGVkLCBnZXRVc2VyTWVkaWFTdHJlYW0gfSBmcm9tICdAdW50ZW1wcy91c2VyLXBlcm1pc3Npb25zLXV0aWxzJ1xuXG5jbGFzcyBWb2NhbCB7XG5cdHN0YXRpYyBkZWZhdWx0T3B0aW9ucyA9IHtcblx0XHRncmFtbWFyczogbnVsbCxcblx0XHRsYW5nOiAnZW4tVVMnLFxuXHRcdGNvbnRpbnVvdXM6IGZhbHNlLFxuXHRcdGludGVyaW1SZXN1bHRzOiBmYWxzZSxcblx0XHRtYXhBbHRlcm5hdGl2ZXM6IDEsXG5cdFx0c2VydmljZVVSSTogbnVsbCxcblx0fVxuXG5cdHN0YXRpYyBldmVudFR5cGVzID0ge1xuXHRcdEFVRElPX0VORDogJ2F1ZGlvZW5kJyxcblx0XHRBVURJT19TVEFSVDogJ2F1ZGlvc3RhcnQnLFxuXHRcdEVORDogJ2VuZCcsXG5cdFx0RVJST1I6ICdlcnJvcicsXG5cdFx0Tk9fTUFUQ0g6ICdub21hdGNoJyxcblx0XHRSRVNVTFQ6ICdyZXN1bHQnLFxuXHRcdFNPVU5EX0VORDogJ3NvdW5kZW5kJyxcblx0XHRTT1VORF9TVEFSVDogJ3NvdW5kc3RhcnQnLFxuXHRcdFNQRUVDSF9FTkQ6ICdzcGVlY2hlbmQnLFxuXHRcdFNQRUVDSF9TVEFSVDogJ3NwZWVjaHN0YXJ0Jyxcblx0XHRTVEFSVDogJ3N0YXJ0Jyxcblx0fVxuXG5cdHN0YXRpYyBnZXQgaXNTdXBwb3J0ZWQoKSB7XG5cdFx0cmV0dXJuICEhVm9jYWwuX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbigpICYmICEhaXNOYXZpZ2F0b3JQZXJtaXNzaW9uc1N1cHBvcnRlZCgpICYmICEhaXNOYXZpZ2F0b3JNZWRpYURldmljZXNTdXBwb3J0ZWQoKVxuXHR9XG5cblx0c3RhdGljIHNldCBpc1N1cHBvcnRlZChfKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNldCBpc1N1cHBvcnRlZCBkaXJlY3RseS4nKVxuXHR9XG5cblx0X2luc3RhbmNlID0gbnVsbFxuXHRfbGlzdGVuZXJzID0gbnVsbFxuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRjb25zdCBTcGVlY2hSZWNvZ25pdGlvbiA9IFZvY2FsLl9yZXNvbHZlU3BlZWNoUmVjb2duaXRpb24oKVxuXHRcdGlmICghU3BlZWNoUmVjb2duaXRpb24pIHtcblx0XHRcdHRocm93IG5ldyBET01FeGNlcHRpb24oJ1NwZWVjaFJlY29nbml0aW9uIG5vdCBzdXBwb3J0ZWQnLCAnTk9UX1NVUFBPUlRFRF9FUlInKVxuXHRcdH1cblxuXHRcdHRoaXMuX2luc3RhbmNlID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKClcblx0XHR0aGlzLl9saXN0ZW5lcnMgPSB7fVxuXG5cdFx0T2JqZWN0LmVudHJpZXMoe1xuXHRcdFx0Li4uVm9jYWwuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHQuLi4ob3B0aW9ucyB8fCB7fSksXG5cdFx0fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRpZiAoa2V5ID09PSAnZ3JhbW1hcnMnICYmICF2YWx1ZSkge1xuXHRcdFx0XHRjb25zdCBTcGVlY2hHcmFtbWFyTGlzdCA9IFZvY2FsLl9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QoKVxuXHRcdFx0XHRpZiAoISFTcGVlY2hHcmFtbWFyTGlzdCkge1xuXHRcdFx0XHRcdHZhbHVlID0gbmV3IFNwZWVjaEdyYW1tYXJMaXN0KClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5faW5zdGFuY2Vba2V5XSA9IHZhbHVlXG5cdFx0fSlcblx0fVxuXG5cdGdldCBpbnN0YW5jZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5faW5zdGFuY2Vcblx0fVxuXG5cdHNldCBpbnN0YW5jZShfKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNldCBpbnN0YW5jZSBkaXJlY3RseS4nKVxuXHR9XG5cblx0YXN5bmMgc3RhcnQoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHN0cmVhbSA9IGF3YWl0IGdldFVzZXJNZWRpYVN0cmVhbSgnbWljcm9waG9uZScsIHsgYXVkaW86IHRydWUgfSlcblx0XHRcdFx0aWYgKCFzdHJlYW0pIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXRyaWV2ZSB0aGUgc3RyZWFtIGZyb20gbWVkaWEgZGV2aWNlJylcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9pbnN0YW5jZS5zdGFydCgpXG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvckhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnMuZXJyb3Jcblx0XHRcdFx0aWYgKCEhZXJyb3JIYW5kbGVyKSB7XG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyKGVycm9yKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdHN0b3AoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRoaXMuX2luc3RhbmNlLnN0b3AoKVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRhYm9ydCgpIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSkge1xuXHRcdFx0dGhpcy5faW5zdGFuY2UuYWJvcnQoKVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSAmJiB0aGlzLl9pbmNsdWRlc0V2ZW50VHlwZShldmVudFR5cGUpKSB7XG5cdFx0XHRpZiAoISF0aGlzLl9saXN0ZW5lcnNbZXZlbnRUeXBlXSkge1xuXHRcdFx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGxldCBhZGRpdGlvbmFsQXJncyA9IFtdXG5cdFx0XHRcdGlmIChldmVudFR5cGUgPT09IFZvY2FsLmV2ZW50VHlwZXMuUkVTVUxUKSB7XG5cdFx0XHRcdFx0aWYgKCEhZXZlbnQucmVzdWx0cyAmJiBldmVudC5yZXN1bHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFkZGl0aW9uYWxBcmdzLnB1c2goZXZlbnQucmVzdWx0c1swXVswXS50cmFuc2NyaXB0KVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCEhY2FsbGJhY2sgJiYgY2FsbGJhY2suYXBwbHkodGhpcywgW2V2ZW50LCAuLi5hZGRpdGlvbmFsQXJnc10pXG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlcilcblxuXHRcdFx0dGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV0gPSBoYW5kbGVyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKSB7XG5cdFx0Y29uc3QgaGFuZGxlciA9IHRoaXMuX2xpc3RlbmVyc1tldmVudFR5cGVdXG5cdFx0dGhpcy5faW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIpXG5cblx0XHRkZWxldGUgdGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRjbGVhbnVwKCkge1xuXHRcdHRoaXMuc3RvcCgpXG5cblx0XHRPYmplY3Qua2V5cyh0aGlzLl9saXN0ZW5lcnMpLmZvckVhY2goKGtleSkgPT4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGtleSkpXG5cdFx0dGhpcy5faW5zdGFuY2UgPSBudWxsXG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0X2luY2x1ZGVzRXZlbnRUeXBlKGV2ZW50VHlwZSkge1xuXHRcdHJldHVybiAhIU9iamVjdC52YWx1ZXMoVm9jYWwuZXZlbnRUeXBlcykuZmluZCgodHlwZSkgPT4gdHlwZSA9PT0gZXZlbnRUeXBlKVxuXHR9XG5cblx0c3RhdGljIF9yZXNvbHZlU3BlZWNoUmVjb2duaXRpb24oKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5TcGVlY2hSZWNvZ25pdGlvbiB8fFxuXHRcdFx0d2luZG93LndlYmtpdFNwZWVjaFJlY29nbml0aW9uIHx8XG5cdFx0XHR3aW5kb3cubW96U3BlZWNoUmVjb2duaXRpb24gfHxcblx0XHRcdHdpbmRvdy5tc1NwZWVjaFJlY29nbml0aW9uXG5cdFx0KVxuXHR9XG5cblx0c3RhdGljIF9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5TcGVlY2hHcmFtbWFyTGlzdCB8fFxuXHRcdFx0d2luZG93LndlYmtpdFNwZWVjaEdyYW1tYXJMaXN0IHx8XG5cdFx0XHR3aW5kb3cubW96U3BlZWNoR3JhbW1hckxpc3QgfHxcblx0XHRcdHdpbmRvdy5tc1NwZWVjaEdyYW1tYXJMaXN0XG5cdFx0KVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZvY2FsXG4iXSwibmFtZXMiOlsicnVudGltZSIsImV4cG9ydHMiLCJPcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093biIsImhhc093blByb3BlcnR5IiwiJFN5bWJvbCIsIlN5bWJvbCIsIml0ZXJhdG9yU3ltYm9sIiwiaXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJvYmoiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIl9pbnZva2UiLCJzdGF0ZSIsIm1ldGhvZCIsImFyZyIsIkVycm9yIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwiQ29udGludWVTZW50aW5lbCIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwicmVjb3JkIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiZG9uZSIsIm1ha2VJbnZva2VNZXRob2QiLCJmbiIsImNhbGwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJ0aGlzIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJyZXNvbHZlIiwicmVqZWN0IiwiaW52b2tlIiwicmVzdWx0IiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInVuZGVmaW5lZCIsIlR5cGVFcnJvciIsImluZm8iLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImxlbmd0aCIsImkiLCJjb25zdHJ1Y3RvciIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJpdGVyIiwidG9TdHJpbmciLCJrZXlzIiwib2JqZWN0IiwicmV2ZXJzZSIsInBvcCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsImNhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsIm1vZHVsZSIsInJlZ2VuZXJhdG9yUnVudGltZSIsImFjY2lkZW50YWxTdHJpY3RNb2RlIiwiRnVuY3Rpb24iLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJfbmV4dCIsIl90aHJvdyIsImFyZ3MiLCJhcmd1bWVudHMiLCJhcHBseSIsImFyciIsIkFycmF5IiwiaXNBcnJheSIsIl9hcnIiLCJfbiIsIl9kIiwiX2UiLCJfcyIsIl9pIiwibGVuIiwiYXJyMiIsIm8iLCJtaW5MZW4iLCJhcnJheUxpa2VUb0FycmF5IiwibiIsImZyb20iLCJ0ZXN0IiwiYXJyYXlXaXRoSG9sZXMiLCJpdGVyYWJsZVRvQXJyYXlMaW1pdCIsInVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5Iiwibm9uSXRlcmFibGVSZXN0IiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwidGFyZ2V0IiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiZSIsIm5hdmlnYXRvciIsInBlcm1pc3Npb25zIiwiciIsIm1lZGlhRGV2aWNlcyIsInQiLCJhIiwidSIsImMiLCJyZXR1cm4iLCJET01FeGNlcHRpb24iLCJxdWVyeSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwidDAiLCJzIiwiZiIsInAiLCJ0MSIsImdldFVzZXJNZWRpYSIsInQyIiwidDMiLCJhbGwiLCJ0NCIsIlZvY2FsIiwib3B0aW9ucyIsIlNwZWVjaFJlY29nbml0aW9uIiwiX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbiIsIl9pbnN0YW5jZSIsIl9saXN0ZW5lcnMiLCJlbnRyaWVzIiwiZGVmYXVsdE9wdGlvbnMiLCJTcGVlY2hHcmFtbWFyTGlzdCIsIl9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QiLCJfdGhpcyIsImlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWQiLCJpc05hdmlnYXRvck1lZGlhRGV2aWNlc1N1cHBvcnRlZCIsIl8iLCJnZXRVc2VyTWVkaWFTdHJlYW0iLCJhdWRpbyIsInN0YXJ0IiwiZXJyb3JIYW5kbGVyIiwiYWJvcnQiLCJldmVudFR5cGUiLCJjYWxsYmFjayIsIl9pbmNsdWRlc0V2ZW50VHlwZSIsImhhbmRsZXIiLCJldmVudCIsImFkZGl0aW9uYWxBcmdzIiwiZXZlbnRUeXBlcyIsIlJFU1VMVCIsInJlc3VsdHMiLCJ0cmFuc2NyaXB0IiwiX3RoaXMyIiwiX3RoaXMzIiwiZmluZCIsIndpbmRvdyIsIndlYmtpdFNwZWVjaFJlY29nbml0aW9uIiwibW96U3BlZWNoUmVjb2duaXRpb24iLCJtc1NwZWVjaFJlY29nbml0aW9uIiwid2Via2l0U3BlZWNoR3JhbW1hckxpc3QiLCJtb3pTcGVlY2hHcmFtbWFyTGlzdCIsIm1zU3BlZWNoR3JhbW1hckxpc3QiLCJncmFtbWFycyIsImxhbmciLCJjb250aW51b3VzIiwiaW50ZXJpbVJlc3VsdHMiLCJtYXhBbHRlcm5hdGl2ZXMiLCJzZXJ2aWNlVVJJIiwiQVVESU9fRU5EIiwiQVVESU9fU1RBUlQiLCJFTkQiLCJFUlJPUiIsIk5PX01BVENIIiwiU09VTkRfRU5EIiwiU09VTkRfU1RBUlQiLCJTUEVFQ0hfRU5EIiwiU1BFRUNIX1NUQVJUIiwiU1RBUlQiXSwibWFwcGluZ3MiOiI4T0FPQSxJQUFJQSxFQUFXLFNBQVVDLEdBR3ZCLElBQUlDLEVBQUtDLE9BQU9DLFVBQ1pDLEVBQVNILEVBQUdJLGVBRVpDLEVBQTRCLG1CQUFYQyxPQUF3QkEsT0FBUyxHQUNsREMs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\n","//#region src/function/isFunction.ts\nvar e = (e) => typeof e == \"function\";\n//#endregion\nexport { e as isFunction };\n","import { useCallback, useEffect, useRef } from 'react'\nimport { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'\n\nconst useVocal = (lang = 'en-US', grammars = null, __rsInstance = null) => {\n\tconst ref = useRef(null)\n\n\tuseEffect(() => {\n\t\tif (SpeechRecognitionWrapper.isSupported) {\n\t\t\tref.current = __rsInstance || new SpeechRecognitionWrapper({ lang, grammars })\n\t\t\treturn () => {\n\t\t\t\tref.current.abort()\n\t\t\t\tref.current.cleanup()\n\t\t\t}\n\t\t}\n\t}, [lang, grammars, __rsInstance])\n\n\tconst start = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.start()\n\t\t}\n\t}, [])\n\n\tconst stop = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.stop()\n\t\t}\n\t}, [])\n\n\tconst abort = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.abort()\n\t\t}\n\t}, [])\n\n\tconst subscribe = useCallback((eventType, handler) => {\n\t\tif (ref.current) {\n\t\t\tref.current.addEventListener(eventType, handler)\n\t\t}\n\t}, [])\n\n\tconst unsubscribe = useCallback((eventType, handler) => {\n\t\tif (ref.current) {\n\t\t\tref.current.removeEventListener(eventType, handler)\n\t\t}\n\t}, [])\n\n\tconst clean = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.cleanup()\n\t\t}\n\t}, [])\n\n\treturn [ref, { start, stop, abort, subscribe, unsubscribe, clean }]\n}\n\nexport default useVocal\n","import { useCallback, useEffect, useRef } from 'react'\n\nconst useTimeout = (handler, timeout = 0) => {\n\tconst ref = useRef(-1)\n\n\tconst stop = useCallback(() => {\n\t\tclearTimeout(ref.current)\n\t\tref.current = -1\n\t}, [])\n\n\tconst start = useCallback(() => {\n\t\tstop()\n\t\tref.current = setTimeout(handler, timeout)\n\t}, [handler, timeout, stop])\n\n\tuseEffect(() => stop, [stop])\n\n\treturn [start, stop]\n}\n\nexport default useTimeout\n","/**\n * Fuse.js v7.3.0 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2026 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray ? getTag(value) === '[object Array]' : Array.isArray(value);\n}\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (typeof value === 'bigint') {\n return value.toString();\n }\n const result = value + '';\n return result == '0' && 1 / value == -Infinity ? '-0' : result;\n}\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\nfunction isString(value) {\n return typeof value === 'string';\n}\nfunction isNumber(value) {\n return typeof value === 'number';\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return value === true || value === false || isObjectLike(value) && getTag(value) == '[object Boolean]';\n}\nfunction isObject(value) {\n return typeof value === 'object';\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null;\n}\nfunction isDefined(value) {\n return value !== undefined && value !== null;\n}\nfunction isBlank(value) {\n return !value.trim().length;\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null ? value === undefined ? '[object Undefined]' : '[object Null]' : Object.prototype.toString.call(value);\n}\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = key => `Invalid value for key ${key}`;\nconst PATTERN_LENGTH_TOO_LARGE = max => `Pattern length exceeds max of ${max}.`;\nconst MISSING_KEY_PROPERTY = name => `Missing ${name} property in key`;\nconst INVALID_KEY_WEIGHT_VALUE = key => `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n let totalWeight = 0;\n keys.forEach(key => {\n const obj = createKey(key);\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach(key => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId];\n }\n keys() {\n return this._keys;\n }\n toJSON() {\n return JSON.stringify(this._keys);\n }\n}\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'));\n }\n const name = key.name;\n src = name;\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name));\n }\n }\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n return {\n path: path,\n id: id,\n weight,\n src: src,\n getFn\n };\n}\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.');\n}\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key;\n}\n\nfunction get(obj, path) {\n const list = [];\n let arr = false;\n const deepGet = (obj, path, index, arrayIndex) => {\n if (!isDefined(obj)) {\n return;\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(arrayIndex !== undefined ? {\n v: obj,\n i: arrayIndex\n } : obj);\n } else {\n const key = path[index];\n const value = obj[key];\n if (!isDefined(value)) {\n return;\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (index === path.length - 1 && (isString(value) || isNumber(value) || isBoolean(value) || typeof value === 'bigint')) {\n list.push(arrayIndex !== undefined ? {\n v: toString(value),\n i: arrayIndex\n } : toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1, i);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1, arrayIndex);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n return arr ? list : list[0];\n}\n\nconst MatchOptions = {\n includeMatches: false,\n findAllMatches: false,\n minMatchCharLength: 1\n};\nconst BasicOptions = {\n isCaseSensitive: false,\n ignoreDiacritics: false,\n includeScore: false,\n keys: [],\n shouldSort: true,\n sortFn: (a, b) => a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1\n};\nconst FuzzyOptions = {\n location: 0,\n threshold: 0.6,\n distance: 100\n};\nconst AdvancedOptions = {\n useExtendedSearch: false,\n useTokenSearch: false,\n getFn: get,\n ignoreLocation: false,\n ignoreFieldNorm: false,\n fieldNormWeight: 1\n};\nconst Config = Object.freeze({\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n});\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n if (cache.has(numTokens)) {\n return cache.get(numTokens);\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n cache.set(numTokens, n);\n return n;\n },\n clear() {\n cache.clear();\n }\n };\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n this.docs = [];\n this.keys = [];\n this._keysMap = {};\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return;\n }\n this.isCreated = true;\n\n // List is Array<String>\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array<Object>\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n // Removes docs at the specified indices (must be sorted ascending)\n removeAll(indices) {\n // Remove in reverse order to avoid index shifting during splice\n for (let i = indices.length - 1; i >= 0; i -= 1) {\n this.records.splice(indices[i], 1);\n }\n // Single re-index pass\n for (let i = 0, len = this.records.length; i < len; i += 1) {\n this.records[i].i = i;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]];\n }\n size() {\n return this.records.length;\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return;\n }\n const record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n const record = {\n i: docIndex,\n $: {}\n };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n const value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n if (!isDefined(value)) {\n return;\n }\n if (isArray(value)) {\n const subRecords = [];\n for (let i = 0, len = value.length; i < len; i += 1) {\n const item = value[i];\n if (!isDefined(item)) {\n continue;\n }\n if (isString(item)) {\n // Custom getFn returning plain string array (backward compat)\n if (!isBlank(item)) {\n const subRecord = {\n v: item,\n i: i,\n n: this.norm.get(item)\n };\n subRecords.push(subRecord);\n }\n } else if (isDefined(item.v)) {\n // Default get() returns {v, i} objects with original array indices\n const text = isString(item.v) ? item.v : toString(item.v);\n if (!isBlank(text)) {\n const subRecord = {\n v: text,\n i: item.i,\n n: this.norm.get(text)\n };\n subRecords.push(subRecord);\n }\n }\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n const subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n record.$[keyIndex] = subRecord;\n }\n });\n this.records.push(record);\n }\n toJSON() {\n return {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n keys: this.keys.map(({\n getFn,\n ...key\n }) => key),\n records: this.records\n };\n }\n}\nfunction createIndex(keys, docs, {\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n} = {}) {\n const myIndex = new FuseIndex({\n getFn,\n fieldNormWeight\n });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex;\n}\nfunction parseIndex(data, {\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n} = {}) {\n const {\n keys,\n records\n } = data;\n const myIndex = new FuseIndex({\n getFn,\n fieldNormWeight\n });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex;\n}\n\nfunction convertMaskToIndices(matchmask = [], minMatchCharLength = Config.minMatchCharLength) {\n const indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n for (let len = matchmask.length; i < len; i += 1) {\n const match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n return indices;\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(text, pattern, patternAlphabet, {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n} = {}) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS));\n }\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Inlined score computation — avoids object allocation per call in hot loops.\n // See ./computeScore.ts for the documented version of this formula.\n const calcScore = (errors, currentLocation) => {\n const accuracy = errors / patternLen;\n if (ignoreLocation) return accuracy;\n const proximity = Math.abs(expectedLocation - currentLocation);\n if (!distance) return proximity ? 1.0 : accuracy;\n return accuracy + proximity / distance;\n };\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n const score = calcScore(0, index);\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n const mask = 1 << patternLen - 1;\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n while (binMin < binMid) {\n const score = calcScore(i, expectedLocation + binMid);\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n let start = Math.max(1, expectedLocation - binMid + 1);\n const finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n const bitArr = Array(finish + 2);\n bitArr[finish + 1] = (1 << i) - 1;\n for (let j = finish; j >= start; j -= 1) {\n const currentLocation = j - 1;\n const charMatch = patternAlphabet[text[currentLocation]];\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1];\n }\n if (bitArr[j] & mask) {\n finalScore = calcScore(i, currentLocation);\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break;\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = calcScore(i + 1, expectedLocation);\n if (score > currentThreshold) {\n break;\n }\n lastBitArr = bitArr;\n }\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n return result;\n}\n\nfunction createPatternAlphabet(pattern) {\n const mask = {};\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | 1 << len - i - 1;\n }\n return mask;\n}\n\nfunction mergeIndices(indices) {\n if (indices.length <= 1) return indices;\n indices.sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n const merged = [indices[0]];\n for (let i = 1, len = indices.length; i < len; i += 1) {\n const last = merged[merged.length - 1];\n const curr = indices[i];\n if (curr[0] <= last[1] + 1) {\n last[1] = Math.max(last[1], curr[1]);\n } else {\n merged.push(curr);\n }\n }\n return merged;\n}\n\n// Characters that survive NFD normalization unchanged and need explicit mapping\nconst NON_DECOMPOSABLE_MAP = {\n '\\u0142': 'l',\n // ł\n '\\u0141': 'L',\n // Ł\n '\\u0111': 'd',\n // đ\n '\\u0110': 'D',\n // Đ\n '\\u00F8': 'o',\n // ø\n '\\u00D8': 'O',\n // Ø\n '\\u0127': 'h',\n // ħ\n '\\u0126': 'H',\n // Ħ\n '\\u0167': 't',\n // ŧ\n '\\u0166': 'T',\n // Ŧ\n '\\u0131': 'i',\n // ı\n '\\u00DF': 'ss' // ß\n};\nconst NON_DECOMPOSABLE_RE = new RegExp('[' + Object.keys(NON_DECOMPOSABLE_MAP).join('') + ']', 'g');\nconst stripDiacritics = String.prototype.normalize ? str => str.normalize('NFD').replace(/[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u07FD\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D3-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u09FE\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0AFA-\\u0AFF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C04\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D00-\\u0D03\\u0D3B\\u0D3C\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF7-\\u1CF9\\u1DC0-\\u1DF9\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA8FF\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F]/g, '').replace(NON_DECOMPOSABLE_RE, ch => NON_DECOMPOSABLE_MAP[ch]) : str => str;\n\nclass BitapSearch {\n constructor(pattern, {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n };\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n this.chunks = [];\n if (!this.pattern.length) {\n return;\n }\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n const len = this.pattern.length;\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n searchIn(text) {\n const {\n isCaseSensitive,\n ignoreDiacritics,\n includeMatches\n } = this.options;\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n\n // Exact match\n if (this.pattern === text) {\n const result = {\n isMatch: true,\n score: 0\n };\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n return result;\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n const allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n this.chunks.forEach(({\n pattern,\n alphabet,\n startIndex\n }) => {\n const {\n isMatch,\n score,\n indices\n } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n if (isMatch) {\n hasMatches = true;\n }\n totalScore += score;\n if (isMatch && indices) {\n allIndices.push(...indices);\n }\n });\n const result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n if (hasMatches && includeMatches) {\n result.indices = mergeIndices(allIndices);\n }\n return result;\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex);\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex);\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n search(_text) {\n return {\n isMatch: false,\n score: 1\n };\n }\n}\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null;\n}\n\n// Token: 'file\n// Match type: exact-match\n// Description: Items that are `file`\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact';\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^=(.*)$/;\n }\n search(text) {\n const isMatch = text === this.pattern;\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n };\n }\n}\n\n// Token: !fire\n// Match type: inverse-exact-match\n// Description: Items that do not include `fire`\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact';\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^!(.*)$/;\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n };\n }\n}\n\n// Token: ^file\n// Match type: prefix-exact-match\n// Description: Items that start with `file`\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact';\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^\\^(.*)$/;\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n };\n }\n}\n\n// Token: !^fire\n// Match type: inverse-prefix-exact-match\n// Description: Items that do not start with `fire`\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact';\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^!\\^(.*)$/;\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n };\n }\n}\n\n// Token: .file$\n// Match type: suffix-exact-match\n// Description: Items that end with `.file`\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact';\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/;\n }\n static get singleRegex() {\n return /^(.*)\\$$/;\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n };\n }\n}\n\n// Token: !.file$\n// Match type: inverse-suffix-exact-match\n// Description: Items that do not end with `.file`\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact';\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/;\n }\n static get singleRegex() {\n return /^!(.*)\\$$/;\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n };\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(pattern, {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n ignoreLocation = Config.ignoreLocation\n } = {}) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreDiacritics,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy';\n }\n static get multiRegex() {\n return /^\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^(.*)$/;\n }\n search(text) {\n return this._bitapSearch.searchIn(text);\n }\n}\n\n// Token: 'file\n// Match type: include-match\n// Description: Items that include `file`\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include';\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/;\n }\n static get singleRegex() {\n return /^'(.*)$/;\n }\n search(text) {\n let location = 0;\n let index;\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n const isMatch = !!indices.length;\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n };\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [ExactMatch, IncludeMatch, PrefixExactMatch, InversePrefixExactMatch, InverseSuffixExactMatch, SuffixExactMatch, InverseExactMatch, FuzzyMatch];\nconst searchersLen = searchers.length;\nconst ESCAPED_PIPE = '\\u0000'; // placeholder for escaped \\|\nconst OR_TOKEN = '|';\n\n// Tokenize a query string into individual search terms.\n// Respects multi-match quoted tokens like =\"said \"test\"\" or ^\"hello world\"$\n// where inner spaces and quotes are part of the token.\nfunction tokenize(pattern) {\n const tokens = [];\n const len = pattern.length;\n let i = 0;\n while (i < len) {\n // Skip spaces\n while (i < len && pattern[i] === ' ') i++;\n if (i >= len) break;\n\n // Scan past prefix characters (=, !, ^, ') to see if a quote follows\n let j = i;\n while (j < len && pattern[j] !== ' ' && pattern[j] !== '\"') j++;\n if (j < len && pattern[j] === '\"') {\n // Multi-match token: prefix + \"content\" (possibly with inner quotes)\n // Find the closing \" that ends this token:\n // it must be followed by optional $, then space or end-of-string\n j++; // skip opening quote\n while (j < len) {\n if (pattern[j] === '\"') {\n // Check if this is the closing quote\n const next = j + 1;\n if (next >= len || pattern[next] === ' ') {\n j++; // include closing quote\n break;\n }\n if (pattern[next] === '$' && (next + 1 >= len || pattern[next + 1] === ' ')) {\n j += 2; // include \"$\n break;\n }\n }\n j++;\n }\n tokens.push(pattern.substring(i, j));\n i = j;\n } else {\n // Regular (unquoted) token: read until space or end\n while (j < len && pattern[j] !== ' ') j++;\n tokens.push(pattern.substring(i, j));\n i = j;\n }\n }\n return tokens;\n}\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n // Replace escaped \\| with placeholder before splitting on |\n const escaped = pattern.replace(/\\\\\\|/g, ESCAPED_PIPE);\n return escaped.split(OR_TOKEN).map(item => {\n // Restore escaped pipes in each OR group\n const restored = item.replace(/\\u0000/g, '|');\n const query = tokenize(restored.trim()).filter(item => item && !!item.trim());\n const results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n const token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n if (found) {\n continue;\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n const token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break;\n }\n }\n }\n return results;\n });\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\nclass ExtendedSearch {\n constructor(pattern, {\n isCaseSensitive = Config.isCaseSensitive,\n ignoreDiacritics = Config.ignoreDiacritics,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n ignoreDiacritics,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;\n this.pattern = pattern;\n this.query = parseQuery(this.pattern, this.options);\n }\n static condition(_, options) {\n return options.useExtendedSearch;\n }\n\n // Note: searchIn operates on a single text value and sets hasInverse on the\n // result when inverse patterns are involved. _searchObjectList uses this to\n // switch from \"ANY key\" to \"ALL keys\" aggregation. See #712.\n searchIn(text) {\n const query = this.query;\n if (!query) {\n return {\n isMatch: false,\n score: 1\n };\n }\n const {\n includeMatches,\n isCaseSensitive,\n ignoreDiacritics\n } = this.options;\n text = isCaseSensitive ? text : text.toLowerCase();\n text = ignoreDiacritics ? stripDiacritics(text) : text;\n let numMatches = 0;\n const allIndices = [];\n let totalScore = 0;\n let hasInverse = false;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n hasInverse = false;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const {\n isMatch,\n indices,\n score\n } = searcher.search(text);\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n const type = searcher.constructor.type;\n if (type.startsWith('inverse')) {\n hasInverse = true;\n }\n if (includeMatches) {\n if (MultiMatchSet.has(type)) {\n allIndices.push(...indices);\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n hasInverse = false;\n break;\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n const result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n if (hasInverse) {\n result.hasInverse = true;\n }\n if (includeMatches) {\n result.indices = mergeIndices(allIndices);\n }\n return result;\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n };\n }\n}\n\nconst registeredSearchers = [];\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n const searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options);\n }\n }\n return new BitapSearch(pattern, options);\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\nconst isExpression = query => !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\nconst isPath = query => !!query[KeyType.PATH];\nconst isLeaf = query => !isArray(query) && isObject(query) && !isExpression(query);\nconst convertToExplicit = query => ({\n [LogicalOperator.AND]: Object.keys(query).map(key => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, {\n auto = true\n} = {}) {\n const next = query => {\n // Keyless string entry: search across all keys\n if (isString(query)) {\n const obj = {\n keyId: null,\n pattern: query\n };\n if (auto) {\n obj.searcher = createSearcher(query, options);\n }\n return obj;\n }\n const keys = Object.keys(query);\n const isQueryPath = isPath(query);\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query));\n }\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key));\n }\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n return obj;\n }\n const node = {\n children: [],\n operator: keys[0]\n };\n keys.forEach(key => {\n const value = query[key];\n if (isArray(value)) {\n value.forEach(item => {\n node.children.push(next(item));\n });\n }\n });\n return node;\n };\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n return next(query);\n}\n\nfunction computeScoreSingle(matches, {\n ignoreFieldNorm = Config.ignoreFieldNorm\n}) {\n let totalScore = 1;\n matches.forEach(({\n key,\n norm,\n score\n }) => {\n const weight = key ? key.weight : null;\n totalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm));\n });\n return totalScore;\n}\nfunction computeScore(results, {\n ignoreFieldNorm = Config.ignoreFieldNorm\n}) {\n results.forEach(result => {\n result.score = computeScoreSingle(result.matches, {\n ignoreFieldNorm\n });\n });\n}\n\n// Max-heap by score: keeps the worst (highest) score at the top\n// so we can efficiently evict it when a better result arrives.\nclass MaxHeap {\n constructor(limit) {\n this.limit = limit;\n this.heap = [];\n }\n get size() {\n return this.heap.length;\n }\n shouldInsert(score) {\n return this.size < this.limit || score < this.heap[0].score;\n }\n insert(item) {\n if (this.size < this.limit) {\n this.heap.push(item);\n this._bubbleUp(this.size - 1);\n } else if (item.score < this.heap[0].score) {\n this.heap[0] = item;\n this._sinkDown(0);\n }\n }\n extractSorted(sortFn) {\n return this.heap.sort(sortFn);\n }\n _bubbleUp(i) {\n const heap = this.heap;\n while (i > 0) {\n const parent = i - 1 >> 1;\n if (heap[i].score <= heap[parent].score) break;\n const tmp = heap[i];\n heap[i] = heap[parent];\n heap[parent] = tmp;\n i = parent;\n }\n }\n _sinkDown(i) {\n const heap = this.heap;\n const len = heap.length;\n let largest = i;\n do {\n i = largest;\n const left = 2 * i + 1;\n const right = 2 * i + 2;\n if (left < len && heap[left].score > heap[largest].score) {\n largest = left;\n }\n if (right < len && heap[right].score > heap[largest].score) {\n largest = right;\n }\n if (largest !== i) {\n const tmp = heap[i];\n heap[i] = heap[largest];\n heap[largest] = tmp;\n }\n } while (largest !== i);\n }\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n if (!isDefined(matches)) {\n return;\n }\n matches.forEach(match => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return;\n }\n const {\n indices,\n value\n } = match;\n const obj = {\n indices,\n value\n };\n if (match.key) {\n obj.key = match.key.src;\n }\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(results, docs, {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n} = {}) {\n const transformers = [];\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n return results.map(result => {\n const {\n idx\n } = result;\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n if (transformers.length) {\n transformers.forEach(transformer => {\n transformer(result, data);\n });\n }\n return data;\n });\n}\n\nconst WORD = /\\b\\w+\\b/g;\nfunction createAnalyzer({\n isCaseSensitive = false,\n ignoreDiacritics = false\n} = {}) {\n return {\n tokenize(text) {\n if (!isCaseSensitive) {\n text = text.toLowerCase();\n }\n if (ignoreDiacritics) {\n text = stripDiacritics(text);\n }\n return text.match(WORD) || [];\n }\n };\n}\n\nfunction buildInvertedIndex(records, keyCount, analyzer) {\n const terms = new Map();\n const df = new Map();\n let fieldCount = 0;\n function addField(text, docIdx, keyIdx, subIdx) {\n const tokens = analyzer.tokenize(text);\n if (!tokens.length) return;\n fieldCount++;\n\n // Count term frequencies in this field\n const termFreqs = new Map();\n for (const token of tokens) {\n termFreqs.set(token, (termFreqs.get(token) || 0) + 1);\n }\n\n // Track which terms we've already counted for df in this field\n for (const [term, tf] of termFreqs) {\n const posting = {\n docIdx,\n keyIdx,\n subIdx,\n tf\n };\n let postings = terms.get(term);\n if (!postings) {\n postings = [];\n terms.set(term, postings);\n }\n postings.push(posting);\n df.set(term, (df.get(term) || 0) + 1);\n }\n }\n for (const record of records) {\n const {\n i: docIdx,\n v,\n $: fields\n } = record;\n\n // String list\n if (v !== undefined) {\n addField(v, docIdx, -1, -1);\n continue;\n }\n\n // Object list\n if (fields) {\n for (let keyIdx = 0; keyIdx < keyCount; keyIdx++) {\n const value = fields[keyIdx];\n if (!value) continue;\n if (Array.isArray(value)) {\n for (const sub of value) {\n addField(sub.v, docIdx, keyIdx, sub.i ?? -1);\n }\n } else {\n addField(value.v, docIdx, keyIdx, -1);\n }\n }\n }\n }\n return {\n terms,\n fieldCount,\n df\n };\n}\nfunction addToInvertedIndex(index, record, keyCount, analyzer) {\n const {\n i: docIdx,\n v,\n $: fields\n } = record;\n function addField(text, keyIdx, subIdx) {\n const tokens = analyzer.tokenize(text);\n if (!tokens.length) return;\n index.fieldCount++;\n const termFreqs = new Map();\n for (const token of tokens) {\n termFreqs.set(token, (termFreqs.get(token) || 0) + 1);\n }\n for (const [term, tf] of termFreqs) {\n const posting = {\n docIdx,\n keyIdx,\n subIdx,\n tf\n };\n let postings = index.terms.get(term);\n if (!postings) {\n postings = [];\n index.terms.set(term, postings);\n }\n postings.push(posting);\n index.df.set(term, (index.df.get(term) || 0) + 1);\n }\n }\n if (v !== undefined) {\n addField(v, -1, -1);\n return;\n }\n if (fields) {\n for (let keyIdx = 0; keyIdx < keyCount; keyIdx++) {\n const value = fields[keyIdx];\n if (!value) continue;\n if (Array.isArray(value)) {\n for (const sub of value) {\n addField(sub.v, keyIdx, sub.i ?? -1);\n }\n } else {\n addField(value.v, keyIdx, -1);\n }\n }\n }\n}\nfunction removeFromInvertedIndex(index, docIdx) {\n for (const [term, postings] of index.terms) {\n const filtered = postings.filter(p => p.docIdx !== docIdx);\n const removed = postings.length - filtered.length;\n if (removed > 0) {\n index.fieldCount -= removed;\n index.df.set(term, (index.df.get(term) || 0) - removed);\n if (filtered.length === 0) {\n index.terms.delete(term);\n index.df.delete(term);\n } else {\n index.terms.set(term, filtered);\n }\n }\n }\n}\n\nclass Fuse {\n // Statics are assigned in entry.ts\n\n constructor(docs, options, index) {\n this.options = {\n ...Config,\n ...options\n };\n if (this.options.useExtendedSearch && false) ;\n if (this.options.useTokenSearch && false) ;\n this._keyStore = new KeyStore(this.options.keys);\n this._docs = docs;\n this._myIndex = null;\n this._invertedIndex = null;\n this.setCollection(docs, index);\n this._lastQuery = null;\n this._lastSearcher = null;\n }\n _getSearcher(query) {\n if (this._lastQuery === query) {\n return this._lastSearcher;\n }\n const opts = this._invertedIndex ? {\n ...this.options,\n _invertedIndex: this._invertedIndex\n } : this.options;\n const searcher = createSearcher(query, opts);\n this._lastQuery = query;\n this._lastSearcher = searcher;\n return searcher;\n }\n setCollection(docs, index) {\n this._docs = docs;\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE);\n }\n this._myIndex = index || createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n if (this.options.useTokenSearch) {\n const analyzer = createAnalyzer({\n isCaseSensitive: this.options.isCaseSensitive,\n ignoreDiacritics: this.options.ignoreDiacritics\n });\n this._invertedIndex = buildInvertedIndex(this._myIndex.records, this._myIndex.keys.length, analyzer);\n }\n }\n add(doc) {\n if (!isDefined(doc)) {\n return;\n }\n this._docs.push(doc);\n this._myIndex.add(doc);\n if (this._invertedIndex) {\n const record = this._myIndex.records[this._myIndex.records.length - 1];\n const analyzer = createAnalyzer({\n isCaseSensitive: this.options.isCaseSensitive,\n ignoreDiacritics: this.options.ignoreDiacritics\n });\n addToInvertedIndex(this._invertedIndex, record, this._myIndex.keys.length, analyzer);\n }\n }\n remove(predicate = () => false) {\n const results = [];\n const indicesToRemove = [];\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n if (predicate(this._docs[i], i)) {\n results.push(this._docs[i]);\n indicesToRemove.push(i);\n }\n }\n if (indicesToRemove.length) {\n if (this._invertedIndex) {\n for (const idx of indicesToRemove) {\n removeFromInvertedIndex(this._invertedIndex, idx);\n }\n }\n\n // Remove from docs in reverse to preserve indices\n for (let i = indicesToRemove.length - 1; i >= 0; i -= 1) {\n this._docs.splice(indicesToRemove[i], 1);\n }\n this._myIndex.removeAll(indicesToRemove);\n }\n return results;\n }\n removeAt(idx) {\n if (this._invertedIndex) {\n removeFromInvertedIndex(this._invertedIndex, idx);\n }\n const doc = this._docs.splice(idx, 1)[0];\n this._myIndex.removeAt(idx);\n return doc;\n }\n getIndex() {\n return this._myIndex;\n }\n search(query, options) {\n const {\n limit = -1\n } = options || {};\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n // Empty string query returns all docs (useful for search UIs)\n if (isString(query) && !query.trim()) {\n let docs = this._docs.map((item, idx) => ({\n item,\n refIndex: idx\n }));\n if (isNumber(limit) && limit > -1) {\n docs = docs.slice(0, limit);\n }\n return docs;\n }\n const useHeap = isNumber(limit) && limit > 0 && isString(query);\n let results;\n if (useHeap) {\n const heap = new MaxHeap(limit);\n if (isString(this._docs[0])) {\n this._searchStringList(query, {\n heap,\n ignoreFieldNorm\n });\n } else {\n this._searchObjectList(query, {\n heap,\n ignoreFieldNorm\n });\n }\n results = heap.extractSorted(sortFn);\n } else {\n results = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query) : this._searchLogical(query);\n computeScore(results, {\n ignoreFieldNorm\n });\n if (shouldSort) {\n results.sort(sortFn);\n }\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n }\n return format(results, this._docs, {\n includeMatches,\n includeScore\n });\n }\n _searchStringList(query, {\n heap,\n ignoreFieldNorm\n } = {}) {\n const searcher = this._getSearcher(query);\n const {\n records\n } = this._myIndex;\n const results = heap ? null : [];\n\n // Iterate over every string in the index\n records.forEach(({\n v: text,\n i: idx,\n n: norm\n }) => {\n if (!isDefined(text)) {\n return;\n }\n const {\n isMatch,\n score,\n indices\n } = searcher.searchIn(text);\n if (isMatch) {\n const result = {\n item: text,\n idx,\n matches: [{\n score,\n value: text,\n norm: norm,\n indices\n }]\n };\n if (heap) {\n result.score = computeScoreSingle(result.matches, {\n ignoreFieldNorm\n });\n if (heap.shouldInsert(result.score)) {\n heap.insert(result);\n }\n } else {\n results.push(result);\n }\n }\n });\n return results;\n }\n _searchLogical(query) {\n const expression = parse(query, this.options);\n const evaluate = (node, item, idx) => {\n if (!('children' in node)) {\n const {\n keyId,\n searcher\n } = node;\n let matches;\n if (keyId === null) {\n // Keyless entry: search across all keys\n matches = [];\n this._myIndex.keys.forEach((key, keyIndex) => {\n matches.push(...this._findMatches({\n key,\n value: item[keyIndex],\n searcher: searcher\n }));\n });\n } else {\n matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher: searcher\n });\n }\n if (matches && matches.length) {\n return [{\n idx,\n item,\n matches\n }];\n }\n return [];\n }\n const {\n children,\n operator\n } = node;\n const res = [];\n for (let i = 0, len = children.length; i < len; i += 1) {\n const child = children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (operator === LogicalOperator.AND) {\n return [];\n }\n }\n return res;\n };\n const records = this._myIndex.records;\n const resultMap = new Map();\n const results = [];\n records.forEach(({\n $: item,\n i: idx\n }) => {\n if (isDefined(item)) {\n const expResults = evaluate(expression, item, idx);\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap.has(idx)) {\n resultMap.set(idx, {\n idx,\n item,\n matches: []\n });\n results.push(resultMap.get(idx));\n }\n expResults.forEach(({\n matches\n }) => {\n resultMap.get(idx).matches.push(...matches);\n });\n }\n }\n });\n return results;\n }\n\n // When a search involves inverse patterns (e.g. !Syrup), the aggregation\n // across keys switches from \"ANY key matches\" to \"ALL keys must match.\"\n // This is signaled by hasInverse on the SearchResult from ExtendedSearch.\n //\n // For mixed patterns like \"^hello !Syrup\", a key failure is ambiguous —\n // it could be the positive or inverse term that failed. In that case we\n // conservatively exclude the item, which is strictly better than the old\n // behavior of including it. See: https://github.com/krisk/Fuse/issues/712\n _searchObjectList(query, {\n heap,\n ignoreFieldNorm\n } = {}) {\n const searcher = this._getSearcher(query);\n const {\n keys,\n records\n } = this._myIndex;\n const results = heap ? null : [];\n\n // List is Array<Object>\n records.forEach(({\n $: item,\n i: idx\n }) => {\n if (!isDefined(item)) {\n return;\n }\n const matches = [];\n let anyKeyFailed = false;\n let hasInverse = false;\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n const keyMatches = this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n });\n if (keyMatches.length) {\n matches.push(...keyMatches);\n if (keyMatches[0].hasInverse) {\n hasInverse = true;\n }\n } else {\n anyKeyFailed = true;\n }\n });\n\n // If the search involves inverse patterns, ALL keys must match\n if (hasInverse && anyKeyFailed) {\n return;\n }\n if (matches.length) {\n const result = {\n idx,\n item,\n matches\n };\n if (heap) {\n result.score = computeScoreSingle(result.matches, {\n ignoreFieldNorm\n });\n if (heap.shouldInsert(result.score)) {\n heap.insert(result);\n }\n } else {\n results.push(result);\n }\n }\n });\n return results;\n }\n _findMatches({\n key,\n value,\n searcher\n }) {\n if (!isDefined(value)) {\n return [];\n }\n const matches = [];\n if (isArray(value)) {\n value.forEach(({\n v: text,\n i: idx,\n n: norm\n }) => {\n if (!isDefined(text)) {\n return;\n }\n const {\n isMatch,\n score,\n indices,\n hasInverse\n } = searcher.searchIn(text);\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices,\n hasInverse\n });\n }\n });\n } else {\n const {\n v: text,\n n: norm\n } = value;\n const {\n isMatch,\n score,\n indices,\n hasInverse\n } = searcher.searchIn(text);\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n norm,\n indices,\n hasInverse\n });\n }\n }\n return matches;\n }\n}\n\nclass TokenSearch {\n static condition(_, options) {\n return options.useTokenSearch;\n }\n constructor(pattern, options) {\n this.options = options;\n this.analyzer = createAnalyzer({\n isCaseSensitive: options.isCaseSensitive,\n ignoreDiacritics: options.ignoreDiacritics\n });\n const queryTerms = this.analyzer.tokenize(pattern);\n const invertedIndex = options._invertedIndex;\n const {\n df,\n fieldCount\n } = invertedIndex;\n this.termSearchers = [];\n this.idfWeights = [];\n for (const term of queryTerms) {\n this.termSearchers.push(new BitapSearch(term, {\n location: options.location,\n threshold: options.threshold,\n distance: options.distance,\n includeMatches: options.includeMatches,\n findAllMatches: options.findAllMatches,\n minMatchCharLength: options.minMatchCharLength,\n isCaseSensitive: options.isCaseSensitive,\n ignoreDiacritics: options.ignoreDiacritics,\n ignoreLocation: true\n }));\n const docFreq = df.get(term) || 0;\n const idf = Math.log(1 + (fieldCount - docFreq + 0.5) / (docFreq + 0.5));\n this.idfWeights.push(idf);\n }\n }\n searchIn(text) {\n if (!this.termSearchers.length) {\n return {\n isMatch: false,\n score: 1\n };\n }\n const allIndices = [];\n let weightedScore = 0;\n let maxPossibleScore = 0;\n let matchedCount = 0;\n for (let i = 0; i < this.termSearchers.length; i++) {\n const result = this.termSearchers[i].searchIn(text);\n const idf = this.idfWeights[i];\n maxPossibleScore += idf;\n if (result.isMatch) {\n matchedCount++;\n weightedScore += idf * (1 - result.score);\n if (result.indices) {\n allIndices.push(...result.indices);\n }\n }\n }\n if (matchedCount === 0) {\n return {\n isMatch: false,\n score: 1\n };\n }\n const normalized = maxPossibleScore > 0 ? 1 - weightedScore / maxPossibleScore : 0;\n const searchResult = {\n isMatch: true,\n score: Math.max(0.001, normalized)\n };\n if (this.options.includeMatches && allIndices.length) {\n searchResult.indices = mergeIndices(allIndices);\n }\n return searchResult;\n }\n}\n\nFuse.version = '7.3.0';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\nFuse.match = function (pattern, text, options) {\n const searcher = createSearcher(pattern, {\n ...Config,\n ...options\n });\n return searcher.searchIn(text);\n};\n{\n Fuse.parseQuery = parse;\n}\n{\n register(ExtendedSearch);\n}\n{\n register(TokenSearch);\n}\nFuse.use = function (...plugins) {\n plugins.forEach(plugin => register(plugin));\n};\n\n// Re-export public types\n\nexport { Fuse as default };\n","import Fuse from 'fuse.js'\n\nconst useCommands = (commands, precision = 0.4) => {\n\tcommands = !!commands\n\t\t? Object.entries(commands)?.reduce((acc, [key, value]) => ({ [key.toLowerCase()]: value }), {})\n\t\t: {}\n\n\tconst triggerCommand = (input) => {\n\t\tconst fuse = new Fuse(Object.keys(commands), { includeScore: true, ignoreLocation: true })\n\t\tconst result = fuse.search(input).filter((r) => r.score < precision)\n\t\tif (!!result?.length) {\n\t\t\tconst key = result[0].item.toLowerCase()\n\t\t\treturn commands[key]?.(input)\n\t\t}\n\t\treturn null\n\t}\n\n\treturn triggerCommand\n}\n\nexport default useCommands\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react'\n\nconst Icon = ({ color = 'black', activeColor = 'red', isActive = false }) => {\n\treturn (\n\t\t<svg\n\t\t\tdata-testid=\"__icon-root__\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t>\n\t\t\t<g>\n\t\t\t\t<path\n\t\t\t\t\tdata-testid=\"__icon-path__\"\n\t\t\t\t\tfill={color}\n\t\t\t\t\td=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\"\n\t\t\t\t/>\n\t\t\t\t{isActive && <circle data-testid=\"__icon-active__\" fill={activeColor} cx=\"16\" cy=\"4\" r=\"4\" />}\n\t\t\t</g>\n\t\t</svg>\n\t)\n}\n\nexport default Icon\n","import React, { cloneElement, isValidElement, useCallback, useMemo, useRef, useState } from 'react'\nimport { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'\nimport { isFunction } from '@untemps/utils/function/isFunction'\n\nimport useVocal from '../hooks/useVocal'\nimport useTimeout from '../hooks/useTimeout'\nimport useCommands from '../hooks/useCommands'\n\nimport Icon from './Icon'\n\nconst Vocal = ({\n\tchildren,\n\tcommands = null,\n\tlang = 'en-US',\n\tgrammars = null,\n\ttimeout = 3000,\n\tariaLabel = 'start recognition',\n\tstyle = null,\n\tclassName = null,\n\toutlineStyle = '2px solid',\n\tonStart = null,\n\tonEnd = null,\n\tonSpeechStart = null,\n\tonSpeechEnd = null,\n\tonResult = null,\n\tonError = null,\n\tonNoMatch = null,\n\t__rsInstance,\n}) => {\n\tconst buttonRef = useRef(null)\n\tconst [isListening, setIsListening] = useState(false)\n\n\tconst [, { start, stop, subscribe, unsubscribe }] = useVocal(lang, grammars, __rsInstance)\n\tconst triggerCommand = useCommands(commands)\n\n\tconst propsRef = useRef({})\n\tpropsRef.current = { onStart, onEnd, onSpeechStart, onSpeechEnd, onResult, onError, onNoMatch }\n\n\tconst triggerCommandRef = useRef(triggerCommand)\n\ttriggerCommandRef.current = triggerCommand\n\n\tconst unsubscribeAllRef = useRef(null)\n\tconst onEndRef = useRef(null)\n\n\t// Breaks the circular dep: _onEnd → useTimeout(handler) → startTimer captures _onEnd\n\tconst stableTimerCb = useCallback(() => onEndRef.current?.(), [])\n\tconst [startTimer, stopTimer] = useTimeout(stableTimerCb, timeout)\n\n\tconst stopRecognition = useCallback(() => {\n\t\ttry {\n\t\t\tsetIsListening(false)\n\t\t\tstop()\n\t\t} catch (error) {\n\t\t\tpropsRef.current.onError?.(error)\n\t\t} finally {\n\t\t\tunsubscribeAllRef.current?.()\n\t\t}\n\t}, [stop])\n\n\tconst _onStart = useCallback(\n\t\t(e) => {\n\t\t\tstartTimer()\n\t\t\tpropsRef.current.onStart?.(e)\n\t\t},\n\t\t[startTimer]\n\t)\n\n\tconst _onSpeechStart = useCallback(\n\t\t(e) => {\n\t\t\tstopTimer()\n\t\t\tpropsRef.current.onSpeechStart?.(e)\n\t\t},\n\t\t[stopTimer]\n\t)\n\n\tconst _onSpeechEnd = useCallback(\n\t\t(e) => {\n\t\t\tstartTimer()\n\t\t\tpropsRef.current.onSpeechEnd?.(e)\n\t\t},\n\t\t[startTimer]\n\t)\n\n\tconst _onResult = useCallback(\n\t\t(event) => {\n\t\t\tconst transcript = Array.from(event?.results ?? [], (segment) => {\n\t\t\t\tlet best = { confidence: -Infinity, transcript: '' }\n\t\t\t\tfor (let j = 0; j < segment.length; j++) {\n\t\t\t\t\tconst alt = segment[j]\n\t\t\t\t\tif (alt.confidence === undefined || alt.confidence > best.confidence) {\n\t\t\t\t\t\tbest = alt\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn best.transcript ?? ''\n\t\t\t}).join('')\n\n\t\t\tstopTimer()\n\t\t\tstopRecognition()\n\t\t\ttriggerCommandRef.current(transcript)\n\t\t\tpropsRef.current.onResult?.(transcript, event)\n\t\t},\n\t\t[stopTimer, stopRecognition]\n\t)\n\n\tconst _onError = useCallback(\n\t\t(error) => {\n\t\t\tstopRecognition()\n\t\t\tpropsRef.current.onError?.(error)\n\t\t},\n\t\t[stopRecognition]\n\t)\n\n\tconst _onNoMatch = useCallback(\n\t\t(e) => {\n\t\t\tstopTimer()\n\t\t\tstopRecognition()\n\t\t\tpropsRef.current.onNoMatch?.(e)\n\t\t},\n\t\t[stopTimer, stopRecognition]\n\t)\n\n\tconst _onEnd = useCallback(\n\t\t(e) => {\n\t\t\tstopTimer()\n\t\t\tstopRecognition()\n\t\t\tpropsRef.current.onEnd?.(e)\n\t\t},\n\t\t[stopTimer, stopRecognition]\n\t)\n\n\tonEndRef.current = _onEnd\n\n\tconst HANDLERS = useMemo(\n\t\t() => ({\n\t\t\tstart: _onStart,\n\t\t\tend: _onEnd,\n\t\t\tspeechstart: _onSpeechStart,\n\t\t\tspeechend: _onSpeechEnd,\n\t\t\tresult: _onResult,\n\t\t\terror: _onError,\n\t\t\tnomatch: _onNoMatch,\n\t\t}),\n\t\t[_onStart, _onEnd, _onSpeechStart, _onSpeechEnd, _onResult, _onError, _onNoMatch]\n\t)\n\n\t// Assigned inline (not in useEffect) so it's ready before any event fires\n\tunsubscribeAllRef.current = () => Object.entries(HANDLERS).forEach(([event, fn]) => unsubscribe?.(event, fn))\n\n\tconst startRecognition = useCallback(() => {\n\t\ttry {\n\t\t\tsetIsListening(true)\n\t\t\tObject.entries(HANDLERS).forEach(([event, fn]) => subscribe(event, fn))\n\t\t\tstart()\n\t\t} catch (error) {\n\t\t\t_onError(error)\n\t\t}\n\t}, [HANDLERS, subscribe, start, _onError])\n\n\tconst _onFocus = () => {\n\t\tif (!className && outlineStyle) {\n\t\t\tbuttonRef.current.style.outline = outlineStyle\n\t\t}\n\t}\n\n\tconst _onBlur = () => {\n\t\tif (!className && outlineStyle) {\n\t\t\tbuttonRef.current.style.outline = 'none'\n\t\t}\n\t}\n\n\tconst _renderDefault = () => (\n\t\t<button\n\t\t\tdata-testid=\"__vocal-root__\"\n\t\t\tref={buttonRef}\n\t\t\trole=\"button\"\n\t\t\taria-label={ariaLabel}\n\t\t\tstyle={\n\t\t\t\tclassName\n\t\t\t\t\t? null\n\t\t\t\t\t: {\n\t\t\t\t\t\t\twidth: 24,\n\t\t\t\t\t\t\theight: 24,\n\t\t\t\t\t\t\tbackgroundColor: 'transparent', // `background: none` shorthand resets all sub-properties; jsdom 29 + jest-dom v6 don't reflect that correctly via getComputedStyle\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tcursor: !isListening ? 'pointer' : 'default',\n\t\t\t\t\t\t\t...style,\n\t\t\t\t\t }\n\t\t\t}\n\t\t\tclassName={className}\n\t\t\tonFocus={_onFocus}\n\t\t\tonBlur={_onBlur}\n\t\t\tonClick={startRecognition}\n\t\t>\n\t\t\t<Icon isActive={isListening} color=\"#aaa\" />\n\t\t</button>\n\t)\n\n\tconst _renderChildren = () => {\n\t\tif (SpeechRecognitionWrapper.isSupported) {\n\t\t\tif (isFunction(children)) {\n\t\t\t\treturn children(startRecognition, stopRecognition, isListening)\n\t\t\t} else if (isValidElement(children)) {\n\t\t\t\treturn cloneElement(children, {\n\t\t\t\t\t...(!isListening && { onClick: startRecognition }),\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\treturn _renderDefault()\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\treturn _renderChildren()\n}\n\nexport default Vocal\n","import Vocal from './components/Vocal'\nimport { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'\n\nexport { default as useVocal } from './hooks/useVocal'\nexport const isSupported = SpeechRecognitionWrapper.isSupported\n\nexport default Vocal\n"],"x_google_ignoreList":[0,1,4,6,7,8],"mappings":"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"}