react-dropzone 12.0.2 → 12.0.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.
package/dist/es/index.js CHANGED
@@ -37,7 +37,7 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r
37
37
  import React, { forwardRef, Fragment, useCallback, useEffect, useImperativeHandle, useMemo, useReducer, useRef } from "react";
38
38
  import PropTypes from "prop-types";
39
39
  import { fromEvent } from "file-selector";
40
- import { allFilesAccepted, composeEventHandlers, fileAccepted, fileMatchSize, filePickerOptionsTypes, canUseFileSystemAccessAPI, isEvtWithFiles, isIeOrEdge, isPropagationStopped, onDocumentDragOver, TOO_MANY_FILES_REJECTION } from "./utils/index";
40
+ import { allFilesAccepted, composeEventHandlers, fileAccepted, fileMatchSize, filePickerOptionsTypes, canUseFileSystemAccessAPI, isAbort, isEvtWithFiles, isIeOrEdge, isPropagationStopped, isSecurityError, onDocumentDragOver, TOO_MANY_FILES_REJECTION } from "./utils/index";
41
41
  /**
42
42
  * Convenience wrapper component for the `useDropzone` hook
43
43
  *
@@ -465,11 +465,12 @@ export function useDropzone() {
465
465
 
466
466
  var isFocused = state.isFocused,
467
467
  isFileDialogActive = state.isFileDialogActive,
468
- draggedFiles = state.draggedFiles; // Update file dialog active state when the window is focused on
468
+ draggedFiles = state.draggedFiles;
469
+ var fsAccessApiWorksRef = useRef(window.isSecureContext && useFsAccessApi && canUseFileSystemAccessAPI()); // Update file dialog active state when the window is focused on
469
470
 
470
471
  var onWindowFocus = function onWindowFocus() {
471
472
  // Execute the timeout only if the file dialog is opened in the browser
472
- if (isFileDialogActive) {
473
+ if (!fsAccessApiWorksRef.current && isFileDialogActive) {
473
474
  setTimeout(function () {
474
475
  if (inputRef.current) {
475
476
  var files = inputRef.current.files;
@@ -486,15 +487,11 @@ export function useDropzone() {
486
487
  };
487
488
 
488
489
  useEffect(function () {
489
- if (window.isSecureContext && useFsAccessApi && canUseFileSystemAccessAPI()) {
490
- return function () {};
491
- }
492
-
493
490
  window.addEventListener("focus", onWindowFocus, false);
494
491
  return function () {
495
492
  window.removeEventListener("focus", onWindowFocus, false);
496
493
  };
497
- }, [inputRef, isFileDialogActive, onFileDialogCancelCb, useFsAccessApi]);
494
+ }, [inputRef, isFileDialogActive, onFileDialogCancelCb, fsAccessApiWorksRef]);
498
495
  var dragTargetsRef = useRef([]);
499
496
 
500
497
  var onDocumentDrop = function onDocumentDrop(event) {
@@ -685,7 +682,7 @@ export function useDropzone() {
685
682
  var openFileDialog = useCallback(function () {
686
683
  // No point to use FS access APIs if context is not secure
687
684
  // https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts#feature_detection
688
- if (window.isSecureContext && useFsAccessApi && canUseFileSystemAccessAPI()) {
685
+ if (fsAccessApiWorksRef.current) {
689
686
  dispatch({
690
687
  type: "openDialog"
691
688
  });
@@ -698,13 +695,26 @@ export function useDropzone() {
698
695
  window.showOpenFilePicker(opts).then(function (handles) {
699
696
  return getFilesFromEvent(handles);
700
697
  }).then(function (files) {
701
- return setFiles(files, null);
702
- }).catch(function (e) {
703
- return onFileDialogCancelCb(e);
704
- }).finally(function () {
705
- return dispatch({
698
+ setFiles(files, null);
699
+ dispatch({
706
700
  type: "closeDialog"
707
701
  });
702
+ }).catch(function (e) {
703
+ // AbortError means the user canceled
704
+ if (isAbort(e)) {
705
+ onFileDialogCancelCb(e);
706
+ dispatch({
707
+ type: "closeDialog"
708
+ });
709
+ } else if (isSecurityError(e)) {
710
+ fsAccessApiWorksRef.current = false; // CORS, so cannot use this API
711
+ // Try using the input
712
+
713
+ if (inputRef.current) {
714
+ inputRef.current.value = null;
715
+ inputRef.current.click();
716
+ }
717
+ }
708
718
  });
709
719
  return;
710
720
  }
@@ -729,7 +739,7 @@ export function useDropzone() {
729
739
  event.preventDefault();
730
740
  openFileDialog();
731
741
  }
732
- }, [rootRef, inputRef, openFileDialog]); // Update focus state for the dropzone
742
+ }, [rootRef, openFileDialog]); // Update focus state for the dropzone
733
743
 
734
744
  var onFocusCb = useCallback(function () {
735
745
  dispatch({
@@ -755,7 +765,7 @@ export function useDropzone() {
755
765
  } else {
756
766
  openFileDialog();
757
767
  }
758
- }, [inputRef, noClick, openFileDialog]);
768
+ }, [noClick, openFileDialog]);
759
769
 
760
770
  var composeHandler = function composeHandler(fn) {
761
771
  return disabled ? null : fn;
@@ -202,4 +202,26 @@ export function filePickerOptionsTypes(accept) {
202
202
  return _objectSpread(_objectSpread({}, a), {}, _defineProperty({}, b, []));
203
203
  }, {}) : {}
204
204
  }];
205
+ }
206
+ /**
207
+ * Check if v is an exception caused by aborting a request (e.g window.showOpenFilePicker()).
208
+ *
209
+ * See https://developer.mozilla.org/en-US/docs/Web/API/DOMException.
210
+ * @param {any} v
211
+ * @returns {boolean} True if v is an abort exception.
212
+ */
213
+
214
+ export function isAbort(v) {
215
+ return v instanceof DOMException && (v.name === "AbortError" || v.code === v.ABORT_ERR);
216
+ }
217
+ /**
218
+ * Check if v is a security error.
219
+ *
220
+ * See https://developer.mozilla.org/en-US/docs/Web/API/DOMException.
221
+ * @param {any} v
222
+ * @returns {boolean} True if v is a security error.
223
+ */
224
+
225
+ export function isSecurityError(v) {
226
+ return v instanceof DOMException && (v.name === "SecurityError" || v.code === v.SECURITY_ERR);
205
227
  }
package/dist/index.js CHANGED
@@ -12,5 +12,5 @@
12
12
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
13
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
14
  PERFORMANCE OF THIS SOFTWARE.
15
- ***************************************************************************** */()}function s(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||p(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function v(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function u(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,u)}c((r=r.apply(e,t||[])).next())}))}function g(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,u])}}}function m(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}var y=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]);function b(e,t){var n=function(e){var t=e.name;if(t&&-1!==t.lastIndexOf(".")&&!e.type){var n=t.split(".").pop().toLowerCase(),r=y.get(n);r&&Object.defineProperty(e,"type",{value:r,writable:!1,configurable:!1,enumerable:!0})}return e}(e);if("string"!=typeof n.path){var r=e.webkitRelativePath;Object.defineProperty(n,"path",{value:"string"==typeof t?t:"string"==typeof r&&r.length>0?r:e.name,writable:!1,configurable:!1,enumerable:!0})}return n}var h=[".DS_Store","Thumbs.db"];function w(e){return"object"==typeof e&&null!==e}function D(e){return O(e.target.files).map((function(e){return b(e)}))}function x(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){switch(t.label){case 0:return[4,Promise.all(e.map((function(e){return e.getFile()})))];case 1:return[2,t.sent().map((function(e){return b(e)}))]}}))}))}function F(e,t){return v(this,void 0,void 0,(function(){var n;return g(this,(function(r){switch(r.label){case 0:return null===e?[2,[]]:e.items?(n=O(e.items).filter((function(e){return"file"===e.kind})),"drop"!==t?[2,n]:[4,Promise.all(n.map(A))]):[3,2];case 1:return[2,j(k(r.sent()))];case 2:return[2,j(O(e.files).map((function(e){return b(e)})))]}}))}))}function j(e){return e.filter((function(e){return-1===h.indexOf(e.name)}))}function O(e){if(null===e)return[];for(var t=[],n=0;n<e.length;n++){var r=e[n];t.push(r)}return t}function A(e){if("function"!=typeof e.webkitGetAsEntry)return P(e);var t=e.webkitGetAsEntry();return t&&t.isDirectory?E(t):P(e)}function k(e){return e.reduce((function(e,t){return function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(m(arguments[t]));return e}(e,Array.isArray(t)?k(t):[t])}),[])}function P(e){var t=e.getAsFile();if(!t)return Promise.reject(e+" is not a File");var n=b(t);return Promise.resolve(n)}function C(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return[2,e.isDirectory?E(e):z(e)]}))}))}function E(e){var t=e.createReader();return new Promise((function(e,n){var r=[];!function o(){var i=this;t.readEntries((function(t){return v(i,void 0,void 0,(function(){var i,a,u;return g(this,(function(c){switch(c.label){case 0:if(t.length)return[3,5];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,Promise.all(r)];case 2:return i=c.sent(),e(i),[3,4];case 3:return a=c.sent(),n(a),[3,4];case 4:return[3,6];case 5:u=Promise.all(t.map(C)),r.push(u),o(),c.label=6;case 6:return[2]}}))}))}),(function(e){n(e)}))}()}))}function z(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return[2,new Promise((function(t,n){e.file((function(n){var r=b(n,e.fullPath);t(r)}),(function(e){n(e)}))}))]}))}))}var S="file-invalid-type",T="file-too-large",R="file-too-small",L="too-many-files",I={FileInvalidType:S,FileTooLarge:T,FileTooSmall:R,TooManyFiles:L},K=function(e){e=Array.isArray(e)&&1===e.length?e[0]:e;var t=Array.isArray(e)?"one of ".concat(e.join(", ")):e;return{code:S,message:"File type must be ".concat(t)}},M=function(e){return{code:T,message:"File is larger than ".concat(e," ").concat(1===e?"byte":"bytes")}},B=function(e){return{code:R,message:"File is smaller than ".concat(e," ").concat(1===e?"byte":"bytes")}},q={code:L,message:"Too many files"};function G(e,t){var n="application/x-moz-file"===e.type||function(e,t){if(e&&t){var n=Array.isArray(t)?t:t.split(","),r=e.name||"",o=(e.type||"").toLowerCase(),i=o.replace(/\/.*$/,"");return n.some((function(e){var t=e.trim().toLowerCase();return"."===t.charAt(0)?r.toLowerCase().endsWith(t):t.endsWith("/*")?i===t.replace(/\/.*$/,""):o===t}))}return!0}(e,t);return[n,n?null:K(t)]}function $(e,t,n){if(_(e.size))if(_(t)&&_(n)){if(e.size>n)return[!1,M(n)];if(e.size<t)return[!1,B(t)]}else{if(_(t)&&e.size<t)return[!1,B(t)];if(_(n)&&e.size>n)return[!1,M(n)]}return[!0,null]}function _(e){return null!=e}function N(e){var t=e.files,n=e.accept,r=e.minSize,o=e.maxSize,i=e.multiple,a=e.maxFiles;return!(!i&&t.length>1||i&&a>=1&&t.length>a)&&t.every((function(e){var t=f(G(e,n),1)[0],i=f($(e,r,o),1)[0];return t&&i}))}function W(e){return"function"==typeof e.isPropagationStopped?e.isPropagationStopped():void 0!==e.cancelBubble&&e.cancelBubble}function H(e){return e.dataTransfer?Array.prototype.some.call(e.dataTransfer.types,(function(e){return"Files"===e||"application/x-moz-file"===e})):!!e.target&&!!e.target.files}function U(e){e.preventDefault()}function J(e){return-1!==e.indexOf("MSIE")||-1!==e.indexOf("Trident/")}function Q(e){return-1!==e.indexOf("Edge/")}function V(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.navigator.userAgent;return J(e)||Q(e)}function X(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return t.some((function(t){return!W(e)&&t&&t.apply(void 0,[e].concat(r)),W(e)}))}}function Y(){return"showOpenFilePicker"in window}function Z(e){return e="string"==typeof e?e.split(","):e,[{description:"everything",accept:Array.isArray(e)?e.filter((function(e){return"audio/*"===e||"video/*"===e||"image/*"===e||"text/*"===e||/\w+\/[-+.\w]+/g.test(e)})).reduce((function(e,t){return u(u({},e),{},c({},t,[]))}),{}):{}}]}var ee=["children"],te=["open"],ne=["refKey","role","onKeyDown","onFocus","onBlur","onClick","onDragEnter","onDragOver","onDragLeave","onDrop"],re=["refKey","onChange","onClick"],oe=t.forwardRef((function(e,n){var r=e.children,i=ue(l(e,ee)),a=i.open,c=l(i,te);return t.useImperativeHandle(n,(function(){return{open:a}}),[a]),o.default.createElement(t.Fragment,null,r(u(u({},c),{},{open:a})))}));oe.displayName="Dropzone";var ie={disabled:!1,getFilesFromEvent:function(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return w(e)&&w(e.dataTransfer)?[2,F(e.dataTransfer,e.type)]:function(e){return w(e)&&w(e.target)}(e)?[2,D(e)]:Array.isArray(e)&&e.every((function(e){return"getFile"in e&&"function"==typeof e.getFile}))?[2,x(e)]:[2,[]]}))}))},maxSize:1/0,minSize:0,multiple:!0,maxFiles:0,preventDropOnDocument:!0,noClick:!1,noKeyboard:!1,noDrag:!1,noDragEventsBubbling:!1,validator:null,useFsAccessApi:!0};oe.defaultProps=ie,oe.propTypes={children:i.default.func,accept:i.default.oneOfType([i.default.string,i.default.arrayOf(i.default.string)]),multiple:i.default.bool,preventDropOnDocument:i.default.bool,noClick:i.default.bool,noKeyboard:i.default.bool,noDrag:i.default.bool,noDragEventsBubbling:i.default.bool,minSize:i.default.number,maxSize:i.default.number,maxFiles:i.default.number,disabled:i.default.bool,getFilesFromEvent:i.default.func,onFileDialogCancel:i.default.func,onFileDialogOpen:i.default.func,useFsAccessApi:i.default.bool,onDragEnter:i.default.func,onDragLeave:i.default.func,onDragOver:i.default.func,onDrop:i.default.func,onDropAccepted:i.default.func,onDropRejected:i.default.func,validator:i.default.func};var ae={isFocused:!1,isFileDialogActive:!1,isDragActive:!1,isDragAccept:!1,isDragReject:!1,draggedFiles:[],acceptedFiles:[],fileRejections:[]};function ue(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=u(u({},ie),e),r=n.accept,o=n.disabled,i=n.getFilesFromEvent,a=n.maxSize,p=n.minSize,d=n.multiple,v=n.maxFiles,g=n.onDragEnter,m=n.onDragLeave,y=n.onDragOver,b=n.onDrop,h=n.onDropAccepted,w=n.onDropRejected,D=n.onFileDialogCancel,x=n.onFileDialogOpen,F=n.useFsAccessApi,j=n.preventDropOnDocument,O=n.noClick,A=n.noKeyboard,k=n.noDrag,P=n.noDragEventsBubbling,C=n.validator,E=t.useMemo((function(){return"function"==typeof x?x:le}),[x]),z=t.useMemo((function(){return"function"==typeof D?D:le}),[D]),S=t.useRef(null),T=t.useRef(null),R=t.useReducer(ce,ae),L=f(R,2),I=L[0],K=L[1],M=I.isFocused,B=I.isFileDialogActive,_=I.draggedFiles,J=function(){B&&setTimeout((function(){T.current&&(T.current.files.length||(K({type:"closeDialog"}),z()))}),300)};t.useEffect((function(){return window.isSecureContext&&F&&Y()?function(){}:(window.addEventListener("focus",J,!1),function(){window.removeEventListener("focus",J,!1)})}),[T,B,z,F]);var Q=t.useRef([]),ee=function(e){S.current&&S.current.contains(e.target)||(e.preventDefault(),Q.current=[])};t.useEffect((function(){return j&&(document.addEventListener("dragover",U,!1),document.addEventListener("drop",ee,!1)),function(){j&&(document.removeEventListener("dragover",U),document.removeEventListener("drop",ee))}}),[S,j]);var te=t.useCallback((function(e){e.preventDefault(),e.persist(),we(e),Q.current=[].concat(s(Q.current),[e.target]),H(e)&&Promise.resolve(i(e)).then((function(t){W(e)&&!P||(K({draggedFiles:t,isDragActive:!0,type:"setDraggedFiles"}),g&&g(e))}))}),[i,g,P]),oe=t.useCallback((function(e){e.preventDefault(),e.persist(),we(e);var t=H(e);if(t&&e.dataTransfer)try{e.dataTransfer.dropEffect="copy"}catch(e){}return t&&y&&y(e),!1}),[y,P]),ue=t.useCallback((function(e){e.preventDefault(),e.persist(),we(e);var t=Q.current.filter((function(e){return S.current&&S.current.contains(e)})),n=t.indexOf(e.target);-1!==n&&t.splice(n,1),Q.current=t,t.length>0||(K({isDragActive:!1,type:"setDraggedFiles",draggedFiles:[]}),H(e)&&m&&m(e))}),[S,m,P]),fe=t.useCallback((function(e,t){var n=[],o=[];e.forEach((function(e){var t=f(G(e,r),2),i=t[0],u=t[1],c=f($(e,p,a),2),l=c[0],s=c[1],d=C?C(e):null;if(i&&l&&!d)n.push(e);else{var v=[u,s];d&&(v=v.concat(d)),o.push({file:e,errors:v.filter((function(e){return e}))})}})),(!d&&n.length>1||d&&v>=1&&n.length>v)&&(n.forEach((function(e){o.push({file:e,errors:[q]})})),n.splice(0)),K({acceptedFiles:n,fileRejections:o,type:"setFiles"}),b&&b(n,o,t),o.length>0&&w&&w(o,t),n.length>0&&h&&h(n,t)}),[K,d,r,p,a,v,b,h,w,C]),se=t.useCallback((function(e){e.preventDefault(),e.persist(),we(e),Q.current=[],H(e)&&Promise.resolve(i(e)).then((function(t){W(e)&&!P||fe(t,e)})),K({type:"reset"})}),[i,fe,P]),pe=t.useCallback((function(){if(window.isSecureContext&&F&&Y()){K({type:"openDialog"}),E();var e={multiple:d,types:Z(r)};window.showOpenFilePicker(e).then((function(e){return i(e)})).then((function(e){return fe(e,null)})).catch((function(e){return z(e)})).finally((function(){return K({type:"closeDialog"})}))}else T.current&&(K({type:"openDialog"}),E(),T.current.value=null,T.current.click())}),[K,E,z,F,fe,r,d]),de=t.useCallback((function(e){S.current&&S.current.isEqualNode(e.target)&&(32!==e.keyCode&&13!==e.keyCode||(e.preventDefault(),pe()))}),[S,T,pe]),ve=t.useCallback((function(){K({type:"focus"})}),[]),ge=t.useCallback((function(){K({type:"blur"})}),[]),me=t.useCallback((function(){O||(V()?setTimeout(pe,0):pe())}),[T,O,pe]),ye=function(e){return o?null:e},be=function(e){return A?null:ye(e)},he=function(e){return k?null:ye(e)},we=function(e){P&&e.stopPropagation()},De=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,r=e.role,i=e.onKeyDown,a=e.onFocus,f=e.onBlur,s=e.onClick,p=e.onDragEnter,d=e.onDragOver,v=e.onDragLeave,g=e.onDrop,m=l(e,ne);return u(u(c({onKeyDown:be(X(i,de)),onFocus:be(X(a,ve)),onBlur:be(X(f,ge)),onClick:ye(X(s,me)),onDragEnter:he(X(p,te)),onDragOver:he(X(d,oe)),onDragLeave:he(X(v,ue)),onDrop:he(X(g,se)),role:"string"==typeof r&&""!==r?r:"button"},n,S),o||A?{}:{tabIndex:0}),m)}}),[S,de,ve,ge,me,te,oe,ue,se,A,k,o]),xe=t.useCallback((function(e){e.stopPropagation()}),[]),Fe=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,o=e.onChange,i=e.onClick,a=l(e,re),f=c({accept:r,multiple:d,type:"file",style:{display:"none"},onChange:ye(X(o,se)),onClick:ye(X(i,xe)),autoComplete:"off",tabIndex:-1},n,T);return u(u({},f),a)}}),[T,r,d,se,o]),je=_.length,Oe=je>0&&N({files:_,accept:r,minSize:p,maxSize:a,multiple:d,maxFiles:v}),Ae=je>0&&!Oe;return u(u({},I),{},{isDragAccept:Oe,isDragReject:Ae,isFocused:M&&!o,getRootProps:De,getInputProps:Fe,rootRef:S,inputRef:T,open:ye(pe)})}function ce(e,t){switch(t.type){case"focus":return u(u({},e),{},{isFocused:!0});case"blur":return u(u({},e),{},{isFocused:!1});case"openDialog":return u(u({},ae),{},{isFileDialogActive:!0});case"closeDialog":return u(u({},e),{},{isFileDialogActive:!1});case"setDraggedFiles":var n=t.isDragActive,r=t.draggedFiles;return u(u({},e),{},{draggedFiles:r,isDragActive:n});case"setFiles":return u(u({},e),{},{acceptedFiles:t.acceptedFiles,fileRejections:t.fileRejections});case"reset":return u({},ae);default:return e}}function le(){}e.ErrorCode=I,e.default=oe,e.useDropzone=ue,Object.defineProperty(e,"__esModule",{value:!0})}));
16
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9ub2RlX21vZHVsZXMvZmlsZS1zZWxlY3Rvci9kaXN0L2VzNS9maWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2VsZWN0b3IvZGlzdC9lczUvZmlsZS1zZWxlY3Rvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9hdHRyLWFjY2VwdC9kaXN0L2VzL2luZGV4LmpzIiwiLi4vc3JjL3V0aWxzL2luZGV4LmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiZXhwb3J0IHZhciBDT01NT05fTUlNRV9UWVBFUyA9IG5ldyBNYXAoW1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlcy9Db21tb25fdHlwZXNcbiAgICBbJ2FhYycsICdhdWRpby9hYWMnXSxcbiAgICBbJ2FidycsICdhcHBsaWNhdGlvbi94LWFiaXdvcmQnXSxcbiAgICBbJ2FyYycsICdhcHBsaWNhdGlvbi94LWZyZWVhcmMnXSxcbiAgICBbJ2F2aWYnLCAnaW1hZ2UvYXZpZiddLFxuICAgIFsnYXZpJywgJ3ZpZGVvL3gtbXN2aWRlbyddLFxuICAgIFsnYXp3JywgJ2FwcGxpY2F0aW9uL3ZuZC5hbWF6b24uZWJvb2snXSxcbiAgICBbJ2JpbicsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ2JtcCcsICdpbWFnZS9ibXAnXSxcbiAgICBbJ2J6JywgJ2FwcGxpY2F0aW9uL3gtYnppcCddLFxuICAgIFsnYnoyJywgJ2FwcGxpY2F0aW9uL3gtYnppcDInXSxcbiAgICBbJ2NkYScsICdhcHBsaWNhdGlvbi94LWNkZiddLFxuICAgIFsnY3NoJywgJ2FwcGxpY2F0aW9uL3gtY3NoJ10sXG4gICAgWydjc3MnLCAndGV4dC9jc3MnXSxcbiAgICBbJ2NzdicsICd0ZXh0L2NzdiddLFxuICAgIFsnZG9jJywgJ2FwcGxpY2F0aW9uL21zd29yZCddLFxuICAgIFsnZG9jeCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCddLFxuICAgIFsnZW90JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0J10sXG4gICAgWydlcHViJywgJ2FwcGxpY2F0aW9uL2VwdWIremlwJ10sXG4gICAgWydneicsICdhcHBsaWNhdGlvbi9nemlwJ10sXG4gICAgWydnaWYnLCAnaW1hZ2UvZ2lmJ10sXG4gICAgWydodG0nLCAndGV4dC9odG1sJ10sXG4gICAgWydodG1sJywgJ3RleHQvaHRtbCddLFxuICAgIFsnaWNvJywgJ2ltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiddLFxuICAgIFsnaWNzJywgJ3RleHQvY2FsZW5kYXInXSxcbiAgICBbJ2phcicsICdhcHBsaWNhdGlvbi9qYXZhLWFyY2hpdmUnXSxcbiAgICBbJ2pwZWcnLCAnaW1hZ2UvanBlZyddLFxuICAgIFsnanBnJywgJ2ltYWdlL2pwZWcnXSxcbiAgICBbJ2pzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnanNvbicsICdhcHBsaWNhdGlvbi9qc29uJ10sXG4gICAgWydqc29ubGQnLCAnYXBwbGljYXRpb24vbGQranNvbiddLFxuICAgIFsnbWlkJywgJ2F1ZGlvL21pZGknXSxcbiAgICBbJ21pZGknLCAnYXVkaW8vbWlkaSddLFxuICAgIFsnbWpzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnbXAzJywgJ2F1ZGlvL21wZWcnXSxcbiAgICBbJ21wNCcsICd2aWRlby9tcDQnXSxcbiAgICBbJ21wZWcnLCAndmlkZW8vbXBlZyddLFxuICAgIFsnbXBrZycsICdhcHBsaWNhdGlvbi92bmQuYXBwbGUuaW5zdGFsbGVyK3htbCddLFxuICAgIFsnb2RwJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uJ10sXG4gICAgWydvZHMnLCAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCddLFxuICAgIFsnb2R0JywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCddLFxuICAgIFsnb2dhJywgJ2F1ZGlvL29nZyddLFxuICAgIFsnb2d2JywgJ3ZpZGVvL29nZyddLFxuICAgIFsnb2d4JywgJ2FwcGxpY2F0aW9uL29nZyddLFxuICAgIFsnb3B1cycsICdhdWRpby9vcHVzJ10sXG4gICAgWydvdGYnLCAnZm9udC9vdGYnXSxcbiAgICBbJ3BuZycsICdpbWFnZS9wbmcnXSxcbiAgICBbJ3BkZicsICdhcHBsaWNhdGlvbi9wZGYnXSxcbiAgICBbJ3BocCcsICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCddLFxuICAgIFsncHB0JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50J10sXG4gICAgWydwcHR4JywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nXSxcbiAgICBbJ3JhcicsICdhcHBsaWNhdGlvbi92bmQucmFyJ10sXG4gICAgWydydGYnLCAnYXBwbGljYXRpb24vcnRmJ10sXG4gICAgWydzaCcsICdhcHBsaWNhdGlvbi94LXNoJ10sXG4gICAgWydzdmcnLCAnaW1hZ2Uvc3ZnK3htbCddLFxuICAgIFsnc3dmJywgJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJ10sXG4gICAgWyd0YXInLCAnYXBwbGljYXRpb24veC10YXInXSxcbiAgICBbJ3RpZicsICdpbWFnZS90aWZmJ10sXG4gICAgWyd0aWZmJywgJ2ltYWdlL3RpZmYnXSxcbiAgICBbJ3RzJywgJ3ZpZGVvL21wMnQnXSxcbiAgICBbJ3R0ZicsICdmb250L3R0ZiddLFxuICAgIFsndHh0JywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ3ZzZCcsICdhcHBsaWNhdGlvbi92bmQudmlzaW8nXSxcbiAgICBbJ3dhdicsICdhdWRpby93YXYnXSxcbiAgICBbJ3dlYmEnLCAnYXVkaW8vd2VibSddLFxuICAgIFsnd2VibScsICd2aWRlby93ZWJtJ10sXG4gICAgWyd3ZWJwJywgJ2ltYWdlL3dlYnAnXSxcbiAgICBbJ3dvZmYnLCAnZm9udC93b2ZmJ10sXG4gICAgWyd3b2ZmMicsICdmb250L3dvZmYyJ10sXG4gICAgWyd4aHRtbCcsICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnXSxcbiAgICBbJ3hscycsICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnXSxcbiAgICBbJ3hsc3gnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnXSxcbiAgICBbJ3htbCcsICdhcHBsaWNhdGlvbi94bWwnXSxcbiAgICBbJ3h1bCcsICdhcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sJ10sXG4gICAgWyd6aXAnLCAnYXBwbGljYXRpb24vemlwJ10sXG4gICAgWyc3eicsICdhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQnXSxcbiAgICAvLyBPdGhlcnNcbiAgICBbJ21rdicsICd2aWRlby94LW1hdHJvc2thJ10sXG4gICAgWydtb3YnLCAndmlkZW8vcXVpY2t0aW1lJ10sXG4gICAgWydtc2cnLCAnYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2snXVxuXSk7XG5leHBvcnQgZnVuY3Rpb24gdG9GaWxlV2l0aFBhdGgoZmlsZSwgcGF0aCkge1xuICAgIHZhciBmID0gd2l0aE1pbWVUeXBlKGZpbGUpO1xuICAgIGlmICh0eXBlb2YgZi5wYXRoICE9PSAnc3RyaW5nJykgeyAvLyBvbiBlbGVjdHJvbiwgcGF0aCBpcyBhbHJlYWR5IHNldCB0byB0aGUgYWJzb2x1dGUgcGF0aFxuICAgICAgICB2YXIgd2Via2l0UmVsYXRpdmVQYXRoID0gZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGg7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAncGF0aCcsIHtcbiAgICAgICAgICAgIHZhbHVlOiB0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IHBhdGhcbiAgICAgICAgICAgICAgICAvLyBJZiA8aW5wdXQgd2Via2l0ZGlyZWN0b3J5PiBpcyBzZXQsXG4gICAgICAgICAgICAgICAgLy8gdGhlIEZpbGUgd2lsbCBoYXZlIGEge3dlYmtpdFJlbGF0aXZlUGF0aH0gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTElucHV0RWxlbWVudC93ZWJraXRkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiB3ZWJraXRSZWxhdGl2ZVBhdGggPT09ICdzdHJpbmcnICYmIHdlYmtpdFJlbGF0aXZlUGF0aC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gd2Via2l0UmVsYXRpdmVQYXRoXG4gICAgICAgICAgICAgICAgICAgIDogZmlsZS5uYW1lLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmO1xufVxuZnVuY3Rpb24gd2l0aE1pbWVUeXBlKGZpbGUpIHtcbiAgICB2YXIgbmFtZSA9IGZpbGUubmFtZTtcbiAgICB2YXIgaGFzRXh0ZW5zaW9uID0gbmFtZSAmJiBuYW1lLmxhc3RJbmRleE9mKCcuJykgIT09IC0xO1xuICAgIGlmIChoYXNFeHRlbnNpb24gJiYgIWZpbGUudHlwZSkge1xuICAgICAgICB2YXIgZXh0ID0gbmFtZS5zcGxpdCgnLicpXG4gICAgICAgICAgICAucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIHR5cGUgPSBDT01NT05fTUlNRV9UWVBFUy5nZXQoZXh0KTtcbiAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWxlLCAndHlwZScsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgdG9GaWxlV2l0aFBhdGggfSBmcm9tICcuL2ZpbGUnO1xudmFyIEZJTEVTX1RPX0lHTk9SRSA9IFtcbiAgICAvLyBUaHVtYm5haWwgY2FjaGUgZmlsZXMgZm9yIG1hY09TIGFuZCBXaW5kb3dzXG4gICAgJy5EU19TdG9yZScsXG4gICAgJ1RodW1icy5kYicgLy8gV2luZG93c1xuXTtcbi8qKlxuICogQ29udmVydCBhIERyYWdFdmVudCdzIERhdGFUcmFzZmVyIG9iamVjdCB0byBhIGxpc3Qgb2YgRmlsZSBvYmplY3RzXG4gKiBOT1RFOiBJZiBzb21lIG9mIHRoZSBpdGVtcyBhcmUgZm9sZGVycyxcbiAqIGV2ZXJ5dGhpbmcgd2lsbCBiZSBmbGF0dGVuZWQgYW5kIHBsYWNlZCBpbiB0aGUgc2FtZSBsaXN0IGJ1dCB0aGUgcGF0aHMgd2lsbCBiZSBrZXB0IGFzIGEge3BhdGh9IHByb3BlcnR5LlxuICpcbiAqIEVYUEVSSU1FTlRBTDogQSBsaXN0IG9mIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtSGFuZGxlIG9iamVjdHMgY2FuIGFsc28gYmUgcGFzc2VkIGFzIGFuIGFyZ1xuICogYW5kIGEgbGlzdCBvZiBGaWxlIG9iamVjdHMgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZXZ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRXZlbnQoZXZ0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZXZ0KSAmJiBpc0RhdGFUcmFuc2ZlcihldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldERhdGFUcmFuc2ZlckZpbGVzKGV2dC5kYXRhVHJhbnNmZXIsIGV2dC50eXBlKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0NoYW5nZUV2dChldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldElucHV0RmlsZXMoZXZ0KV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV2dCkgJiYgZXZ0LmV2ZXJ5KGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAnZ2V0RmlsZScgaW4gaXRlbSAmJiB0eXBlb2YgaXRlbS5nZXRGaWxlID09PSAnZnVuY3Rpb24nOyB9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBnZXRGc0hhbmRsZUZpbGVzKGV2dCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc0RhdGFUcmFuc2Zlcih2YWx1ZSkge1xuICAgIHJldHVybiBpc09iamVjdCh2YWx1ZS5kYXRhVHJhbnNmZXIpO1xufVxuZnVuY3Rpb24gaXNDaGFuZ2VFdnQodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzT2JqZWN0KHZhbHVlLnRhcmdldCk7XG59XG5mdW5jdGlvbiBpc09iamVjdCh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0SW5wdXRGaWxlcyhldnQpIHtcbiAgICByZXR1cm4gZnJvbUxpc3QoZXZ0LnRhcmdldC5maWxlcykubWFwKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiB0b0ZpbGVXaXRoUGF0aChmaWxlKTsgfSk7XG59XG4vLyBFZSBleHBlY3QgZWFjaCBoYW5kbGUgdG8gYmUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1GaWxlSGFuZGxlXG5mdW5jdGlvbiBnZXRGc0hhbmRsZUZpbGVzKGhhbmRsZXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaWxlcztcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoZnVuY3Rpb24gKGgpIHsgcmV0dXJuIGguZ2V0RmlsZSgpOyB9KSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmaWxlcy5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVRyYW5zZmVyRmlsZXMoZHQsIHR5cGUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpdGVtcywgZmlsZXM7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmIChkdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWR0Lml0ZW1zKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBmcm9tTGlzdChkdC5pdGVtcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0ua2luZCA9PT0gJ2ZpbGUnOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSAnZHJhZ3N0YXJ0JyBhbmQgJ2Ryb3AnIGhhcyBhY2Nlc3MgdG8gdGhlIGRhdGEgKHNvdXJjZSBub2RlKVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gJ2Ryb3AnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgaXRlbXNdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGl0ZW1zLm1hcCh0b0ZpbGVQcm9taXNlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbm9JZ25vcmVkRmlsZXMoZmxhdHRlbihmaWxlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCBub0lnbm9yZWRGaWxlcyhmcm9tTGlzdChkdC5maWxlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KSldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vSWdub3JlZEZpbGVzKGZpbGVzKSB7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkgeyByZXR1cm4gRklMRVNfVE9fSUdOT1JFLmluZGV4T2YoZmlsZS5uYW1lKSA9PT0gLTE7IH0pO1xufVxuLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IEFycmF5LmZyb20oKVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZnJvbSNCcm93c2VyX2NvbXBhdGliaWxpdHlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlTGlzdFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlckl0ZW1MaXN0XG5mdW5jdGlvbiBmcm9tTGlzdChpdGVtcykge1xuICAgIGlmIChpdGVtcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciBmaWxlcyA9IFtdO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOiBwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmlsZSA9IGl0ZW1zW2ldO1xuICAgICAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVySXRlbVxuZnVuY3Rpb24gdG9GaWxlUHJvbWlzZXMoaXRlbSkge1xuICAgIGlmICh0eXBlb2YgaXRlbS53ZWJraXRHZXRBc0VudHJ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmcm9tRGF0YVRyYW5zZmVySXRlbShpdGVtKTtcbiAgICB9XG4gICAgdmFyIGVudHJ5ID0gaXRlbS53ZWJraXRHZXRBc0VudHJ5KCk7XG4gICAgLy8gU2FmYXJpIHN1cHBvcnRzIGRyb3BwaW5nIGFuIGltYWdlIG5vZGUgZnJvbSBhIGRpZmZlcmVudCB3aW5kb3cgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmdcbiAgICAvLyB0aGUgRGF0YVRyYW5zZmVySXRlbS5nZXRBc0ZpbGUoKSBBUElcbiAgICAvLyBOT1RFOiBGaWxlU3lzdGVtRW50cnkuZmlsZSgpIHRocm93cyBpZiB0cnlpbmcgdG8gZ2V0IHRoZSBmaWxlXG4gICAgaWYgKGVudHJ5ICYmIGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIHJldHVybiBmcm9tRGlyRW50cnkoZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSk7XG59XG5mdW5jdGlvbiBmbGF0dGVuKGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBmaWxlcykgeyByZXR1cm4gX19zcHJlYWQoYWNjLCAoQXJyYXkuaXNBcnJheShmaWxlcykgPyBmbGF0dGVuKGZpbGVzKSA6IFtmaWxlc10pKTsgfSwgW10pO1xufVxuZnVuY3Rpb24gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSkge1xuICAgIHZhciBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGl0ZW0gKyBcIiBpcyBub3QgYSBGaWxlXCIpO1xuICAgIH1cbiAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmd3ApO1xufVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1FbnRyeVxuZnVuY3Rpb24gZnJvbUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW50cnkuaXNEaXJlY3RvcnkgPyBmcm9tRGlyRW50cnkoZW50cnkpIDogZnJvbUZpbGVFbnRyeShlbnRyeSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRGlyZWN0b3J5RW50cnlcbmZ1bmN0aW9uIGZyb21EaXJFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWFkZXIgPSBlbnRyeS5jcmVhdGVSZWFkZXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgICAgICBmdW5jdGlvbiByZWFkRW50cmllcygpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZVN5c3RlbURpcmVjdG9yeUVudHJ5L2NyZWF0ZVJlYWRlclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1EaXJlY3RvcnlSZWFkZXIvcmVhZEVudHJpZXNcbiAgICAgICAgICAgIHJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoYmF0Y2gpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZXMsIGVycl8xLCBpdGVtcztcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFiYXRjaC5sZW5ndGgpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGVudHJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IFByb21pc2UuYWxsKGJhdGNoLm1hcChmcm9tRW50cnkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIHJlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTsgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZEVudHJpZXMoKTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRmlsZUVudHJ5XG5mdW5jdGlvbiBmcm9tRmlsZUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSwgZW50cnkuZnVsbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmd3ApO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUtc2VsZWN0b3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChmaWxlLCBhY2NlcHRlZEZpbGVzKSB7XG4gIGlmIChmaWxlICYmIGFjY2VwdGVkRmlsZXMpIHtcbiAgICB2YXIgYWNjZXB0ZWRGaWxlc0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NlcHRlZEZpbGVzKSA/IGFjY2VwdGVkRmlsZXMgOiBhY2NlcHRlZEZpbGVzLnNwbGl0KCcsJyk7XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8ICcnO1xuICAgIHZhciBtaW1lVHlwZSA9IChmaWxlLnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGJhc2VNaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICByZXR1cm4gYWNjZXB0ZWRGaWxlc0FycmF5LnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIHZhciB2YWxpZFR5cGUgPSB0eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAodmFsaWRUeXBlLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKHZhbGlkVHlwZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbGlkVHlwZS5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlIGEgaW1hZ2UvKiBtaW1lIHR5cGVcbiAgICAgICAgcmV0dXJuIGJhc2VNaW1lVHlwZSA9PT0gdmFsaWRUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1pbWVUeXBlID09PSB2YWxpZFR5cGU7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07IiwiaW1wb3J0IGFjY2VwdHMgZnJvbSBcImF0dHItYWNjZXB0XCI7XG5cbi8vIEVycm9yIGNvZGVzXG5leHBvcnQgY29uc3QgRklMRV9JTlZBTElEX1RZUEUgPSBcImZpbGUtaW52YWxpZC10eXBlXCI7XG5leHBvcnQgY29uc3QgRklMRV9UT09fTEFSR0UgPSBcImZpbGUtdG9vLWxhcmdlXCI7XG5leHBvcnQgY29uc3QgRklMRV9UT09fU01BTEwgPSBcImZpbGUtdG9vLXNtYWxsXCI7XG5leHBvcnQgY29uc3QgVE9PX01BTllfRklMRVMgPSBcInRvby1tYW55LWZpbGVzXCI7XG5cbmV4cG9ydCBjb25zdCBFcnJvckNvZGUgPSB7XG4gIEZpbGVJbnZhbGlkVHlwZTogRklMRV9JTlZBTElEX1RZUEUsXG4gIEZpbGVUb29MYXJnZTogRklMRV9UT09fTEFSR0UsXG4gIEZpbGVUb29TbWFsbDogRklMRV9UT09fU01BTEwsXG4gIFRvb01hbnlGaWxlczogVE9PX01BTllfRklMRVMsXG59O1xuXG4vLyBGaWxlIEVycm9yc1xuZXhwb3J0IGNvbnN0IGdldEludmFsaWRUeXBlUmVqZWN0aW9uRXJyID0gKGFjY2VwdCkgPT4ge1xuICBhY2NlcHQgPSBBcnJheS5pc0FycmF5KGFjY2VwdCkgJiYgYWNjZXB0Lmxlbmd0aCA9PT0gMSA/IGFjY2VwdFswXSA6IGFjY2VwdDtcbiAgY29uc3QgbWVzc2FnZVN1ZmZpeCA9IEFycmF5LmlzQXJyYXkoYWNjZXB0KVxuICAgID8gYG9uZSBvZiAke2FjY2VwdC5qb2luKFwiLCBcIil9YFxuICAgIDogYWNjZXB0O1xuICByZXR1cm4ge1xuICAgIGNvZGU6IEZJTEVfSU5WQUxJRF9UWVBFLFxuICAgIG1lc3NhZ2U6IGBGaWxlIHR5cGUgbXVzdCBiZSAke21lc3NhZ2VTdWZmaXh9YCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUb29MYXJnZVJlamVjdGlvbkVyciA9IChtYXhTaXplKSA9PiB7XG4gIHJldHVybiB7XG4gICAgY29kZTogRklMRV9UT09fTEFSR0UsXG4gICAgbWVzc2FnZTogYEZpbGUgaXMgbGFyZ2VyIHRoYW4gJHttYXhTaXplfSAke1xuICAgICAgbWF4U2l6ZSA9PT0gMSA/IFwiYnl0ZVwiIDogXCJieXRlc1wiXG4gICAgfWAsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIgPSAobWluU2l6ZSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGNvZGU6IEZJTEVfVE9PX1NNQUxMLFxuICAgIG1lc3NhZ2U6IGBGaWxlIGlzIHNtYWxsZXIgdGhhbiAke21pblNpemV9ICR7XG4gICAgICBtaW5TaXplID09PSAxID8gXCJieXRlXCIgOiBcImJ5dGVzXCJcbiAgICB9YCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBUT09fTUFOWV9GSUxFU19SRUpFQ1RJT04gPSB7XG4gIGNvZGU6IFRPT19NQU5ZX0ZJTEVTLFxuICBtZXNzYWdlOiBcIlRvbyBtYW55IGZpbGVzXCIsXG59O1xuXG4vLyBGaXJlZm94IHZlcnNpb25zIHByaW9yIHRvIDUzIHJldHVybiBhIGJvZ3VzIE1JTUUgdHlwZSBmb3IgZXZlcnkgZmlsZSBkcmFnLCBzbyBkcmFnb3ZlcnMgd2l0aFxuLy8gdGhhdCBNSU1FIHR5cGUgd2lsbCBhbHdheXMgYmUgYWNjZXB0ZWRcbmV4cG9ydCBmdW5jdGlvbiBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KSB7XG4gIGNvbnN0IGlzQWNjZXB0YWJsZSA9XG4gICAgZmlsZS50eXBlID09PSBcImFwcGxpY2F0aW9uL3gtbW96LWZpbGVcIiB8fCBhY2NlcHRzKGZpbGUsIGFjY2VwdCk7XG4gIHJldHVybiBbXG4gICAgaXNBY2NlcHRhYmxlLFxuICAgIGlzQWNjZXB0YWJsZSA/IG51bGwgOiBnZXRJbnZhbGlkVHlwZVJlamVjdGlvbkVycihhY2NlcHQpLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsZU1hdGNoU2l6ZShmaWxlLCBtaW5TaXplLCBtYXhTaXplKSB7XG4gIGlmIChpc0RlZmluZWQoZmlsZS5zaXplKSkge1xuICAgIGlmIChpc0RlZmluZWQobWluU2l6ZSkgJiYgaXNEZWZpbmVkKG1heFNpemUpKSB7XG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4U2l6ZSkgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIobWF4U2l6ZSldO1xuICAgICAgaWYgKGZpbGUuc2l6ZSA8IG1pblNpemUpIHJldHVybiBbZmFsc2UsIGdldFRvb1NtYWxsUmVqZWN0aW9uRXJyKG1pblNpemUpXTtcbiAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChtaW5TaXplKSAmJiBmaWxlLnNpemUgPCBtaW5TaXplKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIobWluU2l6ZSldO1xuICAgIGVsc2UgaWYgKGlzRGVmaW5lZChtYXhTaXplKSAmJiBmaWxlLnNpemUgPiBtYXhTaXplKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIobWF4U2l6ZSldO1xuICB9XG4gIHJldHVybiBbdHJ1ZSwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIGlzRGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbEZpbGVzQWNjZXB0ZWQoe1xuICBmaWxlcyxcbiAgYWNjZXB0LFxuICBtaW5TaXplLFxuICBtYXhTaXplLFxuICBtdWx0aXBsZSxcbiAgbWF4RmlsZXMsXG59KSB7XG4gIGlmIChcbiAgICAoIW11bHRpcGxlICYmIGZpbGVzLmxlbmd0aCA+IDEpIHx8XG4gICAgKG11bHRpcGxlICYmIG1heEZpbGVzID49IDEgJiYgZmlsZXMubGVuZ3RoID4gbWF4RmlsZXMpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlcy5ldmVyeSgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IFthY2NlcHRlZF0gPSBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KTtcbiAgICBjb25zdCBbc2l6ZU1hdGNoXSA9IGZpbGVNYXRjaFNpemUoZmlsZSwgbWluU2l6ZSwgbWF4U2l6ZSk7XG4gICAgcmV0dXJuIGFjY2VwdGVkICYmIHNpemVNYXRjaDtcbiAgfSk7XG59XG5cbi8vIFJlYWN0J3Mgc3ludGhldGljIGV2ZW50cyBoYXMgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQsXG4vLyBidXQgdG8gcmVtYWluIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaWJzIChQcmVhY3QpIGZhbGwgYmFja1xuLy8gdG8gY2hlY2sgZXZlbnQuY2FuY2VsQnViYmxlXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBldmVudC5jYW5jZWxCdWJibGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFdnRXaXRoRmlsZXMoZXZlbnQpIHtcbiAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICByZXR1cm4gISFldmVudC50YXJnZXQgJiYgISFldmVudC50YXJnZXQuZmlsZXM7XG4gIH1cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlci90eXBlc1xuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9EcmFnX2FuZF9Ecm9wX0FQSS9SZWNvbW1lbmRlZF9kcmFnX3R5cGVzI2ZpbGVcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwoXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzLFxuICAgICh0eXBlKSA9PiB0eXBlID09PSBcIkZpbGVzXCIgfHwgdHlwZSA9PT0gXCJhcHBsaWNhdGlvbi94LW1vei1maWxlXCJcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2luZEZpbGUoaXRlbSkge1xuICByZXR1cm4gdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiYgaXRlbSAhPT0gbnVsbCAmJiBpdGVtLmtpbmQgPT09IFwiZmlsZVwiO1xufVxuXG4vLyBhbGxvdyB0aGUgZW50aXJlIGRvY3VtZW50IHRvIGJlIGEgZHJhZyB0YXJnZXRcbmV4cG9ydCBmdW5jdGlvbiBvbkRvY3VtZW50RHJhZ092ZXIoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn1cblxuZnVuY3Rpb24gaXNJZSh1c2VyQWdlbnQpIHtcbiAgcmV0dXJuIChcbiAgICB1c2VyQWdlbnQuaW5kZXhPZihcIk1TSUVcIikgIT09IC0xIHx8IHVzZXJBZ2VudC5pbmRleE9mKFwiVHJpZGVudC9cIikgIT09IC0xXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRWRnZSh1c2VyQWdlbnQpIHtcbiAgcmV0dXJuIHVzZXJBZ2VudC5pbmRleE9mKFwiRWRnZS9cIikgIT09IC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZU9yRWRnZSh1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkge1xuICByZXR1cm4gaXNJZSh1c2VyQWdlbnQpIHx8IGlzRWRnZSh1c2VyQWdlbnQpO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjb21wb3NlIGV2ZW50IGhhbmRsZXJzXG4gKiBUaGV5IGFyZSBleGVjdXRlZCBpbiBvcmRlciB1bnRpbCBvbmUgb2YgdGhlbSBjYWxscyBgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKWAuXG4gKiBOb3RlIHRoYXQgdGhlIGNoZWNrIGlzIGRvbmUgb24gdGhlIGZpcnN0IGludm9rZSB0b28sXG4gKiBtZWFuaW5nIHRoYXQgaWYgcHJvcGFnYXRpb24gd2FzIHN0b3BwZWQgYmVmb3JlIGludm9raW5nIHRoZSBmbnMsXG4gKiBubyBoYW5kbGVycyB3aWxsIGJlIGV4ZWN1dGVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZucyB0aGUgZXZlbnQgaGFubGRlciBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0aGUgZXZlbnQgaGFuZGxlciB0byBhZGQgdG8gYW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUV2ZW50SGFuZGxlcnMoLi4uZm5zKSB7XG4gIHJldHVybiAoZXZlbnQsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnNvbWUoKGZuKSA9PiB7XG4gICAgICBpZiAoIWlzUHJvcGFnYXRpb25TdG9wcGVkKGV2ZW50KSAmJiBmbikge1xuICAgICAgICBmbihldmVudCwgLi4uYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkgY2hlY2tzIGlmIHRoZSBbRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUEkpXG4gKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkoKSB7XG4gIHJldHVybiBcInNob3dPcGVuRmlsZVBpY2tlclwiIGluIHdpbmRvdztcbn1cblxuLyoqXG4gKiBmaWxlUGlja2VyT3B0aW9uc1R5cGVzIHJldHVybnMgdGhlIHt0eXBlc30gb3B0aW9uIGZvciBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvd2luZG93L3Nob3dPcGVuRmlsZVBpY2tlclxuICogYmFzZWQgb24gdGhlIGFjY2VwdCBhdHRyIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRyb3B6b25lL2F0dHItYWNjZXB0KVxuICogRS5nOiBjb252ZXJ0cyBbJ2ltYWdlLyonLCAndGV4dC8qJ10gdG8geydpbWFnZS8qJzogW10sICd0ZXh0LyonOiBbXX1cbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhY2NlcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGVQaWNrZXJPcHRpb25zVHlwZXMoYWNjZXB0KSB7XG4gIGFjY2VwdCA9IHR5cGVvZiBhY2NlcHQgPT09IFwic3RyaW5nXCIgPyBhY2NlcHQuc3BsaXQoXCIsXCIpIDogYWNjZXB0O1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcImV2ZXJ5dGhpbmdcIixcbiAgICAgIC8vIFRPRE86IE5lZWQgdG8gaGFuZGxlIGZpbHRlcmluZyBtb3JlIGVsZWdhbnRseSB0aGFuIHRoaXMhXG4gICAgICBhY2NlcHQ6IEFycmF5LmlzQXJyYXkoYWNjZXB0KVxuICAgICAgICA/IC8vIEFjY2VwdCBqdXN0IE1JTUUgdHlwZXMgYXMgcGVyIHNwZWNcbiAgICAgICAgICAvLyBOT1RFOiBhY2NlcHQgY2FuIGJlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9maWxlI3VuaXF1ZV9maWxlX3R5cGVfc3BlY2lmaWVyc1xuICAgICAgICAgIGFjY2VwdFxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgaXRlbSA9PT0gXCJhdWRpby8qXCIgfHxcbiAgICAgICAgICAgICAgICBpdGVtID09PSBcInZpZGVvLypcIiB8fFxuICAgICAgICAgICAgICAgIGl0ZW0gPT09IFwiaW1hZ2UvKlwiIHx8XG4gICAgICAgICAgICAgICAgaXRlbSA9PT0gXCJ0ZXh0LypcIiB8fFxuICAgICAgICAgICAgICAgIC9cXHcrXFwvWy0rLlxcd10rL2cudGVzdChpdGVtKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gKHsgLi4uYSwgW2JdOiBbXSB9KSwge30pXG4gICAgICAgIDoge30sXG4gICAgfSxcbiAgXTtcbn1cbiIsIi8qIGVzbGludCBwcmVmZXItdGVtcGxhdGU6IDAgKi9cbmltcG9ydCBSZWFjdCwge1xuICBmb3J3YXJkUmVmLFxuICBGcmFnbWVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgdXNlTWVtbyxcbiAgdXNlUmVkdWNlcixcbiAgdXNlUmVmLFxufSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIjtcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gXCJmaWxlLXNlbGVjdG9yXCI7XG5pbXBvcnQge1xuICBhbGxGaWxlc0FjY2VwdGVkLFxuICBjb21wb3NlRXZlbnRIYW5kbGVycyxcbiAgZmlsZUFjY2VwdGVkLFxuICBmaWxlTWF0Y2hTaXplLFxuICBmaWxlUGlja2VyT3B0aW9uc1R5cGVzLFxuICBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJLFxuICBpc0V2dFdpdGhGaWxlcyxcbiAgaXNJZU9yRWRnZSxcbiAgaXNQcm9wYWdhdGlvblN0b3BwZWQsXG4gIG9uRG9jdW1lbnREcmFnT3ZlcixcbiAgVE9PX01BTllfRklMRVNfUkVKRUNUSU9OLFxufSBmcm9tIFwiLi91dGlscy9pbmRleFwiO1xuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgY29tcG9uZW50IGZvciB0aGUgYHVzZURyb3B6b25lYCBob29rXG4gKlxuICogYGBganN4XG4gKiA8RHJvcHpvbmU+XG4gKiAgIHsoe2dldFJvb3RQcm9wcywgZ2V0SW5wdXRQcm9wc30pID0+IChcbiAqICAgICA8ZGl2IHsuLi5nZXRSb290UHJvcHMoKX0+XG4gKiAgICAgICA8aW5wdXQgey4uLmdldElucHV0UHJvcHMoKX0gLz5cbiAqICAgICAgIDxwPkRyYWcgJ24nIGRyb3Agc29tZSBmaWxlcyBoZXJlLCBvciBjbGljayB0byBzZWxlY3QgZmlsZXM8L3A+XG4gKiAgICAgPC9kaXY+XG4gKiAgICl9XG4gKiA8L0Ryb3B6b25lPlxuICogYGBgXG4gKi9cbmNvbnN0IERyb3B6b25lID0gZm9yd2FyZFJlZigoeyBjaGlsZHJlbiwgLi4ucGFyYW1zIH0sIHJlZikgPT4ge1xuICBjb25zdCB7IG9wZW4sIC4uLnByb3BzIH0gPSB1c2VEcm9wem9uZShwYXJhbXMpO1xuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoeyBvcGVuIH0pLCBbb3Blbl0pO1xuXG4gIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IHJlYWN0LXN0eWxlZ3VpZGlzdCBjYW5ub3QgY3JlYXRlIGRvY3MgaWYgd2UgZG9uJ3QgcmV0dXJuIGEganN4IGVsZW1lbnRcbiAgcmV0dXJuIDxGcmFnbWVudD57Y2hpbGRyZW4oeyAuLi5wcm9wcywgb3BlbiB9KX08L0ZyYWdtZW50Pjtcbn0pO1xuXG5Ecm9wem9uZS5kaXNwbGF5TmFtZSA9IFwiRHJvcHpvbmVcIjtcblxuLy8gQWRkIGRlZmF1bHQgcHJvcHMgZm9yIHJlYWN0LWRvY2dlblxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICBkaXNhYmxlZDogZmFsc2UsXG4gIGdldEZpbGVzRnJvbUV2ZW50OiBmcm9tRXZlbnQsXG4gIG1heFNpemU6IEluZmluaXR5LFxuICBtaW5TaXplOiAwLFxuICBtdWx0aXBsZTogdHJ1ZSxcbiAgbWF4RmlsZXM6IDAsXG4gIHByZXZlbnREcm9wT25Eb2N1bWVudDogdHJ1ZSxcbiAgbm9DbGljazogZmFsc2UsXG4gIG5vS2V5Ym9hcmQ6IGZhbHNlLFxuICBub0RyYWc6IGZhbHNlLFxuICBub0RyYWdFdmVudHNCdWJibGluZzogZmFsc2UsXG4gIHZhbGlkYXRvcjogbnVsbCxcbiAgdXNlRnNBY2Nlc3NBcGk6IHRydWUsXG59O1xuXG5Ecm9wem9uZS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbkRyb3B6b25lLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFJlbmRlciBmdW5jdGlvbiB0aGF0IGV4cG9zZXMgdGhlIGRyb3B6b25lIHN0YXRlIGFuZCBwcm9wIGdldHRlciBmbnNcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbXMuZ2V0Um9vdFByb3BzIFJldHVybnMgdGhlIHByb3BzIHlvdSBzaG91bGQgYXBwbHkgdG8gdGhlIHJvb3QgZHJvcCBjb250YWluZXIgeW91IHJlbmRlclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbXMuZ2V0SW5wdXRQcm9wcyBSZXR1cm5zIHRoZSBwcm9wcyB5b3Ugc2hvdWxkIGFwcGx5IHRvIGhpZGRlbiBmaWxlIGlucHV0IHlvdSByZW5kZXJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLm9wZW4gT3BlbiB0aGUgbmF0aXZlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0ZvY3VzZWQgRHJvcHpvbmUgYXJlYSBpcyBpbiBmb2N1c1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0ZpbGVEaWFsb2dBY3RpdmUgRmlsZSBkaWFsb2cgaXMgb3BlbmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmlzRHJhZ0FjdGl2ZSBBY3RpdmUgZHJhZyBpcyBpbiBwcm9ncmVzc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0RyYWdBY2NlcHQgRHJhZ2dlZCBmaWxlcyBhcmUgYWNjZXB0ZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNEcmFnUmVqZWN0IFNvbWUgZHJhZ2dlZCBmaWxlcyBhcmUgcmVqZWN0ZWRcbiAgICogQHBhcmFtIHtGaWxlW119IHBhcmFtcy5kcmFnZ2VkRmlsZXMgRmlsZXMgaW4gYWN0aXZlIGRyYWdcbiAgICogQHBhcmFtIHtGaWxlW119IHBhcmFtcy5hY2NlcHRlZEZpbGVzIEFjY2VwdGVkIGZpbGVzXG4gICAqIEBwYXJhbSB7RmlsZVJlamVjdGlvbltdfSBwYXJhbXMuZmlsZVJlamVjdGlvbnMgUmVqZWN0ZWQgZmlsZXMgYW5kIHdoeSB0aGV5IHdlcmUgcmVqZWN0ZWRcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogU2V0IGFjY2VwdGVkIGZpbGUgdHlwZXMuXG4gICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vb2tvbmV0L2F0dHItYWNjZXB0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiBLZWVwIGluIG1pbmQgdGhhdCBtaW1lIHR5cGUgZGV0ZXJtaW5hdGlvbiBpcyBub3QgcmVsaWFibGUgYWNyb3NzIHBsYXRmb3Jtcy4gQ1NWIGZpbGVzLFxuICAgKiBmb3IgZXhhbXBsZSwgYXJlIHJlcG9ydGVkIGFzIHRleHQvcGxhaW4gdW5kZXIgbWFjT1MgYnV0IGFzIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCB1bmRlclxuICAgKiBXaW5kb3dzLiBJbiBzb21lIGNhc2VzIHRoZXJlIG1pZ2h0IG5vdCBiZSBhIG1pbWUgdHlwZSBzZXQgYXQgYWxsLlxuICAgKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kcm9wem9uZS9yZWFjdC1kcm9wem9uZS9pc3N1ZXMvMjc2XG4gICAqL1xuICBhY2NlcHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gIF0pLFxuXG4gIC8qKlxuICAgKiBBbGxvdyBkcmFnICduJyBkcm9wIChvciBzZWxlY3Rpb24gZnJvbSB0aGUgZmlsZSBkaWFsb2cpIG9mIG11bHRpcGxlIGZpbGVzXG4gICAqL1xuICBtdWx0aXBsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBhbGxvdyBkcm9wcGVkIGl0ZW1zIHRvIHRha2Ugb3ZlciB0aGUgY3VycmVudCBicm93c2VyIHdpbmRvd1xuICAgKi9cbiAgcHJldmVudERyb3BPbkRvY3VtZW50OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgZGlzYWJsZXMgY2xpY2sgdG8gb3BlbiB0aGUgbmF0aXZlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZ1xuICAgKi9cbiAgbm9DbGljazogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGRpc2FibGVzIFNQQUNFL0VOVEVSIHRvIG9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cuXG4gICAqIE5vdGUgdGhhdCBpdCBhbHNvIHN0b3BzIHRyYWNraW5nIHRoZSBmb2N1cyBzdGF0ZS5cbiAgICovXG4gIG5vS2V5Ym9hcmQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBkaXNhYmxlcyBkcmFnICduJyBkcm9wXG4gICAqL1xuICBub0RyYWc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzdG9wcyBkcmFnIGV2ZW50IHByb3BhZ2F0aW9uIHRvIHBhcmVudHNcbiAgICovXG4gIG5vRHJhZ0V2ZW50c0J1YmJsaW5nOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogTWluaW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICAgKi9cbiAgbWluU2l6ZTogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogTWF4aW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICAgKi9cbiAgbWF4U2l6ZTogUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIE1heGltdW0gYWNjZXB0ZWQgbnVtYmVyIG9mIGZpbGVzXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAgd2hpY2ggbWVhbnMgdGhlcmUgaXMgbm8gbGltaXRhdGlvbiB0byBob3cgbWFueSBmaWxlcyBhcmUgYWNjZXB0ZWQuXG4gICAqL1xuICBtYXhGaWxlczogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogRW5hYmxlL2Rpc2FibGUgdGhlIGRyb3B6b25lXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHRvIHByb3ZpZGUgYSBjdXN0b20gZmlsZSBhZ2dyZWdhdG9yXG4gICAqXG4gICAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAgICovXG4gIGdldEZpbGVzRnJvbUV2ZW50OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gY2xvc2luZyB0aGUgZmlsZSBkaWFsb2cgd2l0aCBubyBzZWxlY3Rpb25cbiAgICovXG4gIG9uRmlsZURpYWxvZ0NhbmNlbDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIG9wZW5pbmcgdGhlIGZpbGUgZGlhbG9nXG4gICAqL1xuICBvbkZpbGVEaWFsb2dPcGVuOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogU2V0IHRvIHRydWUgdG8gdXNlIHRoZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZV9TeXN0ZW1fQWNjZXNzX0FQSVxuICAgKiB0byBvcGVuIHRoZSBmaWxlIHBpY2tlciBpbnN0ZWFkIG9mIHVzaW5nIGFuIGA8aW5wdXQgdHlwZT1cImZpbGVcIj5gIGNsaWNrIGV2ZW50LlxuICAgKi9cbiAgdXNlRnNBY2Nlc3NBcGk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyYWdlbnRlcmAgZXZlbnQgb2NjdXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ0VudGVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnbGVhdmVgIGV2ZW50IG9jY3Vyc1xuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ0xlYXZlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnb3ZlcmAgZXZlbnQgb2NjdXJzXG4gICAqXG4gICAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudFxuICAgKi9cbiAgb25EcmFnT3ZlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHRoZSBgZ2V0RmlsZXNGcm9tRXZlbnRgIGNhbGxiYWNrIGlzIGRvbmUuXG4gICAqXG4gICAqIEZpbGVzIGFyZSBhY2NlcHRlZCBvciByZWplY3RlZCBiYXNlZCBvbiB0aGUgYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCBhbmQgYG1heFNpemVgIHByb3BzLlxuICAgKiBgYWNjZXB0YCBtdXN0IGJlIGEgdmFsaWQgW01JTUUgdHlwZV0oaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlcy54aHRtbCkgYWNjb3JkaW5nIHRvIFtpbnB1dCBlbGVtZW50IHNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy93aWtpL0hUTUwvRWxlbWVudHMvaW5wdXQvZmlsZSkgb3IgYSB2YWxpZCBmaWxlIGV4dGVuc2lvbi5cbiAgICogSWYgYG11bHRpcGxlYCBpcyBzZXQgdG8gZmFsc2UgYW5kIGFkZGl0aW9uYWwgZmlsZXMgYXJlIGRyb3BwZWQsXG4gICAqIGFsbCBmaWxlcyBiZXNpZGVzIHRoZSBmaXJzdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBBbnkgZmlsZSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2l6ZSBpbiB0aGUgW2BtaW5TaXplYCwgYG1heFNpemVgXSByYW5nZSwgd2lsbCBiZSByZWplY3RlZCBhcyB3ZWxsLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIGBvbkRyb3BgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGludm9rZWQgcmVnYXJkbGVzcyBpZiB0aGUgZHJvcHBlZCBmaWxlcyB3ZXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLlxuICAgKiBJZiB5b3UnZCBsaWtlIHRvIHJlYWN0IHRvIGEgc3BlY2lmaWMgc2NlbmFyaW8sIHVzZSB0aGUgYG9uRHJvcEFjY2VwdGVkYC9gb25Ecm9wUmVqZWN0ZWRgIHByb3BzLlxuICAgKlxuICAgKiBgb25Ecm9wYCB3aWxsIHByb3ZpZGUgeW91IHdpdGggYW4gYXJyYXkgb2YgW0ZpbGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlKSBvYmplY3RzIHdoaWNoIHlvdSBjYW4gdGhlbiBwcm9jZXNzIGFuZCBzZW5kIHRvIGEgc2VydmVyLlxuICAgKiBGb3IgZXhhbXBsZSwgd2l0aCBbU3VwZXJBZ2VudF0oaHR0cHM6Ly9naXRodWIuY29tL3Zpc2lvbm1lZGlhL3N1cGVyYWdlbnQpIGFzIGEgaHR0cC9hamF4IGxpYnJhcnk6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGZ1bmN0aW9uIG9uRHJvcChhY2NlcHRlZEZpbGVzKSB7XG4gICAqICAgY29uc3QgcmVxID0gcmVxdWVzdC5wb3N0KCcvdXBsb2FkJylcbiAgICogICBhY2NlcHRlZEZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAqICAgICByZXEuYXR0YWNoKGZpbGUubmFtZSwgZmlsZSlcbiAgICogICB9KVxuICAgKiAgIHJlcS5lbmQoY2FsbGJhY2spXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBhY2NlcHRlZEZpbGVzXG4gICAqIEBwYXJhbSB7RmlsZVJlamVjdGlvbltdfSBmaWxlUmVqZWN0aW9uc1xuICAgKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gICAqL1xuICBvbkRyb3A6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyb3BgIGV2ZW50IG9jY3Vycy5cbiAgICogTm90ZSB0aGF0IGlmIG5vIGZpbGVzIGFyZSBhY2NlcHRlZCwgdGhpcyBjYWxsYmFjayBpcyBub3QgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtGaWxlW119IGZpbGVzXG4gICAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50XG4gICAqL1xuICBvbkRyb3BBY2NlcHRlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICAgKiBOb3RlIHRoYXQgaWYgbm8gZmlsZXMgYXJlIHJlamVjdGVkLCB0aGlzIGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gZmlsZVJlamVjdGlvbnNcbiAgICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnRcbiAgICovXG4gIG9uRHJvcFJlamVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cbiAgICogQHBhcmFtIHtGaWxlfSBmaWxlXG4gICAqIEByZXR1cm5zIHtGaWxlRXJyb3J8RmlsZUVycm9yW119XG4gICAqL1xuICB2YWxpZGF0b3I6IFByb3BUeXBlcy5mdW5jLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRHJvcHpvbmU7XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJhZ2VudGVyYCxcbiAqIGBkcmFnb3ZlcmAgYW5kIGBkcmFnbGVhdmVgIGV2ZW50cy5cbiAqIEl0IGlzIG5vdCBpbnZva2VkIGlmIHRoZSBpdGVtcyBhcmUgbm90IGZpbGVzIChzdWNoIGFzIGxpbmssIHRleHQsIGV0Yy4pLlxuICpcbiAqIEBjYWxsYmFjayBkcmFnQ2JcbiAqIEBwYXJhbSB7RHJhZ0V2ZW50fSBldmVudFxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJvcGAgb3IgaW5wdXQgY2hhbmdlIGV2ZW50LlxuICogSXQgaXMgbm90IGludm9rZWQgaWYgdGhlIGl0ZW1zIGFyZSBub3QgZmlsZXMgKHN1Y2ggYXMgbGluaywgdGV4dCwgZXRjLikuXG4gKlxuICogQGNhbGxiYWNrIGRyb3BDYlxuICogQHBhcmFtIHtGaWxlW119IGFjY2VwdGVkRmlsZXMgTGlzdCBvZiBhY2NlcHRlZCBmaWxlc1xuICogQHBhcmFtIHtGaWxlUmVqZWN0aW9uW119IGZpbGVSZWplY3Rpb25zIExpc3Qgb2YgcmVqZWN0ZWQgZmlsZXMgYW5kIHdoeSB0aGV5IHdlcmUgcmVqZWN0ZWRcbiAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGZvciB0aGUgYGRyb3BgIG9yIGlucHV0IGNoYW5nZSBldmVudC5cbiAqIEl0IGlzIG5vdCBpbnZva2VkIGlmIHRoZSBpdGVtcyBhcmUgZmlsZXMgKHN1Y2ggYXMgbGluaywgdGV4dCwgZXRjLikuXG4gKlxuICogQGNhbGxiYWNrIGRyb3BBY2NlcHRlZENiXG4gKiBAcGFyYW0ge0ZpbGVbXX0gZmlsZXMgTGlzdCBvZiBhY2NlcHRlZCBmaWxlcyB0aGF0IG1lZXQgdGhlIGdpdmVuIGNyaXRlcmlhXG4gKiAoYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCwgYG1heFNpemVgKVxuICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIGludm9rZWQgZm9yIHRoZSBgZHJvcGAgb3IgaW5wdXQgY2hhbmdlIGV2ZW50LlxuICpcbiAqIEBjYWxsYmFjayBkcm9wUmVqZWN0ZWRDYlxuICogQHBhcmFtIHtGaWxlW119IGZpbGVzIExpc3Qgb2YgcmVqZWN0ZWQgZmlsZXMgdGhhdCBkbyBub3QgbWVldCB0aGUgZ2l2ZW4gY3JpdGVyaWFcbiAqIChgYWNjZXB0YCwgYG11bHRpcGxlYCwgYG1pblNpemVgLCBgbWF4U2l6ZWApXG4gKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCBhZ2dyZWdhdGUgZmlsZXMsXG4gKiBpbiBhIGFzeW5jaHJvbm91cyBmYXNoaW9uLCBmcm9tIGRyYWcgb3IgaW5wdXQgY2hhbmdlIGV2ZW50cy5cbiAqXG4gKiBAY2FsbGJhY2sgZ2V0RmlsZXNGcm9tRXZlbnRcbiAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAqIEByZXR1cm5zIHsoRmlsZVtdfFByb21pc2U8RmlsZVtdPil9XG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBkcm9wem9uZSBzdGF0ZSBhbmQgc29tZSBoZWxwZXIgZnVuY3Rpb25zLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERyb3B6b25lU3RhdGVcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFJvb3RQcm9wcyBSZXR1cm5zIHRoZSBwcm9wcyB5b3Ugc2hvdWxkIGFwcGx5IHRvIHRoZSByb290IGRyb3AgY29udGFpbmVyIHlvdSByZW5kZXJcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldElucHV0UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byBoaWRkZW4gZmlsZSBpbnB1dCB5b3UgcmVuZGVyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBvcGVuIE9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGb2N1c2VkIERyb3B6b25lIGFyZWEgaXMgaW4gZm9jdXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNGaWxlRGlhbG9nQWN0aXZlIEZpbGUgZGlhbG9nIGlzIG9wZW5lZFxuICogQHByb3BlcnR5IHtib29sZWFufSBpc0RyYWdBY3RpdmUgQWN0aXZlIGRyYWcgaXMgaW4gcHJvZ3Jlc3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNEcmFnQWNjZXB0IERyYWdnZWQgZmlsZXMgYXJlIGFjY2VwdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRHJhZ1JlamVjdCBTb21lIGRyYWdnZWQgZmlsZXMgYXJlIHJlamVjdGVkXG4gKiBAcHJvcGVydHkge0ZpbGVbXX0gZHJhZ2dlZEZpbGVzIEZpbGVzIGluIGFjdGl2ZSBkcmFnXG4gKiBAcHJvcGVydHkge0ZpbGVbXX0gYWNjZXB0ZWRGaWxlcyBBY2NlcHRlZCBmaWxlc1xuICogQHByb3BlcnR5IHtGaWxlUmVqZWN0aW9uW119IGZpbGVSZWplY3Rpb25zIFJlamVjdGVkIGZpbGVzIGFuZCB3aHkgdGhleSB3ZXJlIHJlamVjdGVkXG4gKi9cblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBpc0ZvY3VzZWQ6IGZhbHNlLFxuICBpc0ZpbGVEaWFsb2dBY3RpdmU6IGZhbHNlLFxuICBpc0RyYWdBY3RpdmU6IGZhbHNlLFxuICBpc0RyYWdBY2NlcHQ6IGZhbHNlLFxuICBpc0RyYWdSZWplY3Q6IGZhbHNlLFxuICBkcmFnZ2VkRmlsZXM6IFtdLFxuICBhY2NlcHRlZEZpbGVzOiBbXSxcbiAgZmlsZVJlamVjdGlvbnM6IFtdLFxufTtcblxuLyoqXG4gKiBBIFJlYWN0IGhvb2sgdGhhdCBjcmVhdGVzIGEgZHJhZyAnbicgZHJvcCBhcmVhLlxuICpcbiAqIGBgYGpzeFxuICogZnVuY3Rpb24gTXlEcm9wem9uZShwcm9wcykge1xuICogICBjb25zdCB7Z2V0Um9vdFByb3BzLCBnZXRJbnB1dFByb3BzfSA9IHVzZURyb3B6b25lKHtcbiAqICAgICBvbkRyb3A6IGFjY2VwdGVkRmlsZXMgPT4ge1xuICogICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIEZpbGUgb2JqZWN0cywgZS5nLiB1cGxvYWQgdG8gc29tZSBzZXJ2ZXJcbiAqICAgICB9XG4gKiAgIH0pO1xuICogICByZXR1cm4gKFxuICogICAgIDxkaXYgey4uLmdldFJvb3RQcm9wcygpfT5cbiAqICAgICAgIDxpbnB1dCB7Li4uZ2V0SW5wdXRQcm9wcygpfSAvPlxuICogICAgICAgPHA+RHJhZyBhbmQgZHJvcCBzb21lIGZpbGVzIGhlcmUsIG9yIGNsaWNrIHRvIHNlbGVjdCBmaWxlczwvcD5cbiAqICAgICA8L2Rpdj5cbiAqICAgKVxuICogfVxuICogYGBgXG4gKlxuICogQGZ1bmN0aW9uIHVzZURyb3B6b25lXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3Byb3BzLmFjY2VwdF0gU2V0IGFjY2VwdGVkIGZpbGUgdHlwZXMuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29rb25ldC9hdHRyLWFjY2VwdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIEtlZXAgaW4gbWluZCB0aGF0IG1pbWUgdHlwZSBkZXRlcm1pbmF0aW9uIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgcGxhdGZvcm1zLiBDU1YgZmlsZXMsXG4gKiBmb3IgZXhhbXBsZSwgYXJlIHJlcG9ydGVkIGFzIHRleHQvcGxhaW4gdW5kZXIgbWFjT1MgYnV0IGFzIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCB1bmRlclxuICogV2luZG93cy4gSW4gc29tZSBjYXNlcyB0aGVyZSBtaWdodCBub3QgYmUgYSBtaW1lIHR5cGUgc2V0IGF0IGFsbC5cbiAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRyb3B6b25lL3JlYWN0LWRyb3B6b25lL2lzc3Vlcy8yNzZcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLm11bHRpcGxlPXRydWVdIEFsbG93IGRyYWcgJ24nIGRyb3AgKG9yIHNlbGVjdGlvbiBmcm9tIHRoZSBmaWxlIGRpYWxvZykgb2YgbXVsdGlwbGUgZmlsZXNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLnByZXZlbnREcm9wT25Eb2N1bWVudD10cnVlXSBJZiBmYWxzZSwgYWxsb3cgZHJvcHBlZCBpdGVtcyB0byB0YWtlIG92ZXIgdGhlIGN1cnJlbnQgYnJvd3NlciB3aW5kb3dcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLm5vQ2xpY2s9ZmFsc2VdIElmIHRydWUsIGRpc2FibGVzIGNsaWNrIHRvIG9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLm5vS2V5Ym9hcmQ9ZmFsc2VdIElmIHRydWUsIGRpc2FibGVzIFNQQUNFL0VOVEVSIHRvIG9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cuXG4gKiBOb3RlIHRoYXQgaXQgYWxzbyBzdG9wcyB0cmFja2luZyB0aGUgZm9jdXMgc3RhdGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0RyYWc9ZmFsc2VdIElmIHRydWUsIGRpc2FibGVzIGRyYWcgJ24nIGRyb3BcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLm5vRHJhZ0V2ZW50c0J1YmJsaW5nPWZhbHNlXSBJZiB0cnVlLCBzdG9wcyBkcmFnIGV2ZW50IHByb3BhZ2F0aW9uIHRvIHBhcmVudHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcHJvcHMubWluU2l6ZT0wXSBNaW5pbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gKiBAcGFyYW0ge251bWJlcn0gW3Byb3BzLm1heFNpemU9SW5maW5pdHldIE1heGltdW0gZmlsZSBzaXplIChpbiBieXRlcylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzLmRpc2FibGVkPWZhbHNlXSBFbmFibGUvZGlzYWJsZSB0aGUgZHJvcHpvbmVcbiAqIEBwYXJhbSB7Z2V0RmlsZXNGcm9tRXZlbnR9IFtwcm9wcy5nZXRGaWxlc0Zyb21FdmVudF0gVXNlIHRoaXMgdG8gcHJvdmlkZSBhIGN1c3RvbSBmaWxlIGFnZ3JlZ2F0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wcy5vbkZpbGVEaWFsb2dDYW5jZWxdIENiIGZvciB3aGVuIGNsb3NpbmcgdGhlIGZpbGUgZGlhbG9nIHdpdGggbm8gc2VsZWN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy51c2VGc0FjY2Vzc0FwaV0gU2V0IHRvIHRydWUgdG8gdXNlIHRoZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZV9TeXN0ZW1fQWNjZXNzX0FQSVxuICogdG8gb3BlbiB0aGUgZmlsZSBwaWNrZXIgaW5zdGVhZCBvZiB1c2luZyBhbiBgPGlucHV0IHR5cGU9XCJmaWxlXCI+YCBjbGljayBldmVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wcy5vbkZpbGVEaWFsb2dPcGVuXSBDYiBmb3Igd2hlbiBvcGVuaW5nIHRoZSBmaWxlIGRpYWxvZ1xuICogQHBhcmFtIHtkcmFnQ2J9IFtwcm9wcy5vbkRyYWdFbnRlcl0gQ2IgZm9yIHdoZW4gdGhlIGBkcmFnZW50ZXJgIGV2ZW50IG9jY3Vycy5cbiAqIEBwYXJhbSB7ZHJhZ0NifSBbcHJvcHMub25EcmFnTGVhdmVdIENiIGZvciB3aGVuIHRoZSBgZHJhZ2xlYXZlYCBldmVudCBvY2N1cnNcbiAqIEBwYXJhbSB7ZHJhZ0NifSBbcHJvcHMub25EcmFnT3Zlcl0gQ2IgZm9yIHdoZW4gdGhlIGBkcmFnb3ZlcmAgZXZlbnQgb2NjdXJzXG4gKiBAcGFyYW0ge2Ryb3BDYn0gW3Byb3BzLm9uRHJvcF0gQ2IgZm9yIHdoZW4gdGhlIGBkcm9wYCBldmVudCBvY2N1cnMuXG4gKiBOb3RlIHRoYXQgdGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHRoZSBgZ2V0RmlsZXNGcm9tRXZlbnRgIGNhbGxiYWNrIGlzIGRvbmUuXG4gKlxuICogRmlsZXMgYXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkIGJhc2VkIG9uIHRoZSBgYWNjZXB0YCwgYG11bHRpcGxlYCwgYG1pblNpemVgIGFuZCBgbWF4U2l6ZWAgcHJvcHMuXG4gKiBgYWNjZXB0YCBtdXN0IGJlIGEgdmFsaWQgW01JTUUgdHlwZV0oaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlcy54aHRtbCkgYWNjb3JkaW5nIHRvIFtpbnB1dCBlbGVtZW50IHNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy93aWtpL0hUTUwvRWxlbWVudHMvaW5wdXQvZmlsZSkgb3IgYSB2YWxpZCBmaWxlIGV4dGVuc2lvbi5cbiAqIElmIGBtdWx0aXBsZWAgaXMgc2V0IHRvIGZhbHNlIGFuZCBhZGRpdGlvbmFsIGZpbGVzIGFyZSBkcm9wcGVkLFxuICogYWxsIGZpbGVzIGJlc2lkZXMgdGhlIGZpcnN0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gKiBBbnkgZmlsZSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2l6ZSBpbiB0aGUgW2BtaW5TaXplYCwgYG1heFNpemVgXSByYW5nZSwgd2lsbCBiZSByZWplY3RlZCBhcyB3ZWxsLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgYG9uRHJvcGAgY2FsbGJhY2sgd2lsbCBhbHdheXMgYmUgaW52b2tlZCByZWdhcmRsZXNzIGlmIHRoZSBkcm9wcGVkIGZpbGVzIHdlcmUgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQuXG4gKiBJZiB5b3UnZCBsaWtlIHRvIHJlYWN0IHRvIGEgc3BlY2lmaWMgc2NlbmFyaW8sIHVzZSB0aGUgYG9uRHJvcEFjY2VwdGVkYC9gb25Ecm9wUmVqZWN0ZWRgIHByb3BzLlxuICpcbiAqIGBvbkRyb3BgIHdpbGwgcHJvdmlkZSB5b3Ugd2l0aCBhbiBhcnJheSBvZiBbRmlsZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGUpIG9iamVjdHMgd2hpY2ggeW91IGNhbiB0aGVuIHByb2Nlc3MgYW5kIHNlbmQgdG8gYSBzZXJ2ZXIuXG4gKiBGb3IgZXhhbXBsZSwgd2l0aCBbU3VwZXJBZ2VudF0oaHR0cHM6Ly9naXRodWIuY29tL3Zpc2lvbm1lZGlhL3N1cGVyYWdlbnQpIGFzIGEgaHR0cC9hamF4IGxpYnJhcnk6XG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIG9uRHJvcChhY2NlcHRlZEZpbGVzKSB7XG4gKiAgIGNvbnN0IHJlcSA9IHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gKiAgIGFjY2VwdGVkRmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAqICAgICByZXEuYXR0YWNoKGZpbGUubmFtZSwgZmlsZSlcbiAqICAgfSlcbiAqICAgcmVxLmVuZChjYWxsYmFjaylcbiAqIH1cbiAqIGBgYFxuICogQHBhcmFtIHtkcm9wQWNjZXB0ZWRDYn0gW3Byb3BzLm9uRHJvcEFjY2VwdGVkXVxuICogQHBhcmFtIHtkcm9wUmVqZWN0ZWRDYn0gW3Byb3BzLm9uRHJvcFJlamVjdGVkXVxuICpcbiAqIEByZXR1cm5zIHtEcm9wem9uZVN0YXRlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRHJvcHpvbmUob3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhY2NlcHQsXG4gICAgZGlzYWJsZWQsXG4gICAgZ2V0RmlsZXNGcm9tRXZlbnQsXG4gICAgbWF4U2l6ZSxcbiAgICBtaW5TaXplLFxuICAgIG11bHRpcGxlLFxuICAgIG1heEZpbGVzLFxuICAgIG9uRHJhZ0VudGVyLFxuICAgIG9uRHJhZ0xlYXZlLFxuICAgIG9uRHJhZ092ZXIsXG4gICAgb25Ecm9wLFxuICAgIG9uRHJvcEFjY2VwdGVkLFxuICAgIG9uRHJvcFJlamVjdGVkLFxuICAgIG9uRmlsZURpYWxvZ0NhbmNlbCxcbiAgICBvbkZpbGVEaWFsb2dPcGVuLFxuICAgIHVzZUZzQWNjZXNzQXBpLFxuICAgIHByZXZlbnREcm9wT25Eb2N1bWVudCxcbiAgICBub0NsaWNrLFxuICAgIG5vS2V5Ym9hcmQsXG4gICAgbm9EcmFnLFxuICAgIG5vRHJhZ0V2ZW50c0J1YmJsaW5nLFxuICAgIHZhbGlkYXRvcixcbiAgfSA9IHtcbiAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcblxuICBjb25zdCBvbkZpbGVEaWFsb2dPcGVuQ2IgPSB1c2VNZW1vKFxuICAgICgpID0+ICh0eXBlb2Ygb25GaWxlRGlhbG9nT3BlbiA9PT0gXCJmdW5jdGlvblwiID8gb25GaWxlRGlhbG9nT3BlbiA6IG5vb3ApLFxuICAgIFtvbkZpbGVEaWFsb2dPcGVuXVxuICApO1xuICBjb25zdCBvbkZpbGVEaWFsb2dDYW5jZWxDYiA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIHR5cGVvZiBvbkZpbGVEaWFsb2dDYW5jZWwgPT09IFwiZnVuY3Rpb25cIiA/IG9uRmlsZURpYWxvZ0NhbmNlbCA6IG5vb3AsXG4gICAgW29uRmlsZURpYWxvZ0NhbmNlbF1cbiAgKTtcblxuICBjb25zdCByb290UmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcblxuICBjb25zdCBbc3RhdGUsIGRpc3BhdGNoXSA9IHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbFN0YXRlKTtcbiAgY29uc3QgeyBpc0ZvY3VzZWQsIGlzRmlsZURpYWxvZ0FjdGl2ZSwgZHJhZ2dlZEZpbGVzIH0gPSBzdGF0ZTtcblxuICAvLyBVcGRhdGUgZmlsZSBkaWFsb2cgYWN0aXZlIHN0YXRlIHdoZW4gdGhlIHdpbmRvdyBpcyBmb2N1c2VkIG9uXG4gIGNvbnN0IG9uV2luZG93Rm9jdXMgPSAoKSA9PiB7XG4gICAgLy8gRXhlY3V0ZSB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBmaWxlIGRpYWxvZyBpcyBvcGVuZWQgaW4gdGhlIGJyb3dzZXJcbiAgICBpZiAoaXNGaWxlRGlhbG9nQWN0aXZlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBjb25zdCB7IGZpbGVzIH0gPSBpbnB1dFJlZi5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJjbG9zZURpYWxvZ1wiIH0pO1xuICAgICAgICAgICAgb25GaWxlRGlhbG9nQ2FuY2VsQ2IoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9O1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQgJiZcbiAgICAgIHVzZUZzQWNjZXNzQXBpICYmXG4gICAgICBjYW5Vc2VGaWxlU3lzdGVtQWNjZXNzQVBJKClcbiAgICApIHtcbiAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIG9uV2luZG93Rm9jdXMsIGZhbHNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBvbldpbmRvd0ZvY3VzLCBmYWxzZSk7XG4gICAgfTtcbiAgfSwgW2lucHV0UmVmLCBpc0ZpbGVEaWFsb2dBY3RpdmUsIG9uRmlsZURpYWxvZ0NhbmNlbENiLCB1c2VGc0FjY2Vzc0FwaV0pO1xuXG4gIGNvbnN0IGRyYWdUYXJnZXRzUmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3Qgb25Eb2N1bWVudERyb3AgPSAoZXZlbnQpID0+IHtcbiAgICBpZiAocm9vdFJlZi5jdXJyZW50ICYmIHJvb3RSZWYuY3VycmVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAvLyBJZiB3ZSBpbnRlcmNlcHRlZCBhbiBldmVudCBmb3Igb3VyIGluc3RhbmNlLCBsZXQgaXQgcHJvcGFnYXRlIGRvd24gdG8gdGhlIGluc3RhbmNlJ3Mgb25Ecm9wIGhhbmRsZXJcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBkcmFnVGFyZ2V0c1JlZi5jdXJyZW50ID0gW107XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocHJldmVudERyb3BPbkRvY3VtZW50KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ292ZXJcIiwgb25Eb2N1bWVudERyYWdPdmVyLCBmYWxzZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBvbkRvY3VtZW50RHJvcCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocHJldmVudERyb3BPbkRvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCBvbkRvY3VtZW50RHJhZ092ZXIpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBvbkRvY3VtZW50RHJvcCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW3Jvb3RSZWYsIHByZXZlbnREcm9wT25Eb2N1bWVudF0pO1xuXG4gIGNvbnN0IG9uRHJhZ0VudGVyQ2IgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBQZXJzaXN0IGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRoZSBldmVudCBsYXRlciBhZnRlciBnZXRGaWxlc0Zyb21FdmVudCgpIGlzIGRvbmVcbiAgICAgIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudCk7XG5cbiAgICAgIGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQgPSBbLi4uZHJhZ1RhcmdldHNSZWYuY3VycmVudCwgZXZlbnQudGFyZ2V0XTtcblxuICAgICAgaWYgKGlzRXZ0V2l0aEZpbGVzKGV2ZW50KSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoZ2V0RmlsZXNGcm9tRXZlbnQoZXZlbnQpKS50aGVuKChkcmFnZ2VkRmlsZXMpID0+IHtcbiAgICAgICAgICBpZiAoaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpICYmICFub0RyYWdFdmVudHNCdWJibGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIGRyYWdnZWRGaWxlcyxcbiAgICAgICAgICAgIGlzRHJhZ0FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGU6IFwic2V0RHJhZ2dlZEZpbGVzXCIsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAob25EcmFnRW50ZXIpIHtcbiAgICAgICAgICAgIG9uRHJhZ0VudGVyKGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2dldEZpbGVzRnJvbUV2ZW50LCBvbkRyYWdFbnRlciwgbm9EcmFnRXZlbnRzQnViYmxpbmddXG4gICk7XG5cbiAgY29uc3Qgb25EcmFnT3ZlckNiID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQucGVyc2lzdCgpO1xuICAgICAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50KTtcblxuICAgICAgY29uc3QgaGFzRmlsZXMgPSBpc0V2dFdpdGhGaWxlcyhldmVudCk7XG4gICAgICBpZiAoaGFzRmlsZXMgJiYgZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcImNvcHlcIjtcbiAgICAgICAgfSBjYXRjaCB7fSAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5ICovXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNGaWxlcyAmJiBvbkRyYWdPdmVyKSB7XG4gICAgICAgIG9uRHJhZ092ZXIoZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBbb25EcmFnT3Zlciwgbm9EcmFnRXZlbnRzQnViYmxpbmddXG4gICk7XG5cbiAgY29uc3Qgb25EcmFnTGVhdmVDYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnBlcnNpc3QoKTtcbiAgICAgIHN0b3BQcm9wYWdhdGlvbihldmVudCk7XG5cbiAgICAgIC8vIE9ubHkgZGVhY3RpdmF0ZSBvbmNlIHRoZSBkcm9wem9uZSBhbmQgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBsZWZ0XG4gICAgICBjb25zdCB0YXJnZXRzID0gZHJhZ1RhcmdldHNSZWYuY3VycmVudC5maWx0ZXIoXG4gICAgICAgICh0YXJnZXQpID0+IHJvb3RSZWYuY3VycmVudCAmJiByb290UmVmLmN1cnJlbnQuY29udGFpbnModGFyZ2V0KVxuICAgICAgKTtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0byByZW1vdmUgYSB0YXJnZXQgcHJlc2VudCBtdWx0aXBsZSB0aW1lcyBvbmx5IG9uY2VcbiAgICAgIC8vIChGaXJlZm94IG1heSBmaXJlIGRyYWdlbnRlci9kcmFnbGVhdmUgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgZWxlbWVudClcbiAgICAgIGNvbnN0IHRhcmdldElkeCA9IHRhcmdldHMuaW5kZXhPZihldmVudC50YXJnZXQpO1xuICAgICAgaWYgKHRhcmdldElkeCAhPT0gLTEpIHtcbiAgICAgICAgdGFyZ2V0cy5zcGxpY2UodGFyZ2V0SWR4LCAxKTtcbiAgICAgIH1cbiAgICAgIGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQgPSB0YXJnZXRzO1xuICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgaXNEcmFnQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzZXREcmFnZ2VkRmlsZXNcIixcbiAgICAgICAgZHJhZ2dlZEZpbGVzOiBbXSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNFdnRXaXRoRmlsZXMoZXZlbnQpICYmIG9uRHJhZ0xlYXZlKSB7XG4gICAgICAgIG9uRHJhZ0xlYXZlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyb290UmVmLCBvbkRyYWdMZWF2ZSwgbm9EcmFnRXZlbnRzQnViYmxpbmddXG4gICk7XG5cbiAgY29uc3Qgc2V0RmlsZXMgPSB1c2VDYWxsYmFjayhcbiAgICAoZmlsZXMsIGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBhY2NlcHRlZEZpbGVzID0gW107XG4gICAgICBjb25zdCBmaWxlUmVqZWN0aW9ucyA9IFtdO1xuXG4gICAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IFthY2NlcHRlZCwgYWNjZXB0RXJyb3JdID0gZmlsZUFjY2VwdGVkKGZpbGUsIGFjY2VwdCk7XG4gICAgICAgIGNvbnN0IFtzaXplTWF0Y2gsIHNpemVFcnJvcl0gPSBmaWxlTWF0Y2hTaXplKGZpbGUsIG1pblNpemUsIG1heFNpemUpO1xuICAgICAgICBjb25zdCBjdXN0b21FcnJvcnMgPSB2YWxpZGF0b3IgPyB2YWxpZGF0b3IoZmlsZSkgOiBudWxsO1xuXG4gICAgICAgIGlmIChhY2NlcHRlZCAmJiBzaXplTWF0Y2ggJiYgIWN1c3RvbUVycm9ycykge1xuICAgICAgICAgIGFjY2VwdGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gW2FjY2VwdEVycm9yLCBzaXplRXJyb3JdO1xuXG4gICAgICAgICAgaWYgKGN1c3RvbUVycm9ycykge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChjdXN0b21FcnJvcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVSZWplY3Rpb25zLnB1c2goeyBmaWxlLCBlcnJvcnM6IGVycm9ycy5maWx0ZXIoKGUpID0+IGUpIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW11bHRpcGxlICYmIGFjY2VwdGVkRmlsZXMubGVuZ3RoID4gMSkgfHxcbiAgICAgICAgKG11bHRpcGxlICYmIG1heEZpbGVzID49IDEgJiYgYWNjZXB0ZWRGaWxlcy5sZW5ndGggPiBtYXhGaWxlcylcbiAgICAgICkge1xuICAgICAgICAvLyBSZWplY3QgZXZlcnl0aGluZyBhbmQgZW1wdHkgYWNjZXB0ZWQgZmlsZXNcbiAgICAgICAgYWNjZXB0ZWRGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgZmlsZVJlamVjdGlvbnMucHVzaCh7IGZpbGUsIGVycm9yczogW1RPT19NQU5ZX0ZJTEVTX1JFSkVDVElPTl0gfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBhY2NlcHRlZEZpbGVzLnNwbGljZSgwKTtcbiAgICAgIH1cblxuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICBhY2NlcHRlZEZpbGVzLFxuICAgICAgICBmaWxlUmVqZWN0aW9ucyxcbiAgICAgICAgdHlwZTogXCJzZXRGaWxlc1wiLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbkRyb3ApIHtcbiAgICAgICAgb25Ecm9wKGFjY2VwdGVkRmlsZXMsIGZpbGVSZWplY3Rpb25zLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWxlUmVqZWN0aW9ucy5sZW5ndGggPiAwICYmIG9uRHJvcFJlamVjdGVkKSB7XG4gICAgICAgIG9uRHJvcFJlamVjdGVkKGZpbGVSZWplY3Rpb25zLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY2NlcHRlZEZpbGVzLmxlbmd0aCA+IDAgJiYgb25Ecm9wQWNjZXB0ZWQpIHtcbiAgICAgICAgb25Ecm9wQWNjZXB0ZWQoYWNjZXB0ZWRGaWxlcywgZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgZGlzcGF0Y2gsXG4gICAgICBtdWx0aXBsZSxcbiAgICAgIGFjY2VwdCxcbiAgICAgIG1pblNpemUsXG4gICAgICBtYXhTaXplLFxuICAgICAgbWF4RmlsZXMsXG4gICAgICBvbkRyb3AsXG4gICAgICBvbkRyb3BBY2NlcHRlZCxcbiAgICAgIG9uRHJvcFJlamVjdGVkLFxuICAgICAgdmFsaWRhdG9yLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBvbkRyb3BDYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIFBlcnNpc3QgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdGhlIGV2ZW50IGxhdGVyIGFmdGVyIGdldEZpbGVzRnJvbUV2ZW50KCkgaXMgZG9uZVxuICAgICAgZXZlbnQucGVyc2lzdCgpO1xuICAgICAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50KTtcblxuICAgICAgZHJhZ1RhcmdldHNSZWYuY3VycmVudCA9IFtdO1xuXG4gICAgICBpZiAoaXNFdnRXaXRoRmlsZXMoZXZlbnQpKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShnZXRGaWxlc0Zyb21FdmVudChldmVudCkpLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgaWYgKGlzUHJvcGFnYXRpb25TdG9wcGVkKGV2ZW50KSAmJiAhbm9EcmFnRXZlbnRzQnViYmxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0RmlsZXMoZmlsZXMsIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwicmVzZXRcIiB9KTtcbiAgICB9LFxuICAgIFtnZXRGaWxlc0Zyb21FdmVudCwgc2V0RmlsZXMsIG5vRHJhZ0V2ZW50c0J1YmJsaW5nXVxuICApO1xuXG4gIC8vIEZuIGZvciBvcGVuaW5nIHRoZSBmaWxlIGRpYWxvZyBwcm9ncmFtbWF0aWNhbGx5XG4gIGNvbnN0IG9wZW5GaWxlRGlhbG9nID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIC8vIE5vIHBvaW50IHRvIHVzZSBGUyBhY2Nlc3MgQVBJcyBpZiBjb250ZXh0IGlzIG5vdCBzZWN1cmVcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TZWN1cml0eS9TZWN1cmVfQ29udGV4dHMjZmVhdHVyZV9kZXRlY3Rpb25cbiAgICBpZiAoXG4gICAgICB3aW5kb3cuaXNTZWN1cmVDb250ZXh0ICYmXG4gICAgICB1c2VGc0FjY2Vzc0FwaSAmJlxuICAgICAgY2FuVXNlRmlsZVN5c3RlbUFjY2Vzc0FQSSgpXG4gICAgKSB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwib3BlbkRpYWxvZ1wiIH0pO1xuICAgICAgb25GaWxlRGlhbG9nT3BlbkNiKCk7XG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvd2luZG93L3Nob3dPcGVuRmlsZVBpY2tlclxuICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgbXVsdGlwbGUsXG4gICAgICAgIHR5cGVzOiBmaWxlUGlja2VyT3B0aW9uc1R5cGVzKGFjY2VwdCksXG4gICAgICB9O1xuICAgICAgd2luZG93XG4gICAgICAgIC5zaG93T3BlbkZpbGVQaWNrZXIob3B0cylcbiAgICAgICAgLnRoZW4oKGhhbmRsZXMpID0+IGdldEZpbGVzRnJvbUV2ZW50KGhhbmRsZXMpKVxuICAgICAgICAudGhlbigoZmlsZXMpID0+IHNldEZpbGVzKGZpbGVzLCBudWxsKSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiBvbkZpbGVEaWFsb2dDYW5jZWxDYihlKSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4gZGlzcGF0Y2goeyB0eXBlOiBcImNsb3NlRGlhbG9nXCIgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6IFwib3BlbkRpYWxvZ1wiIH0pO1xuICAgICAgb25GaWxlRGlhbG9nT3BlbkNiKCk7XG4gICAgICBpbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gbnVsbDtcbiAgICAgIGlucHV0UmVmLmN1cnJlbnQuY2xpY2soKTtcbiAgICB9XG4gIH0sIFtcbiAgICBkaXNwYXRjaCxcbiAgICBvbkZpbGVEaWFsb2dPcGVuQ2IsXG4gICAgb25GaWxlRGlhbG9nQ2FuY2VsQ2IsXG4gICAgdXNlRnNBY2Nlc3NBcGksXG4gICAgc2V0RmlsZXMsXG4gICAgYWNjZXB0LFxuICAgIG11bHRpcGxlLFxuICBdKTtcblxuICAvLyBDYiB0byBvcGVuIHRoZSBmaWxlIGRpYWxvZyB3aGVuIFNQQUNFL0VOVEVSIG9jY3VycyBvbiB0aGUgZHJvcHpvbmVcbiAgY29uc3Qgb25LZXlEb3duQ2IgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIC8vIElnbm9yZSBrZXlib2FyZCBldmVudHMgYnViYmxpbmcgdXAgdGhlIERPTSB0cmVlXG4gICAgICBpZiAoIXJvb3RSZWYuY3VycmVudCB8fCAhcm9vdFJlZi5jdXJyZW50LmlzRXF1YWxOb2RlKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzIgfHwgZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb3BlbkZpbGVEaWFsb2coKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyb290UmVmLCBpbnB1dFJlZiwgb3BlbkZpbGVEaWFsb2ddXG4gICk7XG5cbiAgLy8gVXBkYXRlIGZvY3VzIHN0YXRlIGZvciB0aGUgZHJvcHpvbmVcbiAgY29uc3Qgb25Gb2N1c0NiID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJmb2N1c1wiIH0pO1xuICB9LCBbXSk7XG4gIGNvbnN0IG9uQmx1ckNiID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJibHVyXCIgfSk7XG4gIH0sIFtdKTtcblxuICAvLyBDYiB0byBvcGVuIHRoZSBmaWxlIGRpYWxvZyB3aGVuIGNsaWNrIG9jY3VycyBvbiB0aGUgZHJvcHpvbmVcbiAgY29uc3Qgb25DbGlja0NiID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChub0NsaWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW4gSUUxMS9FZGdlIHRoZSBmaWxlLWJyb3dzZXIgZGlhbG9nIGlzIGJsb2NraW5nLCB0aGVyZWZvcmUsIHVzZSBzZXRUaW1lb3V0KClcbiAgICAvLyB0byBlbnN1cmUgUmVhY3QgY2FuIGhhbmRsZSBzdGF0ZSBjaGFuZ2VzXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZHJvcHpvbmUvcmVhY3QtZHJvcHpvbmUvaXNzdWVzLzQ1MFxuICAgIGlmIChpc0llT3JFZGdlKCkpIHtcbiAgICAgIHNldFRpbWVvdXQob3BlbkZpbGVEaWFsb2csIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVuRmlsZURpYWxvZygpO1xuICAgIH1cbiAgfSwgW2lucHV0UmVmLCBub0NsaWNrLCBvcGVuRmlsZURpYWxvZ10pO1xuXG4gIGNvbnN0IGNvbXBvc2VIYW5kbGVyID0gKGZuKSA9PiB7XG4gICAgcmV0dXJuIGRpc2FibGVkID8gbnVsbCA6IGZuO1xuICB9O1xuXG4gIGNvbnN0IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIgPSAoZm4pID0+IHtcbiAgICByZXR1cm4gbm9LZXlib2FyZCA/IG51bGwgOiBjb21wb3NlSGFuZGxlcihmbik7XG4gIH07XG5cbiAgY29uc3QgY29tcG9zZURyYWdIYW5kbGVyID0gKGZuKSA9PiB7XG4gICAgcmV0dXJuIG5vRHJhZyA/IG51bGwgOiBjb21wb3NlSGFuZGxlcihmbik7XG4gIH07XG5cbiAgY29uc3Qgc3RvcFByb3BhZ2F0aW9uID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKG5vRHJhZ0V2ZW50c0J1YmJsaW5nKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0Um9vdFByb3BzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgcmVmS2V5ID0gXCJyZWZcIixcbiAgICAgICAgcm9sZSxcbiAgICAgICAgb25LZXlEb3duLFxuICAgICAgICBvbkZvY3VzLFxuICAgICAgICBvbkJsdXIsXG4gICAgICAgIG9uQ2xpY2ssXG4gICAgICAgIG9uRHJhZ0VudGVyLFxuICAgICAgICBvbkRyYWdPdmVyLFxuICAgICAgICBvbkRyYWdMZWF2ZSxcbiAgICAgICAgb25Ecm9wLFxuICAgICAgICAuLi5yZXN0XG4gICAgICB9ID0ge30pID0+ICh7XG4gICAgICAgIG9uS2V5RG93bjogY29tcG9zZUtleWJvYXJkSGFuZGxlcihcbiAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbktleURvd24sIG9uS2V5RG93bkNiKVxuICAgICAgICApLFxuICAgICAgICBvbkZvY3VzOiBjb21wb3NlS2V5Ym9hcmRIYW5kbGVyKFxuICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRm9jdXMsIG9uRm9jdXNDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25CbHVyOiBjb21wb3NlS2V5Ym9hcmRIYW5kbGVyKGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uQmx1ciwgb25CbHVyQ2IpKSxcbiAgICAgICAgb25DbGljazogY29tcG9zZUhhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25DbGljaywgb25DbGlja0NiKSksXG4gICAgICAgIG9uRHJhZ0VudGVyOiBjb21wb3NlRHJhZ0hhbmRsZXIoXG4gICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25EcmFnRW50ZXIsIG9uRHJhZ0VudGVyQ2IpXG4gICAgICAgICksXG4gICAgICAgIG9uRHJhZ092ZXI6IGNvbXBvc2VEcmFnSGFuZGxlcihcbiAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkRyYWdPdmVyLCBvbkRyYWdPdmVyQ2IpXG4gICAgICAgICksXG4gICAgICAgIG9uRHJhZ0xlYXZlOiBjb21wb3NlRHJhZ0hhbmRsZXIoXG4gICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25EcmFnTGVhdmUsIG9uRHJhZ0xlYXZlQ2IpXG4gICAgICAgICksXG4gICAgICAgIG9uRHJvcDogY29tcG9zZURyYWdIYW5kbGVyKGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRHJvcCwgb25Ecm9wQ2IpKSxcbiAgICAgICAgcm9sZTogdHlwZW9mIHJvbGUgPT09IFwic3RyaW5nXCIgJiYgcm9sZSAhPT0gXCJcIiA/IHJvbGUgOiBcImJ1dHRvblwiLFxuICAgICAgICBbcmVmS2V5XTogcm9vdFJlZixcbiAgICAgICAgLi4uKCFkaXNhYmxlZCAmJiAhbm9LZXlib2FyZCA/IHsgdGFiSW5kZXg6IDAgfSA6IHt9KSxcbiAgICAgICAgLi4ucmVzdCxcbiAgICAgIH0pLFxuICAgIFtcbiAgICAgIHJvb3RSZWYsXG4gICAgICBvbktleURvd25DYixcbiAgICAgIG9uRm9jdXNDYixcbiAgICAgIG9uQmx1ckNiLFxuICAgICAgb25DbGlja0NiLFxuICAgICAgb25EcmFnRW50ZXJDYixcbiAgICAgIG9uRHJhZ092ZXJDYixcbiAgICAgIG9uRHJhZ0xlYXZlQ2IsXG4gICAgICBvbkRyb3BDYixcbiAgICAgIG5vS2V5Ym9hcmQsXG4gICAgICBub0RyYWcsXG4gICAgICBkaXNhYmxlZCxcbiAgICBdXG4gICk7XG5cbiAgY29uc3Qgb25JbnB1dEVsZW1lbnRDbGljayA9IHVzZUNhbGxiYWNrKChldmVudCkgPT4ge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgZ2V0SW5wdXRQcm9wcyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgICh7IHJlZktleSA9IFwicmVmXCIsIG9uQ2hhbmdlLCBvbkNsaWNrLCAuLi5yZXN0IH0gPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dFByb3BzID0ge1xuICAgICAgICAgIGFjY2VwdCxcbiAgICAgICAgICBtdWx0aXBsZSxcbiAgICAgICAgICB0eXBlOiBcImZpbGVcIixcbiAgICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiBcIm5vbmVcIiB9LFxuICAgICAgICAgIG9uQ2hhbmdlOiBjb21wb3NlSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkNoYW5nZSwgb25Ecm9wQ2IpKSxcbiAgICAgICAgICBvbkNsaWNrOiBjb21wb3NlSGFuZGxlcihcbiAgICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uQ2xpY2ssIG9uSW5wdXRFbGVtZW50Q2xpY2spXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhdXRvQ29tcGxldGU6IFwib2ZmXCIsXG4gICAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICAgIFtyZWZLZXldOiBpbnB1dFJlZixcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmlucHV0UHJvcHMsXG4gICAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgW2lucHV0UmVmLCBhY2NlcHQsIG11bHRpcGxlLCBvbkRyb3BDYiwgZGlzYWJsZWRdXG4gICk7XG5cbiAgY29uc3QgZmlsZUNvdW50ID0gZHJhZ2dlZEZpbGVzLmxlbmd0aDtcbiAgY29uc3QgaXNEcmFnQWNjZXB0ID1cbiAgICBmaWxlQ291bnQgPiAwICYmXG4gICAgYWxsRmlsZXNBY2NlcHRlZCh7XG4gICAgICBmaWxlczogZHJhZ2dlZEZpbGVzLFxuICAgICAgYWNjZXB0LFxuICAgICAgbWluU2l6ZSxcbiAgICAgIG1heFNpemUsXG4gICAgICBtdWx0aXBsZSxcbiAgICAgIG1heEZpbGVzLFxuICAgIH0pO1xuICBjb25zdCBpc0RyYWdSZWplY3QgPSBmaWxlQ291bnQgPiAwICYmICFpc0RyYWdBY2NlcHQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBpc0RyYWdBY2NlcHQsXG4gICAgaXNEcmFnUmVqZWN0LFxuICAgIGlzRm9jdXNlZDogaXNGb2N1c2VkICYmICFkaXNhYmxlZCxcbiAgICBnZXRSb290UHJvcHMsXG4gICAgZ2V0SW5wdXRQcm9wcyxcbiAgICByb290UmVmLFxuICAgIGlucHV0UmVmLFxuICAgIG9wZW46IGNvbXBvc2VIYW5kbGVyKG9wZW5GaWxlRGlhbG9nKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFwiZm9jdXNcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0ZvY3VzZWQ6IHRydWUsXG4gICAgICB9O1xuICAgIGNhc2UgXCJibHVyXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgaXNGb2N1c2VkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgY2FzZSBcIm9wZW5EaWFsb2dcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmluaXRpYWxTdGF0ZSxcbiAgICAgICAgaXNGaWxlRGlhbG9nQWN0aXZlOiB0cnVlLFxuICAgICAgfTtcbiAgICBjYXNlIFwiY2xvc2VEaWFsb2dcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0ZpbGVEaWFsb2dBY3RpdmU6IGZhbHNlLFxuICAgICAgfTtcbiAgICBjYXNlIFwic2V0RHJhZ2dlZEZpbGVzXCI6XG4gICAgICAvKiBlc2xpbnQgbm8tY2FzZS1kZWNsYXJhdGlvbnM6IDAgKi9cbiAgICAgIGNvbnN0IHsgaXNEcmFnQWN0aXZlLCBkcmFnZ2VkRmlsZXMgfSA9IGFjdGlvbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBkcmFnZ2VkRmlsZXMsXG4gICAgICAgIGlzRHJhZ0FjdGl2ZSxcbiAgICAgIH07XG4gICAgY2FzZSBcInNldEZpbGVzXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgYWNjZXB0ZWRGaWxlczogYWN0aW9uLmFjY2VwdGVkRmlsZXMsXG4gICAgICAgIGZpbGVSZWplY3Rpb25zOiBhY3Rpb24uZmlsZVJlamVjdGlvbnMsXG4gICAgICB9O1xuICAgIGNhc2UgXCJyZXNldFwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5pdGlhbFN0YXRlLFxuICAgICAgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQgeyBFcnJvckNvZGUgfSBmcm9tIFwiLi91dGlsc1wiO1xuIl0sIm5hbWVzIjpbIl9fYXdhaXRlciIsInRoaXNBcmciLCJfYXJndW1lbnRzIiwiUCIsImdlbmVyYXRvciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwidmFsdWUiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJfX2dlbmVyYXRvciIsImJvZHkiLCJmIiwieSIsInQiLCJnIiwiXyIsImxhYmVsIiwic2VudCIsInRyeXMiLCJvcHMiLCJ2ZXJiIiwidGhyb3ciLCJyZXR1cm4iLCJTeW1ib2wiLCJpdGVyYXRvciIsInRoaXMiLCJuIiwidiIsIm9wIiwiVHlwZUVycm9yIiwiY2FsbCIsInBvcCIsImxlbmd0aCIsInB1c2giLCJfX3JlYWQiLCJvIiwibSIsInIiLCJpIiwiYXIiLCJlcnJvciIsIkNPTU1PTl9NSU1FX1RZUEVTIiwiTWFwIiwidG9GaWxlV2l0aFBhdGgiLCJmaWxlIiwicGF0aCIsIm5hbWUiLCJsYXN0SW5kZXhPZiIsInR5cGUiLCJleHQiLCJzcGxpdCIsInRvTG93ZXJDYXNlIiwiZ2V0IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJ3cml0YWJsZSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJ3aXRoTWltZVR5cGUiLCJ3ZWJraXRSZWxhdGl2ZVBhdGgiLCJGSUxFU19UT19JR05PUkUiLCJpc09iamVjdCIsImdldElucHV0RmlsZXMiLCJldnQiLCJmcm9tTGlzdCIsInRhcmdldCIsImZpbGVzIiwibWFwIiwiZ2V0RnNIYW5kbGVGaWxlcyIsImhhbmRsZXMiLCJfYSIsImFsbCIsImgiLCJnZXRGaWxlIiwiZ2V0RGF0YVRyYW5zZmVyRmlsZXMiLCJkdCIsIml0ZW1zIiwiZmlsdGVyIiwiaXRlbSIsImtpbmQiLCJ0b0ZpbGVQcm9taXNlcyIsIm5vSWdub3JlZEZpbGVzIiwiZmxhdHRlbiIsImluZGV4T2YiLCJ3ZWJraXRHZXRBc0VudHJ5IiwiZnJvbURhdGFUcmFuc2Zlckl0ZW0iLCJlbnRyeSIsImlzRGlyZWN0b3J5IiwiZnJvbURpckVudHJ5IiwicmVkdWNlIiwiYWNjIiwiYXJndW1lbnRzIiwiY29uY2F0IiwiX19zcHJlYWQiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRBc0ZpbGUiLCJmd3AiLCJmcm9tRW50cnkiLCJmcm9tRmlsZUVudHJ5IiwicmVhZGVyIiwiY3JlYXRlUmVhZGVyIiwiZW50cmllcyIsInJlYWRFbnRyaWVzIiwiX3RoaXMiLCJiYXRjaCIsImVycl8xIiwiZXJyIiwiZnVsbFBhdGgiLCJGSUxFX0lOVkFMSURfVFlQRSIsIkZJTEVfVE9PX0xBUkdFIiwiRklMRV9UT09fU01BTEwiLCJUT09fTUFOWV9GSUxFUyIsIkVycm9yQ29kZSIsIkZpbGVJbnZhbGlkVHlwZSIsIkZpbGVUb29MYXJnZSIsIkZpbGVUb29TbWFsbCIsIlRvb01hbnlGaWxlcyIsImdldEludmFsaWRUeXBlUmVqZWN0aW9uRXJyIiwiYWNjZXB0IiwibWVzc2FnZVN1ZmZpeCIsImpvaW4iLCJjb2RlIiwibWVzc2FnZSIsImdldFRvb0xhcmdlUmVqZWN0aW9uRXJyIiwibWF4U2l6ZSIsImdldFRvb1NtYWxsUmVqZWN0aW9uRXJyIiwibWluU2l6ZSIsIlRPT19NQU5ZX0ZJTEVTX1JFSkVDVElPTiIsImZpbGVBY2NlcHRlZCIsImlzQWNjZXB0YWJsZSIsImFjY2VwdGVkRmlsZXMiLCJhY2NlcHRlZEZpbGVzQXJyYXkiLCJmaWxlTmFtZSIsIm1pbWVUeXBlIiwiYmFzZU1pbWVUeXBlIiwicmVwbGFjZSIsInNvbWUiLCJ2YWxpZFR5cGUiLCJ0cmltIiwiY2hhckF0IiwiZW5kc1dpdGgiLCJhY2NlcHRzIiwiZmlsZU1hdGNoU2l6ZSIsImlzRGVmaW5lZCIsInNpemUiLCJhbGxGaWxlc0FjY2VwdGVkIiwibXVsdGlwbGUiLCJtYXhGaWxlcyIsImV2ZXJ5IiwiYWNjZXB0ZWQiLCJzaXplTWF0Y2giLCJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsImV2ZW50IiwiY2FuY2VsQnViYmxlIiwiaXNFdnRXaXRoRmlsZXMiLCJkYXRhVHJhbnNmZXIiLCJwcm90b3R5cGUiLCJ0eXBlcyIsIm9uRG9jdW1lbnREcmFnT3ZlciIsInByZXZlbnREZWZhdWx0IiwiaXNJZSIsInVzZXJBZ2VudCIsImlzRWRnZSIsImlzSWVPckVkZ2UiLCJ3aW5kb3ciLCJuYXZpZ2F0b3IiLCJjb21wb3NlRXZlbnRIYW5kbGVycyIsImZucyIsImFyZ3MiLCJmbiIsImNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkiLCJmaWxlUGlja2VyT3B0aW9uc1R5cGVzIiwiZGVzY3JpcHRpb24iLCJ0ZXN0IiwiYSIsImIiLCJEcm9wem9uZSIsImZvcndhcmRSZWYiLCJyZWYiLCJjaGlsZHJlbiIsInVzZURyb3B6b25lIiwib3BlbiIsInByb3BzIiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsIlJlYWN0IiwiRnJhZ21lbnQiLCJkaXNwbGF5TmFtZSIsImRlZmF1bHRQcm9wcyIsImRpc2FibGVkIiwiZ2V0RmlsZXNGcm9tRXZlbnQiLCJpc0NoYW5nZUV2dCIsIkluZmluaXR5IiwicHJldmVudERyb3BPbkRvY3VtZW50Iiwibm9DbGljayIsIm5vS2V5Ym9hcmQiLCJub0RyYWciLCJub0RyYWdFdmVudHNCdWJibGluZyIsInZhbGlkYXRvciIsInVzZUZzQWNjZXNzQXBpIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZnVuYyIsIm9uZU9mVHlwZSIsInN0cmluZyIsImFycmF5T2YiLCJib29sIiwibnVtYmVyIiwib25GaWxlRGlhbG9nQ2FuY2VsIiwib25GaWxlRGlhbG9nT3BlbiIsIm9uRHJhZ0VudGVyIiwib25EcmFnTGVhdmUiLCJvbkRyYWdPdmVyIiwib25Ecm9wIiwib25Ecm9wQWNjZXB0ZWQiLCJvbkRyb3BSZWplY3RlZCIsImluaXRpYWxTdGF0ZSIsImlzRm9jdXNlZCIsImlzRmlsZURpYWxvZ0FjdGl2ZSIsImlzRHJhZ0FjdGl2ZSIsImlzRHJhZ0FjY2VwdCIsImlzRHJhZ1JlamVjdCIsImRyYWdnZWRGaWxlcyIsImZpbGVSZWplY3Rpb25zIiwib3B0aW9ucyIsIm9uRmlsZURpYWxvZ09wZW5DYiIsInVzZU1lbW8iLCJub29wIiwib25GaWxlRGlhbG9nQ2FuY2VsQ2IiLCJyb290UmVmIiwidXNlUmVmIiwiaW5wdXRSZWYiLCJ1c2VSZWR1Y2VyIiwicmVkdWNlciIsInN0YXRlIiwiZGlzcGF0Y2giLCJvbldpbmRvd0ZvY3VzIiwic2V0VGltZW91dCIsImN1cnJlbnQiLCJ1c2VFZmZlY3QiLCJpc1NlY3VyZUNvbnRleHQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRyYWdUYXJnZXRzUmVmIiwib25Eb2N1bWVudERyb3AiLCJjb250YWlucyIsImRvY3VtZW50Iiwib25EcmFnRW50ZXJDYiIsInVzZUNhbGxiYWNrIiwicGVyc2lzdCIsInN0b3BQcm9wYWdhdGlvbiIsIm9uRHJhZ092ZXJDYiIsImhhc0ZpbGVzIiwiZHJvcEVmZmVjdCIsIm9uRHJhZ0xlYXZlQ2IiLCJ0YXJnZXRzIiwidGFyZ2V0SWR4Iiwic3BsaWNlIiwic2V0RmlsZXMiLCJmb3JFYWNoIiwiYWNjZXB0RXJyb3IiLCJzaXplRXJyb3IiLCJjdXN0b21FcnJvcnMiLCJlcnJvcnMiLCJvbkRyb3BDYiIsIm9wZW5GaWxlRGlhbG9nIiwib3B0cyIsInNob3dPcGVuRmlsZVBpY2tlciIsImNhdGNoIiwiZmluYWxseSIsImNsaWNrIiwib25LZXlEb3duQ2IiLCJpc0VxdWFsTm9kZSIsImtleUNvZGUiLCJvbkZvY3VzQ2IiLCJvbkJsdXJDYiIsIm9uQ2xpY2tDYiIsImNvbXBvc2VIYW5kbGVyIiwiY29tcG9zZUtleWJvYXJkSGFuZGxlciIsImNvbXBvc2VEcmFnSGFuZGxlciIsImdldFJvb3RQcm9wcyIsInJlZktleSIsInJvbGUiLCJvbktleURvd24iLCJvbkZvY3VzIiwib25CbHVyIiwib25DbGljayIsInJlc3QiLCJ0YWJJbmRleCIsIm9uSW5wdXRFbGVtZW50Q2xpY2siLCJnZXRJbnB1dFByb3BzIiwib25DaGFuZ2UiLCJpbnB1dFByb3Bz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
15
+ ***************************************************************************** */()}function s(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||p(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function v(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{c(r.next(e))}catch(e){i(e)}}function u(e){try{c(r.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,u)}c((r=r.apply(e,t||[])).next())}))}function g(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,u])}}}function m(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}var y=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]);function b(e,t){var n=function(e){var t=e.name;if(t&&-1!==t.lastIndexOf(".")&&!e.type){var n=t.split(".").pop().toLowerCase(),r=y.get(n);r&&Object.defineProperty(e,"type",{value:r,writable:!1,configurable:!1,enumerable:!0})}return e}(e);if("string"!=typeof n.path){var r=e.webkitRelativePath;Object.defineProperty(n,"path",{value:"string"==typeof t?t:"string"==typeof r&&r.length>0?r:e.name,writable:!1,configurable:!1,enumerable:!0})}return n}var h=[".DS_Store","Thumbs.db"];function D(e){return"object"==typeof e&&null!==e}function w(e){return j(e.target.files).map((function(e){return b(e)}))}function x(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){switch(t.label){case 0:return[4,Promise.all(e.map((function(e){return e.getFile()})))];case 1:return[2,t.sent().map((function(e){return b(e)}))]}}))}))}function F(e,t){return v(this,void 0,void 0,(function(){var n;return g(this,(function(r){switch(r.label){case 0:return null===e?[2,[]]:e.items?(n=j(e.items).filter((function(e){return"file"===e.kind})),"drop"!==t?[2,n]:[4,Promise.all(n.map(A))]):[3,2];case 1:return[2,O(k(r.sent()))];case 2:return[2,O(j(e.files).map((function(e){return b(e)})))]}}))}))}function O(e){return e.filter((function(e){return-1===h.indexOf(e.name)}))}function j(e){if(null===e)return[];for(var t=[],n=0;n<e.length;n++){var r=e[n];t.push(r)}return t}function A(e){if("function"!=typeof e.webkitGetAsEntry)return E(e);var t=e.webkitGetAsEntry();return t&&t.isDirectory?C(t):E(e)}function k(e){return e.reduce((function(e,t){return function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(m(arguments[t]));return e}(e,Array.isArray(t)?k(t):[t])}),[])}function E(e){var t=e.getAsFile();if(!t)return Promise.reject(e+" is not a File");var n=b(t);return Promise.resolve(n)}function P(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return[2,e.isDirectory?C(e):S(e)]}))}))}function C(e){var t=e.createReader();return new Promise((function(e,n){var r=[];!function o(){var i=this;t.readEntries((function(t){return v(i,void 0,void 0,(function(){var i,a,u;return g(this,(function(c){switch(c.label){case 0:if(t.length)return[3,5];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,Promise.all(r)];case 2:return i=c.sent(),e(i),[3,4];case 3:return a=c.sent(),n(a),[3,4];case 4:return[3,6];case 5:u=Promise.all(t.map(P)),r.push(u),o(),c.label=6;case 6:return[2]}}))}))}),(function(e){n(e)}))}()}))}function S(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return[2,new Promise((function(t,n){e.file((function(n){var r=b(n,e.fullPath);t(r)}),(function(e){n(e)}))}))]}))}))}var z="file-invalid-type",R="file-too-large",T="file-too-small",L="too-many-files",I={FileInvalidType:z,FileTooLarge:R,FileTooSmall:T,TooManyFiles:L},M=function(e){e=Array.isArray(e)&&1===e.length?e[0]:e;var t=Array.isArray(e)?"one of ".concat(e.join(", ")):e;return{code:z,message:"File type must be ".concat(t)}},K=function(e){return{code:R,message:"File is larger than ".concat(e," ").concat(1===e?"byte":"bytes")}},B=function(e){return{code:T,message:"File is smaller than ".concat(e," ").concat(1===e?"byte":"bytes")}},_={code:L,message:"Too many files"};function q(e,t){var n="application/x-moz-file"===e.type||function(e,t){if(e&&t){var n=Array.isArray(t)?t:t.split(","),r=e.name||"",o=(e.type||"").toLowerCase(),i=o.replace(/\/.*$/,"");return n.some((function(e){var t=e.trim().toLowerCase();return"."===t.charAt(0)?r.toLowerCase().endsWith(t):t.endsWith("/*")?i===t.replace(/\/.*$/,""):o===t}))}return!0}(e,t);return[n,n?null:M(t)]}function G(e,t,n){if($(e.size))if($(t)&&$(n)){if(e.size>n)return[!1,K(n)];if(e.size<t)return[!1,B(t)]}else{if($(t)&&e.size<t)return[!1,B(t)];if($(n)&&e.size>n)return[!1,K(n)]}return[!0,null]}function $(e){return null!=e}function N(e){var t=e.files,n=e.accept,r=e.minSize,o=e.maxSize,i=e.multiple,a=e.maxFiles;return!(!i&&t.length>1||i&&a>=1&&t.length>a)&&t.every((function(e){var t=f(q(e,n),1)[0],i=f(G(e,r,o),1)[0];return t&&i}))}function U(e){return"function"==typeof e.isPropagationStopped?e.isPropagationStopped():void 0!==e.cancelBubble&&e.cancelBubble}function W(e){return e.dataTransfer?Array.prototype.some.call(e.dataTransfer.types,(function(e){return"Files"===e||"application/x-moz-file"===e})):!!e.target&&!!e.target.files}function H(e){e.preventDefault()}function Y(e){return-1!==e.indexOf("MSIE")||-1!==e.indexOf("Trident/")}function J(e){return-1!==e.indexOf("Edge/")}function Q(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.navigator.userAgent;return Y(e)||J(e)}function V(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return t.some((function(t){return!U(e)&&t&&t.apply(void 0,[e].concat(r)),U(e)}))}}function X(){return"showOpenFilePicker"in window}function Z(e){return e="string"==typeof e?e.split(","):e,[{description:"everything",accept:Array.isArray(e)?e.filter((function(e){return"audio/*"===e||"video/*"===e||"image/*"===e||"text/*"===e||/\w+\/[-+.\w]+/g.test(e)})).reduce((function(e,t){return u(u({},e),{},c({},t,[]))}),{}):{}}]}function ee(e){return e instanceof DOMException&&("AbortError"===e.name||e.code===e.ABORT_ERR)}function te(e){return e instanceof DOMException&&("SecurityError"===e.name||e.code===e.SECURITY_ERR)}var ne=["children"],re=["open"],oe=["refKey","role","onKeyDown","onFocus","onBlur","onClick","onDragEnter","onDragOver","onDragLeave","onDrop"],ie=["refKey","onChange","onClick"],ae=t.forwardRef((function(e,n){var r=e.children,i=le(l(e,ne)),a=i.open,c=l(i,re);return t.useImperativeHandle(n,(function(){return{open:a}}),[a]),o.default.createElement(t.Fragment,null,r(u(u({},c),{},{open:a})))}));ae.displayName="Dropzone";var ue={disabled:!1,getFilesFromEvent:function(e){return v(this,void 0,void 0,(function(){return g(this,(function(t){return D(e)&&D(e.dataTransfer)?[2,F(e.dataTransfer,e.type)]:function(e){return D(e)&&D(e.target)}(e)?[2,w(e)]:Array.isArray(e)&&e.every((function(e){return"getFile"in e&&"function"==typeof e.getFile}))?[2,x(e)]:[2,[]]}))}))},maxSize:1/0,minSize:0,multiple:!0,maxFiles:0,preventDropOnDocument:!0,noClick:!1,noKeyboard:!1,noDrag:!1,noDragEventsBubbling:!1,validator:null,useFsAccessApi:!0};ae.defaultProps=ue,ae.propTypes={children:i.default.func,accept:i.default.oneOfType([i.default.string,i.default.arrayOf(i.default.string)]),multiple:i.default.bool,preventDropOnDocument:i.default.bool,noClick:i.default.bool,noKeyboard:i.default.bool,noDrag:i.default.bool,noDragEventsBubbling:i.default.bool,minSize:i.default.number,maxSize:i.default.number,maxFiles:i.default.number,disabled:i.default.bool,getFilesFromEvent:i.default.func,onFileDialogCancel:i.default.func,onFileDialogOpen:i.default.func,useFsAccessApi:i.default.bool,onDragEnter:i.default.func,onDragLeave:i.default.func,onDragOver:i.default.func,onDrop:i.default.func,onDropAccepted:i.default.func,onDropRejected:i.default.func,validator:i.default.func};var ce={isFocused:!1,isFileDialogActive:!1,isDragActive:!1,isDragAccept:!1,isDragReject:!1,draggedFiles:[],acceptedFiles:[],fileRejections:[]};function le(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=u(u({},ue),e),r=n.accept,o=n.disabled,i=n.getFilesFromEvent,a=n.maxSize,p=n.minSize,d=n.multiple,v=n.maxFiles,g=n.onDragEnter,m=n.onDragLeave,y=n.onDragOver,b=n.onDrop,h=n.onDropAccepted,D=n.onDropRejected,w=n.onFileDialogCancel,x=n.onFileDialogOpen,F=n.useFsAccessApi,O=n.preventDropOnDocument,j=n.noClick,A=n.noKeyboard,k=n.noDrag,E=n.noDragEventsBubbling,P=n.validator,C=t.useMemo((function(){return"function"==typeof x?x:se}),[x]),S=t.useMemo((function(){return"function"==typeof w?w:se}),[w]),z=t.useRef(null),R=t.useRef(null),T=t.useReducer(fe,ce),L=f(T,2),I=L[0],M=L[1],K=I.isFocused,B=I.isFileDialogActive,$=I.draggedFiles,Y=t.useRef(window.isSecureContext&&F&&X()),J=function(){!Y.current&&B&&setTimeout((function(){R.current&&(R.current.files.length||(M({type:"closeDialog"}),S()))}),300)};t.useEffect((function(){return window.addEventListener("focus",J,!1),function(){window.removeEventListener("focus",J,!1)}}),[R,B,S,Y]);var ne=t.useRef([]),re=function(e){z.current&&z.current.contains(e.target)||(e.preventDefault(),ne.current=[])};t.useEffect((function(){return O&&(document.addEventListener("dragover",H,!1),document.addEventListener("drop",re,!1)),function(){O&&(document.removeEventListener("dragover",H),document.removeEventListener("drop",re))}}),[z,O]);var ae=t.useCallback((function(e){e.preventDefault(),e.persist(),Fe(e),ne.current=[].concat(s(ne.current),[e.target]),W(e)&&Promise.resolve(i(e)).then((function(t){U(e)&&!E||(M({draggedFiles:t,isDragActive:!0,type:"setDraggedFiles"}),g&&g(e))}))}),[i,g,E]),le=t.useCallback((function(e){e.preventDefault(),e.persist(),Fe(e);var t=W(e);if(t&&e.dataTransfer)try{e.dataTransfer.dropEffect="copy"}catch(e){}return t&&y&&y(e),!1}),[y,E]),pe=t.useCallback((function(e){e.preventDefault(),e.persist(),Fe(e);var t=ne.current.filter((function(e){return z.current&&z.current.contains(e)})),n=t.indexOf(e.target);-1!==n&&t.splice(n,1),ne.current=t,t.length>0||(M({isDragActive:!1,type:"setDraggedFiles",draggedFiles:[]}),W(e)&&m&&m(e))}),[z,m,E]),de=t.useCallback((function(e,t){var n=[],o=[];e.forEach((function(e){var t=f(q(e,r),2),i=t[0],u=t[1],c=f(G(e,p,a),2),l=c[0],s=c[1],d=P?P(e):null;if(i&&l&&!d)n.push(e);else{var v=[u,s];d&&(v=v.concat(d)),o.push({file:e,errors:v.filter((function(e){return e}))})}})),(!d&&n.length>1||d&&v>=1&&n.length>v)&&(n.forEach((function(e){o.push({file:e,errors:[_]})})),n.splice(0)),M({acceptedFiles:n,fileRejections:o,type:"setFiles"}),b&&b(n,o,t),o.length>0&&D&&D(o,t),n.length>0&&h&&h(n,t)}),[M,d,r,p,a,v,b,h,D,P]),ve=t.useCallback((function(e){e.preventDefault(),e.persist(),Fe(e),ne.current=[],W(e)&&Promise.resolve(i(e)).then((function(t){U(e)&&!E||de(t,e)})),M({type:"reset"})}),[i,de,E]),ge=t.useCallback((function(){if(Y.current){M({type:"openDialog"}),C();var e={multiple:d,types:Z(r)};window.showOpenFilePicker(e).then((function(e){return i(e)})).then((function(e){de(e,null),M({type:"closeDialog"})})).catch((function(e){ee(e)?(S(e),M({type:"closeDialog"})):te(e)&&(Y.current=!1,R.current&&(R.current.value=null,R.current.click()))}))}else R.current&&(M({type:"openDialog"}),C(),R.current.value=null,R.current.click())}),[M,C,S,F,de,r,d]),me=t.useCallback((function(e){z.current&&z.current.isEqualNode(e.target)&&(32!==e.keyCode&&13!==e.keyCode||(e.preventDefault(),ge()))}),[z,ge]),ye=t.useCallback((function(){M({type:"focus"})}),[]),be=t.useCallback((function(){M({type:"blur"})}),[]),he=t.useCallback((function(){j||(Q()?setTimeout(ge,0):ge())}),[j,ge]),De=function(e){return o?null:e},we=function(e){return A?null:De(e)},xe=function(e){return k?null:De(e)},Fe=function(e){E&&e.stopPropagation()},Oe=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,r=e.role,i=e.onKeyDown,a=e.onFocus,f=e.onBlur,s=e.onClick,p=e.onDragEnter,d=e.onDragOver,v=e.onDragLeave,g=e.onDrop,m=l(e,oe);return u(u(c({onKeyDown:we(V(i,me)),onFocus:we(V(a,ye)),onBlur:we(V(f,be)),onClick:De(V(s,he)),onDragEnter:xe(V(p,ae)),onDragOver:xe(V(d,le)),onDragLeave:xe(V(v,pe)),onDrop:xe(V(g,ve)),role:"string"==typeof r&&""!==r?r:"button"},n,z),o||A?{}:{tabIndex:0}),m)}}),[z,me,ye,be,he,ae,le,pe,ve,A,k,o]),je=t.useCallback((function(e){e.stopPropagation()}),[]),Ae=t.useMemo((function(){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.refKey,n=void 0===t?"ref":t,o=e.onChange,i=e.onClick,a=l(e,ie),f=c({accept:r,multiple:d,type:"file",style:{display:"none"},onChange:De(V(o,ve)),onClick:De(V(i,je)),autoComplete:"off",tabIndex:-1},n,R);return u(u({},f),a)}}),[R,r,d,ve,o]),ke=$.length,Ee=ke>0&&N({files:$,accept:r,minSize:p,maxSize:a,multiple:d,maxFiles:v}),Pe=ke>0&&!Ee;return u(u({},I),{},{isDragAccept:Ee,isDragReject:Pe,isFocused:K&&!o,getRootProps:Oe,getInputProps:Ae,rootRef:z,inputRef:R,open:De(ge)})}function fe(e,t){switch(t.type){case"focus":return u(u({},e),{},{isFocused:!0});case"blur":return u(u({},e),{},{isFocused:!1});case"openDialog":return u(u({},ce),{},{isFileDialogActive:!0});case"closeDialog":return u(u({},e),{},{isFileDialogActive:!1});case"setDraggedFiles":var n=t.isDragActive,r=t.draggedFiles;return u(u({},e),{},{draggedFiles:r,isDragActive:n});case"setFiles":return u(u({},e),{},{acceptedFiles:t.acceptedFiles,fileRejections:t.fileRejections});case"reset":return u({},ce);default:return e}}function se(){}e.ErrorCode=I,e.default=ae,e.useDropzone=le,Object.defineProperty(e,"__esModule",{value:!0})}));
16
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9ub2RlX21vZHVsZXMvZmlsZS1zZWxlY3Rvci9kaXN0L2VzNS9maWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZpbGUtc2VsZWN0b3IvZGlzdC9lczUvZmlsZS1zZWxlY3Rvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9hdHRyLWFjY2VwdC9kaXN0L2VzL2luZGV4LmpzIiwiLi4vc3JjL3V0aWxzL2luZGV4LmpzIiwiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiZXhwb3J0IHZhciBDT01NT05fTUlNRV9UWVBFUyA9IG5ldyBNYXAoW1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlcy9Db21tb25fdHlwZXNcbiAgICBbJ2FhYycsICdhdWRpby9hYWMnXSxcbiAgICBbJ2FidycsICdhcHBsaWNhdGlvbi94LWFiaXdvcmQnXSxcbiAgICBbJ2FyYycsICdhcHBsaWNhdGlvbi94LWZyZWVhcmMnXSxcbiAgICBbJ2F2aWYnLCAnaW1hZ2UvYXZpZiddLFxuICAgIFsnYXZpJywgJ3ZpZGVvL3gtbXN2aWRlbyddLFxuICAgIFsnYXp3JywgJ2FwcGxpY2F0aW9uL3ZuZC5hbWF6b24uZWJvb2snXSxcbiAgICBbJ2JpbicsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ2JtcCcsICdpbWFnZS9ibXAnXSxcbiAgICBbJ2J6JywgJ2FwcGxpY2F0aW9uL3gtYnppcCddLFxuICAgIFsnYnoyJywgJ2FwcGxpY2F0aW9uL3gtYnppcDInXSxcbiAgICBbJ2NkYScsICdhcHBsaWNhdGlvbi94LWNkZiddLFxuICAgIFsnY3NoJywgJ2FwcGxpY2F0aW9uL3gtY3NoJ10sXG4gICAgWydjc3MnLCAndGV4dC9jc3MnXSxcbiAgICBbJ2NzdicsICd0ZXh0L2NzdiddLFxuICAgIFsnZG9jJywgJ2FwcGxpY2F0aW9uL21zd29yZCddLFxuICAgIFsnZG9jeCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCddLFxuICAgIFsnZW90JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0J10sXG4gICAgWydlcHViJywgJ2FwcGxpY2F0aW9uL2VwdWIremlwJ10sXG4gICAgWydneicsICdhcHBsaWNhdGlvbi9nemlwJ10sXG4gICAgWydnaWYnLCAnaW1hZ2UvZ2lmJ10sXG4gICAgWydodG0nLCAndGV4dC9odG1sJ10sXG4gICAgWydodG1sJywgJ3RleHQvaHRtbCddLFxuICAgIFsnaWNvJywgJ2ltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiddLFxuICAgIFsnaWNzJywgJ3RleHQvY2FsZW5kYXInXSxcbiAgICBbJ2phcicsICdhcHBsaWNhdGlvbi9qYXZhLWFyY2hpdmUnXSxcbiAgICBbJ2pwZWcnLCAnaW1hZ2UvanBlZyddLFxuICAgIFsnanBnJywgJ2ltYWdlL2pwZWcnXSxcbiAgICBbJ2pzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnanNvbicsICdhcHBsaWNhdGlvbi9qc29uJ10sXG4gICAgWydqc29ubGQnLCAnYXBwbGljYXRpb24vbGQranNvbiddLFxuICAgIFsnbWlkJywgJ2F1ZGlvL21pZGknXSxcbiAgICBbJ21pZGknLCAnYXVkaW8vbWlkaSddLFxuICAgIFsnbWpzJywgJ3RleHQvamF2YXNjcmlwdCddLFxuICAgIFsnbXAzJywgJ2F1ZGlvL21wZWcnXSxcbiAgICBbJ21wNCcsICd2aWRlby9tcDQnXSxcbiAgICBbJ21wZWcnLCAndmlkZW8vbXBlZyddLFxuICAgIFsnbXBrZycsICdhcHBsaWNhdGlvbi92bmQuYXBwbGUuaW5zdGFsbGVyK3htbCddLFxuICAgIFsnb2RwJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uJ10sXG4gICAgWydvZHMnLCAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCddLFxuICAgIFsnb2R0JywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCddLFxuICAgIFsnb2dhJywgJ2F1ZGlvL29nZyddLFxuICAgIFsnb2d2JywgJ3ZpZGVvL29nZyddLFxuICAgIFsnb2d4JywgJ2FwcGxpY2F0aW9uL29nZyddLFxuICAgIFsnb3B1cycsICdhdWRpby9vcHVzJ10sXG4gICAgWydvdGYnLCAnZm9udC9vdGYnXSxcbiAgICBbJ3BuZycsICdpbWFnZS9wbmcnXSxcbiAgICBbJ3BkZicsICdhcHBsaWNhdGlvbi9wZGYnXSxcbiAgICBbJ3BocCcsICdhcHBsaWNhdGlvbi94LWh0dHBkLXBocCddLFxuICAgIFsncHB0JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50J10sXG4gICAgWydwcHR4JywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nXSxcbiAgICBbJ3JhcicsICdhcHBsaWNhdGlvbi92bmQucmFyJ10sXG4gICAgWydydGYnLCAnYXBwbGljYXRpb24vcnRmJ10sXG4gICAgWydzaCcsICdhcHBsaWNhdGlvbi94LXNoJ10sXG4gICAgWydzdmcnLCAnaW1hZ2Uvc3ZnK3htbCddLFxuICAgIFsnc3dmJywgJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJ10sXG4gICAgWyd0YXInLCAnYXBwbGljYXRpb24veC10YXInXSxcbiAgICBbJ3RpZicsICdpbWFnZS90aWZmJ10sXG4gICAgWyd0aWZmJywgJ2ltYWdlL3RpZmYnXSxcbiAgICBbJ3RzJywgJ3ZpZGVvL21wMnQnXSxcbiAgICBbJ3R0ZicsICdmb250L3R0ZiddLFxuICAgIFsndHh0JywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ3ZzZCcsICdhcHBsaWNhdGlvbi92bmQudmlzaW8nXSxcbiAgICBbJ3dhdicsICdhdWRpby93YXYnXSxcbiAgICBbJ3dlYmEnLCAnYXVkaW8vd2VibSddLFxuICAgIFsnd2VibScsICd2aWRlby93ZWJtJ10sXG4gICAgWyd3ZWJwJywgJ2ltYWdlL3dlYnAnXSxcbiAgICBbJ3dvZmYnLCAnZm9udC93b2ZmJ10sXG4gICAgWyd3b2ZmMicsICdmb250L3dvZmYyJ10sXG4gICAgWyd4aHRtbCcsICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnXSxcbiAgICBbJ3hscycsICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnXSxcbiAgICBbJ3hsc3gnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnXSxcbiAgICBbJ3htbCcsICdhcHBsaWNhdGlvbi94bWwnXSxcbiAgICBbJ3h1bCcsICdhcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sJ10sXG4gICAgWyd6aXAnLCAnYXBwbGljYXRpb24vemlwJ10sXG4gICAgWyc3eicsICdhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWQnXSxcbiAgICAvLyBPdGhlcnNcbiAgICBbJ21rdicsICd2aWRlby94LW1hdHJvc2thJ10sXG4gICAgWydtb3YnLCAndmlkZW8vcXVpY2t0aW1lJ10sXG4gICAgWydtc2cnLCAnYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2snXVxuXSk7XG5leHBvcnQgZnVuY3Rpb24gdG9GaWxlV2l0aFBhdGgoZmlsZSwgcGF0aCkge1xuICAgIHZhciBmID0gd2l0aE1pbWVUeXBlKGZpbGUpO1xuICAgIGlmICh0eXBlb2YgZi5wYXRoICE9PSAnc3RyaW5nJykgeyAvLyBvbiBlbGVjdHJvbiwgcGF0aCBpcyBhbHJlYWR5IHNldCB0byB0aGUgYWJzb2x1dGUgcGF0aFxuICAgICAgICB2YXIgd2Via2l0UmVsYXRpdmVQYXRoID0gZmlsZS53ZWJraXRSZWxhdGl2ZVBhdGg7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAncGF0aCcsIHtcbiAgICAgICAgICAgIHZhbHVlOiB0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IHBhdGhcbiAgICAgICAgICAgICAgICAvLyBJZiA8aW5wdXQgd2Via2l0ZGlyZWN0b3J5PiBpcyBzZXQsXG4gICAgICAgICAgICAgICAgLy8gdGhlIEZpbGUgd2lsbCBoYXZlIGEge3dlYmtpdFJlbGF0aXZlUGF0aH0gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTElucHV0RWxlbWVudC93ZWJraXRkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiB3ZWJraXRSZWxhdGl2ZVBhdGggPT09ICdzdHJpbmcnICYmIHdlYmtpdFJlbGF0aXZlUGF0aC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gd2Via2l0UmVsYXRpdmVQYXRoXG4gICAgICAgICAgICAgICAgICAgIDogZmlsZS5uYW1lLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmO1xufVxuZnVuY3Rpb24gd2l0aE1pbWVUeXBlKGZpbGUpIHtcbiAgICB2YXIgbmFtZSA9IGZpbGUubmFtZTtcbiAgICB2YXIgaGFzRXh0ZW5zaW9uID0gbmFtZSAmJiBuYW1lLmxhc3RJbmRleE9mKCcuJykgIT09IC0xO1xuICAgIGlmIChoYXNFeHRlbnNpb24gJiYgIWZpbGUudHlwZSkge1xuICAgICAgICB2YXIgZXh0ID0gbmFtZS5zcGxpdCgnLicpXG4gICAgICAgICAgICAucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIHR5cGUgPSBDT01NT05fTUlNRV9UWVBFUy5nZXQoZXh0KTtcbiAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmaWxlLCAndHlwZScsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUuanMubWFwIiwiaW1wb3J0IHsgX19hd2FpdGVyLCBfX2dlbmVyYXRvciwgX19yZWFkLCBfX3NwcmVhZCB9IGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgdG9GaWxlV2l0aFBhdGggfSBmcm9tICcuL2ZpbGUnO1xudmFyIEZJTEVTX1RPX0lHTk9SRSA9IFtcbiAgICAvLyBUaHVtYm5haWwgY2FjaGUgZmlsZXMgZm9yIG1hY09TIGFuZCBXaW5kb3dzXG4gICAgJy5EU19TdG9yZScsXG4gICAgJ1RodW1icy5kYicgLy8gV2luZG93c1xuXTtcbi8qKlxuICogQ29udmVydCBhIERyYWdFdmVudCdzIERhdGFUcmFzZmVyIG9iamVjdCB0byBhIGxpc3Qgb2YgRmlsZSBvYmplY3RzXG4gKiBOT1RFOiBJZiBzb21lIG9mIHRoZSBpdGVtcyBhcmUgZm9sZGVycyxcbiAqIGV2ZXJ5dGhpbmcgd2lsbCBiZSBmbGF0dGVuZWQgYW5kIHBsYWNlZCBpbiB0aGUgc2FtZSBsaXN0IGJ1dCB0aGUgcGF0aHMgd2lsbCBiZSBrZXB0IGFzIGEge3BhdGh9IHByb3BlcnR5LlxuICpcbiAqIEVYUEVSSU1FTlRBTDogQSBsaXN0IG9mIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtSGFuZGxlIG9iamVjdHMgY2FuIGFsc28gYmUgcGFzc2VkIGFzIGFuIGFyZ1xuICogYW5kIGEgbGlzdCBvZiBGaWxlIG9iamVjdHMgd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZXZ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRXZlbnQoZXZ0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QoZXZ0KSAmJiBpc0RhdGFUcmFuc2ZlcihldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldERhdGFUcmFuc2ZlckZpbGVzKGV2dC5kYXRhVHJhbnNmZXIsIGV2dC50eXBlKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0NoYW5nZUV2dChldnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIGdldElucHV0RmlsZXMoZXZ0KV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV2dCkgJiYgZXZ0LmV2ZXJ5KGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiAnZ2V0RmlsZScgaW4gaXRlbSAmJiB0eXBlb2YgaXRlbS5nZXRGaWxlID09PSAnZnVuY3Rpb24nOyB9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBnZXRGc0hhbmRsZUZpbGVzKGV2dCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc0RhdGFUcmFuc2Zlcih2YWx1ZSkge1xuICAgIHJldHVybiBpc09iamVjdCh2YWx1ZS5kYXRhVHJhbnNmZXIpO1xufVxuZnVuY3Rpb24gaXNDaGFuZ2VFdnQodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzT2JqZWN0KHZhbHVlLnRhcmdldCk7XG59XG5mdW5jdGlvbiBpc09iamVjdCh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gZ2V0SW5wdXRGaWxlcyhldnQpIHtcbiAgICByZXR1cm4gZnJvbUxpc3QoZXZ0LnRhcmdldC5maWxlcykubWFwKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiB0b0ZpbGVXaXRoUGF0aChmaWxlKTsgfSk7XG59XG4vLyBFZSBleHBlY3QgZWFjaCBoYW5kbGUgdG8gYmUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1GaWxlSGFuZGxlXG5mdW5jdGlvbiBnZXRGc0hhbmRsZUZpbGVzKGhhbmRsZXMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmaWxlcztcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoZnVuY3Rpb24gKGgpIHsgcmV0dXJuIGguZ2V0RmlsZSgpOyB9KSldO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmaWxlcy5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0RGF0YVRyYW5zZmVyRmlsZXMoZHQsIHR5cGUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpdGVtcywgZmlsZXM7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmIChkdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFtdXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWR0Lml0ZW1zKSByZXR1cm4gWzMgLypicmVhayovLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBmcm9tTGlzdChkdC5pdGVtcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW0ua2luZCA9PT0gJ2ZpbGUnOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSAnZHJhZ3N0YXJ0JyBhbmQgJ2Ryb3AnIGhhcyBhY2Nlc3MgdG8gdGhlIGRhdGEgKHNvdXJjZSBub2RlKVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gJ2Ryb3AnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgaXRlbXNdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGl0ZW1zLm1hcCh0b0ZpbGVQcm9taXNlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbm9JZ25vcmVkRmlsZXMoZmxhdHRlbihmaWxlcykpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbMiAvKnJldHVybiovLCBub0lnbm9yZWRGaWxlcyhmcm9tTGlzdChkdC5maWxlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIHRvRmlsZVdpdGhQYXRoKGZpbGUpOyB9KSldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vSWdub3JlZEZpbGVzKGZpbGVzKSB7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmdW5jdGlvbiAoZmlsZSkgeyByZXR1cm4gRklMRVNfVE9fSUdOT1JFLmluZGV4T2YoZmlsZS5uYW1lKSA9PT0gLTE7IH0pO1xufVxuLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IEFycmF5LmZyb20oKVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZnJvbSNCcm93c2VyX2NvbXBhdGliaWxpdHlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlTGlzdFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlckl0ZW1MaXN0XG5mdW5jdGlvbiBmcm9tTGlzdChpdGVtcykge1xuICAgIGlmIChpdGVtcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciBmaWxlcyA9IFtdO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOiBwcmVmZXItZm9yLW9mXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmlsZSA9IGl0ZW1zW2ldO1xuICAgICAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXM7XG59XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVySXRlbVxuZnVuY3Rpb24gdG9GaWxlUHJvbWlzZXMoaXRlbSkge1xuICAgIGlmICh0eXBlb2YgaXRlbS53ZWJraXRHZXRBc0VudHJ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmcm9tRGF0YVRyYW5zZmVySXRlbShpdGVtKTtcbiAgICB9XG4gICAgdmFyIGVudHJ5ID0gaXRlbS53ZWJraXRHZXRBc0VudHJ5KCk7XG4gICAgLy8gU2FmYXJpIHN1cHBvcnRzIGRyb3BwaW5nIGFuIGltYWdlIG5vZGUgZnJvbSBhIGRpZmZlcmVudCB3aW5kb3cgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmdcbiAgICAvLyB0aGUgRGF0YVRyYW5zZmVySXRlbS5nZXRBc0ZpbGUoKSBBUElcbiAgICAvLyBOT1RFOiBGaWxlU3lzdGVtRW50cnkuZmlsZSgpIHRocm93cyBpZiB0cnlpbmcgdG8gZ2V0IHRoZSBmaWxlXG4gICAgaWYgKGVudHJ5ICYmIGVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIHJldHVybiBmcm9tRGlyRW50cnkoZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSk7XG59XG5mdW5jdGlvbiBmbGF0dGVuKGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBmaWxlcykgeyByZXR1cm4gX19zcHJlYWQoYWNjLCAoQXJyYXkuaXNBcnJheShmaWxlcykgPyBmbGF0dGVuKGZpbGVzKSA6IFtmaWxlc10pKTsgfSwgW10pO1xufVxuZnVuY3Rpb24gZnJvbURhdGFUcmFuc2Zlckl0ZW0oaXRlbSkge1xuICAgIHZhciBmaWxlID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGl0ZW0gKyBcIiBpcyBub3QgYSBGaWxlXCIpO1xuICAgIH1cbiAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmd3ApO1xufVxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1FbnRyeVxuZnVuY3Rpb24gZnJvbUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZW50cnkuaXNEaXJlY3RvcnkgPyBmcm9tRGlyRW50cnkoZW50cnkpIDogZnJvbUZpbGVFbnRyeShlbnRyeSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRGlyZWN0b3J5RW50cnlcbmZ1bmN0aW9uIGZyb21EaXJFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWFkZXIgPSBlbnRyeS5jcmVhdGVSZWFkZXIoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgICAgICBmdW5jdGlvbiByZWFkRW50cmllcygpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZVN5c3RlbURpcmVjdG9yeUVudHJ5L2NyZWF0ZVJlYWRlclxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVTeXN0ZW1EaXJlY3RvcnlSZWFkZXIvcmVhZEVudHJpZXNcbiAgICAgICAgICAgIHJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoYmF0Y2gpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZXMsIGVycl8xLCBpdGVtcztcbiAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFiYXRjaC5sZW5ndGgpIHJldHVybiBbMyAvKmJyZWFrKi8sIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzEsIDMsICwgNF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGVudHJpZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCA0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMyAvKmJyZWFrKi8sIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzMgLypicmVhayovLCA2XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IFByb21pc2UuYWxsKGJhdGNoLm1hcChmcm9tRW50cnkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIHJlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRW50cmllcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gNjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogcmV0dXJuIFsyIC8qcmV0dXJuKi9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTsgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZEVudHJpZXMoKTtcbiAgICB9KTtcbn1cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlU3lzdGVtRmlsZUVudHJ5XG5mdW5jdGlvbiBmcm9tRmlsZUVudHJ5KGVudHJ5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZndwID0gdG9GaWxlV2l0aFBhdGgoZmlsZSwgZW50cnkuZnVsbFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmd3ApO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUtc2VsZWN0b3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChmaWxlLCBhY2NlcHRlZEZpbGVzKSB7XG4gIGlmIChmaWxlICYmIGFjY2VwdGVkRmlsZXMpIHtcbiAgICB2YXIgYWNjZXB0ZWRGaWxlc0FycmF5ID0gQXJyYXkuaXNBcnJheShhY2NlcHRlZEZpbGVzKSA/IGFjY2VwdGVkRmlsZXMgOiBhY2NlcHRlZEZpbGVzLnNwbGl0KCcsJyk7XG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8ICcnO1xuICAgIHZhciBtaW1lVHlwZSA9IChmaWxlLnR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGJhc2VNaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICByZXR1cm4gYWNjZXB0ZWRGaWxlc0FycmF5LnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIHZhciB2YWxpZFR5cGUgPSB0eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAodmFsaWRUeXBlLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKHZhbGlkVHlwZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbGlkVHlwZS5lbmRzV2l0aCgnLyonKSkge1xuICAgICAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyBsaWtlIGEgaW1hZ2UvKiBtaW1lIHR5cGVcbiAgICAgICAgcmV0dXJuIGJhc2VNaW1lVHlwZSA9PT0gdmFsaWRUeXBlLnJlcGxhY2UoL1xcLy4qJC8sICcnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1pbWVUeXBlID09PSB2YWxpZFR5cGU7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07IiwiaW1wb3J0IGFjY2VwdHMgZnJvbSBcImF0dHItYWNjZXB0XCI7XG5cbi8vIEVycm9yIGNvZGVzXG5leHBvcnQgY29uc3QgRklMRV9JTlZBTElEX1RZUEUgPSBcImZpbGUtaW52YWxpZC10eXBlXCI7XG5leHBvcnQgY29uc3QgRklMRV9UT09fTEFSR0UgPSBcImZpbGUtdG9vLWxhcmdlXCI7XG5leHBvcnQgY29uc3QgRklMRV9UT09fU01BTEwgPSBcImZpbGUtdG9vLXNtYWxsXCI7XG5leHBvcnQgY29uc3QgVE9PX01BTllfRklMRVMgPSBcInRvby1tYW55LWZpbGVzXCI7XG5cbmV4cG9ydCBjb25zdCBFcnJvckNvZGUgPSB7XG4gIEZpbGVJbnZhbGlkVHlwZTogRklMRV9JTlZBTElEX1RZUEUsXG4gIEZpbGVUb29MYXJnZTogRklMRV9UT09fTEFSR0UsXG4gIEZpbGVUb29TbWFsbDogRklMRV9UT09fU01BTEwsXG4gIFRvb01hbnlGaWxlczogVE9PX01BTllfRklMRVMsXG59O1xuXG4vLyBGaWxlIEVycm9yc1xuZXhwb3J0IGNvbnN0IGdldEludmFsaWRUeXBlUmVqZWN0aW9uRXJyID0gKGFjY2VwdCkgPT4ge1xuICBhY2NlcHQgPSBBcnJheS5pc0FycmF5KGFjY2VwdCkgJiYgYWNjZXB0Lmxlbmd0aCA9PT0gMSA/IGFjY2VwdFswXSA6IGFjY2VwdDtcbiAgY29uc3QgbWVzc2FnZVN1ZmZpeCA9IEFycmF5LmlzQXJyYXkoYWNjZXB0KVxuICAgID8gYG9uZSBvZiAke2FjY2VwdC5qb2luKFwiLCBcIil9YFxuICAgIDogYWNjZXB0O1xuICByZXR1cm4ge1xuICAgIGNvZGU6IEZJTEVfSU5WQUxJRF9UWVBFLFxuICAgIG1lc3NhZ2U6IGBGaWxlIHR5cGUgbXVzdCBiZSAke21lc3NhZ2VTdWZmaXh9YCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUb29MYXJnZVJlamVjdGlvbkVyciA9IChtYXhTaXplKSA9PiB7XG4gIHJldHVybiB7XG4gICAgY29kZTogRklMRV9UT09fTEFSR0UsXG4gICAgbWVzc2FnZTogYEZpbGUgaXMgbGFyZ2VyIHRoYW4gJHttYXhTaXplfSAke1xuICAgICAgbWF4U2l6ZSA9PT0gMSA/IFwiYnl0ZVwiIDogXCJieXRlc1wiXG4gICAgfWAsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIgPSAobWluU2l6ZSkgPT4ge1xuICByZXR1cm4ge1xuICAgIGNvZGU6IEZJTEVfVE9PX1NNQUxMLFxuICAgIG1lc3NhZ2U6IGBGaWxlIGlzIHNtYWxsZXIgdGhhbiAke21pblNpemV9ICR7XG4gICAgICBtaW5TaXplID09PSAxID8gXCJieXRlXCIgOiBcImJ5dGVzXCJcbiAgICB9YCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBUT09fTUFOWV9GSUxFU19SRUpFQ1RJT04gPSB7XG4gIGNvZGU6IFRPT19NQU5ZX0ZJTEVTLFxuICBtZXNzYWdlOiBcIlRvbyBtYW55IGZpbGVzXCIsXG59O1xuXG4vLyBGaXJlZm94IHZlcnNpb25zIHByaW9yIHRvIDUzIHJldHVybiBhIGJvZ3VzIE1JTUUgdHlwZSBmb3IgZXZlcnkgZmlsZSBkcmFnLCBzbyBkcmFnb3ZlcnMgd2l0aFxuLy8gdGhhdCBNSU1FIHR5cGUgd2lsbCBhbHdheXMgYmUgYWNjZXB0ZWRcbmV4cG9ydCBmdW5jdGlvbiBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KSB7XG4gIGNvbnN0IGlzQWNjZXB0YWJsZSA9XG4gICAgZmlsZS50eXBlID09PSBcImFwcGxpY2F0aW9uL3gtbW96LWZpbGVcIiB8fCBhY2NlcHRzKGZpbGUsIGFjY2VwdCk7XG4gIHJldHVybiBbXG4gICAgaXNBY2NlcHRhYmxlLFxuICAgIGlzQWNjZXB0YWJsZSA/IG51bGwgOiBnZXRJbnZhbGlkVHlwZVJlamVjdGlvbkVycihhY2NlcHQpLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsZU1hdGNoU2l6ZShmaWxlLCBtaW5TaXplLCBtYXhTaXplKSB7XG4gIGlmIChpc0RlZmluZWQoZmlsZS5zaXplKSkge1xuICAgIGlmIChpc0RlZmluZWQobWluU2l6ZSkgJiYgaXNEZWZpbmVkKG1heFNpemUpKSB7XG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4U2l6ZSkgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIobWF4U2l6ZSldO1xuICAgICAgaWYgKGZpbGUuc2l6ZSA8IG1pblNpemUpIHJldHVybiBbZmFsc2UsIGdldFRvb1NtYWxsUmVqZWN0aW9uRXJyKG1pblNpemUpXTtcbiAgICB9IGVsc2UgaWYgKGlzRGVmaW5lZChtaW5TaXplKSAmJiBmaWxlLnNpemUgPCBtaW5TaXplKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIobWluU2l6ZSldO1xuICAgIGVsc2UgaWYgKGlzRGVmaW5lZChtYXhTaXplKSAmJiBmaWxlLnNpemUgPiBtYXhTaXplKVxuICAgICAgcmV0dXJuIFtmYWxzZSwgZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIobWF4U2l6ZSldO1xuICB9XG4gIHJldHVybiBbdHJ1ZSwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIGlzRGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbEZpbGVzQWNjZXB0ZWQoe1xuICBmaWxlcyxcbiAgYWNjZXB0LFxuICBtaW5TaXplLFxuICBtYXhTaXplLFxuICBtdWx0aXBsZSxcbiAgbWF4RmlsZXMsXG59KSB7XG4gIGlmIChcbiAgICAoIW11bHRpcGxlICYmIGZpbGVzLmxlbmd0aCA+IDEpIHx8XG4gICAgKG11bHRpcGxlICYmIG1heEZpbGVzID49IDEgJiYgZmlsZXMubGVuZ3RoID4gbWF4RmlsZXMpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBmaWxlcy5ldmVyeSgoZmlsZSkgPT4ge1xuICAgIGNvbnN0IFthY2NlcHRlZF0gPSBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KTtcbiAgICBjb25zdCBbc2l6ZU1hdGNoXSA9IGZpbGVNYXRjaFNpemUoZmlsZSwgbWluU2l6ZSwgbWF4U2l6ZSk7XG4gICAgcmV0dXJuIGFjY2VwdGVkICYmIHNpemVNYXRjaDtcbiAgfSk7XG59XG5cbi8vIFJlYWN0J3Mgc3ludGhldGljIGV2ZW50cyBoYXMgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQsXG4vLyBidXQgdG8gcmVtYWluIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaWJzIChQcmVhY3QpIGZhbGwgYmFja1xuLy8gdG8gY2hlY2sgZXZlbnQuY2FuY2VsQnViYmxlXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBldmVudC5jYW5jZWxCdWJibGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFdnRXaXRoRmlsZXMoZXZlbnQpIHtcbiAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICByZXR1cm4gISFldmVudC50YXJnZXQgJiYgISFldmVudC50YXJnZXQuZmlsZXM7XG4gIH1cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlci90eXBlc1xuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTF9EcmFnX2FuZF9Ecm9wX0FQSS9SZWNvbW1lbmRlZF9kcmFnX3R5cGVzI2ZpbGVcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwoXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzLFxuICAgICh0eXBlKSA9PiB0eXBlID09PSBcIkZpbGVzXCIgfHwgdHlwZSA9PT0gXCJhcHBsaWNhdGlvbi94LW1vei1maWxlXCJcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2luZEZpbGUoaXRlbSkge1xuICByZXR1cm4gdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiYgaXRlbSAhPT0gbnVsbCAmJiBpdGVtLmtpbmQgPT09IFwiZmlsZVwiO1xufVxuXG4vLyBhbGxvdyB0aGUgZW50aXJlIGRvY3VtZW50IHRvIGJlIGEgZHJhZyB0YXJnZXRcbmV4cG9ydCBmdW5jdGlvbiBvbkRvY3VtZW50RHJhZ092ZXIoZXZlbnQpIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbn1cblxuZnVuY3Rpb24gaXNJZSh1c2VyQWdlbnQpIHtcbiAgcmV0dXJuIChcbiAgICB1c2VyQWdlbnQuaW5kZXhPZihcIk1TSUVcIikgIT09IC0xIHx8IHVzZXJBZ2VudC5pbmRleE9mKFwiVHJpZGVudC9cIikgIT09IC0xXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRWRnZSh1c2VyQWdlbnQpIHtcbiAgcmV0dXJuIHVzZXJBZ2VudC5pbmRleE9mKFwiRWRnZS9cIikgIT09IC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZU9yRWRnZSh1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkge1xuICByZXR1cm4gaXNJZSh1c2VyQWdlbnQpIHx8IGlzRWRnZSh1c2VyQWdlbnQpO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjb21wb3NlIGV2ZW50IGhhbmRsZXJzXG4gKiBUaGV5IGFyZSBleGVjdXRlZCBpbiBvcmRlciB1bnRpbCBvbmUgb2YgdGhlbSBjYWxscyBgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKWAuXG4gKiBOb3RlIHRoYXQgdGhlIGNoZWNrIGlzIGRvbmUgb24gdGhlIGZpcnN0IGludm9rZSB0b28sXG4gKiBtZWFuaW5nIHRoYXQgaWYgcHJvcGFnYXRpb24gd2FzIHN0b3BwZWQgYmVmb3JlIGludm9raW5nIHRoZSBmbnMsXG4gKiBubyBoYW5kbGVycyB3aWxsIGJlIGV4ZWN1dGVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZucyB0aGUgZXZlbnQgaGFubGRlciBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0aGUgZXZlbnQgaGFuZGxlciB0byBhZGQgdG8gYW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUV2ZW50SGFuZGxlcnMoLi4uZm5zKSB7XG4gIHJldHVybiAoZXZlbnQsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnNvbWUoKGZuKSA9PiB7XG4gICAgICBpZiAoIWlzUHJvcGFnYXRpb25TdG9wcGVkKGV2ZW50KSAmJiBmbikge1xuICAgICAgICBmbihldmVudCwgLi4uYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkgY2hlY2tzIGlmIHRoZSBbRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUEkpXG4gKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkoKSB7XG4gIHJldHVybiBcInNob3dPcGVuRmlsZVBpY2tlclwiIGluIHdpbmRvdztcbn1cblxuLyoqXG4gKiBmaWxlUGlja2VyT3B0aW9uc1R5cGVzIHJldHVybnMgdGhlIHt0eXBlc30gb3B0aW9uIGZvciBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvd2luZG93L3Nob3dPcGVuRmlsZVBpY2tlclxuICogYmFzZWQgb24gdGhlIGFjY2VwdCBhdHRyIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWRyb3B6b25lL2F0dHItYWNjZXB0KVxuICogRS5nOiBjb252ZXJ0cyBbJ2ltYWdlLyonLCAndGV4dC8qJ10gdG8geydpbWFnZS8qJzogW10sICd0ZXh0LyonOiBbXX1cbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBhY2NlcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGVQaWNrZXJPcHRpb25zVHlwZXMoYWNjZXB0KSB7XG4gIGFjY2VwdCA9IHR5cGVvZiBhY2NlcHQgPT09IFwic3RyaW5nXCIgPyBhY2NlcHQuc3BsaXQoXCIsXCIpIDogYWNjZXB0O1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcImV2ZXJ5dGhpbmdcIixcbiAgICAgIC8vIFRPRE86IE5lZWQgdG8gaGFuZGxlIGZpbHRlcmluZyBtb3JlIGVsZWdhbnRseSB0aGFuIHRoaXMhXG4gICAgICBhY2NlcHQ6IEFycmF5LmlzQXJyYXkoYWNjZXB0KVxuICAgICAgICA/IC8vIEFjY2VwdCBqdXN0IE1JTUUgdHlwZXMgYXMgcGVyIHNwZWNcbiAgICAgICAgICAvLyBOT1RFOiBhY2NlcHQgY2FuIGJlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9maWxlI3VuaXF1ZV9maWxlX3R5cGVfc3BlY2lmaWVyc1xuICAgICAgICAgIGFjY2VwdFxuICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgKGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgaXRlbSA9PT0gXCJhdWRpby8qXCIgfHxcbiAgICAgICAgICAgICAgICBpdGVtID09PSBcInZpZGVvLypcIiB8fFxuICAgICAgICAgICAgICAgIGl0ZW0gPT09IFwiaW1hZ2UvKlwiIHx8XG4gICAgICAgICAgICAgICAgaXRlbSA9PT0gXCJ0ZXh0LypcIiB8fFxuICAgICAgICAgICAgICAgIC9cXHcrXFwvWy0rLlxcd10rL2cudGVzdChpdGVtKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gKHsgLi4uYSwgW2JdOiBbXSB9KSwge30pXG4gICAgICAgIDoge30sXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2IGlzIGFuIGV4Y2VwdGlvbiBjYXVzZWQgYnkgYWJvcnRpbmcgYSByZXF1ZXN0IChlLmcgd2luZG93LnNob3dPcGVuRmlsZVBpY2tlcigpKS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUV4Y2VwdGlvbi5cbiAqIEBwYXJhbSB7YW55fSB2XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2IGlzIGFuIGFib3J0IGV4Y2VwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnQodikge1xuICByZXR1cm4gKFxuICAgIHYgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiZcbiAgICAodi5uYW1lID09PSBcIkFib3J0RXJyb3JcIiB8fCB2LmNvZGUgPT09IHYuQUJPUlRfRVJSKVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHYgaXMgYSBzZWN1cml0eSBlcnJvci5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RPTUV4Y2VwdGlvbi5cbiAqIEBwYXJhbSB7YW55fSB2XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2IGlzIGEgc2VjdXJpdHkgZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlY3VyaXR5RXJyb3Iodikge1xuICByZXR1cm4gKFxuICAgIHYgaW5zdGFuY2VvZiBET01FeGNlcHRpb24gJiZcbiAgICAodi5uYW1lID09PSBcIlNlY3VyaXR5RXJyb3JcIiB8fCB2LmNvZGUgPT09IHYuU0VDVVJJVFlfRVJSKVxuICApO1xufVxuIiwiLyogZXNsaW50IHByZWZlci10ZW1wbGF0ZTogMCAqL1xuaW1wb3J0IFJlYWN0LCB7XG4gIGZvcndhcmRSZWYsXG4gIEZyYWdtZW50LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlLFxuICB1c2VNZW1vLFxuICB1c2VSZWR1Y2VyLFxuICB1c2VSZWYsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSBcImZpbGUtc2VsZWN0b3JcIjtcbmltcG9ydCB7XG4gIGFsbEZpbGVzQWNjZXB0ZWQsXG4gIGNvbXBvc2VFdmVudEhhbmRsZXJzLFxuICBmaWxlQWNjZXB0ZWQsXG4gIGZpbGVNYXRjaFNpemUsXG4gIGZpbGVQaWNrZXJPcHRpb25zVHlwZXMsXG4gIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEksXG4gIGlzQWJvcnQsXG4gIGlzRXZ0V2l0aEZpbGVzLFxuICBpc0llT3JFZGdlLFxuICBpc1Byb3BhZ2F0aW9uU3RvcHBlZCxcbiAgaXNTZWN1cml0eUVycm9yLFxuICBvbkRvY3VtZW50RHJhZ092ZXIsXG4gIFRPT19NQU5ZX0ZJTEVTX1JFSkVDVElPTixcbn0gZnJvbSBcIi4vdXRpbHMvaW5kZXhcIjtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSB3cmFwcGVyIGNvbXBvbmVudCBmb3IgdGhlIGB1c2VEcm9wem9uZWAgaG9va1xuICpcbiAqIGBgYGpzeFxuICogPERyb3B6b25lPlxuICogICB7KHtnZXRSb290UHJvcHMsIGdldElucHV0UHJvcHN9KSA9PiAoXG4gKiAgICAgPGRpdiB7Li4uZ2V0Um9vdFByb3BzKCl9PlxuICogICAgICAgPGlucHV0IHsuLi5nZXRJbnB1dFByb3BzKCl9IC8+XG4gKiAgICAgICA8cD5EcmFnICduJyBkcm9wIHNvbWUgZmlsZXMgaGVyZSwgb3IgY2xpY2sgdG8gc2VsZWN0IGZpbGVzPC9wPlxuICogICAgIDwvZGl2PlxuICogICApfVxuICogPC9Ecm9wem9uZT5cbiAqIGBgYFxuICovXG5jb25zdCBEcm9wem9uZSA9IGZvcndhcmRSZWYoKHsgY2hpbGRyZW4sIC4uLnBhcmFtcyB9LCByZWYpID0+IHtcbiAgY29uc3QgeyBvcGVuLCAuLi5wcm9wcyB9ID0gdXNlRHJvcHpvbmUocGFyYW1zKTtcblxuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHsgb3BlbiB9KSwgW29wZW5dKTtcblxuICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSByZWFjdC1zdHlsZWd1aWRpc3QgY2Fubm90IGNyZWF0ZSBkb2NzIGlmIHdlIGRvbid0IHJldHVybiBhIGpzeCBlbGVtZW50XG4gIHJldHVybiA8RnJhZ21lbnQ+e2NoaWxkcmVuKHsgLi4ucHJvcHMsIG9wZW4gfSl9PC9GcmFnbWVudD47XG59KTtcblxuRHJvcHpvbmUuZGlzcGxheU5hbWUgPSBcIkRyb3B6b25lXCI7XG5cbi8vIEFkZCBkZWZhdWx0IHByb3BzIGZvciByZWFjdC1kb2NnZW5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBnZXRGaWxlc0Zyb21FdmVudDogZnJvbUV2ZW50LFxuICBtYXhTaXplOiBJbmZpbml0eSxcbiAgbWluU2l6ZTogMCxcbiAgbXVsdGlwbGU6IHRydWUsXG4gIG1heEZpbGVzOiAwLFxuICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQ6IHRydWUsXG4gIG5vQ2xpY2s6IGZhbHNlLFxuICBub0tleWJvYXJkOiBmYWxzZSxcbiAgbm9EcmFnOiBmYWxzZSxcbiAgbm9EcmFnRXZlbnRzQnViYmxpbmc6IGZhbHNlLFxuICB2YWxpZGF0b3I6IG51bGwsXG4gIHVzZUZzQWNjZXNzQXBpOiB0cnVlLFxufTtcblxuRHJvcHpvbmUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5Ecm9wem9uZS5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBSZW5kZXIgZnVuY3Rpb24gdGhhdCBleHBvc2VzIHRoZSBkcm9wem9uZSBzdGF0ZSBhbmQgcHJvcCBnZXR0ZXIgZm5zXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLmdldFJvb3RQcm9wcyBSZXR1cm5zIHRoZSBwcm9wcyB5b3Ugc2hvdWxkIGFwcGx5IHRvIHRoZSByb290IGRyb3AgY29udGFpbmVyIHlvdSByZW5kZXJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLmdldElucHV0UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byBoaWRkZW4gZmlsZSBpbnB1dCB5b3UgcmVuZGVyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcmFtcy5vcGVuIE9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNGb2N1c2VkIERyb3B6b25lIGFyZWEgaXMgaW4gZm9jdXNcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNGaWxlRGlhbG9nQWN0aXZlIEZpbGUgZGlhbG9nIGlzIG9wZW5lZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5pc0RyYWdBY3RpdmUgQWN0aXZlIGRyYWcgaXMgaW4gcHJvZ3Jlc3NcbiAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMuaXNEcmFnQWNjZXB0IERyYWdnZWQgZmlsZXMgYXJlIGFjY2VwdGVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLmlzRHJhZ1JlamVjdCBTb21lIGRyYWdnZWQgZmlsZXMgYXJlIHJlamVjdGVkXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBwYXJhbXMuZHJhZ2dlZEZpbGVzIEZpbGVzIGluIGFjdGl2ZSBkcmFnXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBwYXJhbXMuYWNjZXB0ZWRGaWxlcyBBY2NlcHRlZCBmaWxlc1xuICAgKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gcGFyYW1zLmZpbGVSZWplY3Rpb25zIFJlamVjdGVkIGZpbGVzIGFuZCB3aHkgdGhleSB3ZXJlIHJlamVjdGVkXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFNldCBhY2NlcHRlZCBmaWxlIHR5cGVzLlxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29rb25ldC9hdHRyLWFjY2VwdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICogS2VlcCBpbiBtaW5kIHRoYXQgbWltZSB0eXBlIGRldGVybWluYXRpb24gaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBwbGF0Zm9ybXMuIENTViBmaWxlcyxcbiAgICogZm9yIGV4YW1wbGUsIGFyZSByZXBvcnRlZCBhcyB0ZXh0L3BsYWluIHVuZGVyIG1hY09TIGJ1dCBhcyBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgdW5kZXJcbiAgICogV2luZG93cy4gSW4gc29tZSBjYXNlcyB0aGVyZSBtaWdodCBub3QgYmUgYSBtaW1lIHR5cGUgc2V0IGF0IGFsbC5cbiAgICogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZHJvcHpvbmUvcmVhY3QtZHJvcHpvbmUvaXNzdWVzLzI3NlxuICAgKi9cbiAgYWNjZXB0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zdHJpbmcpLFxuICBdKSxcblxuICAvKipcbiAgICogQWxsb3cgZHJhZyAnbicgZHJvcCAob3Igc2VsZWN0aW9uIGZyb20gdGhlIGZpbGUgZGlhbG9nKSBvZiBtdWx0aXBsZSBmaWxlc1xuICAgKi9cbiAgbXVsdGlwbGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBmYWxzZSwgYWxsb3cgZHJvcHBlZCBpdGVtcyB0byB0YWtlIG92ZXIgdGhlIGN1cnJlbnQgYnJvd3NlciB3aW5kb3dcbiAgICovXG4gIHByZXZlbnREcm9wT25Eb2N1bWVudDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGRpc2FibGVzIGNsaWNrIHRvIG9wZW4gdGhlIG5hdGl2ZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2dcbiAgICovXG4gIG5vQ2xpY2s6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBkaXNhYmxlcyBTUEFDRS9FTlRFUiB0byBvcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nLlxuICAgKiBOb3RlIHRoYXQgaXQgYWxzbyBzdG9wcyB0cmFja2luZyB0aGUgZm9jdXMgc3RhdGUuXG4gICAqL1xuICBub0tleWJvYXJkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgZGlzYWJsZXMgZHJhZyAnbicgZHJvcFxuICAgKi9cbiAgbm9EcmFnOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgc3RvcHMgZHJhZyBldmVudCBwcm9wYWdhdGlvbiB0byBwYXJlbnRzXG4gICAqL1xuICBub0RyYWdFdmVudHNCdWJibGluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIE1pbmltdW0gZmlsZSBzaXplIChpbiBieXRlcylcbiAgICovXG4gIG1pblNpemU6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIE1heGltdW0gZmlsZSBzaXplIChpbiBieXRlcylcbiAgICovXG4gIG1heFNpemU6IFByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBNYXhpbXVtIGFjY2VwdGVkIG51bWJlciBvZiBmaWxlc1xuICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwIHdoaWNoIG1lYW5zIHRoZXJlIGlzIG5vIGxpbWl0YXRpb24gdG8gaG93IG1hbnkgZmlsZXMgYXJlIGFjY2VwdGVkLlxuICAgKi9cbiAgbWF4RmlsZXM6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIHRoZSBkcm9wem9uZVxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyB0byBwcm92aWRlIGEgY3VzdG9tIGZpbGUgYWdncmVnYXRvclxuICAgKlxuICAgKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gICAqL1xuICBnZXRGaWxlc0Zyb21FdmVudDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIGNsb3NpbmcgdGhlIGZpbGUgZGlhbG9nIHdpdGggbm8gc2VsZWN0aW9uXG4gICAqL1xuICBvbkZpbGVEaWFsb2dDYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiBvcGVuaW5nIHRoZSBmaWxlIGRpYWxvZ1xuICAgKi9cbiAgb25GaWxlRGlhbG9nT3BlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIHVzZSB0aGUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUElcbiAgICogdG8gb3BlbiB0aGUgZmlsZSBwaWNrZXIgaW5zdGVhZCBvZiB1c2luZyBhbiBgPGlucHV0IHR5cGU9XCJmaWxlXCI+YCBjbGljayBldmVudC5cbiAgICovXG4gIHVzZUZzQWNjZXNzQXBpOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcmFnZW50ZXJgIGV2ZW50IG9jY3Vycy5cbiAgICpcbiAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50XG4gICAqL1xuICBvbkRyYWdFbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJhZ2xlYXZlYCBldmVudCBvY2N1cnNcbiAgICpcbiAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50XG4gICAqL1xuICBvbkRyYWdMZWF2ZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENiIGZvciB3aGVuIHRoZSBgZHJhZ292ZXJgIGV2ZW50IG9jY3Vyc1xuICAgKlxuICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAgICovXG4gIG9uRHJhZ092ZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyb3BgIGV2ZW50IG9jY3Vycy5cbiAgICogTm90ZSB0aGF0IHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBhZnRlciB0aGUgYGdldEZpbGVzRnJvbUV2ZW50YCBjYWxsYmFjayBpcyBkb25lLlxuICAgKlxuICAgKiBGaWxlcyBhcmUgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQgYmFzZWQgb24gdGhlIGBhY2NlcHRgLCBgbXVsdGlwbGVgLCBgbWluU2l6ZWAgYW5kIGBtYXhTaXplYCBwcm9wcy5cbiAgICogYGFjY2VwdGAgbXVzdCBiZSBhIHZhbGlkIFtNSU1FIHR5cGVdKGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMueGh0bWwpIGFjY29yZGluZyB0byBbaW5wdXQgZWxlbWVudCBzcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy53My5vcmcvd2lraS9IVE1ML0VsZW1lbnRzL2lucHV0L2ZpbGUpIG9yIGEgdmFsaWQgZmlsZSBleHRlbnNpb24uXG4gICAqIElmIGBtdWx0aXBsZWAgaXMgc2V0IHRvIGZhbHNlIGFuZCBhZGRpdGlvbmFsIGZpbGVzIGFyZSBkcm9wcGVkLFxuICAgKiBhbGwgZmlsZXMgYmVzaWRlcyB0aGUgZmlyc3Qgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQW55IGZpbGUgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHNpemUgaW4gdGhlIFtgbWluU2l6ZWAsIGBtYXhTaXplYF0gcmFuZ2UsIHdpbGwgYmUgcmVqZWN0ZWQgYXMgd2VsbC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBgb25Ecm9wYCBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSBpbnZva2VkIHJlZ2FyZGxlc3MgaWYgdGhlIGRyb3BwZWQgZmlsZXMgd2VyZSBhY2NlcHRlZCBvciByZWplY3RlZC5cbiAgICogSWYgeW91J2QgbGlrZSB0byByZWFjdCB0byBhIHNwZWNpZmljIHNjZW5hcmlvLCB1c2UgdGhlIGBvbkRyb3BBY2NlcHRlZGAvYG9uRHJvcFJlamVjdGVkYCBwcm9wcy5cbiAgICpcbiAgICogYG9uRHJvcGAgd2lsbCBwcm92aWRlIHlvdSB3aXRoIGFuIGFycmF5IG9mIFtGaWxlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmlsZSkgb2JqZWN0cyB3aGljaCB5b3UgY2FuIHRoZW4gcHJvY2VzcyBhbmQgc2VuZCB0byBhIHNlcnZlci5cbiAgICogRm9yIGV4YW1wbGUsIHdpdGggW1N1cGVyQWdlbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS92aXNpb25tZWRpYS9zdXBlcmFnZW50KSBhcyBhIGh0dHAvYWpheCBsaWJyYXJ5OlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBmdW5jdGlvbiBvbkRyb3AoYWNjZXB0ZWRGaWxlcykge1xuICAgKiAgIGNvbnN0IHJlcSA9IHJlcXVlc3QucG9zdCgnL3VwbG9hZCcpXG4gICAqICAgYWNjZXB0ZWRGaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgKiAgICAgcmVxLmF0dGFjaChmaWxlLm5hbWUsIGZpbGUpXG4gICAqICAgfSlcbiAgICogICByZXEuZW5kKGNhbGxiYWNrKVxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge0ZpbGVbXX0gYWNjZXB0ZWRGaWxlc1xuICAgKiBAcGFyYW0ge0ZpbGVSZWplY3Rpb25bXX0gZmlsZVJlamVjdGlvbnNcbiAgICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICAgKi9cbiAgb25Ecm9wOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2IgZm9yIHdoZW4gdGhlIGBkcm9wYCBldmVudCBvY2N1cnMuXG4gICAqIE5vdGUgdGhhdCBpZiBubyBmaWxlcyBhcmUgYWNjZXB0ZWQsIHRoaXMgY2FsbGJhY2sgaXMgbm90IGludm9rZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RmlsZVtdfSBmaWxlc1xuICAgKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudFxuICAgKi9cbiAgb25Ecm9wQWNjZXB0ZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYiBmb3Igd2hlbiB0aGUgYGRyb3BgIGV2ZW50IG9jY3Vycy5cbiAgICogTm90ZSB0aGF0IGlmIG5vIGZpbGVzIGFyZSByZWplY3RlZCwgdGhpcyBjYWxsYmFjayBpcyBub3QgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtGaWxlUmVqZWN0aW9uW119IGZpbGVSZWplY3Rpb25zXG4gICAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50XG4gICAqL1xuICBvbkRyb3BSZWplY3RlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7RmlsZX0gZmlsZVxuICAgKiBAcmV0dXJucyB7RmlsZUVycm9yfEZpbGVFcnJvcltdfVxuICAgKi9cbiAgdmFsaWRhdG9yOiBQcm9wVHlwZXMuZnVuYyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IERyb3B6b25lO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGZvciB0aGUgYGRyYWdlbnRlcmAsXG4gKiBgZHJhZ292ZXJgIGFuZCBgZHJhZ2xlYXZlYCBldmVudHMuXG4gKiBJdCBpcyBub3QgaW52b2tlZCBpZiB0aGUgaXRlbXMgYXJlIG5vdCBmaWxlcyAoc3VjaCBhcyBsaW5rLCB0ZXh0LCBldGMuKS5cbiAqXG4gKiBAY2FsbGJhY2sgZHJhZ0NiXG4gKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnRcbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGZvciB0aGUgYGRyb3BgIG9yIGlucHV0IGNoYW5nZSBldmVudC5cbiAqIEl0IGlzIG5vdCBpbnZva2VkIGlmIHRoZSBpdGVtcyBhcmUgbm90IGZpbGVzIChzdWNoIGFzIGxpbmssIHRleHQsIGV0Yy4pLlxuICpcbiAqIEBjYWxsYmFjayBkcm9wQ2JcbiAqIEBwYXJhbSB7RmlsZVtdfSBhY2NlcHRlZEZpbGVzIExpc3Qgb2YgYWNjZXB0ZWQgZmlsZXNcbiAqIEBwYXJhbSB7RmlsZVJlamVjdGlvbltdfSBmaWxlUmVqZWN0aW9ucyBMaXN0IG9mIHJlamVjdGVkIGZpbGVzIGFuZCB3aHkgdGhleSB3ZXJlIHJlamVjdGVkXG4gKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gKi9cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBmb3IgdGhlIGBkcm9wYCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQuXG4gKiBJdCBpcyBub3QgaW52b2tlZCBpZiB0aGUgaXRlbXMgYXJlIGZpbGVzIChzdWNoIGFzIGxpbmssIHRleHQsIGV0Yy4pLlxuICpcbiAqIEBjYWxsYmFjayBkcm9wQWNjZXB0ZWRDYlxuICogQHBhcmFtIHtGaWxlW119IGZpbGVzIExpc3Qgb2YgYWNjZXB0ZWQgZmlsZXMgdGhhdCBtZWV0IHRoZSBnaXZlbiBjcml0ZXJpYVxuICogKGBhY2NlcHRgLCBgbXVsdGlwbGVgLCBgbWluU2l6ZWAsIGBtYXhTaXplYClcbiAqIEBwYXJhbSB7KERyYWdFdmVudHxFdmVudCl9IGV2ZW50IEEgZHJhZyBldmVudCBvciBpbnB1dCBjaGFuZ2UgZXZlbnQgKGlmIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIHRoZSBmaWxlIGRpYWxvZylcbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGZvciB0aGUgYGRyb3BgIG9yIGlucHV0IGNoYW5nZSBldmVudC5cbiAqXG4gKiBAY2FsbGJhY2sgZHJvcFJlamVjdGVkQ2JcbiAqIEBwYXJhbSB7RmlsZVtdfSBmaWxlcyBMaXN0IG9mIHJlamVjdGVkIGZpbGVzIHRoYXQgZG8gbm90IG1lZXQgdGhlIGdpdmVuIGNyaXRlcmlhXG4gKiAoYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCwgYG1heFNpemVgKVxuICogQHBhcmFtIHsoRHJhZ0V2ZW50fEV2ZW50KX0gZXZlbnQgQSBkcmFnIGV2ZW50IG9yIGlucHV0IGNoYW5nZSBldmVudCAoaWYgZmlsZXMgd2VyZSBzZWxlY3RlZCB2aWEgdGhlIGZpbGUgZGlhbG9nKVxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgYWdncmVnYXRlIGZpbGVzLFxuICogaW4gYSBhc3luY2hyb25vdXMgZmFzaGlvbiwgZnJvbSBkcmFnIG9yIGlucHV0IGNoYW5nZSBldmVudHMuXG4gKlxuICogQGNhbGxiYWNrIGdldEZpbGVzRnJvbUV2ZW50XG4gKiBAcGFyYW0geyhEcmFnRXZlbnR8RXZlbnQpfSBldmVudCBBIGRyYWcgZXZlbnQgb3IgaW5wdXQgY2hhbmdlIGV2ZW50IChpZiBmaWxlcyB3ZXJlIHNlbGVjdGVkIHZpYSB0aGUgZmlsZSBkaWFsb2cpXG4gKiBAcmV0dXJucyB7KEZpbGVbXXxQcm9taXNlPEZpbGVbXT4pfVxuICovXG5cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgZHJvcHpvbmUgc3RhdGUgYW5kIHNvbWUgaGVscGVyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEcm9wem9uZVN0YXRlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRSb290UHJvcHMgUmV0dXJucyB0aGUgcHJvcHMgeW91IHNob3VsZCBhcHBseSB0byB0aGUgcm9vdCBkcm9wIGNvbnRhaW5lciB5b3UgcmVuZGVyXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRJbnB1dFByb3BzIFJldHVybnMgdGhlIHByb3BzIHlvdSBzaG91bGQgYXBwbHkgdG8gaGlkZGVuIGZpbGUgaW5wdXQgeW91IHJlbmRlclxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gb3BlbiBPcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRm9jdXNlZCBEcm9wem9uZSBhcmVhIGlzIGluIGZvY3VzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRmlsZURpYWxvZ0FjdGl2ZSBGaWxlIGRpYWxvZyBpcyBvcGVuZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNEcmFnQWN0aXZlIEFjdGl2ZSBkcmFnIGlzIGluIHByb2dyZXNzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzRHJhZ0FjY2VwdCBEcmFnZ2VkIGZpbGVzIGFyZSBhY2NlcHRlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBpc0RyYWdSZWplY3QgU29tZSBkcmFnZ2VkIGZpbGVzIGFyZSByZWplY3RlZFxuICogQHByb3BlcnR5IHtGaWxlW119IGRyYWdnZWRGaWxlcyBGaWxlcyBpbiBhY3RpdmUgZHJhZ1xuICogQHByb3BlcnR5IHtGaWxlW119IGFjY2VwdGVkRmlsZXMgQWNjZXB0ZWQgZmlsZXNcbiAqIEBwcm9wZXJ0eSB7RmlsZVJlamVjdGlvbltdfSBmaWxlUmVqZWN0aW9ucyBSZWplY3RlZCBmaWxlcyBhbmQgd2h5IHRoZXkgd2VyZSByZWplY3RlZFxuICovXG5cbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgaXNGb2N1c2VkOiBmYWxzZSxcbiAgaXNGaWxlRGlhbG9nQWN0aXZlOiBmYWxzZSxcbiAgaXNEcmFnQWN0aXZlOiBmYWxzZSxcbiAgaXNEcmFnQWNjZXB0OiBmYWxzZSxcbiAgaXNEcmFnUmVqZWN0OiBmYWxzZSxcbiAgZHJhZ2dlZEZpbGVzOiBbXSxcbiAgYWNjZXB0ZWRGaWxlczogW10sXG4gIGZpbGVSZWplY3Rpb25zOiBbXSxcbn07XG5cbi8qKlxuICogQSBSZWFjdCBob29rIHRoYXQgY3JlYXRlcyBhIGRyYWcgJ24nIGRyb3AgYXJlYS5cbiAqXG4gKiBgYGBqc3hcbiAqIGZ1bmN0aW9uIE15RHJvcHpvbmUocHJvcHMpIHtcbiAqICAgY29uc3Qge2dldFJvb3RQcm9wcywgZ2V0SW5wdXRQcm9wc30gPSB1c2VEcm9wem9uZSh7XG4gKiAgICAgb25Ecm9wOiBhY2NlcHRlZEZpbGVzID0+IHtcbiAqICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBGaWxlIG9iamVjdHMsIGUuZy4gdXBsb2FkIHRvIHNvbWUgc2VydmVyXG4gKiAgICAgfVxuICogICB9KTtcbiAqICAgcmV0dXJuIChcbiAqICAgICA8ZGl2IHsuLi5nZXRSb290UHJvcHMoKX0+XG4gKiAgICAgICA8aW5wdXQgey4uLmdldElucHV0UHJvcHMoKX0gLz5cbiAqICAgICAgIDxwPkRyYWcgYW5kIGRyb3Agc29tZSBmaWxlcyBoZXJlLCBvciBjbGljayB0byBzZWxlY3QgZmlsZXM8L3A+XG4gKiAgICAgPC9kaXY+XG4gKiAgIClcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBmdW5jdGlvbiB1c2VEcm9wem9uZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFtwcm9wcy5hY2NlcHRdIFNldCBhY2NlcHRlZCBmaWxlIHR5cGVzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvYXR0ci1hY2NlcHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBLZWVwIGluIG1pbmQgdGhhdCBtaW1lIHR5cGUgZGV0ZXJtaW5hdGlvbiBpcyBub3QgcmVsaWFibGUgYWNyb3NzIHBsYXRmb3Jtcy4gQ1NWIGZpbGVzLFxuICogZm9yIGV4YW1wbGUsIGFyZSByZXBvcnRlZCBhcyB0ZXh0L3BsYWluIHVuZGVyIG1hY09TIGJ1dCBhcyBhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwgdW5kZXJcbiAqIFdpbmRvd3MuIEluIHNvbWUgY2FzZXMgdGhlcmUgbWlnaHQgbm90IGJlIGEgbWltZSB0eXBlIHNldCBhdCBhbGwuXG4gKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1kcm9wem9uZS9yZWFjdC1kcm9wem9uZS9pc3N1ZXMvMjc2XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5tdWx0aXBsZT10cnVlXSBBbGxvdyBkcmFnICduJyBkcm9wIChvciBzZWxlY3Rpb24gZnJvbSB0aGUgZmlsZSBkaWFsb2cpIG9mIG11bHRpcGxlIGZpbGVzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5wcmV2ZW50RHJvcE9uRG9jdW1lbnQ9dHJ1ZV0gSWYgZmFsc2UsIGFsbG93IGRyb3BwZWQgaXRlbXMgdG8gdGFrZSBvdmVyIHRoZSBjdXJyZW50IGJyb3dzZXIgd2luZG93XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0NsaWNrPWZhbHNlXSBJZiB0cnVlLCBkaXNhYmxlcyBjbGljayB0byBvcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0tleWJvYXJkPWZhbHNlXSBJZiB0cnVlLCBkaXNhYmxlcyBTUEFDRS9FTlRFUiB0byBvcGVuIHRoZSBuYXRpdmUgZmlsZSBzZWxlY3Rpb24gZGlhbG9nLlxuICogTm90ZSB0aGF0IGl0IGFsc28gc3RvcHMgdHJhY2tpbmcgdGhlIGZvY3VzIHN0YXRlLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMubm9EcmFnPWZhbHNlXSBJZiB0cnVlLCBkaXNhYmxlcyBkcmFnICduJyBkcm9wXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5ub0RyYWdFdmVudHNCdWJibGluZz1mYWxzZV0gSWYgdHJ1ZSwgc3RvcHMgZHJhZyBldmVudCBwcm9wYWdhdGlvbiB0byBwYXJlbnRzXG4gKiBAcGFyYW0ge251bWJlcn0gW3Byb3BzLm1pblNpemU9MF0gTWluaW11bSBmaWxlIHNpemUgKGluIGJ5dGVzKVxuICogQHBhcmFtIHtudW1iZXJ9IFtwcm9wcy5tYXhTaXplPUluZmluaXR5XSBNYXhpbXVtIGZpbGUgc2l6ZSAoaW4gYnl0ZXMpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5kaXNhYmxlZD1mYWxzZV0gRW5hYmxlL2Rpc2FibGUgdGhlIGRyb3B6b25lXG4gKiBAcGFyYW0ge2dldEZpbGVzRnJvbUV2ZW50fSBbcHJvcHMuZ2V0RmlsZXNGcm9tRXZlbnRdIFVzZSB0aGlzIHRvIHByb3ZpZGUgYSBjdXN0b20gZmlsZSBhZ2dyZWdhdG9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcHMub25GaWxlRGlhbG9nQ2FuY2VsXSBDYiBmb3Igd2hlbiBjbG9zaW5nIHRoZSBmaWxlIGRpYWxvZyB3aXRoIG5vIHNlbGVjdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMudXNlRnNBY2Nlc3NBcGldIFNldCB0byB0cnVlIHRvIHVzZSB0aGUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ZpbGVfU3lzdGVtX0FjY2Vzc19BUElcbiAqIHRvIG9wZW4gdGhlIGZpbGUgcGlja2VyIGluc3RlYWQgb2YgdXNpbmcgYW4gYDxpbnB1dCB0eXBlPVwiZmlsZVwiPmAgY2xpY2sgZXZlbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcHMub25GaWxlRGlhbG9nT3Blbl0gQ2IgZm9yIHdoZW4gb3BlbmluZyB0aGUgZmlsZSBkaWFsb2dcbiAqIEBwYXJhbSB7ZHJhZ0NifSBbcHJvcHMub25EcmFnRW50ZXJdIENiIGZvciB3aGVuIHRoZSBgZHJhZ2VudGVyYCBldmVudCBvY2N1cnMuXG4gKiBAcGFyYW0ge2RyYWdDYn0gW3Byb3BzLm9uRHJhZ0xlYXZlXSBDYiBmb3Igd2hlbiB0aGUgYGRyYWdsZWF2ZWAgZXZlbnQgb2NjdXJzXG4gKiBAcGFyYW0ge2RyYWdDYn0gW3Byb3BzLm9uRHJhZ092ZXJdIENiIGZvciB3aGVuIHRoZSBgZHJhZ292ZXJgIGV2ZW50IG9jY3Vyc1xuICogQHBhcmFtIHtkcm9wQ2J9IFtwcm9wcy5vbkRyb3BdIENiIGZvciB3aGVuIHRoZSBgZHJvcGAgZXZlbnQgb2NjdXJzLlxuICogTm90ZSB0aGF0IHRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBhZnRlciB0aGUgYGdldEZpbGVzRnJvbUV2ZW50YCBjYWxsYmFjayBpcyBkb25lLlxuICpcbiAqIEZpbGVzIGFyZSBhY2NlcHRlZCBvciByZWplY3RlZCBiYXNlZCBvbiB0aGUgYGFjY2VwdGAsIGBtdWx0aXBsZWAsIGBtaW5TaXplYCBhbmQgYG1heFNpemVgIHByb3BzLlxuICogYGFjY2VwdGAgbXVzdCBiZSBhIHZhbGlkIFtNSU1FIHR5cGVdKGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMvbWVkaWEtdHlwZXMueGh0bWwpIGFjY29yZGluZyB0byBbaW5wdXQgZWxlbWVudCBzcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy53My5vcmcvd2lraS9IVE1ML0VsZW1lbnRzL2lucHV0L2ZpbGUpIG9yIGEgdmFsaWQgZmlsZSBleHRlbnNpb24uXG4gKiBJZiBgbXVsdGlwbGVgIGlzIHNldCB0byBmYWxzZSBhbmQgYWRkaXRpb25hbCBmaWxlcyBhcmUgZHJvcHBlZCxcbiAqIGFsbCBmaWxlcyBiZXNpZGVzIHRoZSBmaXJzdCB3aWxsIGJlIHJlamVjdGVkLlxuICogQW55IGZpbGUgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHNpemUgaW4gdGhlIFtgbWluU2l6ZWAsIGBtYXhTaXplYF0gcmFuZ2UsIHdpbGwgYmUgcmVqZWN0ZWQgYXMgd2VsbC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGBvbkRyb3BgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGludm9rZWQgcmVnYXJkbGVzcyBpZiB0aGUgZHJvcHBlZCBmaWxlcyB3ZXJlIGFjY2VwdGVkIG9yIHJlamVjdGVkLlxuICogSWYgeW91J2QgbGlrZSB0byByZWFjdCB0byBhIHNwZWNpZmljIHNjZW5hcmlvLCB1c2UgdGhlIGBvbkRyb3BBY2NlcHRlZGAvYG9uRHJvcFJlamVjdGVkYCBwcm9wcy5cbiAqXG4gKiBgb25Ecm9wYCB3aWxsIHByb3ZpZGUgeW91IHdpdGggYW4gYXJyYXkgb2YgW0ZpbGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GaWxlKSBvYmplY3RzIHdoaWNoIHlvdSBjYW4gdGhlbiBwcm9jZXNzIGFuZCBzZW5kIHRvIGEgc2VydmVyLlxuICogRm9yIGV4YW1wbGUsIHdpdGggW1N1cGVyQWdlbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS92aXNpb25tZWRpYS9zdXBlcmFnZW50KSBhcyBhIGh0dHAvYWpheCBsaWJyYXJ5OlxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBvbkRyb3AoYWNjZXB0ZWRGaWxlcykge1xuICogICBjb25zdCByZXEgPSByZXF1ZXN0LnBvc3QoJy91cGxvYWQnKVxuICogICBhY2NlcHRlZEZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gKiAgICAgcmVxLmF0dGFjaChmaWxlLm5hbWUsIGZpbGUpXG4gKiAgIH0pXG4gKiAgIHJlcS5lbmQoY2FsbGJhY2spXG4gKiB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7ZHJvcEFjY2VwdGVkQ2J9IFtwcm9wcy5vbkRyb3BBY2NlcHRlZF1cbiAqIEBwYXJhbSB7ZHJvcFJlamVjdGVkQ2J9IFtwcm9wcy5vbkRyb3BSZWplY3RlZF1cbiAqXG4gKiBAcmV0dXJucyB7RHJvcHpvbmVTdGF0ZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURyb3B6b25lKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYWNjZXB0LFxuICAgIGRpc2FibGVkLFxuICAgIGdldEZpbGVzRnJvbUV2ZW50LFxuICAgIG1heFNpemUsXG4gICAgbWluU2l6ZSxcbiAgICBtdWx0aXBsZSxcbiAgICBtYXhGaWxlcyxcbiAgICBvbkRyYWdFbnRlcixcbiAgICBvbkRyYWdMZWF2ZSxcbiAgICBvbkRyYWdPdmVyLFxuICAgIG9uRHJvcCxcbiAgICBvbkRyb3BBY2NlcHRlZCxcbiAgICBvbkRyb3BSZWplY3RlZCxcbiAgICBvbkZpbGVEaWFsb2dDYW5jZWwsXG4gICAgb25GaWxlRGlhbG9nT3BlbixcbiAgICB1c2VGc0FjY2Vzc0FwaSxcbiAgICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQsXG4gICAgbm9DbGljayxcbiAgICBub0tleWJvYXJkLFxuICAgIG5vRHJhZyxcbiAgICBub0RyYWdFdmVudHNCdWJibGluZyxcbiAgICB2YWxpZGF0b3IsXG4gIH0gPSB7XG4gICAgLi4uZGVmYXVsdFByb3BzLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG5cbiAgY29uc3Qgb25GaWxlRGlhbG9nT3BlbkNiID0gdXNlTWVtbyhcbiAgICAoKSA9PiAodHlwZW9mIG9uRmlsZURpYWxvZ09wZW4gPT09IFwiZnVuY3Rpb25cIiA/IG9uRmlsZURpYWxvZ09wZW4gOiBub29wKSxcbiAgICBbb25GaWxlRGlhbG9nT3Blbl1cbiAgKTtcbiAgY29uc3Qgb25GaWxlRGlhbG9nQ2FuY2VsQ2IgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICB0eXBlb2Ygb25GaWxlRGlhbG9nQ2FuY2VsID09PSBcImZ1bmN0aW9uXCIgPyBvbkZpbGVEaWFsb2dDYW5jZWwgOiBub29wLFxuICAgIFtvbkZpbGVEaWFsb2dDYW5jZWxdXG4gICk7XG5cbiAgY29uc3Qgcm9vdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3QgW3N0YXRlLCBkaXNwYXRjaF0gPSB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSk7XG4gIGNvbnN0IHsgaXNGb2N1c2VkLCBpc0ZpbGVEaWFsb2dBY3RpdmUsIGRyYWdnZWRGaWxlcyB9ID0gc3RhdGU7XG5cbiAgY29uc3QgZnNBY2Nlc3NBcGlXb3Jrc1JlZiA9IHVzZVJlZihcbiAgICB3aW5kb3cuaXNTZWN1cmVDb250ZXh0ICYmIHVzZUZzQWNjZXNzQXBpICYmIGNhblVzZUZpbGVTeXN0ZW1BY2Nlc3NBUEkoKVxuICApO1xuXG4gIC8vIFVwZGF0ZSBmaWxlIGRpYWxvZyBhY3RpdmUgc3RhdGUgd2hlbiB0aGUgd2luZG93IGlzIGZvY3VzZWQgb25cbiAgY29uc3Qgb25XaW5kb3dGb2N1cyA9ICgpID0+IHtcbiAgICAvLyBFeGVjdXRlIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGZpbGUgZGlhbG9nIGlzIG9wZW5lZCBpbiB0aGUgYnJvd3NlclxuICAgIGlmICghZnNBY2Nlc3NBcGlXb3Jrc1JlZi5jdXJyZW50ICYmIGlzRmlsZURpYWxvZ0FjdGl2ZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgY29uc3QgeyBmaWxlcyB9ID0gaW5wdXRSZWYuY3VycmVudDtcblxuICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiY2xvc2VEaWFsb2dcIiB9KTtcbiAgICAgICAgICAgIG9uRmlsZURpYWxvZ0NhbmNlbENiKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAzMDApO1xuICAgIH1cbiAgfTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIG9uV2luZG93Rm9jdXMsIGZhbHNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBvbldpbmRvd0ZvY3VzLCBmYWxzZSk7XG4gICAgfTtcbiAgfSwgW2lucHV0UmVmLCBpc0ZpbGVEaWFsb2dBY3RpdmUsIG9uRmlsZURpYWxvZ0NhbmNlbENiLCBmc0FjY2Vzc0FwaVdvcmtzUmVmXSk7XG5cbiAgY29uc3QgZHJhZ1RhcmdldHNSZWYgPSB1c2VSZWYoW10pO1xuICBjb25zdCBvbkRvY3VtZW50RHJvcCA9IChldmVudCkgPT4ge1xuICAgIGlmIChyb290UmVmLmN1cnJlbnQgJiYgcm9vdFJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIC8vIElmIHdlIGludGVyY2VwdGVkIGFuIGV2ZW50IGZvciBvdXIgaW5zdGFuY2UsIGxldCBpdCBwcm9wYWdhdGUgZG93biB0byB0aGUgaW5zdGFuY2UncyBvbkRyb3AgaGFuZGxlclxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGRyYWdUYXJnZXRzUmVmLmN1cnJlbnQgPSBbXTtcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChwcmV2ZW50RHJvcE9uRG9jdW1lbnQpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCBvbkRvY3VtZW50RHJhZ092ZXIsIGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJkcm9wXCIsIG9uRG9jdW1lbnREcm9wLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChwcmV2ZW50RHJvcE9uRG9jdW1lbnQpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIG9uRG9jdW1lbnREcmFnT3Zlcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkcm9wXCIsIG9uRG9jdW1lbnREcm9wKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbcm9vdFJlZiwgcHJldmVudERyb3BPbkRvY3VtZW50XSk7XG5cbiAgY29uc3Qgb25EcmFnRW50ZXJDYiA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIFBlcnNpc3QgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdGhlIGV2ZW50IGxhdGVyIGFmdGVyIGdldEZpbGVzRnJvbUV2ZW50KCkgaXMgZG9uZVxuICAgICAgZXZlbnQucGVyc2lzdCgpO1xuICAgICAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50KTtcblxuICAgICAgZHJhZ1RhcmdldHNSZWYuY3VycmVudCA9IFsuLi5kcmFnVGFyZ2V0c1JlZi5jdXJyZW50LCBldmVudC50YXJnZXRdO1xuXG4gICAgICBpZiAoaXNFdnRXaXRoRmlsZXMoZXZlbnQpKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShnZXRGaWxlc0Zyb21FdmVudChldmVudCkpLnRoZW4oKGRyYWdnZWRGaWxlcykgPT4ge1xuICAgICAgICAgIGlmIChpc1Byb3BhZ2F0aW9uU3RvcHBlZChldmVudCkgJiYgIW5vRHJhZ0V2ZW50c0J1YmJsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgZHJhZ2dlZEZpbGVzLFxuICAgICAgICAgICAgaXNEcmFnQWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogXCJzZXREcmFnZ2VkRmlsZXNcIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChvbkRyYWdFbnRlcikge1xuICAgICAgICAgICAgb25EcmFnRW50ZXIoZXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZ2V0RmlsZXNGcm9tRXZlbnQsIG9uRHJhZ0VudGVyLCBub0RyYWdFdmVudHNCdWJibGluZ11cbiAgKTtcblxuICBjb25zdCBvbkRyYWdPdmVyQ2IgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5wZXJzaXN0KCk7XG4gICAgICBzdG9wUHJvcGFnYXRpb24oZXZlbnQpO1xuXG4gICAgICBjb25zdCBoYXNGaWxlcyA9IGlzRXZ0V2l0aEZpbGVzKGV2ZW50KTtcbiAgICAgIGlmIChoYXNGaWxlcyAmJiBldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwiY29weVwiO1xuICAgICAgICB9IGNhdGNoIHt9IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHkgKi9cbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0ZpbGVzICYmIG9uRHJhZ092ZXIpIHtcbiAgICAgICAgb25EcmFnT3ZlcihldmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIFtvbkRyYWdPdmVyLCBub0RyYWdFdmVudHNCdWJibGluZ11cbiAgKTtcblxuICBjb25zdCBvbkRyYWdMZWF2ZUNiID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQucGVyc2lzdCgpO1xuICAgICAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50KTtcblxuICAgICAgLy8gT25seSBkZWFjdGl2YXRlIG9uY2UgdGhlIGRyb3B6b25lIGFuZCBhbGwgY2hpbGRyZW4gaGF2ZSBiZWVuIGxlZnRcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBkcmFnVGFyZ2V0c1JlZi5jdXJyZW50LmZpbHRlcihcbiAgICAgICAgKHRhcmdldCkgPT4gcm9vdFJlZi5jdXJyZW50ICYmIHJvb3RSZWYuY3VycmVudC5jb250YWlucyh0YXJnZXQpXG4gICAgICApO1xuICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlbW92ZSBhIHRhcmdldCBwcmVzZW50IG11bHRpcGxlIHRpbWVzIG9ubHkgb25jZVxuICAgICAgLy8gKEZpcmVmb3ggbWF5IGZpcmUgZHJhZ2VudGVyL2RyYWdsZWF2ZSBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBlbGVtZW50KVxuICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gdGFyZ2V0cy5pbmRleE9mKGV2ZW50LnRhcmdldCk7XG4gICAgICBpZiAodGFyZ2V0SWR4ICE9PSAtMSkge1xuICAgICAgICB0YXJnZXRzLnNwbGljZSh0YXJnZXRJZHgsIDEpO1xuICAgICAgfVxuICAgICAgZHJhZ1RhcmdldHNSZWYuY3VycmVudCA9IHRhcmdldHM7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICBpc0RyYWdBY3RpdmU6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNldERyYWdnZWRGaWxlc1wiLFxuICAgICAgICBkcmFnZ2VkRmlsZXM6IFtdLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0V2dFdpdGhGaWxlcyhldmVudCkgJiYgb25EcmFnTGVhdmUpIHtcbiAgICAgICAgb25EcmFnTGVhdmUoZXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3Jvb3RSZWYsIG9uRHJhZ0xlYXZlLCBub0RyYWdFdmVudHNCdWJibGluZ11cbiAgKTtcblxuICBjb25zdCBzZXRGaWxlcyA9IHVzZUNhbGxiYWNrKFxuICAgIChmaWxlcywgZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGFjY2VwdGVkRmlsZXMgPSBbXTtcbiAgICAgIGNvbnN0IGZpbGVSZWplY3Rpb25zID0gW107XG5cbiAgICAgIGZpbGVzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgW2FjY2VwdGVkLCBhY2NlcHRFcnJvcl0gPSBmaWxlQWNjZXB0ZWQoZmlsZSwgYWNjZXB0KTtcbiAgICAgICAgY29uc3QgW3NpemVNYXRjaCwgc2l6ZUVycm9yXSA9IGZpbGVNYXRjaFNpemUoZmlsZSwgbWluU2l6ZSwgbWF4U2l6ZSk7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVycm9ycyA9IHZhbGlkYXRvciA/IHZhbGlkYXRvcihmaWxlKSA6IG51bGw7XG5cbiAgICAgICAgaWYgKGFjY2VwdGVkICYmIHNpemVNYXRjaCAmJiAhY3VzdG9tRXJyb3JzKSB7XG4gICAgICAgICAgYWNjZXB0ZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBlcnJvcnMgPSBbYWNjZXB0RXJyb3IsIHNpemVFcnJvcl07XG5cbiAgICAgICAgICBpZiAoY3VzdG9tRXJyb3JzKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KGN1c3RvbUVycm9ycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmlsZVJlamVjdGlvbnMucHVzaCh7IGZpbGUsIGVycm9yczogZXJyb3JzLmZpbHRlcigoZSkgPT4gZSkgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXG4gICAgICAgICghbXVsdGlwbGUgJiYgYWNjZXB0ZWRGaWxlcy5sZW5ndGggPiAxKSB8fFxuICAgICAgICAobXVsdGlwbGUgJiYgbWF4RmlsZXMgPj0gMSAmJiBhY2NlcHRlZEZpbGVzLmxlbmd0aCA+IG1heEZpbGVzKVxuICAgICAgKSB7XG4gICAgICAgIC8vIFJlamVjdCBldmVyeXRoaW5nIGFuZCBlbXB0eSBhY2NlcHRlZCBmaWxlc1xuICAgICAgICBhY2NlcHRlZEZpbGVzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICBmaWxlUmVqZWN0aW9ucy5wdXNoKHsgZmlsZSwgZXJyb3JzOiBbVE9PX01BTllfRklMRVNfUkVKRUNUSU9OXSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFjY2VwdGVkRmlsZXMuc3BsaWNlKDApO1xuICAgICAgfVxuXG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIGFjY2VwdGVkRmlsZXMsXG4gICAgICAgIGZpbGVSZWplY3Rpb25zLFxuICAgICAgICB0eXBlOiBcInNldEZpbGVzXCIsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9uRHJvcCkge1xuICAgICAgICBvbkRyb3AoYWNjZXB0ZWRGaWxlcywgZmlsZVJlamVjdGlvbnMsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVSZWplY3Rpb25zLmxlbmd0aCA+IDAgJiYgb25Ecm9wUmVqZWN0ZWQpIHtcbiAgICAgICAgb25Ecm9wUmVqZWN0ZWQoZmlsZVJlamVjdGlvbnMsIGV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjY2VwdGVkRmlsZXMubGVuZ3RoID4gMCAmJiBvbkRyb3BBY2NlcHRlZCkge1xuICAgICAgICBvbkRyb3BBY2NlcHRlZChhY2NlcHRlZEZpbGVzLCBldmVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBkaXNwYXRjaCxcbiAgICAgIG11bHRpcGxlLFxuICAgICAgYWNjZXB0LFxuICAgICAgbWluU2l6ZSxcbiAgICAgIG1heFNpemUsXG4gICAgICBtYXhGaWxlcyxcbiAgICAgIG9uRHJvcCxcbiAgICAgIG9uRHJvcEFjY2VwdGVkLFxuICAgICAgb25Ecm9wUmVqZWN0ZWQsXG4gICAgICB2YWxpZGF0b3IsXG4gICAgXVxuICApO1xuXG4gIGNvbnN0IG9uRHJvcENiID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gUGVyc2lzdCBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0aGUgZXZlbnQgbGF0ZXIgYWZ0ZXIgZ2V0RmlsZXNGcm9tRXZlbnQoKSBpcyBkb25lXG4gICAgICBldmVudC5wZXJzaXN0KCk7XG4gICAgICBzdG9wUHJvcGFnYXRpb24oZXZlbnQpO1xuXG4gICAgICBkcmFnVGFyZ2V0c1JlZi5jdXJyZW50ID0gW107XG5cbiAgICAgIGlmIChpc0V2dFdpdGhGaWxlcyhldmVudCkpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGdldEZpbGVzRnJvbUV2ZW50KGV2ZW50KSkudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICBpZiAoaXNQcm9wYWdhdGlvblN0b3BwZWQoZXZlbnQpICYmICFub0RyYWdFdmVudHNCdWJibGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRGaWxlcyhmaWxlcywgZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJyZXNldFwiIH0pO1xuICAgIH0sXG4gICAgW2dldEZpbGVzRnJvbUV2ZW50LCBzZXRGaWxlcywgbm9EcmFnRXZlbnRzQnViYmxpbmddXG4gICk7XG5cbiAgLy8gRm4gZm9yIG9wZW5pbmcgdGhlIGZpbGUgZGlhbG9nIHByb2dyYW1tYXRpY2FsbHlcbiAgY29uc3Qgb3BlbkZpbGVEaWFsb2cgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gTm8gcG9pbnQgdG8gdXNlIEZTIGFjY2VzcyBBUElzIGlmIGNvbnRleHQgaXMgbm90IHNlY3VyZVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NlY3VyaXR5L1NlY3VyZV9Db250ZXh0cyNmZWF0dXJlX2RldGVjdGlvblxuICAgIGlmIChmc0FjY2Vzc0FwaVdvcmtzUmVmLmN1cnJlbnQpIHtcbiAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJvcGVuRGlhbG9nXCIgfSk7XG4gICAgICBvbkZpbGVEaWFsb2dPcGVuQ2IoKTtcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS93aW5kb3cvc2hvd09wZW5GaWxlUGlja2VyXG4gICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICBtdWx0aXBsZSxcbiAgICAgICAgdHlwZXM6IGZpbGVQaWNrZXJPcHRpb25zVHlwZXMoYWNjZXB0KSxcbiAgICAgIH07XG4gICAgICB3aW5kb3dcbiAgICAgICAgLnNob3dPcGVuRmlsZVBpY2tlcihvcHRzKVxuICAgICAgICAudGhlbigoaGFuZGxlcykgPT4gZ2V0RmlsZXNGcm9tRXZlbnQoaGFuZGxlcykpXG4gICAgICAgIC50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgIHNldEZpbGVzKGZpbGVzLCBudWxsKTtcbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6IFwiY2xvc2VEaWFsb2dcIiB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgLy8gQWJvcnRFcnJvciBtZWFucyB0aGUgdXNlciBjYW5jZWxlZFxuICAgICAgICAgIGlmIChpc0Fib3J0KGUpKSB7XG4gICAgICAgICAgICBvbkZpbGVEaWFsb2dDYW5jZWxDYihlKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogXCJjbG9zZURpYWxvZ1wiIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNTZWN1cml0eUVycm9yKGUpKSB7XG4gICAgICAgICAgICBmc0FjY2Vzc0FwaVdvcmtzUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIENPUlMsIHNvIGNhbm5vdCB1c2UgdGhpcyBBUElcbiAgICAgICAgICAgIC8vIFRyeSB1c2luZyB0aGUgaW5wdXRcbiAgICAgICAgICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgIGlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICBpbnB1dFJlZi5jdXJyZW50LmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiBcIm9wZW5EaWFsb2dcIiB9KTtcbiAgICAgIG9uRmlsZURpYWxvZ09wZW5DYigpO1xuICAgICAgaW5wdXRSZWYuY3VycmVudC52YWx1ZSA9IG51bGw7XG4gICAgICBpbnB1dFJlZi5jdXJyZW50LmNsaWNrKCk7XG4gICAgfVxuICB9LCBbXG4gICAgZGlzcGF0Y2gsXG4gICAgb25GaWxlRGlhbG9nT3BlbkNiLFxuICAgIG9uRmlsZURpYWxvZ0NhbmNlbENiLFxuICAgIHVzZUZzQWNjZXNzQXBpLFxuICAgIHNldEZpbGVzLFxuICAgIGFjY2VwdCxcbiAgICBtdWx0aXBsZSxcbiAgXSk7XG5cbiAgLy8gQ2IgdG8gb3BlbiB0aGUgZmlsZSBkaWFsb2cgd2hlbiBTUEFDRS9FTlRFUiBvY2N1cnMgb24gdGhlIGRyb3B6b25lXG4gIGNvbnN0IG9uS2V5RG93bkNiID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICAvLyBJZ25vcmUga2V5Ym9hcmQgZXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBET00gdHJlZVxuICAgICAgaWYgKCFyb290UmVmLmN1cnJlbnQgfHwgIXJvb3RSZWYuY3VycmVudC5pc0VxdWFsTm9kZShldmVudC50YXJnZXQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDMyIHx8IGV2ZW50LmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG9wZW5GaWxlRGlhbG9nKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbcm9vdFJlZiwgb3BlbkZpbGVEaWFsb2ddXG4gICk7XG5cbiAgLy8gVXBkYXRlIGZvY3VzIHN0YXRlIGZvciB0aGUgZHJvcHpvbmVcbiAgY29uc3Qgb25Gb2N1c0NiID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJmb2N1c1wiIH0pO1xuICB9LCBbXSk7XG4gIGNvbnN0IG9uQmx1ckNiID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGRpc3BhdGNoKHsgdHlwZTogXCJibHVyXCIgfSk7XG4gIH0sIFtdKTtcblxuICAvLyBDYiB0byBvcGVuIHRoZSBmaWxlIGRpYWxvZyB3aGVuIGNsaWNrIG9jY3VycyBvbiB0aGUgZHJvcHpvbmVcbiAgY29uc3Qgb25DbGlja0NiID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChub0NsaWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW4gSUUxMS9FZGdlIHRoZSBmaWxlLWJyb3dzZXIgZGlhbG9nIGlzIGJsb2NraW5nLCB0aGVyZWZvcmUsIHVzZSBzZXRUaW1lb3V0KClcbiAgICAvLyB0byBlbnN1cmUgUmVhY3QgY2FuIGhhbmRsZSBzdGF0ZSBjaGFuZ2VzXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3QtZHJvcHpvbmUvcmVhY3QtZHJvcHpvbmUvaXNzdWVzLzQ1MFxuICAgIGlmIChpc0llT3JFZGdlKCkpIHtcbiAgICAgIHNldFRpbWVvdXQob3BlbkZpbGVEaWFsb2csIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcGVuRmlsZURpYWxvZygpO1xuICAgIH1cbiAgfSwgW25vQ2xpY2ssIG9wZW5GaWxlRGlhbG9nXSk7XG5cbiAgY29uc3QgY29tcG9zZUhhbmRsZXIgPSAoZm4pID0+IHtcbiAgICByZXR1cm4gZGlzYWJsZWQgPyBudWxsIDogZm47XG4gIH07XG5cbiAgY29uc3QgY29tcG9zZUtleWJvYXJkSGFuZGxlciA9IChmbikgPT4ge1xuICAgIHJldHVybiBub0tleWJvYXJkID8gbnVsbCA6IGNvbXBvc2VIYW5kbGVyKGZuKTtcbiAgfTtcblxuICBjb25zdCBjb21wb3NlRHJhZ0hhbmRsZXIgPSAoZm4pID0+IHtcbiAgICByZXR1cm4gbm9EcmFnID8gbnVsbCA6IGNvbXBvc2VIYW5kbGVyKGZuKTtcbiAgfTtcblxuICBjb25zdCBzdG9wUHJvcGFnYXRpb24gPSAoZXZlbnQpID0+IHtcbiAgICBpZiAobm9EcmFnRXZlbnRzQnViYmxpbmcpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXRSb290UHJvcHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICAoe1xuICAgICAgICByZWZLZXkgPSBcInJlZlwiLFxuICAgICAgICByb2xlLFxuICAgICAgICBvbktleURvd24sXG4gICAgICAgIG9uRm9jdXMsXG4gICAgICAgIG9uQmx1cixcbiAgICAgICAgb25DbGljayxcbiAgICAgICAgb25EcmFnRW50ZXIsXG4gICAgICAgIG9uRHJhZ092ZXIsXG4gICAgICAgIG9uRHJhZ0xlYXZlLFxuICAgICAgICBvbkRyb3AsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSB7fSkgPT4gKHtcbiAgICAgICAgb25LZXlEb3duOiBjb21wb3NlS2V5Ym9hcmRIYW5kbGVyKFxuICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uS2V5RG93biwgb25LZXlEb3duQ2IpXG4gICAgICAgICksXG4gICAgICAgIG9uRm9jdXM6IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIoXG4gICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25Gb2N1cywgb25Gb2N1c0NiKVxuICAgICAgICApLFxuICAgICAgICBvbkJsdXI6IGNvbXBvc2VLZXlib2FyZEhhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25CbHVyLCBvbkJsdXJDYikpLFxuICAgICAgICBvbkNsaWNrOiBjb21wb3NlSGFuZGxlcihjb21wb3NlRXZlbnRIYW5kbGVycyhvbkNsaWNrLCBvbkNsaWNrQ2IpKSxcbiAgICAgICAgb25EcmFnRW50ZXI6IGNvbXBvc2VEcmFnSGFuZGxlcihcbiAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkRyYWdFbnRlciwgb25EcmFnRW50ZXJDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25EcmFnT3ZlcjogY29tcG9zZURyYWdIYW5kbGVyKFxuICAgICAgICAgIGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uRHJhZ092ZXIsIG9uRHJhZ092ZXJDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25EcmFnTGVhdmU6IGNvbXBvc2VEcmFnSGFuZGxlcihcbiAgICAgICAgICBjb21wb3NlRXZlbnRIYW5kbGVycyhvbkRyYWdMZWF2ZSwgb25EcmFnTGVhdmVDYilcbiAgICAgICAgKSxcbiAgICAgICAgb25Ecm9wOiBjb21wb3NlRHJhZ0hhbmRsZXIoY29tcG9zZUV2ZW50SGFuZGxlcnMob25Ecm9wLCBvbkRyb3BDYikpLFxuICAgICAgICByb2xlOiB0eXBlb2Ygcm9sZSA9PT0gXCJzdHJpbmdcIiAmJiByb2xlICE9PSBcIlwiID8gcm9sZSA6IFwiYnV0dG9uXCIsXG4gICAgICAgIFtyZWZLZXldOiByb290UmVmLFxuICAgICAgICAuLi4oIWRpc2FibGVkICYmICFub0tleWJvYXJkID8geyB0YWJJbmRleDogMCB9IDoge30pLFxuICAgICAgICAuLi5yZXN0LFxuICAgICAgfSksXG4gICAgW1xuICAgICAgcm9vdFJlZixcbiAgICAgIG9uS2V5RG93bkNiLFxuICAgICAgb25Gb2N1c0NiLFxuICAgICAgb25CbHVyQ2IsXG4gICAgICBvbkNsaWNrQ2IsXG4gICAgICBvbkRyYWdFbnRlckNiLFxuICAgICAgb25EcmFnT3ZlckNiLFxuICAgICAgb25EcmFnTGVhdmVDYixcbiAgICAgIG9uRHJvcENiLFxuICAgICAgbm9LZXlib2FyZCxcbiAgICAgIG5vRHJhZyxcbiAgICAgIGRpc2FibGVkLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBvbklucHV0RWxlbWVudENsaWNrID0gdXNlQ2FsbGJhY2soKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBnZXRJbnB1dFByb3BzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgKHsgcmVmS2V5ID0gXCJyZWZcIiwgb25DaGFuZ2UsIG9uQ2xpY2ssIC4uLnJlc3QgfSA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0UHJvcHMgPSB7XG4gICAgICAgICAgYWNjZXB0LFxuICAgICAgICAgIG11bHRpcGxlLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6IFwibm9uZVwiIH0sXG4gICAgICAgICAgb25DaGFuZ2U6IGNvbXBvc2VIYW5kbGVyKGNvbXBvc2VFdmVudEhhbmRsZXJzKG9uQ2hhbmdlLCBvbkRyb3BDYikpLFxuICAgICAgICAgIG9uQ2xpY2s6IGNvbXBvc2VIYW5kbGVyKFxuICAgICAgICAgICAgY29tcG9zZUV2ZW50SGFuZGxlcnMob25DbGljaywgb25JbnB1dEVsZW1lbnRDbGljaylcbiAgICAgICAgICApLFxuICAgICAgICAgIGF1dG9Db21wbGV0ZTogXCJvZmZcIixcbiAgICAgICAgICB0YWJJbmRleDogLTEsXG4gICAgICAgICAgW3JlZktleV06IGlucHV0UmVmLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICAuLi5yZXN0LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICBbaW5wdXRSZWYsIGFjY2VwdCwgbXVsdGlwbGUsIG9uRHJvcENiLCBkaXNhYmxlZF1cbiAgKTtcblxuICBjb25zdCBmaWxlQ291bnQgPSBkcmFnZ2VkRmlsZXMubGVuZ3RoO1xuICBjb25zdCBpc0RyYWdBY2NlcHQgPVxuICAgIGZpbGVDb3VudCA+IDAgJiZcbiAgICBhbGxGaWxlc0FjY2VwdGVkKHtcbiAgICAgIGZpbGVzOiBkcmFnZ2VkRmlsZXMsXG4gICAgICBhY2NlcHQsXG4gICAgICBtaW5TaXplLFxuICAgICAgbWF4U2l6ZSxcbiAgICAgIG11bHRpcGxlLFxuICAgICAgbWF4RmlsZXMsXG4gICAgfSk7XG4gIGNvbnN0IGlzRHJhZ1JlamVjdCA9IGZpbGVDb3VudCA+IDAgJiYgIWlzRHJhZ0FjY2VwdDtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGlzRHJhZ0FjY2VwdCxcbiAgICBpc0RyYWdSZWplY3QsXG4gICAgaXNGb2N1c2VkOiBpc0ZvY3VzZWQgJiYgIWRpc2FibGVkLFxuICAgIGdldFJvb3RQcm9wcyxcbiAgICBnZXRJbnB1dFByb3BzLFxuICAgIHJvb3RSZWYsXG4gICAgaW5wdXRSZWYsXG4gICAgb3BlbjogY29tcG9zZUhhbmRsZXIob3BlbkZpbGVEaWFsb2cpLFxuICB9O1xufVxuXG5mdW5jdGlvbiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgXCJmb2N1c1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzRm9jdXNlZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgY2FzZSBcImJsdXJcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpc0ZvY3VzZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICBjYXNlIFwib3BlbkRpYWxvZ1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5pdGlhbFN0YXRlLFxuICAgICAgICBpc0ZpbGVEaWFsb2dBY3RpdmU6IHRydWUsXG4gICAgICB9O1xuICAgIGNhc2UgXCJjbG9zZURpYWxvZ1wiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGlzRmlsZURpYWxvZ0FjdGl2ZTogZmFsc2UsXG4gICAgICB9O1xuICAgIGNhc2UgXCJzZXREcmFnZ2VkRmlsZXNcIjpcbiAgICAgIC8qIGVzbGludCBuby1jYXNlLWRlY2xhcmF0aW9uczogMCAqL1xuICAgICAgY29uc3QgeyBpc0RyYWdBY3RpdmUsIGRyYWdnZWRGaWxlcyB9ID0gYWN0aW9uO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGRyYWdnZWRGaWxlcyxcbiAgICAgICAgaXNEcmFnQWN0aXZlLFxuICAgICAgfTtcbiAgICBjYXNlIFwic2V0RmlsZXNcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBhY2NlcHRlZEZpbGVzOiBhY3Rpb24uYWNjZXB0ZWRGaWxlcyxcbiAgICAgICAgZmlsZVJlamVjdGlvbnM6IGFjdGlvbi5maWxlUmVqZWN0aW9ucyxcbiAgICAgIH07XG4gICAgY2FzZSBcInJlc2V0XCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbml0aWFsU3RhdGUsXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmV4cG9ydCB7IEVycm9yQ29kZSB9IGZyb20gXCIuL3V0aWxzXCI7XG4iXSwibmFtZXMiOlsiX19hd2FpdGVyIiwidGhpc0FyZyIsIl9hcmd1bWVudHMiLCJQIiwiZ2VuZXJhdG9yIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJ2YWx1ZSIsInN0ZXAiLCJuZXh0IiwiZSIsInJlamVjdGVkIiwicmVzdWx0IiwiZG9uZSIsInRoZW4iLCJhcHBseSIsIl9fZ2VuZXJhdG9yIiwiYm9keSIsImYiLCJ5IiwidCIsImciLCJfIiwibGFiZWwiLCJzZW50IiwidHJ5cyIsIm9wcyIsInZlcmIiLCJ0aHJvdyIsInJldHVybiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwidGhpcyIsIm4iLCJ2Iiwib3AiLCJUeXBlRXJyb3IiLCJjYWxsIiwicG9wIiwibGVuZ3RoIiwicHVzaCIsIl9fcmVhZCIsIm8iLCJtIiwiciIsImkiLCJhciIsImVycm9yIiwiQ09NTU9OX01JTUVfVFlQRVMiLCJNYXAiLCJ0b0ZpbGVXaXRoUGF0aCIsImZpbGUiLCJwYXRoIiwibmFtZSIsImxhc3RJbmRleE9mIiwidHlwZSIsImV4dCIsInNwbGl0IiwidG9Mb3dlckNhc2UiLCJnZXQiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsIndpdGhNaW1lVHlwZSIsIndlYmtpdFJlbGF0aXZlUGF0aCIsIkZJTEVTX1RPX0lHTk9SRSIsImlzT2JqZWN0IiwiZ2V0SW5wdXRGaWxlcyIsImV2dCIsImZyb21MaXN0IiwidGFyZ2V0IiwiZmlsZXMiLCJtYXAiLCJnZXRGc0hhbmRsZUZpbGVzIiwiaGFuZGxlcyIsIl9hIiwiYWxsIiwiaCIsImdldEZpbGUiLCJnZXREYXRhVHJhbnNmZXJGaWxlcyIsImR0IiwiaXRlbXMiLCJmaWx0ZXIiLCJpdGVtIiwia2luZCIsInRvRmlsZVByb21pc2VzIiwibm9JZ25vcmVkRmlsZXMiLCJmbGF0dGVuIiwiaW5kZXhPZiIsIndlYmtpdEdldEFzRW50cnkiLCJmcm9tRGF0YVRyYW5zZmVySXRlbSIsImVudHJ5IiwiaXNEaXJlY3RvcnkiLCJmcm9tRGlyRW50cnkiLCJyZWR1Y2UiLCJhY2MiLCJhcmd1bWVudHMiLCJjb25jYXQiLCJfX3NwcmVhZCIsIkFycmF5IiwiaXNBcnJheSIsImdldEFzRmlsZSIsImZ3cCIsImZyb21FbnRyeSIsImZyb21GaWxlRW50cnkiLCJyZWFkZXIiLCJjcmVhdGVSZWFkZXIiLCJlbnRyaWVzIiwicmVhZEVudHJpZXMiLCJfdGhpcyIsImJhdGNoIiwiZXJyXzEiLCJlcnIiLCJmdWxsUGF0aCIsIkZJTEVfSU5WQUxJRF9UWVBFIiwiRklMRV9UT09fTEFSR0UiLCJGSUxFX1RPT19TTUFMTCIsIlRPT19NQU5ZX0ZJTEVTIiwiRXJyb3JDb2RlIiwiRmlsZUludmFsaWRUeXBlIiwiRmlsZVRvb0xhcmdlIiwiRmlsZVRvb1NtYWxsIiwiVG9vTWFueUZpbGVzIiwiZ2V0SW52YWxpZFR5cGVSZWplY3Rpb25FcnIiLCJhY2NlcHQiLCJtZXNzYWdlU3VmZml4Iiwiam9pbiIsImNvZGUiLCJtZXNzYWdlIiwiZ2V0VG9vTGFyZ2VSZWplY3Rpb25FcnIiLCJtYXhTaXplIiwiZ2V0VG9vU21hbGxSZWplY3Rpb25FcnIiLCJtaW5TaXplIiwiVE9PX01BTllfRklMRVNfUkVKRUNUSU9OIiwiZmlsZUFjY2VwdGVkIiwiaXNBY2NlcHRhYmxlIiwiYWNjZXB0ZWRGaWxlcyIsImFjY2VwdGVkRmlsZXNBcnJheSIsImZpbGVOYW1lIiwibWltZVR5cGUiLCJiYXNlTWltZVR5cGUiLCJyZXBsYWNlIiwic29tZSIsInZhbGlkVHlwZSIsInRyaW0iLCJjaGFyQXQiLCJlbmRzV2l0aCIsImFjY2VwdHMiLCJmaWxlTWF0Y2hTaXplIiwiaXNEZWZpbmVkIiwic2l6ZSIsImFsbEZpbGVzQWNjZXB0ZWQiLCJtdWx0aXBsZSIsIm1heEZpbGVzIiwiZXZlcnkiLCJhY2NlcHRlZCIsInNpemVNYXRjaCIsImlzUHJvcGFnYXRpb25TdG9wcGVkIiwiZXZlbnQiLCJjYW5jZWxCdWJibGUiLCJpc0V2dFdpdGhGaWxlcyIsImRhdGFUcmFuc2ZlciIsInByb3RvdHlwZSIsInR5cGVzIiwib25Eb2N1bWVudERyYWdPdmVyIiwicHJldmVudERlZmF1bHQiLCJpc0llIiwidXNlckFnZW50IiwiaXNFZGdlIiwiaXNJZU9yRWRnZSIsIndpbmRvdyIsIm5hdmlnYXRvciIsImNvbXBvc2VFdmVudEhhbmRsZXJzIiwiZm5zIiwiYXJncyIsImZuIiwiY2FuVXNlRmlsZVN5c3RlbUFjY2Vzc0FQSSIsImZpbGVQaWNrZXJPcHRpb25zVHlwZXMiLCJkZXNjcmlwdGlvbiIsInRlc3QiLCJhIiwiYiIsImlzQWJvcnQiLCJET01FeGNlcHRpb24iLCJBQk9SVF9FUlIiLCJpc1NlY3VyaXR5RXJyb3IiLCJTRUNVUklUWV9FUlIiLCJEcm9wem9uZSIsImZvcndhcmRSZWYiLCJyZWYiLCJjaGlsZHJlbiIsInVzZURyb3B6b25lIiwib3BlbiIsInByb3BzIiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsIlJlYWN0IiwiRnJhZ21lbnQiLCJkaXNwbGF5TmFtZSIsImRlZmF1bHRQcm9wcyIsImRpc2FibGVkIiwiZ2V0RmlsZXNGcm9tRXZlbnQiLCJpc0NoYW5nZUV2dCIsIkluZmluaXR5IiwicHJldmVudERyb3BPbkRvY3VtZW50Iiwibm9DbGljayIsIm5vS2V5Ym9hcmQiLCJub0RyYWciLCJub0RyYWdFdmVudHNCdWJibGluZyIsInZhbGlkYXRvciIsInVzZUZzQWNjZXNzQXBpIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZnVuYyIsIm9uZU9mVHlwZSIsInN0cmluZyIsImFycmF5T2YiLCJib29sIiwibnVtYmVyIiwib25GaWxlRGlhbG9nQ2FuY2VsIiwib25GaWxlRGlhbG9nT3BlbiIsIm9uRHJhZ0VudGVyIiwib25EcmFnTGVhdmUiLCJvbkRyYWdPdmVyIiwib25Ecm9wIiwib25Ecm9wQWNjZXB0ZWQiLCJvbkRyb3BSZWplY3RlZCIsImluaXRpYWxTdGF0ZSIsImlzRm9jdXNlZCIsImlzRmlsZURpYWxvZ0FjdGl2ZSIsImlzRHJhZ0FjdGl2ZSIsImlzRHJhZ0FjY2VwdCIsImlzRHJhZ1JlamVjdCIsImRyYWdnZWRGaWxlcyIsImZpbGVSZWplY3Rpb25zIiwib3B0aW9ucyIsIm9uRmlsZURpYWxvZ09wZW5DYiIsInVzZU1lbW8iLCJub29wIiwib25GaWxlRGlhbG9nQ2FuY2VsQ2IiLCJyb290UmVmIiwidXNlUmVmIiwiaW5wdXRSZWYiLCJ1c2VSZWR1Y2VyIiwicmVkdWNlciIsInN0YXRlIiwiZGlzcGF0Y2giLCJmc0FjY2Vzc0FwaVdvcmtzUmVmIiwiaXNTZWN1cmVDb250ZXh0Iiwib25XaW5kb3dGb2N1cyIsImN1cnJlbnQiLCJzZXRUaW1lb3V0IiwidXNlRWZmZWN0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJkcmFnVGFyZ2V0c1JlZiIsIm9uRG9jdW1lbnREcm9wIiwiY29udGFpbnMiLCJkb2N1bWVudCIsIm9uRHJhZ0VudGVyQ2IiLCJ1c2VDYWxsYmFjayIsInBlcnNpc3QiLCJzdG9wUHJvcGFnYXRpb24iLCJvbkRyYWdPdmVyQ2IiLCJoYXNGaWxlcyIsImRyb3BFZmZlY3QiLCJvbkRyYWdMZWF2ZUNiIiwidGFyZ2V0cyIsInRhcmdldElkeCIsInNwbGljZSIsInNldEZpbGVzIiwiZm9yRWFjaCIsImFjY2VwdEVycm9yIiwic2l6ZUVycm9yIiwiY3VzdG9tRXJyb3JzIiwiZXJyb3JzIiwib25Ecm9wQ2IiLCJvcGVuRmlsZURpYWxvZyIsIm9wdHMiLCJzaG93T3BlbkZpbGVQaWNrZXIiLCJjYXRjaCIsImNsaWNrIiwib25LZXlEb3duQ2IiLCJpc0VxdWFsTm9kZSIsImtleUNvZGUiLCJvbkZvY3VzQ2IiLCJvbkJsdXJDYiIsIm9uQ2xpY2tDYiIsImNvbXBvc2VIYW5kbGVyIiwiY29tcG9zZUtleWJvYXJkSGFuZGxlciIsImNvbXBvc2VEcmFnSGFuZGxlciIsImdldFJvb3RQcm9wcyIsInJlZktleSIsInJvbGUiLCJvbktleURvd24iLCJvbkZvY3VzIiwib25CbHVyIiwib25DbGljayIsInJlc3QiLCJ0YWJJbmRleCIsIm9uSW5wdXRFbGVtZW50Q2xpY2siLCJnZXRJbnB1dFByb3BzIiwib25DaGFuZ2UiLCJpbnB1dFByb3BzIiwic3R5bGUiLCJkaXNwbGF5IiwiYXV0b0NvbXBsZXRlIiwiZmlsZUNvdW50IiwiYWN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozt3MEJBcUVPLFNBQVNBLEVBQVVDLEVBQVNDLEVBQVlDLEVBQUdDLEdBRTlDLE9BQU8sSUFBS0QsSUFBTUEsRUFBSUUsV0FBVSxTQUFVQyxFQUFTQyxHQUMvQyxTQUFTQyxFQUFVQyxHQUFTLElBQU1DLEVBQUtOLEVBQVVPLEtBQUtGLElBQVcsTUFBT0csR0FBS0wsRUFBT0ssSUFDcEYsU0FBU0MsRUFBU0osR0FBUyxJQUFNQyxFQUFLTixFQUFpQixNQUFFSyxJQUFXLE1BQU9HLEdBQUtMLEVBQU9LLElBQ3ZGLFNBQVNGLEVBQUtJLEdBSmxCLElBQWVMLEVBSWFLLEVBQU9DLEtBQU9ULEVBQVFRLEVBQU9MLFFBSjFDQSxFQUl5REssRUFBT0wsTUFKaERBLGFBQWlCTixFQUFJTSxFQUFRLElBQUlOLEdBQUUsU0FBVUcsR0FBV0EsRUFBUUcsT0FJVE8sS0FBS1IsRUFBV0ssR0FDbEdILEdBQU1OLEVBQVlBLEVBQVVhLE1BQU1oQixFQUFTQyxHQUFjLEtBQUtTLFdBSS9E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
package/package.json CHANGED
@@ -171,7 +171,7 @@
171
171
  "webpack-blocks": "^2.1.0"
172
172
  },
173
173
  "typings": "typings/react-dropzone.d.ts",
174
- "version": "12.0.2",
174
+ "version": "12.0.3",
175
175
  "engines": {
176
176
  "node": ">= 10.13"
177
177
  },
package/src/index.js CHANGED
@@ -18,9 +18,11 @@ import {
18
18
  fileMatchSize,
19
19
  filePickerOptionsTypes,
20
20
  canUseFileSystemAccessAPI,
21
+ isAbort,
21
22
  isEvtWithFiles,
22
23
  isIeOrEdge,
23
24
  isPropagationStopped,
25
+ isSecurityError,
24
26
  onDocumentDragOver,
25
27
  TOO_MANY_FILES_REJECTION,
26
28
  } from "./utils/index";
@@ -451,10 +453,14 @@ export function useDropzone(options = {}) {
451
453
  const [state, dispatch] = useReducer(reducer, initialState);
452
454
  const { isFocused, isFileDialogActive, draggedFiles } = state;
453
455
 
456
+ const fsAccessApiWorksRef = useRef(
457
+ window.isSecureContext && useFsAccessApi && canUseFileSystemAccessAPI()
458
+ );
459
+
454
460
  // Update file dialog active state when the window is focused on
455
461
  const onWindowFocus = () => {
456
462
  // Execute the timeout only if the file dialog is opened in the browser
457
- if (isFileDialogActive) {
463
+ if (!fsAccessApiWorksRef.current && isFileDialogActive) {
458
464
  setTimeout(() => {
459
465
  if (inputRef.current) {
460
466
  const { files } = inputRef.current;
@@ -468,19 +474,11 @@ export function useDropzone(options = {}) {
468
474
  }
469
475
  };
470
476
  useEffect(() => {
471
- if (
472
- window.isSecureContext &&
473
- useFsAccessApi &&
474
- canUseFileSystemAccessAPI()
475
- ) {
476
- return () => {};
477
- }
478
-
479
477
  window.addEventListener("focus", onWindowFocus, false);
480
478
  return () => {
481
479
  window.removeEventListener("focus", onWindowFocus, false);
482
480
  };
483
- }, [inputRef, isFileDialogActive, onFileDialogCancelCb, useFsAccessApi]);
481
+ }, [inputRef, isFileDialogActive, onFileDialogCancelCb, fsAccessApiWorksRef]);
484
482
 
485
483
  const dragTargetsRef = useRef([]);
486
484
  const onDocumentDrop = (event) => {
@@ -684,11 +682,7 @@ export function useDropzone(options = {}) {
684
682
  const openFileDialog = useCallback(() => {
685
683
  // No point to use FS access APIs if context is not secure
686
684
  // https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts#feature_detection
687
- if (
688
- window.isSecureContext &&
689
- useFsAccessApi &&
690
- canUseFileSystemAccessAPI()
691
- ) {
685
+ if (fsAccessApiWorksRef.current) {
692
686
  dispatch({ type: "openDialog" });
693
687
  onFileDialogOpenCb();
694
688
  // https://developer.mozilla.org/en-US/docs/Web/API/window/showOpenFilePicker
@@ -699,9 +693,25 @@ export function useDropzone(options = {}) {
699
693
  window
700
694
  .showOpenFilePicker(opts)
701
695
  .then((handles) => getFilesFromEvent(handles))
702
- .then((files) => setFiles(files, null))
703
- .catch((e) => onFileDialogCancelCb(e))
704
- .finally(() => dispatch({ type: "closeDialog" }));
696
+ .then((files) => {
697
+ setFiles(files, null);
698
+ dispatch({ type: "closeDialog" });
699
+ })
700
+ .catch((e) => {
701
+ // AbortError means the user canceled
702
+ if (isAbort(e)) {
703
+ onFileDialogCancelCb(e);
704
+ dispatch({ type: "closeDialog" });
705
+ } else if (isSecurityError(e)) {
706
+ fsAccessApiWorksRef.current = false;
707
+ // CORS, so cannot use this API
708
+ // Try using the input
709
+ if (inputRef.current) {
710
+ inputRef.current.value = null;
711
+ inputRef.current.click();
712
+ }
713
+ }
714
+ });
705
715
  return;
706
716
  }
707
717
 
@@ -734,7 +744,7 @@ export function useDropzone(options = {}) {
734
744
  openFileDialog();
735
745
  }
736
746
  },
737
- [rootRef, inputRef, openFileDialog]
747
+ [rootRef, openFileDialog]
738
748
  );
739
749
 
740
750
  // Update focus state for the dropzone
@@ -759,7 +769,7 @@ export function useDropzone(options = {}) {
759
769
  } else {
760
770
  openFileDialog();
761
771
  }
762
- }, [inputRef, noClick, openFileDialog]);
772
+ }, [noClick, openFileDialog]);
763
773
 
764
774
  const composeHandler = (fn) => {
765
775
  return disabled ? null : fn;
package/src/index.spec.js CHANGED
@@ -1660,6 +1660,114 @@ describe("useDropzone() hook", () => {
1660
1660
 
1661
1661
  jest.useRealTimers();
1662
1662
  });
1663
+
1664
+ it("should try to use showOpenFilePicker() and fallback to input in case of a security error", async () => {
1665
+ const activeRef = createRef();
1666
+ const active = <span ref={activeRef}>I am active</span>;
1667
+ const onClickSpy = jest.spyOn(HTMLInputElement.prototype, "click");
1668
+
1669
+ const thenable = createThenable();
1670
+ const showOpenFilePickerMock = jest
1671
+ .fn()
1672
+ .mockReturnValue(thenable.promise);
1673
+
1674
+ window.showOpenFilePicker = showOpenFilePickerMock;
1675
+
1676
+ const onDropSpy = jest.fn();
1677
+ const onFileDialogOpenSpy = jest.fn();
1678
+
1679
+ const ui = (
1680
+ <Dropzone
1681
+ onDrop={onDropSpy}
1682
+ onFileDialogOpen={onFileDialogOpenSpy}
1683
+ accept="application/pdf"
1684
+ multiple
1685
+ useFsAccessApi
1686
+ >
1687
+ {({ getRootProps, getInputProps, isFileDialogActive }) => (
1688
+ <div {...getRootProps()}>
1689
+ <input {...getInputProps()} />
1690
+ {isFileDialogActive && active}
1691
+ </div>
1692
+ )}
1693
+ </Dropzone>
1694
+ );
1695
+
1696
+ const { container, rerender } = render(ui);
1697
+
1698
+ const dropzone = container.querySelector("div");
1699
+
1700
+ fireEvent.click(dropzone);
1701
+
1702
+ await flushPromises(rerender, ui);
1703
+
1704
+ expect(activeRef.current).not.toBeNull();
1705
+ expect(dropzone).toContainElement(activeRef.current);
1706
+ expect(onFileDialogOpenSpy).toHaveBeenCalled();
1707
+
1708
+ thenable.cancel(
1709
+ new DOMException("Cannot use this API cross-origin", "SecurityError")
1710
+ );
1711
+ await flushPromises(rerender, ui);
1712
+
1713
+ expect(activeRef.current).not.toBeNull();
1714
+ expect(dropzone).toContainElement(activeRef.current);
1715
+ expect(onClickSpy).toHaveBeenCalled();
1716
+ });
1717
+
1718
+ test("window focus evt is bound if showOpenFilePicker() is supported but errors due to a security error", async () => {
1719
+ jest.useFakeTimers();
1720
+
1721
+ const activeRef = createRef();
1722
+ const active = <span ref={activeRef}>I am active</span>;
1723
+ const onFileDialogCancelSpy = jest.fn();
1724
+
1725
+ const thenable = createThenable();
1726
+ const showOpenFilePickerMock = jest
1727
+ .fn()
1728
+ .mockReturnValue(thenable.promise);
1729
+
1730
+ window.showOpenFilePicker = showOpenFilePickerMock;
1731
+
1732
+ const ui = (
1733
+ <Dropzone onFileDialogCancel={onFileDialogCancelSpy}>
1734
+ {({ getRootProps, getInputProps, isFileDialogActive }) => (
1735
+ <div {...getRootProps()}>
1736
+ <input {...getInputProps()} />
1737
+ {isFileDialogActive && active}
1738
+ </div>
1739
+ )}
1740
+ </Dropzone>
1741
+ );
1742
+
1743
+ const { container, rerender } = render(ui);
1744
+
1745
+ const dropzone = container.querySelector("div");
1746
+
1747
+ fireEvent.click(dropzone);
1748
+
1749
+ drainTimers();
1750
+ await flushPromises(rerender, ui);
1751
+
1752
+ const ref = activeRef.current;
1753
+ expect(ref).not.toBeNull();
1754
+ expect(dropzone).toContainElement(ref);
1755
+
1756
+ thenable.cancel(
1757
+ new DOMException("Cannot use this API cross-origin", "SecurityError")
1758
+ );
1759
+
1760
+ await flushPromises(rerender, ui);
1761
+
1762
+ dispatchEvt(document.body, "focus");
1763
+ drainTimers();
1764
+ await flushPromises(rerender, ui);
1765
+
1766
+ expect(onFileDialogCancelSpy).toHaveBeenCalled();
1767
+ expect(dropzone).not.toContainElement(ref);
1768
+
1769
+ jest.useRealTimers();
1770
+ });
1663
1771
  });
1664
1772
 
1665
1773
  describe("onKeyDown", () => {
@@ -203,3 +203,31 @@ export function filePickerOptionsTypes(accept) {
203
203
  },
204
204
  ];
205
205
  }
206
+
207
+ /**
208
+ * Check if v is an exception caused by aborting a request (e.g window.showOpenFilePicker()).
209
+ *
210
+ * See https://developer.mozilla.org/en-US/docs/Web/API/DOMException.
211
+ * @param {any} v
212
+ * @returns {boolean} True if v is an abort exception.
213
+ */
214
+ export function isAbort(v) {
215
+ return (
216
+ v instanceof DOMException &&
217
+ (v.name === "AbortError" || v.code === v.ABORT_ERR)
218
+ );
219
+ }
220
+
221
+ /**
222
+ * Check if v is a security error.
223
+ *
224
+ * See https://developer.mozilla.org/en-US/docs/Web/API/DOMException.
225
+ * @param {any} v
226
+ * @returns {boolean} True if v is a security error.
227
+ */
228
+ export function isSecurityError(v) {
229
+ return (
230
+ v instanceof DOMException &&
231
+ (v.name === "SecurityError" || v.code === v.SECURITY_ERR)
232
+ );
233
+ }
@@ -426,6 +426,60 @@ describe("filePickerOptionsTypes()", () => {
426
426
  });
427
427
  });
428
428
 
429
+ describe("isAbort()", () => {
430
+ let utils;
431
+ beforeEach(async () => {
432
+ utils = await import("./index");
433
+ });
434
+
435
+ it("should work as expected", () => {
436
+ expect(utils.isAbort(new DOMException())).toBe(false);
437
+ expect(utils.isAbort(new DOMException("some err"))).toBe(false);
438
+ expect(utils.isAbort(new DOMException("some err", "Noop"))).toBe(false);
439
+ expect(utils.isAbort(new DOMException("some err", "AbortError"))).toBe(
440
+ true
441
+ );
442
+ const err = new DOMException("some err");
443
+ const e = new Proxy(err, {
444
+ get(t, p) {
445
+ if (p === "code") {
446
+ return 20;
447
+ }
448
+ return t[p];
449
+ },
450
+ });
451
+ expect(utils.isAbort(e)).toBe(true);
452
+ });
453
+ });
454
+
455
+ describe("isSecurityError()", () => {
456
+ let utils;
457
+ beforeEach(async () => {
458
+ utils = await import("./index");
459
+ });
460
+
461
+ it("should work as expected", () => {
462
+ expect(utils.isSecurityError(new DOMException())).toBe(false);
463
+ expect(utils.isSecurityError(new DOMException("some err"))).toBe(false);
464
+ expect(utils.isSecurityError(new DOMException("some err", "Noop"))).toBe(
465
+ false
466
+ );
467
+ expect(
468
+ utils.isSecurityError(new DOMException("some err", "SecurityError"))
469
+ ).toBe(true);
470
+ const err = new DOMException("some err");
471
+ const e = new Proxy(err, {
472
+ get(t, p) {
473
+ if (p === "code") {
474
+ return 18;
475
+ }
476
+ return t[p];
477
+ },
478
+ });
479
+ expect(utils.isSecurityError(e)).toBe(true);
480
+ });
481
+ });
482
+
429
483
  function createFile(name, size, type) {
430
484
  const file = new File([], name, { type });
431
485
  Object.defineProperty(file, "size", {