diff --git a/js/dist-typings/admin/components/UploadImageButton.d.ts b/js/dist-typings/admin/components/UploadImageButton.d.ts new file mode 100644 index 00000000..37febd24 --- /dev/null +++ b/js/dist-typings/admin/components/UploadImageButton.d.ts @@ -0,0 +1,4 @@ +import FlarumUploadImageButton from 'flarum/admin/components/UploadImageButton'; +export default class UploadImageButton extends FlarumUploadImageButton { + resourceUrl(): string; +} diff --git a/js/dist/admin.js b/js/dist/admin.js index 87685a1a..f68157f0 100644 --- a/js/dist/admin.js +++ b/js/dist/admin.js @@ -1,2 +1,2 @@ -(()=>{var t={195:(t,e,i)=>{t.exports=i(236)},236:t=>{var e=function(t){"use strict";var e,i=Object.prototype,a=i.hasOwnProperty,n="function"==typeof Symbol?Symbol:{},o=n.iterator||"@@iterator",r=n.asyncIterator||"@@asyncIterator",s=n.toStringTag||"@@toStringTag";function l(t,e,i){return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{l({},"")}catch(t){l=function(t,e,i){return t[e]=i}}function u(t,e,i,a){var n=e&&e.prototype instanceof v?e:v,o=Object.create(n.prototype),r=new L(a||[]);return o._invoke=function(t,e,i){var a=d;return function(n,o){if(a===p)throw new Error("Generator is already running");if(a===m){if("throw"===n)throw o;return P()}for(i.method=n,i.arg=o;;){var r=i.delegate;if(r){var s=F(r,i);if(s){if(s===h)continue;return s}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if(a===d)throw a=m,i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);a=p;var l=f(t,e,i);if("normal"===l.type){if(a=i.done?m:c,l.arg===h)continue;return{value:l.arg,done:i.done}}"throw"===l.type&&(a=m,i.method="throw",i.arg=l.arg)}}}(t,i,r),o}function f(t,e,i){try{return{type:"normal",arg:t.call(e,i)}}catch(t){return{type:"throw",arg:t}}}t.wrap=u;var d="suspendedStart",c="suspendedYield",p="executing",m="completed",h={};function v(){}function g(){}function b(){}var y={};l(y,o,(function(){return this}));var w=Object.getPrototypeOf,x=w&&w(w(M([])));x&&x!==i&&a.call(x,o)&&(y=x);var _=b.prototype=v.prototype=Object.create(y);function S(t){["next","throw","return"].forEach((function(e){l(t,e,(function(t){return this._invoke(e,t)}))}))}function k(t,e){function i(n,o,r,s){var l=f(t[n],t,o);if("throw"!==l.type){var u=l.arg,d=u.value;return d&&"object"==typeof d&&a.call(d,"__await")?e.resolve(d.__await).then((function(t){i("next",t,r,s)}),(function(t){i("throw",t,r,s)})):e.resolve(d).then((function(t){u.value=t,r(u)}),(function(t){return i("throw",t,r,s)}))}s(l.arg)}var n;this._invoke=function(t,a){function o(){return new e((function(e,n){i(t,a,e,n)}))}return n=n?n.then(o,o):o()}}function F(t,i){var a=t.iterator[i.method];if(a===e){if(i.delegate=null,"throw"===i.method){if(t.iterator.return&&(i.method="return",i.arg=e,F(t,i),"throw"===i.method))return h;i.method="throw",i.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var n=f(a,t.iterator,i.arg);if("throw"===n.type)return i.method="throw",i.arg=n.arg,i.delegate=null,h;var o=n.arg;return o?o.done?(i[t.resultName]=o.value,i.next=t.nextLoc,"return"!==i.method&&(i.method="next",i.arg=e),i.delegate=null,h):o:(i.method="throw",i.arg=new TypeError("iterator result is not an object"),i.delegate=null,h)}function T(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function N(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function L(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(T,this),this.reset(!0)}function M(t){if(t){var i=t[o];if(i)return i.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,r=function i(){for(;++n=0;--o){var r=this.tryEntries[o],s=r.completion;if("root"===r.tryLoc)return n("end");if(r.tryLoc<=this.prev){var l=a.call(r,"catchLoc"),u=a.call(r,"finallyLoc");if(l&&u){if(this.prev=0;--i){var n=this.tryEntries[i];if(n.tryLoc<=this.prev&&a.call(n,"finallyLoc")&&this.prev=0;--e){var i=this.tryEntries[e];if(i.finallyLoc===t)return this.complete(i.completion,i.afterLoc),N(i),h}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc===t){var a=i.completion;if("throw"===a.type){var n=a.arg;N(i)}return n}}throw new Error("illegal catch attempt")},delegateYield:function(t,i,a){return this.delegate={iterator:M(t),resultName:i,nextLoc:a},"next"===this.method&&(this.arg=e),h}},t}(t.exports);try{regeneratorRuntime=e}catch(t){"object"==typeof globalThis?globalThis.regeneratorRuntime=e:Function("r","regeneratorRuntime = r")(e)}}},e={};function i(a){var n=e[a];if(void 0!==n)return n.exports;var o=e[a]={exports:{}};return t[a](o,o.exports,i),o.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var a in e)i.o(e,a)&&!i.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var a={};(()=>{"use strict";i.r(a),i.d(a,{components:()=>ut,extend:()=>xt});const t=flarum.core.compat["admin/app"];var e=i.n(t);function n(t,e){return n=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},n(t,e)}function o(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,n(t,e)}const r=flarum.core.compat["common/components/Button"];var s=i.n(r);const l=flarum.core.compat["admin/utils/saveSettings"];var u=i.n(l);const f=flarum.core.compat["common/components/Alert"];var d=i.n(f);const c=flarum.core.compat["common/components/Select"];var p=i.n(c);const h=flarum.core.compat["common/components/Switch"];var v=i.n(h);const g=flarum.core.compat["admin/components/UploadImageButton"];var b=i.n(g);const y=flarum.core.compat["common/utils/withAttr"];var w=i.n(y);const x=flarum.core.compat["common/utils/Stream"];var _=i.n(x);const S=flarum.core.compat["admin/components/ExtensionPage"];var k=i.n(S);const F=flarum.core.compat["common/utils/ItemList"];var T=i.n(F);const N=flarum.core.compat["common/components/Modal"];var L=i.n(N);const M=flarum.core.compat["common/components/LoadingIndicator"];var P=i.n(M),O=function(t){function i(){return t.apply(this,arguments)||this}o(i,t);var a=i.prototype;return a.oninit=function(e){t.prototype.oninit.call(this,e),this.uploading=!1,this.inspection={}},a.className=function(){return"Modal--small fof-upload-inspect-mime-modal"},a.title=function(){return e().translator.trans("fof-upload.admin.inspect-mime.title")},a.content=function(){return m("div",{className:"Modal-body"},m("p",null,e().translator.trans("fof-upload.admin.inspect-mime.description",{a:m("a",{href:"https://github.com/SoftCreatR/php-mime-detector"})})),m("p",null,e().translator.trans("fof-upload.admin.inspect-mime.select")),m("div",null,m("input",{type:"file",onchange:this.onupload.bind(this),disabled:this.uploading}),this.uploading?P().component():null),m("dl",null,m("dt",null,e().translator.trans("fof-upload.admin.inspect-mime.laravel-validation")),m("dd",null,void 0===this.inspection.laravel_validation?m("em",null,e().translator.trans("fof-upload.admin.inspect-mime.no-file-selected")):this.inspection.laravel_validation?e().translator.trans("fof-upload.admin.inspect-mime.validation-passed"):e().translator.trans("fof-upload.admin.inspect-mime.validation-failed",{error:this.inspection.laravel_validation_error||"?"}))),m("dl",null,m("dt",null,e().translator.trans("fof-upload.admin.inspect-mime.mime-detector")),m("dd",null,this.inspection.mime_detector?m("code",null,this.inspection.mime_detector):m("em",null,e().translator.trans("fof-upload.admin.inspect-mime.not-available")))),m("dl",null,m("dt",null,e().translator.trans("fof-upload.admin.inspect-mime.mime-fileinfo")),m("dd",null,this.inspection.php_mime?m("code",null,this.inspection.php_mime):m("em",null,e().translator.trans("fof-upload.admin.inspect-mime.not-available")))),m("dl",null,m("dt",null,e().translator.trans("fof-upload.admin.inspect-mime.guessed-extension")),m("dd",null,this.inspection.guessed_extension?m("code",null,this.inspection.guessed_extension):m("em",null,e().translator.trans("fof-upload.admin.inspect-mime.not-available")))))},a.onupload=function(t){for(var i=this,a=new FormData,n=0;n=0&&"fof-file-selected"]),s=t.filesBeingHidden.includes(e.uuid());return m("li",{"aria-busy":s,key:e.uuid()},m(ot,{file:e,fileSelectable:o,isSelected:t.attrs.selectedFiles&&t.attrs.selectedFiles.indexOf(null!=(a=e.id())?a:"")>=0,fileClassNames:r,isFileHiding:s,onHide:t.hideFile.bind(t),onFileClick:t.onFileClick.bind(t),user:t.attrs.user,onDelete:t.onDelete.bind(t)}))})),this.hasMoreResults()&&m("div",{className:"fof-load-more-files"},m(s(),{className:"Button Button--primary",disabled:this.isLoading(),loading:this.isLoading(),onclick:function(){return t.loadMore()}},J().translator.trans("fof-upload.lib.file_list.load_more_files_btn")))))},i.onDelete=function(t){this.attrs.onDelete&&this.attrs.onDelete(t)},i.onFileClick=function(t){this.attrs.onFileSelect?this.attrs.onFileSelect(t):this.attrs.downloadOnClick&&window.open(t.url())},i.isSelectable=function(t){var e=t.type();return Array.isArray(this.restrictFileType)?this.restrictFileType.indexOf(e)>=0:"image"===this.restrictFileType?e.includes("image/"):"audio"===this.restrictFileType?e.includes("audio/"):"video"===this.restrictFileType&&e.includes("video/")},i.hideFile=function(){var t=W(K().mark((function t(e){var i,a,n,o,r;return K().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(i=e.uuid(),!this.filesBeingHidden.includes(i)){t.next=3;break}return t.abrupt("return");case 3:if(this.filesBeingHidden.push(i),a=e.isShared()?"fof-upload.lib.file_list.hide_shared_file":"fof-upload.lib.file_list.hide_file",!confirm(st()(J().translator.trans(e.hidden()?a+".show_confirmation":a+".hide_confirmation",{fileName:e.baseName()})))){t.next=24;break}return t.prev=7,t.next=10,J().request({method:"PATCH",url:J().forum.attribute("apiUrl")+"/fof/upload/hide",body:{uuid:i}});case 10:n=t.sent,J().store.pushPayload(n),m.redraw(),J().alerts.show(d(),{type:"success"},[B()(e.hidden()?"fas fa-eye-slash":"fas fa-eye")," ",J().translator.trans(null!=e&&e.hidden()?a+".hide_success":a+".show_success")]),this.fileState.user&&(o=this.fileState.files.findIndex((function(t){return i===t.uuid()})),this.fileState.files.splice(o,1)),t.next=20;break;case 17:t.prev=17,t.t0=t.catch(7),J().alerts.show(d(),{type:"error"},J().translator.trans(null!=e&&e.hidden()?a+".hide_fail":a+".show_fail",{fileName:e.baseName()}));case 20:return t.prev=20,r=this.filesBeingHidden.indexOf(i),this.filesBeingHidden.splice(r,1),t.finish(20);case 24:case"end":return t.stop()}}),t,this,[[7,17,20,24]])})));return function(e){return t.apply(this,arguments)}}(),e}($()),ut=H({},{UploadedFile:tt,UploadSharedFileModal:X,UserFileList:function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var i=e.prototype;return i.loadFileList=function(){this.fileState.setUser(this.attrs.user||J().session.user),this.user=this.fileState.user},i.hasMoreResults=function(){return this.fileState.hasMoreResults()},i.loadMore=function(){this.fileState.loadMore()},i.isLoading=function(){return this.fileState.isLoading()},i.fileCollection=function(){return this.fileState.files},e}(lt)},{UploadPage:I});const ft=flarum.core.compat["common/extenders"];var dt=i.n(ft);const ct=flarum.core.compat["common/Model"];var pt=i.n(ct),mt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var i=e.prototype;return i.baseName=function(){return pt().attribute("baseName").call(this)},i.path=function(){return pt().attribute("path").call(this)},i.url=function(){return pt().attribute("url").call(this)},i.size=function(){return pt().attribute("size").call(this)},i.type=function(){return pt().attribute("type").call(this)},i.humanSize=function(){return pt().attribute("humanSize").call(this)},i.createdAt=function(){return pt().attribute("createdAt",pt().transformDate).call(this)},i.uuid=function(){return pt().attribute("uuid").call(this)},i.tag=function(){return pt().attribute("tag").call(this)},i.hidden=function(){return pt().attribute("hidden").call(this)},i.bbcode=function(){return pt().attribute("bbcode").call(this)},i.isShared=function(){return pt().attribute("shared").call(this)},i.isPrivateShared=function(){return pt().attribute("isPrivateShared").call(this)},i.canViewInfo=function(){return pt().attribute("canViewInfo").call(this)},i.canHide=function(){return pt().attribute("canHide").call(this)},i.canDelete=function(){return pt().attribute("canDelete").call(this)},i.apiEndpoint=function(){return"/fof/uploads"+(this.exists?"/"+this.id():"")},e}(pt());const ht=[(new(dt().Store)).add("files",mt).add("shared-files",mt)],vt=flarum.core.compat["admin/components/AdminPage"];var gt=i.n(vt),bt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var i=e.prototype;return i.loadFileList=function(){this.fileState.loadResults()},i.hasMoreResults=function(){return this.fileState.hasMoreResults()},i.loadMore=function(){this.fileState.loadMore()},i.isLoading=function(){return this.fileState.isLoading()},i.fileCollection=function(){return this.fileState.files},e}(lt),yt=function(){function t(t){void 0===t&&(t=!1),this.user=void 0,this.files=void 0,this.moreResults=void 0,this.loading=void 0,this.sharedFiles=void 0,this.user=null,this.files=[],this.moreResults=!1,this.loading=!1,this.sharedFiles=t}var e=t.prototype;return e.setUser=function(t){t!==this.user&&(this.user=t,this.files=[],this.loadResults())},e.refresh=function(){this.files=[],this.loadResults(),m.redraw()},e.loadResults=function(){var t=W(K().mark((function t(e){var i,a,n;return K().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===e&&(e=0),this.sharedFiles||this.user){t.next=3;break}return t.abrupt("return",Promise.reject("User not set"));case 3:return this.loading=!0,i="fof/uploads",a={},!this.sharedFiles&&this.user?a={filter:{user:this.user.id()},page:{offset:e}}:(i="fof/upload/shared-files",a={page:{offset:e}}),t.next=9,J().store.find(i,a);case 9:return n=t.sent,t.abrupt("return",this.parseResults(n));case 11:case"end":return t.stop()}}),t,this)})));return function(e){return t.apply(this,arguments)}}(),e.loadMore=function(){var t=W(K().mark((function t(){return K().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return this.loading=!0,t.abrupt("return",this.loadResults(this.files.length));case 2:case"end":return t.stop()}}),t,this)})));return function(){return t.apply(this,arguments)}}(),e.parseResults=function(t){var e,i;return this.files=t,this.loading=!1,this.moreResults=!(null==(e=t.payload)||null==(i=e.links)||!i.next),m.redraw(),t},e.addToList=function(t){var e;Array.isArray(t)?(e=this.files).unshift.apply(e,t):this.files.unshift(t),m.redraw()},e.removeFromList=function(t){Array.isArray(t)?this.files=this.files.filter((function(e){return!t.includes(e)})):this.files=this.files.filter((function(e){return e!==t})),m.redraw()},e.hasFiles=function(){return this.files.length>0},e.isLoading=function(){return this.loading},e.hasMoreResults=function(){return this.moreResults},e.empty=function(){return!this.hasFiles()&&!this.isLoading()},t}(),wt=function(t){function i(){for(var e,i=arguments.length,a=new Array(i),n=0;n{var t={195:(t,e,i)=>{t.exports=i(236)},236:t=>{var e=function(t){"use strict";var e,i=Object.prototype,a=i.hasOwnProperty,n="function"==typeof Symbol?Symbol:{},o=n.iterator||"@@iterator",r=n.asyncIterator||"@@asyncIterator",s=n.toStringTag||"@@toStringTag";function l(t,e,i){return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{l({},"")}catch(t){l=function(t,e,i){return t[e]=i}}function u(t,e,i,a){var n=e&&e.prototype instanceof v?e:v,o=Object.create(n.prototype),r=new L(a||[]);return o._invoke=function(t,e,i){var a=d;return function(n,o){if(a===p)throw new Error("Generator is already running");if(a===m){if("throw"===n)throw o;return P()}for(i.method=n,i.arg=o;;){var r=i.delegate;if(r){var s=F(r,i);if(s){if(s===h)continue;return s}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if(a===d)throw a=m,i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);a=p;var l=f(t,e,i);if("normal"===l.type){if(a=i.done?m:c,l.arg===h)continue;return{value:l.arg,done:i.done}}"throw"===l.type&&(a=m,i.method="throw",i.arg=l.arg)}}}(t,i,r),o}function f(t,e,i){try{return{type:"normal",arg:t.call(e,i)}}catch(t){return{type:"throw",arg:t}}}t.wrap=u;var d="suspendedStart",c="suspendedYield",p="executing",m="completed",h={};function v(){}function g(){}function b(){}var y={};l(y,o,(function(){return this}));var w=Object.getPrototypeOf,x=w&&w(w(M([])));x&&x!==i&&a.call(x,o)&&(y=x);var _=b.prototype=v.prototype=Object.create(y);function S(t){["next","throw","return"].forEach((function(e){l(t,e,(function(t){return this._invoke(e,t)}))}))}function k(t,e){function i(n,o,r,s){var l=f(t[n],t,o);if("throw"!==l.type){var u=l.arg,d=u.value;return d&&"object"==typeof d&&a.call(d,"__await")?e.resolve(d.__await).then((function(t){i("next",t,r,s)}),(function(t){i("throw",t,r,s)})):e.resolve(d).then((function(t){u.value=t,r(u)}),(function(t){return i("throw",t,r,s)}))}s(l.arg)}var n;this._invoke=function(t,a){function o(){return new e((function(e,n){i(t,a,e,n)}))}return n=n?n.then(o,o):o()}}function F(t,i){var a=t.iterator[i.method];if(a===e){if(i.delegate=null,"throw"===i.method){if(t.iterator.return&&(i.method="return",i.arg=e,F(t,i),"throw"===i.method))return h;i.method="throw",i.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var n=f(a,t.iterator,i.arg);if("throw"===n.type)return i.method="throw",i.arg=n.arg,i.delegate=null,h;var o=n.arg;return o?o.done?(i[t.resultName]=o.value,i.next=t.nextLoc,"return"!==i.method&&(i.method="next",i.arg=e),i.delegate=null,h):o:(i.method="throw",i.arg=new TypeError("iterator result is not an object"),i.delegate=null,h)}function T(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function N(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function L(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(T,this),this.reset(!0)}function M(t){if(t){var i=t[o];if(i)return i.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,r=function i(){for(;++n=0;--o){var r=this.tryEntries[o],s=r.completion;if("root"===r.tryLoc)return n("end");if(r.tryLoc<=this.prev){var l=a.call(r,"catchLoc"),u=a.call(r,"finallyLoc");if(l&&u){if(this.prev=0;--i){var n=this.tryEntries[i];if(n.tryLoc<=this.prev&&a.call(n,"finallyLoc")&&this.prev=0;--e){var i=this.tryEntries[e];if(i.finallyLoc===t)return this.complete(i.completion,i.afterLoc),N(i),h}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var i=this.tryEntries[e];if(i.tryLoc===t){var a=i.completion;if("throw"===a.type){var n=a.arg;N(i)}return n}}throw new Error("illegal catch attempt")},delegateYield:function(t,i,a){return this.delegate={iterator:M(t),resultName:i,nextLoc:a},"next"===this.method&&(this.arg=e),h}},t}(t.exports);try{regeneratorRuntime=e}catch(t){"object"==typeof globalThis?globalThis.regeneratorRuntime=e:Function("r","regeneratorRuntime = r")(e)}}},e={};function i(a){var n=e[a];if(void 0!==n)return n.exports;var o=e[a]={exports:{}};return t[a](o,o.exports,i),o.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var a in e)i.o(e,a)&&!i.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var a={};(()=>{"use strict";i.r(a),i.d(a,{components:()=>ut,extend:()=>xt});const t=flarum.core.compat["admin/app"];var e=i.n(t);function n(t,e){return n=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},n(t,e)}function o(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,n(t,e)}const r=flarum.core.compat["common/components/Button"];var s=i.n(r);const l=flarum.core.compat["admin/utils/saveSettings"];var u=i.n(l);const f=flarum.core.compat["common/components/Alert"];var d=i.n(f);const c=flarum.core.compat["common/components/Select"];var p=i.n(c);const h=flarum.core.compat["common/components/Switch"];var v=i.n(h);const g=flarum.core.compat["admin/components/UploadImageButton"];var b=function(t){function i(){return t.apply(this,arguments)||this}return o(i,t),i.prototype.resourceUrl=function(){return e().forum.attribute("apiUrl")+"/"+this.attrs.path},i}(i.n(g)());const y=flarum.core.compat["common/utils/withAttr"];var w=i.n(y);const x=flarum.core.compat["common/utils/Stream"];var _=i.n(x);const S=flarum.core.compat["admin/components/ExtensionPage"];var k=i.n(S);const F=flarum.core.compat["common/utils/ItemList"];var T=i.n(F);const N=flarum.core.compat["common/components/Modal"];var L=i.n(N);const M=flarum.core.compat["common/components/LoadingIndicator"];var P=i.n(M),O=function(t){function i(){return t.apply(this,arguments)||this}o(i,t);var a=i.prototype;return a.oninit=function(e){t.prototype.oninit.call(this,e),this.uploading=!1,this.inspection={}},a.className=function(){return"Modal--small fof-upload-inspect-mime-modal"},a.title=function(){return e().translator.trans("fof-upload.admin.inspect-mime.title")},a.content=function(){return m("div",{className:"Modal-body"},m("p",null,e().translator.trans("fof-upload.admin.inspect-mime.description",{a:m("a",{href:"https://github.com/SoftCreatR/php-mime-detector"})})),m("p",null,e().translator.trans("fof-upload.admin.inspect-mime.select")),m("div",null,m("input",{type:"file",onchange:this.onupload.bind(this),disabled:this.uploading}),this.uploading?P().component():null),m("dl",null,m("dt",null,e().translator.trans("fof-upload.admin.inspect-mime.laravel-validation")),m("dd",null,void 0===this.inspection.laravel_validation?m("em",null,e().translator.trans("fof-upload.admin.inspect-mime.no-file-selected")):this.inspection.laravel_validation?e().translator.trans("fof-upload.admin.inspect-mime.validation-passed"):e().translator.trans("fof-upload.admin.inspect-mime.validation-failed",{error:this.inspection.laravel_validation_error||"?"}))),m("dl",null,m("dt",null,e().translator.trans("fof-upload.admin.inspect-mime.mime-detector")),m("dd",null,this.inspection.mime_detector?m("code",null,this.inspection.mime_detector):m("em",null,e().translator.trans("fof-upload.admin.inspect-mime.not-available")))),m("dl",null,m("dt",null,e().translator.trans("fof-upload.admin.inspect-mime.mime-fileinfo")),m("dd",null,this.inspection.php_mime?m("code",null,this.inspection.php_mime):m("em",null,e().translator.trans("fof-upload.admin.inspect-mime.not-available")))),m("dl",null,m("dt",null,e().translator.trans("fof-upload.admin.inspect-mime.guessed-extension")),m("dd",null,this.inspection.guessed_extension?m("code",null,this.inspection.guessed_extension):m("em",null,e().translator.trans("fof-upload.admin.inspect-mime.not-available")))))},a.onupload=function(t){for(var i=this,a=new FormData,n=0;n=0&&"fof-file-selected"]),s=t.filesBeingHidden.includes(e.uuid());return m("li",{"aria-busy":s,key:e.uuid()},m(ot,{file:e,fileSelectable:o,isSelected:t.attrs.selectedFiles&&t.attrs.selectedFiles.indexOf(null!=(a=e.id())?a:"")>=0,fileClassNames:r,isFileHiding:s,onHide:t.hideFile.bind(t),onFileClick:t.onFileClick.bind(t),user:t.attrs.user,onDelete:t.onDelete.bind(t)}))})),this.hasMoreResults()&&m("div",{className:"fof-load-more-files"},m(s(),{className:"Button Button--primary",disabled:this.isLoading(),loading:this.isLoading(),onclick:function(){return t.loadMore()}},J().translator.trans("fof-upload.lib.file_list.load_more_files_btn")))))},i.onDelete=function(t){this.attrs.onDelete&&this.attrs.onDelete(t)},i.onFileClick=function(t){this.attrs.onFileSelect?this.attrs.onFileSelect(t):this.attrs.downloadOnClick&&window.open(t.url())},i.isSelectable=function(t){var e=t.type();return Array.isArray(this.restrictFileType)?this.restrictFileType.indexOf(e)>=0:"image"===this.restrictFileType?e.includes("image/"):"audio"===this.restrictFileType?e.includes("audio/"):"video"===this.restrictFileType&&e.includes("video/")},i.hideFile=function(){var t=W(K().mark((function t(e){var i,a,n,o,r;return K().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(i=e.uuid(),!this.filesBeingHidden.includes(i)){t.next=3;break}return t.abrupt("return");case 3:if(this.filesBeingHidden.push(i),a=e.isShared()?"fof-upload.lib.file_list.hide_shared_file":"fof-upload.lib.file_list.hide_file",!confirm(st()(J().translator.trans(e.hidden()?a+".show_confirmation":a+".hide_confirmation",{fileName:e.baseName()})))){t.next=24;break}return t.prev=7,t.next=10,J().request({method:"PATCH",url:J().forum.attribute("apiUrl")+"/fof/upload/hide",body:{uuid:i}});case 10:n=t.sent,J().store.pushPayload(n),m.redraw(),J().alerts.show(d(),{type:"success"},[B()(e.hidden()?"fas fa-eye-slash":"fas fa-eye")," ",J().translator.trans(null!=e&&e.hidden()?a+".hide_success":a+".show_success")]),this.fileState.user&&(o=this.fileState.files.findIndex((function(t){return i===t.uuid()})),this.fileState.files.splice(o,1)),t.next=20;break;case 17:t.prev=17,t.t0=t.catch(7),J().alerts.show(d(),{type:"error"},J().translator.trans(null!=e&&e.hidden()?a+".hide_fail":a+".show_fail",{fileName:e.baseName()}));case 20:return t.prev=20,r=this.filesBeingHidden.indexOf(i),this.filesBeingHidden.splice(r,1),t.finish(20);case 24:case"end":return t.stop()}}),t,this,[[7,17,20,24]])})));return function(e){return t.apply(this,arguments)}}(),e}($()),ut=H({},{UploadedFile:tt,UploadSharedFileModal:X,UserFileList:function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var i=e.prototype;return i.loadFileList=function(){this.fileState.setUser(this.attrs.user||J().session.user),this.user=this.fileState.user},i.hasMoreResults=function(){return this.fileState.hasMoreResults()},i.loadMore=function(){this.fileState.loadMore()},i.isLoading=function(){return this.fileState.isLoading()},i.fileCollection=function(){return this.fileState.files},e}(lt)},{UploadPage:I});const ft=flarum.core.compat["common/extenders"];var dt=i.n(ft);const ct=flarum.core.compat["common/Model"];var pt=i.n(ct),mt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var i=e.prototype;return i.baseName=function(){return pt().attribute("baseName").call(this)},i.path=function(){return pt().attribute("path").call(this)},i.url=function(){return pt().attribute("url").call(this)},i.size=function(){return pt().attribute("size").call(this)},i.type=function(){return pt().attribute("type").call(this)},i.humanSize=function(){return pt().attribute("humanSize").call(this)},i.createdAt=function(){return pt().attribute("createdAt",pt().transformDate).call(this)},i.uuid=function(){return pt().attribute("uuid").call(this)},i.tag=function(){return pt().attribute("tag").call(this)},i.hidden=function(){return pt().attribute("hidden").call(this)},i.bbcode=function(){return pt().attribute("bbcode").call(this)},i.isShared=function(){return pt().attribute("shared").call(this)},i.isPrivateShared=function(){return pt().attribute("isPrivateShared").call(this)},i.canViewInfo=function(){return pt().attribute("canViewInfo").call(this)},i.canHide=function(){return pt().attribute("canHide").call(this)},i.canDelete=function(){return pt().attribute("canDelete").call(this)},i.apiEndpoint=function(){return"/fof/uploads"+(this.exists?"/"+this.id():"")},e}(pt());const ht=[(new(dt().Store)).add("files",mt).add("shared-files",mt)],vt=flarum.core.compat["admin/components/AdminPage"];var gt=i.n(vt),bt=function(t){function e(){return t.apply(this,arguments)||this}o(e,t);var i=e.prototype;return i.loadFileList=function(){this.fileState.loadResults()},i.hasMoreResults=function(){return this.fileState.hasMoreResults()},i.loadMore=function(){this.fileState.loadMore()},i.isLoading=function(){return this.fileState.isLoading()},i.fileCollection=function(){return this.fileState.files},e}(lt),yt=function(){function t(t){void 0===t&&(t=!1),this.user=void 0,this.files=void 0,this.moreResults=void 0,this.loading=void 0,this.sharedFiles=void 0,this.user=null,this.files=[],this.moreResults=!1,this.loading=!1,this.sharedFiles=t}var e=t.prototype;return e.setUser=function(t){t!==this.user&&(this.user=t,this.files=[],this.loadResults())},e.refresh=function(){this.files=[],this.loadResults(),m.redraw()},e.loadResults=function(){var t=W(K().mark((function t(e){var i,a,n;return K().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===e&&(e=0),this.sharedFiles||this.user){t.next=3;break}return t.abrupt("return",Promise.reject("User not set"));case 3:return this.loading=!0,i="fof/uploads",a={},!this.sharedFiles&&this.user?a={filter:{user:this.user.id()},page:{offset:e}}:(i="fof/upload/shared-files",a={page:{offset:e}}),t.next=9,J().store.find(i,a);case 9:return n=t.sent,t.abrupt("return",this.parseResults(n));case 11:case"end":return t.stop()}}),t,this)})));return function(e){return t.apply(this,arguments)}}(),e.loadMore=function(){var t=W(K().mark((function t(){return K().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return this.loading=!0,t.abrupt("return",this.loadResults(this.files.length));case 2:case"end":return t.stop()}}),t,this)})));return function(){return t.apply(this,arguments)}}(),e.parseResults=function(t){var e,i;return this.files=t,this.loading=!1,this.moreResults=!(null==(e=t.payload)||null==(i=e.links)||!i.next),m.redraw(),t},e.addToList=function(t){var e;Array.isArray(t)?(e=this.files).unshift.apply(e,t):this.files.unshift(t),m.redraw()},e.removeFromList=function(t){Array.isArray(t)?this.files=this.files.filter((function(e){return!t.includes(e)})):this.files=this.files.filter((function(e){return e!==t})),m.redraw()},e.hasFiles=function(){return this.files.length>0},e.isLoading=function(){return this.loading},e.hasMoreResults=function(){return this.moreResults},e.empty=function(){return!this.hasFiles()&&!this.isLoading()},t}(),wt=function(t){function i(){for(var e,i=arguments.length,a=new Array(i),n=0;n result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/utils/saveSettings'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Alert'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Select'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/UploadImageButton'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/withAttr'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/Stream'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/ExtensionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","import app from 'flarum/admin/app';\nimport Modal from 'flarum/common/components/Modal';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\n\nexport default class InspectMimeModal extends Modal {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.uploading = false;\n this.inspection = {};\n }\n\n className() {\n return 'Modal--small fof-upload-inspect-mime-modal';\n }\n\n title() {\n return app.translator.trans('fof-upload.admin.inspect-mime.title');\n }\n\n content() {\n return (\n
\n

\n {app.translator.trans('fof-upload.admin.inspect-mime.description', {\n a: ,\n })}\n

\n

{app.translator.trans('fof-upload.admin.inspect-mime.select')}

\n
\n \n {this.uploading ? LoadingIndicator.component() : null}\n
\n
\n
{app.translator.trans('fof-upload.admin.inspect-mime.laravel-validation')}
\n
\n {typeof this.inspection.laravel_validation === 'undefined' ? (\n {app.translator.trans('fof-upload.admin.inspect-mime.no-file-selected')}\n ) : this.inspection.laravel_validation ? (\n app.translator.trans('fof-upload.admin.inspect-mime.validation-passed')\n ) : (\n app.translator.trans('fof-upload.admin.inspect-mime.validation-failed', {\n error: this.inspection.laravel_validation_error || '?',\n })\n )}\n
\n
\n
\n
{app.translator.trans('fof-upload.admin.inspect-mime.mime-detector')}
\n
\n {this.inspection.mime_detector ? (\n {this.inspection.mime_detector}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
\n
\n
\n
{app.translator.trans('fof-upload.admin.inspect-mime.mime-fileinfo')}
\n
\n {this.inspection.php_mime ? (\n {this.inspection.php_mime}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
\n
\n
\n
{app.translator.trans('fof-upload.admin.inspect-mime.guessed-extension')}
\n
\n {this.inspection.guessed_extension ? (\n {this.inspection.guessed_extension}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
\n
\n
\n );\n }\n\n onupload(event) {\n const body = new FormData();\n\n for (let i = 0; i < event.target.files.length; i++) {\n body.append('files[]', event.target.files[i]);\n }\n\n this.uploading = true;\n\n return app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload/inspect-mime',\n serialize: (raw) => raw,\n body,\n })\n .then((result) => {\n this.uploading = false;\n this.inspection = result;\n m.redraw();\n })\n .catch((error) => {\n this.uploading = false;\n this.inspection = {};\n m.redraw();\n\n throw error;\n });\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Link'];","import app from 'flarum/admin/app';\nimport Button from 'flarum/common/components/Button';\nimport saveSettings from 'flarum/admin/utils/saveSettings';\nimport Alert from 'flarum/common/components/Alert';\nimport Select from 'flarum/common/components/Select';\nimport Switch from 'flarum/common/components/Switch';\nimport UploadImageButton from 'flarum/admin/components/UploadImageButton';\nimport withAttr from 'flarum/common/utils/withAttr';\nimport Stream from 'flarum/common/utils/Stream';\nimport ExtensionPage from 'flarum/admin/components/ExtensionPage';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport InspectMimeModal from './InspectMimeModal';\nimport icon from 'flarum/common/helpers/icon';\nimport Link from 'flarum/common/components/Link';\n\n/* global m */\n\nexport default class UploadPage extends ExtensionPage {\n oninit(vnode) {\n super.oninit(vnode);\n // whether we are saving the settings or not right now\n this.loading = false;\n\n // the fields we need to watch and to save\n this.fields = [\n // image\n 'resizeMaxWidth',\n 'cdnUrl',\n 'maxFileSize',\n 'whitelistedClientExtensions',\n 'composerButtonVisiblity',\n // watermark\n 'watermark',\n 'watermarkPosition',\n // Imgur\n 'imgurClientId',\n // AWS\n 'awsS3Key',\n 'awsS3Secret',\n 'awsS3Bucket',\n 'awsS3Region',\n 'awsS3Endpoint',\n 'awsS3ACL',\n // QIniu\n 'qiniuKey',\n 'qiniuSecret',\n 'qiniuBucket',\n ];\n\n // the checkboxes we need to watch and to save.\n this.checkboxes = ['mustResize', 'addsWatermarks', 'disableHotlinkProtection', 'disableDownloadLogging', 'awsS3UsePathStyleEndpoint'];\n\n // fields that are objects\n this.objects = ['mimeTypes'];\n\n // watermark positions\n this.watermarkPositions = {\n 'top-left': 'top-left',\n 'top-right': 'top-right',\n 'bottom-left': 'bottom-left',\n 'bottom-right': 'bottom-right',\n center: 'center',\n left: 'left',\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n };\n\n // Composer button options\n this.composerButtonVisiblityOptions = {\n both: app.translator.trans('fof-upload.admin.labels.composer_buttons.options.both'),\n 'upload-btn': app.translator.trans('fof-upload.admin.labels.composer_buttons.options.upload-btn'),\n 'media-btn': app.translator.trans('fof-upload.admin.labels.composer_buttons.options.media-btn'),\n };\n\n // get the saved settings from the database\n const settings = app.data.settings;\n\n // our package prefix (to be added to every field and checkbox in the setting table)\n this.settingsPrefix = 'fof-upload';\n\n // Options for the Upload methods dropdown menu.\n this.uploadMethodOptions = settings[this.addPrefix('availableUploadMethods')] || {};\n // Options for the Template dropdown menu.\n this.templateOptions = settings[this.addPrefix('availableTemplates')] || {};\n // Contains current values.\n this.values = {};\n // bind the values of the fields and checkboxes to the getter/setter functions\n this.fields.forEach((key) => (this.values[key] = Stream(settings[this.addPrefix(key)])));\n this.checkboxes.forEach((key) => (this.values[key] = Stream(settings[this.addPrefix(key)] === '1')));\n this.objects.forEach((key) => (this.values[key] = settings[this.addPrefix(key)] ? Stream(JSON.parse(settings[this.addPrefix(key)])) : Stream()));\n\n // Set a sane default in case no mimeTypes have been configured yet.\n // Since 'local' (or others) can now be disabled, pick the last entry in the object for default\n this.defaultAdap = Object.keys(this.uploadMethodOptions)[Object.keys(this.uploadMethodOptions).length - 1];\n this.values.mimeTypes() ||\n (this.values.mimeTypes = Stream({\n '^image\\\\/.*': {\n adapter: this.defaultAdap,\n template: 'image-preview',\n },\n }));\n\n this.newMimeType = {\n regex: Stream(''),\n adapter: Stream(this.defaultAdap),\n template: Stream('file'),\n };\n }\n\n /**\n * Show the actual ImageUploadPage.\n *\n * @returns {*}\n */\n content() {\n const max_post = app.data.settings[this.addPrefix('php_ini.post_max_size')];\n const max_upload = app.data.settings[this.addPrefix('php_ini.upload_max_filesize')];\n return [\n m('.UploadPage', [\n m('.container', [\n m(\n 'form',\n {\n onsubmit: this.onsubmit.bind(this),\n },\n [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.preferences.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.preferences.max_file_size')),\n m('input.FormControl', {\n value: this.values.maxFileSize(),\n oninput: withAttr('value', this.values.maxFileSize),\n type: 'number',\n min: '0',\n }),\n m(\n '.helpText',\n app.translator.trans('fof-upload.admin.labels.preferences.php_ini_values', {\n post: max_post,\n upload: max_upload,\n })\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.preferences.mime_types')),\n m(\n '.MimeTypes--Container',\n Object.keys(this.values.mimeTypes()).map((mime) => {\n let config = this.values.mimeTypes()[mime];\n // Compatibility for older versions.\n if (typeof config !== 'object') {\n config = {\n adapter: config,\n template: 'file',\n };\n }\n\n return m('div', [\n m('input.FormControl.MimeTypes', {\n value: mime,\n oninput: withAttr('value', this.updateMimeTypeKey.bind(this, mime)),\n }),\n Select.component({\n options: this.uploadMethodOptions,\n onchange: this.updateMimeTypeAdapter.bind(this, mime, config),\n value: config.adapter || 'local',\n }),\n Select.component({\n options: this.getTemplateOptionsForInput(),\n onchange: this.updateMimeTypeTemplate.bind(this, mime, config),\n value: config.template || 'local',\n }),\n Button.component(\n {\n type: 'button',\n className: 'Button Button--warning',\n onclick: this.deleteMimeType.bind(this, mime),\n },\n 'x'\n ),\n ]);\n }),\n m('br'),\n m('div', [\n m('input.FormControl.MimeTypes.add-MimeType-key', {\n value: this.newMimeType.regex(),\n oninput: withAttr('value', this.newMimeType.regex),\n }),\n Select.component({\n options: this.uploadMethodOptions,\n className: 'add-MimeType-value',\n oninput: withAttr('value', this.newMimeType.adapter),\n value: this.newMimeType.adapter(),\n }),\n Select.component({\n options: this.getTemplateOptionsForInput(),\n className: 'add-MimeType-value',\n oninput: withAttr('value', this.newMimeType.template),\n value: this.newMimeType.template(),\n }),\n Button.component(\n {\n type: 'button',\n className: 'Button Button--warning',\n onclick: this.addMimeType.bind(this),\n },\n '+'\n ),\n ])\n ),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.mime_types')),\n Button.component(\n {\n className: 'Button',\n onclick() {\n app.modal.show(InspectMimeModal);\n },\n },\n app.translator.trans('fof-upload.admin.labels.inspect-mime')\n ),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.download_templates')),\n this.templateOptionsDescriptions(),\n ]),\n m('fieldset.composerButtons', [\n m('legend', app.translator.trans('fof-upload.admin.labels.composer_buttons.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.composer_buttons')),\n m('div', [\n Select.component({\n options: this.composerButtonVisiblityOptions,\n onchange: this.values.composerButtonVisiblity,\n value: this.values.composerButtonVisiblity() || 'both',\n }),\n ]),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.resize.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.resize')),\n Switch.component(\n {\n state: this.values.mustResize() || false,\n onchange: this.values.mustResize,\n },\n app.translator.trans('fof-upload.admin.labels.resize.toggle')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.resize.max_width')),\n m('input', {\n className: 'FormControl',\n value: this.values.resizeMaxWidth() || 100,\n oninput: withAttr('value', this.values.resizeMaxWidth),\n disabled: !this.values.mustResize(),\n type: 'number',\n min: '0',\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.client_extension.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.client_extension')),\n m('input', {\n className: 'FormControl',\n value: this.values.whitelistedClientExtensions() || '',\n oninput: withAttr('value', this.values.whitelistedClientExtensions),\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.watermark.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.watermark')),\n Switch.component(\n {\n state: this.values.addsWatermarks() || false,\n onchange: this.values.addsWatermarks,\n },\n app.translator.trans('fof-upload.admin.labels.watermark.toggle')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.watermark.position')),\n m('div', [\n Select.component({\n options: this.watermarkPositions,\n onchange: this.values.watermarkPosition,\n value: this.values.watermarkPosition() || 'bottom-right',\n }),\n ]),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.watermark.file')),\n UploadImageButton.component({\n name: 'fof/watermark',\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.disable-hotlink-protection.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.disable-hotlink-protection')),\n Switch.component(\n {\n state: this.values.disableHotlinkProtection() || false,\n onchange: this.values.disableHotlinkProtection,\n },\n app.translator.trans('fof-upload.admin.labels.disable-hotlink-protection.toggle')\n ),\n m('legend', app.translator.trans('fof-upload.admin.labels.disable-download-logging.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.disable-download-logging')),\n Switch.component(\n {\n state: this.values.disableDownloadLogging() || false,\n onchange: this.values.disableDownloadLogging,\n },\n app.translator.trans('fof-upload.admin.labels.disable-download-logging.toggle')\n ),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.local.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.local.cdn_url')),\n m('input.FormControl', {\n value: this.values.cdnUrl() || '',\n oninput: withAttr('value', this.values.cdnUrl),\n }),\n ]),\n\n this.adaptorItems().toArray(),\n\n Button.component(\n {\n type: 'submit',\n className: 'Button Button--primary',\n loading: this.loading,\n disabled: !this.changed(),\n },\n app.translator.trans('core.admin.settings.submit_button')\n ),\n ]\n ),\n ]),\n ]),\n ];\n }\n\n adaptorItems() {\n const items = new ItemList();\n\n if (this.uploadMethodOptions['imgur'] !== undefined) {\n items.add(\n 'imgur',\n
\n
\n {app.translator.trans('fof-upload.admin.labels.imgur.title')}\n

\n {icon('fas fa-exclamation-circle')}{' '}\n {app.translator.trans('fof-upload.admin.labels.imgur.tos', {\n a: ,\n })}\n

\n \n \n
\n
,\n 100\n );\n }\n\n if (this.uploadMethodOptions['qiniu'] !== undefined) {\n items.add(\n 'qiniu',\n m('.qiniu', [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.qiniu.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.qiniu.key')),\n m('input.FormControl', {\n value: this.values.qiniuKey() || '',\n oninput: withAttr('value', this.values.qiniuKey),\n }),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.qiniu.secret')),\n m('input.FormControl', {\n value: this.values.qiniuSecret() || '',\n oninput: withAttr('value', this.values.qiniuSecret),\n }),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.qiniu.bucket')),\n m('input.FormControl', {\n value: this.values.qiniuBucket() || '',\n oninput: withAttr('value', this.values.qiniuBucket),\n }),\n ]),\n ]),\n 80\n );\n }\n\n if (this.uploadMethodOptions['aws-s3'] !== undefined) {\n items.add(\n 'aws-s3',\n m('.aws', [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.aws-s3.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_instance_profile')),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.key')),\n m('input.FormControl', {\n value: this.values.awsS3Key() || '',\n oninput: withAttr('value', this.values.awsS3Key),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.secret')),\n m('input.FormControl', {\n value: this.values.awsS3Secret() || '',\n oninput: withAttr('value', this.values.awsS3Secret),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.bucket')),\n m('input.FormControl', {\n value: this.values.awsS3Bucket() || '',\n oninput: withAttr('value', this.values.awsS3Bucket),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.region')),\n m('input.FormControl', {\n value: this.values.awsS3Region() || '',\n oninput: withAttr('value', this.values.awsS3Region),\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.aws-s3.advanced_title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_compatible_storage')),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.endpoint')),\n m('input.FormControl', {\n value: this.values.awsS3Endpoint() || '',\n oninput: withAttr('value', this.values.awsS3Endpoint),\n }),\n Switch.component(\n {\n state: this.values.awsS3UsePathStyleEndpoint() || false,\n onchange: this.values.awsS3UsePathStyleEndpoint,\n },\n app.translator.trans('fof-upload.admin.labels.aws-s3.use_path_style_endpoint')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.acl')),\n m('input.FormControl', {\n value: this.values.awsS3ACL() || '',\n oninput: withAttr('value', this.values.awsS3ACL),\n }),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_acl')),\n ]),\n ]),\n 60\n );\n }\n\n return items;\n }\n\n getTemplateOptionsForInput() {\n const options = {};\n\n for (let option in this.templateOptions) {\n if (!this.templateOptions.hasOwnProperty(option)) {\n continue;\n }\n\n options[option] = this.templateOptions[option].name;\n }\n\n return options;\n }\n\n updateMimeTypeKey(mime, value) {\n this.values.mimeTypes()[value] = this.values.mimeTypes()[mime];\n\n this.deleteMimeType(mime);\n }\n\n updateMimeTypeAdapter(mime, config, value) {\n config.adapter = value;\n this.values.mimeTypes()[mime] = config;\n }\n\n updateMimeTypeTemplate(mime, config, value) {\n config.template = value;\n this.values.mimeTypes()[mime] = config;\n }\n\n deleteMimeType(mime) {\n delete this.values.mimeTypes()[mime];\n }\n\n templateOptionsDescriptions() {\n const children = [];\n\n for (let template in this.templateOptions) {\n if (!this.templateOptions.hasOwnProperty(template)) {\n continue;\n }\n\n children.push(\n
  • \n {this.templateOptions[template].name}: {m.trust(this.templateOptions[template].description)}\n
  • \n );\n }\n\n return m('ul', children);\n }\n\n addMimeType() {\n this.values.mimeTypes()[this.newMimeType.regex()] = {\n adapter: this.newMimeType.adapter(),\n template: this.newMimeType.template(),\n };\n\n this.newMimeType.regex('');\n this.newMimeType.adapter('local');\n this.newMimeType.template('file');\n }\n\n /**\n * Checks if the values of the fields and checkboxes are different from\n * the ones stored in the database\n *\n * @returns boolean\n */\n changed() {\n const fieldsCheck = this.fields.some((key) => this.values[key]() !== app.data.settings[this.addPrefix(key)]);\n const checkboxesCheck = this.checkboxes.some((key) => this.values[key]() !== (app.data.settings[this.addPrefix(key)] === '1'));\n const objectsCheck = this.objects.some((key) => JSON.stringify(this.values[key]()) !== app.data.settings[this.addPrefix(key)]);\n\n return fieldsCheck || checkboxesCheck || objectsCheck;\n }\n\n /**\n * Saves the settings to the database and redraw the page\n *\n * @param e\n */\n onsubmit(e) {\n // prevent the usual form submit behaviour\n e.preventDefault();\n\n // if the page is already saving, do nothing\n if (this.loading) return;\n\n // prevents multiple savings\n this.loading = true;\n\n // remove previous success popup\n app.alerts.dismiss(this.successAlert);\n\n const settings = {};\n\n // gets all the values from the form\n this.fields.forEach((key) => (settings[this.addPrefix(key)] = this.values[key]()));\n this.checkboxes.forEach((key) => (settings[this.addPrefix(key)] = this.values[key]()));\n this.objects.forEach((key) => (settings[this.addPrefix(key)] = JSON.stringify(this.values[key]())));\n\n // actually saves everything in the database\n saveSettings(settings)\n .then(() => {\n // on success, show popup\n this.successAlert = app.alerts.show(Alert, { type: 'success' }, app.translator.trans('core.admin.settings.saved_message'));\n })\n .catch(() => {})\n .then(() => {\n // return to the initial state and redraw the page\n this.loading = false;\n m.redraw();\n });\n }\n\n /**\n * Adds the prefix `this.settingsPrefix` at the beginning of `key`\n *\n * @returns string\n */\n addPrefix(key) {\n return this.settingsPrefix + '.' + key;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/AdminNav'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","const mimeToIconMap = new Map([\n // Image formats\n ['image/png', 'far fa-file-image'],\n ['image/jpg', 'far fa-file-image'],\n ['image/jpeg', 'far fa-file-image'],\n ['image/svg+xml', 'far fa-file-image'],\n ['image/gif', 'far fa-file-image'],\n ['image/bmp', 'far fa-file-image'],\n ['image/webp', 'far fa-file-image'],\n\n // Compressed file formats\n ['application/zip', 'far fa-file-archive'],\n ['application/x-7z-compressed', 'far fa-file-archive'],\n ['application/gzip', 'far fa-file-archive'],\n ['application/vnd.rar', 'far fa-file-archive'],\n ['application/x-rar-compressed', 'far fa-file-archive'],\n ['application/x-tar', 'far fa-file-archive'],\n ['application/x-iso9660-image', 'far fa-file-archive'],\n\n // Text and code file formats\n ['text/plain', 'far fa-file-alt'],\n ['text/csv', 'far fa-file-csv'],\n ['text/xml', 'far fa-file-code'],\n ['text/html', 'far fa-file-code'],\n ['text/css', 'far fa-file-code'],\n ['text/javascript', 'far fa-file-code'],\n ['application/json', 'far fa-file-code'],\n ['application/ld+json', 'far fa-file-code'],\n ['application/x-httpd-php', 'far fa-file-code'],\n ['application/xml', 'far fa-file-code'],\n ['text/xml', 'far fa-file-code'],\n\n // Document formats\n ['application/x-abiword', 'far fa-file-word'],\n ['application/msword', 'far fa-file-word'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'far fa-file-word'],\n ['application/vnd.oasis.opendocument.text', 'far fa-file-word'],\n ['application/vnd.ms-excel', 'far fa-file-excel'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'far fa-file-excel'],\n ['application/vnd.oasis.opendocument.spreadsheet', 'far fa-file-excel'],\n ['application/vnd.ms-powerpoint', 'far fa-file-powerpoint'],\n ['application/vnd.openxmlformats-officedocument.presentationml.presentation', 'far fa-file-powerpoint'],\n ['application/vnd.oasis.opendocument.presentation', 'far fa-file-powerpoint'],\n ['application/pdf', 'far fa-file-pdf'],\n ['application/rtf', 'far fa-file-alt'],\n\n // eBook formats\n ['application/epub+zip', 'far fa-book'],\n ['application/x-mobipocket-ebook', 'far fa-book'],\n ['application/vnd.amazon.ebook', 'far fa-book'],\n\n // Audio formats\n ['audio/mpeg', 'far fa-file-audio'],\n ['audio/wav', 'far fa-file-audio'],\n ['audio/x-wav', 'far fa-file-audio'],\n ['audio/aac', 'far fa-file-audio'],\n ['audio/ogg', 'far fa-file-audio'],\n ['audio/flac', 'far fa-file-audio'],\n ['audio/aiff', 'far fa-file-audio'],\n ['audio/x-aiff', 'far fa-file-audio'],\n\n // Video formats\n ['video/x-msvideo', 'far fa-file-video'],\n ['video/mp4', 'far fa-file-video'],\n ['video/quicktime', 'far fa-file-video'],\n]);\n\nexport default function mimeToIcon(fileType: string): string {\n // Directly return the icon if the fileType is in the map\n return (\n mimeToIconMap.get(fileType) ||\n (function () {\n // Check for generic types\n if (fileType.startsWith('image/')) {\n return 'far fa-file-image';\n } else if (fileType.startsWith('video/')) {\n return 'far fa-file-video';\n } else if (fileType.startsWith('audio/')) {\n return 'far fa-file-audio';\n }\n\n // Default icon\n return 'far fa-file';\n })()\n );\n}\n","import app from 'flarum/common/app';\nimport Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';\nimport Switch from 'flarum/common/components/Switch';\nimport mimeToIcon from '../mimeToIcon';\nimport Button from 'flarum/common/components/Button';\nimport type Mithril from 'mithril';\nimport { ApiResponsePlural } from 'flarum/common/Store';\nimport File from '../models/File';\n\ninterface CustomAttrs extends IInternalModalAttrs {\n onUploadComplete: (files: File | File[]) => void;\n}\n\nexport default class UploadSharedFileModal extends Modal {\n files = [];\n fileInput = null;\n options = {\n shared: true,\n hidden: false,\n };\n loading: boolean = false;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n }\n\n className() {\n return 'UploadSharedFileModal Modal--medium';\n }\n\n title() {\n return app.translator.trans('fof-upload.lib.upload-shared-file-modal.title');\n }\n\n onFileChange(e) {\n this.addFiles(Array.from(e.target.files));\n }\n\n addFiles(newFiles: File[]) {\n (this.files as File[]).push(...newFiles);\n m.redraw();\n }\n\n onDragOver(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer && e.dataTransfer.files) {\n this.addFiles(Array.from(e.dataTransfer.files));\n }\n }\n\n onDropzoneClick() {\n if (this.fileInput) {\n this.fileInput.click();\n }\n }\n\n content() {\n return (\n
    \n this.onDropzoneClick()}\n ondragover={this.onDragOver.bind(this)}\n ondrop={this.onDrop.bind(this)}\n >\n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.dropzone')}\n {\n this.fileInput = vnode.dom;\n }}\n />\n
    \n
    \n {this.files.map((file: File) => {\n const isImage = file.type.startsWith('image/');\n return (\n
    \n {isImage ? {file.name} : }\n
    {file.name}
    \n {/* Remove button */}\n {\n this.files = this.files.filter((f) => f !== file);\n }}\n />\n
    \n );\n })}\n
    \n
    \n (this.options.hidden = value)}>\n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.hide-from-media-gallery')}\n \n
    \n
    \n \n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.upload')}\n \n
    \n \n );\n }\n\n async upload() {\n this.loading = true;\n m.redraw();\n\n const formData = new FormData();\n\n // Append each file to the form data\n this.files.forEach((file) => {\n formData.append('files[]', file);\n });\n\n Object.keys(this.options).forEach((key) => {\n formData.append(`options[${key}]`, this.options[key]);\n });\n\n const results = await app.request>({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload',\n serialize: (raw: FormData) => raw, // Prevent mithril from trying to serialize FormData\n body: formData,\n });\n\n const uploadedFiles = app.store.pushPayload(results);\n\n this.attrs.onUploadComplete(uploadedFiles);\n this.files = [];\n this.hide();\n\n this.loading = false;\n m.redraw();\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Component'];","import Component, { ComponentAttrs } from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\nimport mimeToIcon from '../mimeToIcon';\nimport File from '../models/File';\nimport icon from 'flarum/common/helpers/icon';\nimport app from 'flarum/common/app';\nimport classList from 'flarum/common/utils/classList';\n\ninterface CustomAttrs extends ComponentAttrs {\n file: File;\n selectable: boolean;\n fileClassNames: string;\n onDelete: (file: File) => void | undefined;\n onFileSelect: (file: File) => void | undefined;\n}\n\nexport default class UploadedFile extends Component {\n file!: File;\n callback!: () => void | undefined;\n imageLoaded: boolean = true;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.file = this.attrs.file;\n }\n\n view() {\n const isImage = this.file.type().startsWith('image/');\n const fileIcon = mimeToIcon(this.file.type());\n const errorIcon = 'fas fa-exclamation-triangle';\n const statusIcon = this.file.isPrivateShared() ? 'fas fa-lock' : 'fas fa-unlock';\n\n return (\n
    \n
    \n \n {icon(statusIcon)}\n {this.file.baseName()}\n \n
    \n
    this.onFileClick(this.file)}>\n {isImage ? (\n this.imageLoaded ? (\n \n ) : (\n icon(errorIcon, { className: 'icon-fallback' }) // Error icon for failed image load\n )\n ) : (\n icon(fileIcon, { className: 'icon-fallback' }) // Icon representing the file type\n )}\n
    \n
    {this.actionItems().toArray()}
    \n
    \n );\n }\n\n actionItems(): ItemList {\n const items = new ItemList();\n\n items.add(\n 'view-info',\n \n \n )}\n \n \n );\n }\n\n onDelete(file: File) {\n if (this.attrs.onDelete) {\n this.attrs.onDelete(file);\n }\n }\n\n // Common methods like onFileClick, isSelectable, hideFile...\n\n onFileClick(file: File) {\n // Custom functionality\n if (this.attrs.onFileSelect) {\n this.attrs.onFileSelect(file);\n return;\n }\n\n // Download on click\n if (this.attrs.downloadOnClick) {\n window.open(file.url());\n return;\n }\n }\n\n isSelectable(file: File) {\n const fileType = file.type();\n\n // Custom defined file types\n if (Array.isArray(this.restrictFileType)) {\n return this.restrictFileType.indexOf(fileType) >= 0;\n }\n\n // Image\n else if (this.restrictFileType === 'image') {\n return fileType.includes('image/');\n }\n\n // Audio\n else if (this.restrictFileType === 'audio') {\n return fileType.includes('audio/');\n }\n\n // Video\n else if (this.restrictFileType === 'video') {\n return fileType.includes('video/');\n }\n\n return false;\n }\n\n /**\n * Begins the hiding process for a file.\n *\n * - Shows a native confirmation dialog\n * - If confirmed, sends AJAX request to the hide file API\n */\n async hideFile(file: File) {\n const uuid = file.uuid();\n\n if (this.filesBeingHidden.includes(uuid)) return;\n\n this.filesBeingHidden.push(uuid);\n\n const transPrefix = file.isShared() ? 'fof-upload.lib.file_list.hide_shared_file' : 'fof-upload.lib.file_list.hide_file';\n\n const confirmToggleHide = confirm(\n extractText(\n app.translator.trans(file.hidden() ? `${transPrefix}.show_confirmation` : `${transPrefix}.hide_confirmation`, {\n fileName: file.baseName(),\n })\n )\n );\n\n if (confirmToggleHide) {\n try {\n const filePayload = await app.request({\n method: 'PATCH',\n url: `${app.forum.attribute('apiUrl')}/fof/upload/hide`,\n body: { uuid },\n });\n\n app.store.pushPayload(filePayload);\n m.redraw();\n\n app.alerts.show(Alert, { type: 'success' }, [\n icon(file.hidden() ? 'fas fa-eye-slash' : 'fas fa-eye'),\n ' ',\n app.translator.trans(file?.hidden() ? `${transPrefix}.hide_success` : `${transPrefix}.show_success`),\n ]);\n\n if (this.fileState.user) {\n const index = this.fileState.files.findIndex((file: File) => uuid === file.uuid());\n this.fileState.files.splice(index, 1);\n }\n } catch (error) {\n app.alerts.show(\n Alert,\n { type: 'error' },\n app.translator.trans(file?.hidden() ? `${transPrefix}.hide_fail` : `${transPrefix}.show_fail`, {\n fileName: file.baseName(),\n })\n );\n } finally {\n // Remove file from hiding list\n const i = this.filesBeingHidden.indexOf(uuid);\n this.filesBeingHidden.splice(i, 1);\n }\n }\n }\n}\n","import UploadPage from './UploadPage';\nimport { commonComponents } from '../../common/components';\n\nexport const components = {\n ...commonComponents,\n UploadPage,\n};\n","import UploadSharedFileModal from './UploadSharedFileModal';\nimport UploadedFile from './UploadedFile';\nimport UserFileList from './UserFileList';\n\nexport const commonComponents = {\n UploadedFile,\n UploadSharedFileModal,\n UserFileList,\n};\n","import app from 'flarum/common/app';\nimport File from '../models/File';\nimport AbstractFileList from './AbstractFIleList';\nimport FileListState from '../states/FileListState';\n\nexport default class UserFileList extends AbstractFileList {\n public loadFileList(): void {\n //app.fileListState.setUser(this.attrs.user || app.session.user);\n this.fileState.setUser(this.attrs.user || app.session.user);\n /**\n * The user who's media we are dealing with\n */\n this.user = this.fileState.user; //app.fileListState.user;\n }\n\n hasMoreResults(): boolean {\n return this.fileState.hasMoreResults();\n }\n\n loadMore(): void {\n this.fileState.loadMore();\n }\n\n isLoading(): boolean {\n return this.fileState.isLoading();\n }\n\n fileCollection(): File[] {\n return this.fileState.files;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extenders'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","import Model from 'flarum/common/Model';\n\nexport default class File extends Model {\n baseName() {\n return Model.attribute('baseName').call(this);\n }\n\n path() {\n return Model.attribute('path').call(this);\n }\n\n url() {\n return Model.attribute('url').call(this);\n }\n\n size() {\n return Model.attribute('size').call(this);\n }\n\n type() {\n return Model.attribute('type').call(this);\n }\n\n humanSize() {\n return Model.attribute('humanSize').call(this);\n }\n\n createdAt() {\n return Model.attribute('createdAt', Model.transformDate).call(this);\n }\n\n uuid() {\n return Model.attribute('uuid').call(this);\n }\n\n tag() {\n return Model.attribute('tag').call(this);\n }\n\n hidden() {\n return Model.attribute('hidden').call(this);\n }\n\n bbcode() {\n return Model.attribute('bbcode').call(this);\n }\n\n isShared() {\n return Model.attribute('shared').call(this);\n }\n\n isPrivateShared() {\n return Model.attribute('isPrivateShared').call(this);\n }\n\n canViewInfo() {\n return Model.attribute('canViewInfo').call(this);\n }\n\n canHide() {\n return Model.attribute('canHide').call(this);\n }\n\n canDelete() {\n return Model.attribute('canDelete').call(this);\n }\n\n apiEndpoint() {\n return '/fof/uploads' + (this.exists ? '/' + this.id() : '');\n }\n}\n","import Extend from 'flarum/common/extenders';\nimport File from './models/File';\n\nexport default [\n new Extend.Store() //\n .add('files', File)\n .add('shared-files', File),\n];\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/AdminPage'];","import app from 'flarum/common/app';\nimport File from '../models/File';\nimport AbstractFileList from './AbstractFIleList';\n\nexport default class SharedFileList extends AbstractFileList {\n public loadFileList(): void {\n this.fileState.loadResults();\n }\n\n hasMoreResults() {\n return this.fileState.hasMoreResults();\n }\n\n loadMore() {\n this.fileState.loadMore();\n }\n\n isLoading(): boolean {\n return this.fileState.isLoading();\n }\n\n fileCollection(): File[] {\n return this.fileState.files;\n }\n}\n","import app from 'flarum/common/app';\nimport User from 'flarum/common/models/User';\nimport File from '../models/File';\nimport { ApiQueryParamsPlural, ApiResponsePlural } from 'flarum/common/Store';\n\nexport default class FileListState {\n public user: User | null;\n public files: File[];\n private moreResults: boolean;\n private loading: boolean;\n private sharedFiles: boolean;\n\n constructor(sharedFiles: boolean = false) {\n this.user = null;\n this.files = [];\n this.moreResults = false;\n this.loading = false;\n this.sharedFiles = sharedFiles;\n }\n\n /**\n * Set the user and load their file list.\n * @param user The user whose files to load.\n */\n public setUser(user: User): void {\n if (user === this.user) return;\n\n this.user = user;\n this.files = [];\n this.loadResults();\n }\n\n public refresh(): void {\n this.files = [];\n this.loadResults();\n m.redraw();\n }\n\n /**\n * Load more files for the current user, starting from the given offset.\n * @param offset The starting index for loading more files.\n * @returns A promise resolving to the loaded files.\n */\n public async loadResults(offset: number = 0): Promise> {\n if (!this.sharedFiles && !this.user) return Promise.reject('User not set');\n\n this.loading = true;\n\n let route: string = 'fof/uploads';\n let params: ApiQueryParamsPlural = {};\n\n if (!this.sharedFiles && this.user) {\n params = {\n filter: { user: this.user.id() },\n page: { offset },\n } as ApiQueryParamsPlural;\n } else {\n route = 'fof/upload/shared-files';\n params = {\n page: { offset },\n } as ApiQueryParamsPlural;\n }\n\n const results = await app.store.find(route, params);\n\n return this.parseResults(results);\n }\n\n /**\n * Load the next set of results.\n */\n public async loadMore(): Promise> {\n this.loading = true;\n return this.loadResults(this.files.length);\n }\n\n private parseResults(results: ApiResponsePlural): ApiResponsePlural {\n this.files = results;\n this.loading = false;\n this.moreResults = !!results.payload?.links?.next;\n m.redraw();\n return results;\n }\n\n /**\n * Add files to the beginning of the list.\n * @param files The files to be added.\n */\n public addToList(files: File | File[]): void {\n if (Array.isArray(files)) {\n this.files.unshift(...files);\n } else {\n this.files.unshift(files);\n }\n m.redraw();\n }\n\n /**\n * Remove files from the list.\n * @param files The files to be removed.\n */\n public removeFromList(files: File | File[]): void {\n if (Array.isArray(files)) {\n this.files = this.files.filter((file) => !files.includes(file));\n } else {\n this.files = this.files.filter((file) => file !== files);\n }\n\n m.redraw();\n }\n\n /**\n * Check if there are files in the list.\n * @returns True if there are files, false otherwise.\n */\n public hasFiles(): boolean {\n return this.files.length > 0;\n }\n\n /**\n * Check if the file list is currently loading.\n * @returns True if loading, false otherwise.\n */\n public isLoading(): boolean {\n return this.loading;\n }\n\n /**\n * Check if there are more files to load.\n * @returns True if there are more files, false otherwise.\n */\n public hasMoreResults(): boolean {\n return this.moreResults;\n }\n\n /**\n * Check if the user has no files and the list is not loading.\n * @returns True if the list is empty and not loading, false otherwise.\n */\n public empty(): boolean {\n return !this.hasFiles() && !this.isLoading();\n }\n}\n","import app from 'flarum/admin/app';\nimport AdminPage, { AdminHeaderAttrs } from 'flarum/admin/components/AdminPage';\nimport Button from 'flarum/common/components/Button';\nimport { IPageAttrs } from 'flarum/common/components/Page';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\nimport UploadSharedFileModal from '../../common/components/UploadSharedFileModal';\nimport File from 'src/common/models/File';\nimport SharedFileList from '../../common/components/SharedFileList';\nimport FileListState from '../../common/states/FileListState';\n\nexport default class SharedUploadPage extends AdminPage {\n sharedUploads: File[] = [];\n currentPage: number = 1;\n fileState!: FileListState;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.fileState = new FileListState(true);\n }\n\n headerInfo(): AdminHeaderAttrs {\n return {\n className: 'SharedUploadPage--header',\n icon: 'fas fa-file-upload',\n title: app.translator.trans('fof-upload.admin.shared-uploads.title'),\n description: app.translator.trans('fof-upload.admin.shared-uploads.description'),\n };\n }\n\n content(): Mithril.Children {\n return (\n
    \n

    {app.translator.trans('fof-upload.admin.shared-uploads.introduction')}

    \n
    \n
    {this.mainActionItems().toArray()}
    \n
    \n
    \n \n
    \n
    \n );\n }\n\n showUploadModal() {\n app.modal.show(UploadSharedFileModal, {\n onUploadComplete: (files: File | File[]) => {\n this.uploadComplete(files);\n },\n });\n }\n\n mainActionItems(): ItemList {\n const items = new ItemList();\n\n items.add('refresh', \n );\n\n return items;\n }\n\n fileActionItems(file: File): ItemList {\n const items = new ItemList();\n\n return items;\n }\n\n uploadComplete(files: File | File[]) {\n console.log('upload complete', files);\n this.fileState.addToList(files);\n }\n\n refresh() {\n this.fileState.refresh();\n }\n\n onDelete(file: File) {\n this.fileState.removeFromList(file);\n }\n}\n","import { default as extend } from '../common/extend';\nimport Extend from 'flarum/common/extenders';\nimport SharedUploadPage from './components/SharedUploadPage';\n\nexport default [\n ...extend,\n\n new Extend.Routes() //\n .add('adminUploads', '/uploads', SharedUploadPage),\n];\n","import app from 'flarum/admin/app';\nimport UploadPage from './components/UploadPage';\nimport extendAdminNav from './extendAdminNav';\nimport FileListState from '../common/states/FileListState';\n\nexport * from './components';\n\nexport { default as extend } from './extend';\n\napp.initializers.add('fof-upload', () => {\n app.extensionData\n .for('fof-upload')\n .registerPage(UploadPage)\n .registerPermission(\n {\n icon: 'far fa-file',\n label: app.translator.trans('fof-upload.admin.permissions.upload_label'),\n permission: 'fof-upload.upload',\n },\n 'start',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-download',\n label: app.translator.trans('fof-upload.admin.permissions.download_label'),\n permission: 'fof-upload.download',\n allowGuest: true,\n },\n 'view',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-eye',\n label: app.translator.trans('fof-upload.admin.permissions.view_user_uploads_label'),\n permission: 'fof-upload.viewUserUploads',\n },\n 'moderate',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-trash',\n label: app.translator.trans('fof-upload.admin.permissions.delete_uploads_of_others_label'),\n permission: 'fof-upload.deleteUserUploads',\n },\n 'moderate',\n 50\n )\n .registerPermission(\n {\n icon: 'far fa-file-alt',\n label: app.translator.trans('fof-upload.admin.permissions.upload_shared_label'),\n permission: 'fof-upload.upload-shared-files',\n },\n 'start'\n )\n .registerPermission(\n {\n icon: 'far fa-file-alt',\n label: app.translator.trans('fof-upload.admin.permissions.access_shared_label'),\n permission: 'fof-upload.access-shared-files',\n },\n 'start'\n );\n\n extendAdminNav();\n\n //app.fileListState = new FileListState();\n});\n","import app from 'flarum/admin/app';\nimport { extend } from 'flarum/common/extend';\nimport AdminNav from 'flarum/admin/components/AdminNav';\nimport LinkButton from 'flarum/common/components/LinkButton';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\n\nexport default function extendAdminNav() {\n extend(AdminNav.prototype, 'items', function (items: ItemList) {\n items.add(\n 'shared-uploads',\n \n {app.translator.trans('fof-upload.admin.nav.shared-uploads-button')}\n ,\n 49\n );\n });\n}\n"],"names":["module","exports","runtime","undefined","Op","Object","prototype","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","obj","key","value","defineProperty","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","_invoke","state","GenStateSuspendedStart","method","arg","GenStateExecuting","Error","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","done","GenStateSuspendedYield","makeInvokeMethod","fn","call","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","this","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","invoke","resolve","reject","result","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","a","definition","o","get","prop","r","flarum","core","compat","_setPrototypeOf","p","_inheritsLoose","subClass","superClass","InspectMimeModal","_Modal","apply","arguments","_proto","oninit","vnode","uploading","inspection","className","title","app","trans","content","m","href","onchange","onupload","bind","disabled","LoadingIndicator","laravel_validation","laravel_validation_error","mime_detector","php_mime","guessed_extension","event","_this","body","FormData","target","files","append","url","attribute","serialize","raw","redraw","Modal","UploadPage","_ExtensionPage","loading","fields","checkboxes","objects","watermarkPositions","center","left","top","right","bottom","composerButtonVisiblityOptions","both","settings","settingsPrefix","uploadMethodOptions","addPrefix","templateOptions","Stream","JSON","parse","defaultAdap","mimeTypes","adapter","template","newMimeType","regex","_this2","max_post","max_upload","onsubmit","maxFileSize","oninput","withAttr","min","post","upload","map","mime","config","updateMimeTypeKey","Select","options","updateMimeTypeAdapter","getTemplateOptionsForInput","updateMimeTypeTemplate","Button","onclick","deleteMimeType","addMimeType","show","templateOptionsDescriptions","composerButtonVisiblity","Switch","mustResize","resizeMaxWidth","whitelistedClientExtensions","addsWatermarks","watermarkPosition","UploadImageButton","disableHotlinkProtection","disableDownloadLogging","cdnUrl","adaptorItems","toArray","changed","items","ItemList","add","icon","Link","external","imgurClientId","qiniuKey","qiniuSecret","qiniuBucket","awsS3Key","awsS3Secret","awsS3Bucket","awsS3Region","awsS3Endpoint","awsS3UsePathStyleEndpoint","awsS3ACL","option","children","trust","description","_this3","fieldsCheck","some","checkboxesCheck","objectsCheck","stringify","e","_this4","preventDefault","dismiss","successAlert","saveSettings","Alert","ExtensionPage","_extends","assign","source","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","args","mimeToIconMap","Map","mimeToIcon","fileType","startsWith","UploadSharedFileModal","_len","Array","_key","concat","fileInput","shared","hidden","onFileChange","addFiles","from","newFiles","_ref","onDragOver","stopPropagation","onDrop","dataTransfer","onDropzoneClick","click","ondragover","ondrop","multiple","style","opacity","position","oncreate","dom","file","isImage","src","URL","createObjectURL","alt","filter","f","_upload","_regeneratorRuntime","_callee","formData","results","uploadedFiles","_context","pushPayload","attrs","onUploadComplete","hide","UploadedFile","_Component","callback","imageLoaded","handleImageError","handleImageLoad","view","fileIcon","statusIcon","isPrivateShared","uuid","baseName","onFileClick","fileClassNames","onerror","onload","actionItems","viewFileInfo","window","open","hideFileIcon","hideFile","confirmDelete","_confirmDelete","confirm","onDelete","console","log","onFileSelect","Component","DisplayFile","isFileHiding","isSelected","isSelectable","fileSelectable","onbeforeupdate","fileSelectedClass","draggable","displayIcon","Tooltip","text","class","role","display","alignItems","justifyContent","height","canViewInfo","transPrefix","isShared","canHide","fileName","canDelete","onHide","AbstractFileList","user","inModal","restrictFileType","downloadOnClick","filesBeingHidden","fileState","selectable","loadFileList","isLoading","fileCollection","_file$id","_file$id2","classList","selectedFiles","indexOf","id","includes","hasMoreResults","loadMore","isArray","_hideFile","filePayload","index","extractText","findIndex","splice","t0","_x","components","UserFileList","_AbstractFileList","setUser","File","_Model","Model","path","size","humanSize","createdAt","tag","bbcode","apiEndpoint","exists","Extend","SharedFileList","loadResults","FileListState","sharedFiles","moreResults","refresh","_loadResults","offset","route","params","page","find","parseResults","_loadMore","_callee2","_context2","_results$payload","_results$payload$link","payload","links","addToList","_this$files","unshift","removeFromList","hasFiles","empty","SharedUploadPage","_AdminPage","sharedUploads","currentPage","headerInfo","mainActionItems","showUploadModal","uploadComplete","fileActionItems","AdminPage","extend","registerPage","registerPermission","label","permission","allowGuest","AdminNav","LinkButton"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"admin.js","mappings":"2BAAAA,EAAOC,QAAU,EAAjBD,I,UCOA,IAAIE,EAAW,SAAUD,GACvB,aAEA,IAEIE,EAFAC,EAAKC,OAAOC,UACZC,EAASH,EAAGI,eAEZC,EAA4B,mBAAXC,OAAwBA,OAAS,CAAC,EACnDC,EAAiBF,EAAQG,UAAY,aACrCC,EAAsBJ,EAAQK,eAAiB,kBAC/CC,EAAoBN,EAAQO,aAAe,gBAE/C,SAASC,EAAOC,EAAKC,EAAKC,GAOxB,OANAf,OAAOgB,eAAeH,EAAKC,EAAK,CAC9BC,MAAOA,EACPE,YAAY,EACZC,cAAc,EACdC,UAAU,IAELN,EAAIC,EACb,CACA,IAEEF,EAAO,CAAC,EAAG,GACb,CAAE,MAAOQ,GACPR,EAAS,SAASC,EAAKC,EAAKC,GAC1B,OAAOF,EAAIC,GAAOC,CACpB,CACF,CAEA,SAASM,EAAKC,EAASC,EAASC,EAAMC,GAEpC,IAAIC,EAAiBH,GAAWA,EAAQtB,qBAAqB0B,EAAYJ,EAAUI,EAC/EC,EAAY5B,OAAO6B,OAAOH,EAAezB,WACzC6B,EAAU,IAAIC,EAAQN,GAAe,IAMzC,OAFAG,EAAUI,QAuMZ,SAA0BV,EAASE,EAAMM,GACvC,IAAIG,EAAQC,EAEZ,OAAO,SAAgBC,EAAQC,GAC7B,GAAIH,IAAUI,EACZ,MAAM,IAAIC,MAAM,gCAGlB,GAAIL,IAAUM,EAAmB,CAC/B,GAAe,UAAXJ,EACF,MAAMC,EAKR,OAAOI,GACT,CAKA,IAHAV,EAAQK,OAASA,EACjBL,EAAQM,IAAMA,IAED,CACX,IAAIK,EAAWX,EAAQW,SACvB,GAAIA,EAAU,CACZ,IAAIC,EAAiBC,EAAoBF,EAAUX,GACnD,GAAIY,EAAgB,CAClB,GAAIA,IAAmBE,EAAkB,SACzC,OAAOF,CACT,CACF,CAEA,GAAuB,SAAnBZ,EAAQK,OAGVL,EAAQe,KAAOf,EAAQgB,MAAQhB,EAAQM,SAElC,GAAuB,UAAnBN,EAAQK,OAAoB,CACrC,GAAIF,IAAUC,EAEZ,MADAD,EAAQM,EACFT,EAAQM,IAGhBN,EAAQiB,kBAAkBjB,EAAQM,IAEpC,KAA8B,WAAnBN,EAAQK,QACjBL,EAAQkB,OAAO,SAAUlB,EAAQM,KAGnCH,EAAQI,EAER,IAAIY,EAASC,EAAS5B,EAASE,EAAMM,GACrC,GAAoB,WAAhBmB,EAAOE,KAAmB,CAO5B,GAJAlB,EAAQH,EAAQsB,KACZb,EACAc,EAEAJ,EAAOb,MAAQQ,EACjB,SAGF,MAAO,CACL7B,MAAOkC,EAAOb,IACdgB,KAAMtB,EAAQsB,KAGlB,CAA2B,UAAhBH,EAAOE,OAChBlB,EAAQM,EAGRT,EAAQK,OAAS,QACjBL,EAAQM,IAAMa,EAAOb,IAEzB,CACF,CACF,CAnRsBkB,CAAiBhC,EAASE,EAAMM,GAE7CF,CACT,CAaA,SAASsB,EAASK,EAAI1C,EAAKuB,GACzB,IACE,MAAO,CAAEe,KAAM,SAAUf,IAAKmB,EAAGC,KAAK3C,EAAKuB,GAC7C,CAAE,MAAOhB,GACP,MAAO,CAAE+B,KAAM,QAASf,IAAKhB,EAC/B,CACF,CAlBAxB,EAAQyB,KAAOA,EAoBf,IAAIa,EAAyB,iBACzBmB,EAAyB,iBACzBhB,EAAoB,YACpBE,EAAoB,YAIpBK,EAAmB,CAAC,EAMxB,SAASjB,IAAa,CACtB,SAAS8B,IAAqB,CAC9B,SAASC,IAA8B,CAIvC,IAAIC,EAAoB,CAAC,EACzB/C,EAAO+C,EAAmBrD,GAAgB,WACxC,OAAOsD,IACT,IAEA,IAAIC,EAAW7D,OAAO8D,eAClBC,EAA0BF,GAAYA,EAASA,EAASG,EAAO,MAC/DD,GACAA,IAA4BhE,GAC5BG,EAAOsD,KAAKO,EAAyBzD,KAGvCqD,EAAoBI,GAGtB,IAAIE,EAAKP,EAA2BzD,UAClC0B,EAAU1B,UAAYD,OAAO6B,OAAO8B,GAYtC,SAASO,EAAsBjE,GAC7B,CAAC,OAAQ,QAAS,UAAUkE,SAAQ,SAAShC,GAC3CvB,EAAOX,EAAWkC,GAAQ,SAASC,GACjC,OAAOwB,KAAK5B,QAAQG,EAAQC,EAC9B,GACF,GACF,CA+BA,SAASgC,EAAcxC,EAAWyC,GAChC,SAASC,EAAOnC,EAAQC,EAAKmC,EAASC,GACpC,IAAIvB,EAASC,EAAStB,EAAUO,GAASP,EAAWQ,GACpD,GAAoB,UAAhBa,EAAOE,KAEJ,CACL,IAAIsB,EAASxB,EAAOb,IAChBrB,EAAQ0D,EAAO1D,MACnB,OAAIA,GACiB,iBAAVA,GACPb,EAAOsD,KAAKzC,EAAO,WACdsD,EAAYE,QAAQxD,EAAM2D,SAASC,MAAK,SAAS5D,GACtDuD,EAAO,OAAQvD,EAAOwD,EAASC,EACjC,IAAG,SAASpD,GACVkD,EAAO,QAASlD,EAAKmD,EAASC,EAChC,IAGKH,EAAYE,QAAQxD,GAAO4D,MAAK,SAASC,GAI9CH,EAAO1D,MAAQ6D,EACfL,EAAQE,EACV,IAAG,SAASI,GAGV,OAAOP,EAAO,QAASO,EAAON,EAASC,EACzC,GACF,CAzBEA,EAAOvB,EAAOb,IA0BlB,CAEA,IAAI0C,EAgCJlB,KAAK5B,QA9BL,SAAiBG,EAAQC,GACvB,SAAS2C,IACP,OAAO,IAAIV,GAAY,SAASE,EAASC,GACvCF,EAAOnC,EAAQC,EAAKmC,EAASC,EAC/B,GACF,CAEA,OAAOM,EAaLA,EAAkBA,EAAgBH,KAChCI,EAGAA,GACEA,GACR,CAKF,CA4GA,SAASpC,EAAoBF,EAAUX,GACrC,IAAIK,EAASM,EAASlC,SAASuB,EAAQK,QACvC,GAAIA,IAAWrC,EAAW,CAKxB,GAFAgC,EAAQW,SAAW,KAEI,UAAnBX,EAAQK,OAAoB,CAE9B,GAAIM,EAASlC,SAAiB,SAG5BuB,EAAQK,OAAS,SACjBL,EAAQM,IAAMtC,EACd6C,EAAoBF,EAAUX,GAEP,UAAnBA,EAAQK,QAGV,OAAOS,EAIXd,EAAQK,OAAS,QACjBL,EAAQM,IAAM,IAAI4C,UAChB,iDACJ,CAEA,OAAOpC,CACT,CAEA,IAAIK,EAASC,EAASf,EAAQM,EAASlC,SAAUuB,EAAQM,KAEzD,GAAoB,UAAhBa,EAAOE,KAIT,OAHArB,EAAQK,OAAS,QACjBL,EAAQM,IAAMa,EAAOb,IACrBN,EAAQW,SAAW,KACZG,EAGT,IAAIqC,EAAOhC,EAAOb,IAElB,OAAM6C,EAOFA,EAAK7B,MAGPtB,EAAQW,EAASyC,YAAcD,EAAKlE,MAGpCe,EAAQqD,KAAO1C,EAAS2C,QAQD,WAAnBtD,EAAQK,SACVL,EAAQK,OAAS,OACjBL,EAAQM,IAAMtC,GAUlBgC,EAAQW,SAAW,KACZG,GANEqC,GA3BPnD,EAAQK,OAAS,QACjBL,EAAQM,IAAM,IAAI4C,UAAU,oCAC5BlD,EAAQW,SAAW,KACZG,EA+BX,CAqBA,SAASyC,EAAaC,GACpB,IAAIC,EAAQ,CAAEC,OAAQF,EAAK,IAEvB,KAAKA,IACPC,EAAME,SAAWH,EAAK,IAGpB,KAAKA,IACPC,EAAMG,WAAaJ,EAAK,GACxBC,EAAMI,SAAWL,EAAK,IAGxB1B,KAAKgC,WAAWC,KAAKN,EACvB,CAEA,SAASO,EAAcP,GACrB,IAAItC,EAASsC,EAAMQ,YAAc,CAAC,EAClC9C,EAAOE,KAAO,gBACPF,EAAOb,IACdmD,EAAMQ,WAAa9C,CACrB,CAEA,SAASlB,EAAQN,GAIfmC,KAAKgC,WAAa,CAAC,CAAEJ,OAAQ,SAC7B/D,EAAY0C,QAAQkB,EAAczB,MAClCA,KAAKoC,OAAM,EACb,CA6BA,SAAShC,EAAOiC,GACd,GAAIA,EAAU,CACZ,IAAIC,EAAiBD,EAAS3F,GAC9B,GAAI4F,EACF,OAAOA,EAAe1C,KAAKyC,GAG7B,GAA6B,mBAAlBA,EAASd,KAClB,OAAOc,EAGT,IAAKE,MAAMF,EAASG,QAAS,CAC3B,IAAIC,GAAK,EAAGlB,EAAO,SAASA,IAC1B,OAASkB,EAAIJ,EAASG,QACpB,GAAIlG,EAAOsD,KAAKyC,EAAUI,GAGxB,OAFAlB,EAAKpE,MAAQkF,EAASI,GACtBlB,EAAK/B,MAAO,EACL+B,EAOX,OAHAA,EAAKpE,MAAQjB,EACbqF,EAAK/B,MAAO,EAEL+B,CACT,EAEA,OAAOA,EAAKA,KAAOA,CACrB,CACF,CAGA,MAAO,CAAEA,KAAM3C,EACjB,CAGA,SAASA,IACP,MAAO,CAAEzB,MAAOjB,EAAWsD,MAAM,EACnC,CA8MA,OA7mBAK,EAAkBxD,UAAYyD,EAC9B9C,EAAOqD,EAAI,cAAeP,GAC1B9C,EAAO8C,EAA4B,cAAeD,GAClDA,EAAkB6C,YAAc1F,EAC9B8C,EACAhD,EACA,qBAaFd,EAAQ2G,oBAAsB,SAASC,GACrC,IAAIC,EAAyB,mBAAXD,GAAyBA,EAAOE,YAClD,QAAOD,IACHA,IAAShD,GAG2B,uBAAnCgD,EAAKH,aAAeG,EAAKE,MAEhC,EAEA/G,EAAQgH,KAAO,SAASJ,GAQtB,OAPIxG,OAAO6G,eACT7G,OAAO6G,eAAeL,EAAQ9C,IAE9B8C,EAAOM,UAAYpD,EACnB9C,EAAO4F,EAAQ9F,EAAmB,sBAEpC8F,EAAOvG,UAAYD,OAAO6B,OAAOoC,GAC1BuC,CACT,EAMA5G,EAAQmH,MAAQ,SAAS3E,GACvB,MAAO,CAAEsC,QAAStC,EACpB,EAqEA8B,EAAsBE,EAAcnE,WACpCW,EAAOwD,EAAcnE,UAAWO,GAAqB,WACnD,OAAOoD,IACT,IACAhE,EAAQwE,cAAgBA,EAKxBxE,EAAQoH,MAAQ,SAAS1F,EAASC,EAASC,EAAMC,EAAa4C,QACxC,IAAhBA,IAAwBA,EAAc4C,SAE1C,IAAIC,EAAO,IAAI9C,EACb/C,EAAKC,EAASC,EAASC,EAAMC,GAC7B4C,GAGF,OAAOzE,EAAQ2G,oBAAoBhF,GAC/B2F,EACAA,EAAK/B,OAAOR,MAAK,SAASF,GACxB,OAAOA,EAAOrB,KAAOqB,EAAO1D,MAAQmG,EAAK/B,MAC3C,GACN,EAqKAjB,EAAsBD,GAEtBrD,EAAOqD,EAAIvD,EAAmB,aAO9BE,EAAOqD,EAAI3D,GAAgB,WACzB,OAAOsD,IACT,IAEAhD,EAAOqD,EAAI,YAAY,WACrB,MAAO,oBACT,IAiCArE,EAAQuH,KAAO,SAASC,GACtB,IAAID,EAAO,GACX,IAAK,IAAIrG,KAAOsG,EACdD,EAAKtB,KAAK/E,GAMZ,OAJAqG,EAAKE,UAIE,SAASlC,IACd,KAAOgC,EAAKf,QAAQ,CAClB,IAAItF,EAAMqG,EAAKG,MACf,GAAIxG,KAAOsG,EAGT,OAFAjC,EAAKpE,MAAQD,EACbqE,EAAK/B,MAAO,EACL+B,CAEX,CAMA,OADAA,EAAK/B,MAAO,EACL+B,CACT,CACF,EAoCAvF,EAAQoE,OAASA,EAMjBjC,EAAQ9B,UAAY,CAClByG,YAAa3E,EAEbiE,MAAO,SAASuB,GAcd,GAbA3D,KAAK4D,KAAO,EACZ5D,KAAKuB,KAAO,EAGZvB,KAAKf,KAAOe,KAAKd,MAAQhD,EACzB8D,KAAKR,MAAO,EACZQ,KAAKnB,SAAW,KAEhBmB,KAAKzB,OAAS,OACdyB,KAAKxB,IAAMtC,EAEX8D,KAAKgC,WAAWzB,QAAQ2B,IAEnByB,EACH,IAAK,IAAIZ,KAAQ/C,KAEQ,MAAnB+C,EAAKc,OAAO,IACZvH,EAAOsD,KAAKI,KAAM+C,KACjBR,OAAOQ,EAAKe,MAAM,MACrB9D,KAAK+C,GAAQ7G,EAIrB,EAEA6H,KAAM,WACJ/D,KAAKR,MAAO,EAEZ,IACIwE,EADYhE,KAAKgC,WAAW,GACLG,WAC3B,GAAwB,UAApB6B,EAAWzE,KACb,MAAMyE,EAAWxF,IAGnB,OAAOwB,KAAKiE,IACd,EAEA9E,kBAAmB,SAAS+E,GAC1B,GAAIlE,KAAKR,KACP,MAAM0E,EAGR,IAAIhG,EAAU8B,KACd,SAASmE,EAAOC,EAAKC,GAYnB,OAXAhF,EAAOE,KAAO,QACdF,EAAOb,IAAM0F,EACbhG,EAAQqD,KAAO6C,EAEXC,IAGFnG,EAAQK,OAAS,OACjBL,EAAQM,IAAMtC,KAGNmI,CACZ,CAEA,IAAK,IAAI5B,EAAIzC,KAAKgC,WAAWQ,OAAS,EAAGC,GAAK,IAAKA,EAAG,CACpD,IAAId,EAAQ3B,KAAKgC,WAAWS,GACxBpD,EAASsC,EAAMQ,WAEnB,GAAqB,SAAjBR,EAAMC,OAIR,OAAOuC,EAAO,OAGhB,GAAIxC,EAAMC,QAAU5B,KAAK4D,KAAM,CAC7B,IAAIU,EAAWhI,EAAOsD,KAAK+B,EAAO,YAC9B4C,EAAajI,EAAOsD,KAAK+B,EAAO,cAEpC,GAAI2C,GAAYC,EAAY,CAC1B,GAAIvE,KAAK4D,KAAOjC,EAAME,SACpB,OAAOsC,EAAOxC,EAAME,UAAU,GACzB,GAAI7B,KAAK4D,KAAOjC,EAAMG,WAC3B,OAAOqC,EAAOxC,EAAMG,WAGxB,MAAO,GAAIwC,GACT,GAAItE,KAAK4D,KAAOjC,EAAME,SACpB,OAAOsC,EAAOxC,EAAME,UAAU,OAG3B,KAAI0C,EAMT,MAAM,IAAI7F,MAAM,0CALhB,GAAIsB,KAAK4D,KAAOjC,EAAMG,WACpB,OAAOqC,EAAOxC,EAAMG,WAKxB,CACF,CACF,CACF,EAEA1C,OAAQ,SAASG,EAAMf,GACrB,IAAK,IAAIiE,EAAIzC,KAAKgC,WAAWQ,OAAS,EAAGC,GAAK,IAAKA,EAAG,CACpD,IAAId,EAAQ3B,KAAKgC,WAAWS,GAC5B,GAAId,EAAMC,QAAU5B,KAAK4D,MACrBtH,EAAOsD,KAAK+B,EAAO,eACnB3B,KAAK4D,KAAOjC,EAAMG,WAAY,CAChC,IAAI0C,EAAe7C,EACnB,KACF,CACF,CAEI6C,IACU,UAATjF,GACS,aAATA,IACDiF,EAAa5C,QAAUpD,GACvBA,GAAOgG,EAAa1C,aAGtB0C,EAAe,MAGjB,IAAInF,EAASmF,EAAeA,EAAarC,WAAa,CAAC,EAIvD,OAHA9C,EAAOE,KAAOA,EACdF,EAAOb,IAAMA,EAETgG,GACFxE,KAAKzB,OAAS,OACdyB,KAAKuB,KAAOiD,EAAa1C,WAClB9C,GAGFgB,KAAKyE,SAASpF,EACvB,EAEAoF,SAAU,SAASpF,EAAQ0C,GACzB,GAAoB,UAAhB1C,EAAOE,KACT,MAAMF,EAAOb,IAcf,MAXoB,UAAhBa,EAAOE,MACS,aAAhBF,EAAOE,KACTS,KAAKuB,KAAOlC,EAAOb,IACM,WAAhBa,EAAOE,MAChBS,KAAKiE,KAAOjE,KAAKxB,IAAMa,EAAOb,IAC9BwB,KAAKzB,OAAS,SACdyB,KAAKuB,KAAO,OACa,WAAhBlC,EAAOE,MAAqBwC,IACrC/B,KAAKuB,KAAOQ,GAGP/C,CACT,EAEA0F,OAAQ,SAAS5C,GACf,IAAK,IAAIW,EAAIzC,KAAKgC,WAAWQ,OAAS,EAAGC,GAAK,IAAKA,EAAG,CACpD,IAAId,EAAQ3B,KAAKgC,WAAWS,GAC5B,GAAId,EAAMG,aAAeA,EAGvB,OAFA9B,KAAKyE,SAAS9C,EAAMQ,WAAYR,EAAMI,UACtCG,EAAcP,GACP3C,CAEX,CACF,EAEA,MAAS,SAAS4C,GAChB,IAAK,IAAIa,EAAIzC,KAAKgC,WAAWQ,OAAS,EAAGC,GAAK,IAAKA,EAAG,CACpD,IAAId,EAAQ3B,KAAKgC,WAAWS,GAC5B,GAAId,EAAMC,SAAWA,EAAQ,CAC3B,IAAIvC,EAASsC,EAAMQ,WACnB,GAAoB,UAAhB9C,EAAOE,KAAkB,CAC3B,IAAIoF,EAAStF,EAAOb,IACpB0D,EAAcP,EAChB,CACA,OAAOgD,CACT,CACF,CAIA,MAAM,IAAIjG,MAAM,wBAClB,EAEAkG,cAAe,SAASvC,EAAUf,EAAYE,GAa5C,OAZAxB,KAAKnB,SAAW,CACdlC,SAAUyD,EAAOiC,GACjBf,WAAYA,EACZE,QAASA,GAGS,SAAhBxB,KAAKzB,SAGPyB,KAAKxB,IAAMtC,GAGN8C,CACT,GAOKhD,CAET,CAhtBe,CAqtBgBD,EAAOC,SAGtC,IACE6I,mBAAqB5I,CACvB,CAAE,MAAO6I,GAWmB,iBAAfC,WACTA,WAAWF,mBAAqB5I,EAEhC+I,SAAS,IAAK,yBAAdA,CAAwC/I,EAE5C,C,GChvBIgJ,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBjJ,IAAjBkJ,EACH,OAAOA,EAAapJ,QAGrB,IAAID,EAASkJ,EAAyBE,GAAY,CAGjDnJ,QAAS,CAAC,GAOX,OAHAqJ,EAAoBF,GAAUpJ,EAAQA,EAAOC,QAASkJ,GAG/CnJ,EAAOC,OACf,CCrBAkJ,EAAoBI,EAAKvJ,IACxB,IAAIwJ,EAASxJ,GAAUA,EAAOyJ,WAC7B,IAAOzJ,EAAiB,QACxB,IAAM,EAEP,OADAmJ,EAAoBO,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdL,EAAoBO,EAAI,CAACzJ,EAAS2J,KACjC,IAAI,IAAIzI,KAAOyI,EACXT,EAAoBU,EAAED,EAAYzI,KAASgI,EAAoBU,EAAE5J,EAASkB,IAC5Ed,OAAOgB,eAAepB,EAASkB,EAAK,CAAEG,YAAY,EAAMwI,IAAKF,EAAWzI,IAE1E,ECNDgI,EAAoBU,EAAI,CAAC3I,EAAK6I,IAAU1J,OAAOC,UAAUE,eAAeqD,KAAK3C,EAAK6I,GCClFZ,EAAoBa,EAAK/J,IACH,oBAAXS,QAA0BA,OAAOM,aAC1CX,OAAOgB,eAAepB,EAASS,OAAOM,YAAa,CAAEI,MAAO,WAE7Df,OAAOgB,eAAepB,EAAS,aAAc,CAAEmB,OAAO,GAAO,E,4ECL9D,MAAM,EAA+B6I,OAAOC,KAAKC,OAAO,a,aCAzC,SAASC,EAAgBP,EAAGQ,GAMzC,OALAD,EAAkB/J,OAAO6G,gBAAkB,SAAyB2C,EAAGQ,GAErE,OADAR,EAAE1C,UAAYkD,EACPR,CACT,EAEOO,EAAgBP,EAAGQ,EAC5B,CCNe,SAASC,EAAeC,EAAUC,GAC/CD,EAASjK,UAAYD,OAAO6B,OAAOsI,EAAWlK,WAC9CiK,EAASjK,UAAUyG,YAAcwD,EACjCrD,EAAeqD,EAAUC,EAC3B,CCLA,MAAM,EAA+BP,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,2B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,sC,ICGnCM,EAAiB,SAAAC,GAAA,SAAAD,IAAA,OAAAC,EAAAC,MAAA,KAAAC,YAAA,KAGnC,OAHmCN,EAAAG,EAAAC,GAAAD,EAAAnK,UACpCuK,YAAA,WACE,OAAOC,IAAAA,MAAUC,UAAU,UAAY,IAAM9G,KAAK+G,MAAMC,IAC1D,EAACR,CAAA,CAHmC,C,MAASS,ICH/C,MAAM,EAA+BjB,OAAOC,KAAKC,OAAO,yB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,uB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,kC,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,yB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,2B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,sC,aCInCgB,EAAgB,SAAAC,GAAA,SAAAD,IAAA,OAAAC,EAAAT,MAAA,KAAAC,YAAA,KAAAN,EAAAa,EAAAC,GAAA,IAAAC,EAAAF,EAAA7K,UAyGlC,OAzGkC+K,EACnCC,OAAA,SAAOC,GACLH,EAAA9K,UAAMgL,OAAMzH,KAAC,KAAA0H,GAEbtH,KAAKuH,WAAY,EACjBvH,KAAKwH,WAAa,CAAC,CACrB,EAACJ,EAEDK,UAAA,WACE,MAAO,4CACT,EAACL,EAEDM,MAAA,WACE,OAAOb,IAAAA,WAAec,MAAM,sCAC9B,EAACP,EAEDQ,QAAA,WACE,OACEC,EAAA,OAAKJ,UAAU,cACbI,EAAA,SACGhB,IAAAA,WAAec,MAAM,4CAA6C,CACjEjC,EAAGmC,EAAA,KAAGC,KAAK,uDAGfD,EAAA,SAAIhB,IAAAA,WAAec,MAAM,yCACzBE,EAAA,WACEA,EAAA,SAAOtI,KAAK,OAAOwI,SAAU/H,KAAKgI,SAASC,KAAKjI,MAAOkI,SAAUlI,KAAKuH,YACrEvH,KAAKuH,UAAYY,IAAAA,YAA+B,MAEnDN,EAAA,UACEA,EAAA,UAAKhB,IAAAA,WAAec,MAAM,qDAC1BE,EAAA,eACiD,IAAvC7H,KAAKwH,WAAWY,mBACtBP,EAAA,UAAKhB,IAAAA,WAAec,MAAM,mDACxB3H,KAAKwH,WAAWY,mBAClBvB,IAAAA,WAAec,MAAM,mDAErBd,IAAAA,WAAec,MAAM,kDAAmD,CACtE1G,MAAOjB,KAAKwH,WAAWa,0BAA4B,QAK3DR,EAAA,UACEA,EAAA,UAAKhB,IAAAA,WAAec,MAAM,gDAC1BE,EAAA,UACG7H,KAAKwH,WAAWc,cACfT,EAAA,YAAO7H,KAAKwH,WAAWc,eAEvBT,EAAA,UAAKhB,IAAAA,WAAec,MAAM,kDAIhCE,EAAA,UACEA,EAAA,UAAKhB,IAAAA,WAAec,MAAM,gDAC1BE,EAAA,UACG7H,KAAKwH,WAAWe,SACfV,EAAA,YAAO7H,KAAKwH,WAAWe,UAEvBV,EAAA,UAAKhB,IAAAA,WAAec,MAAM,kDAIhCE,EAAA,UACEA,EAAA,UAAKhB,IAAAA,WAAec,MAAM,oDAC1BE,EAAA,UACG7H,KAAKwH,WAAWgB,kBACfX,EAAA,YAAO7H,KAAKwH,WAAWgB,mBAEvBX,EAAA,UAAKhB,IAAAA,WAAec,MAAM,kDAMtC,EAACP,EAEDY,SAAA,SAASS,GAGP,IAHc,IAAAC,EAAA,KACRC,EAAO,IAAIC,SAERnG,EAAI,EAAGA,EAAIgG,EAAMI,OAAOC,MAAMtG,OAAQC,IAC7CkG,EAAKI,OAAO,UAAWN,EAAMI,OAAOC,MAAMrG,IAK5C,OAFAzC,KAAKuH,WAAY,EAEVV,IAAAA,QACI,CACPtI,OAAQ,OACRyK,IAAKnC,IAAAA,MAAUC,UAAU,UAAY,2BACrCmC,UAAW,SAACC,GAAG,OAAKA,CAAG,EACvBP,KAAAA,IAED5H,MAAK,SAACF,GACL6H,EAAKnB,WAAY,EACjBmB,EAAKlB,WAAa3G,EAClBgH,EAAEsB,QACJ,IAAE,OACK,SAAClI,GAKN,MAJAyH,EAAKnB,WAAY,EACjBmB,EAAKlB,WAAa,CAAC,EACnBK,EAAEsB,SAEIlI,CACR,GACJ,EAACiG,CAAA,CAzGkC,CAASkC,KCJ9C,MAAM,EAA+BpD,OAAOC,KAAKC,OAAO,uB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,0B,aCiBnCmD,EAAU,SAAAC,GAAA,SAAAD,IAAA,OAAAC,EAAA5C,MAAA,KAAAC,YAAA,KAAAN,EAAAgD,EAAAC,GAAA,IAAAlC,EAAAiC,EAAAhN,UAmiB5B,OAniB4B+K,EAC7BC,OAAA,SAAOC,GAAO,IAAAoB,EAAA,KACZY,EAAAjN,UAAMgL,OAAMzH,KAAC,KAAA0H,GAEbtH,KAAKuJ,SAAU,EAGfvJ,KAAKwJ,OAAS,CAEZ,iBACA,SACA,cACA,8BACA,0BAEA,YACA,oBAEA,gBAEA,WACA,cACA,cACA,cACA,gBACA,WAEA,WACA,cACA,eAIFxJ,KAAKyJ,WAAa,CAAC,aAAc,iBAAkB,2BAA4B,yBAA0B,6BAGzGzJ,KAAK0J,QAAU,CAAC,aAGhB1J,KAAK2J,mBAAqB,CACxB,WAAY,WACZ,YAAa,YACb,cAAe,cACf,eAAgB,eAChBC,OAAQ,SACRC,KAAM,OACNC,IAAK,MACLC,MAAO,QACPC,OAAQ,UAIVhK,KAAKiK,+BAAiC,CACpCC,KAAMrD,IAAAA,WAAec,MAAM,yDAC3B,aAAcd,IAAAA,WAAec,MAAM,+DACnC,YAAad,IAAAA,WAAec,MAAM,+DAIpC,IAAMwC,EAAWtD,IAAAA,KAASsD,SAG1BnK,KAAKoK,eAAiB,aAGtBpK,KAAKqK,oBAAsBF,EAASnK,KAAKsK,UAAU,4BAA8B,CAAC,EAElFtK,KAAKuK,gBAAkBJ,EAASnK,KAAKsK,UAAU,wBAA0B,CAAC,EAE1EtK,KAAKI,OAAS,CAAC,EAEfJ,KAAKwJ,OAAOjJ,SAAQ,SAACrD,GAAG,OAAMwL,EAAKtI,OAAOlD,GAAOsN,IAAOL,EAASzB,EAAK4B,UAAUpN,IAAM,IACtF8C,KAAKyJ,WAAWlJ,SAAQ,SAACrD,GAAG,OAAMwL,EAAKtI,OAAOlD,GAAOsN,IAAyC,MAAlCL,EAASzB,EAAK4B,UAAUpN,IAAc,IAClG8C,KAAK0J,QAAQnJ,SAAQ,SAACrD,GAAG,OAAMwL,EAAKtI,OAAOlD,GAAOiN,EAASzB,EAAK4B,UAAUpN,IAAQsN,IAAOC,KAAKC,MAAMP,EAASzB,EAAK4B,UAAUpN,MAAUsN,KAAQ,IAI9IxK,KAAK2K,YAAcvO,OAAOmH,KAAKvD,KAAKqK,qBAAqBjO,OAAOmH,KAAKvD,KAAKqK,qBAAqB7H,OAAS,GACxGxC,KAAKI,OAAOwK,cACT5K,KAAKI,OAAOwK,UAAYJ,IAAO,CAC9B,cAAe,CACbK,QAAS7K,KAAK2K,YACdG,SAAU,oBAIhB9K,KAAK+K,YAAc,CACjBC,MAAOR,IAAO,IACdK,QAASL,IAAOxK,KAAK2K,aACrBG,SAAUN,IAAO,QAErB,EAEApD,EAKAQ,QAAA,WAAU,IAAAqD,EAAA,KACFC,EAAWrE,IAAAA,KAASsD,SAASnK,KAAKsK,UAAU,0BAC5Ca,EAAatE,IAAAA,KAASsD,SAASnK,KAAKsK,UAAU,gCACpD,MAAO,CACLzC,EAAE,cAAe,CACfA,EAAE,aAAc,CACdA,EACE,OACA,CACEuD,SAAUpL,KAAKoL,SAASnD,KAAKjI,OAE/B,CACE6H,EAAE,WAAY,CACZA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,8CACjCE,EAAE,QAAShB,IAAAA,WAAec,MAAM,sDAChCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAOiL,cACnBC,QAASC,IAAS,QAASvL,KAAKI,OAAOiL,aACvC9L,KAAM,SACNiM,IAAK,MAEP3D,EACE,YACAhB,IAAAA,WAAec,MAAM,qDAAsD,CACzE8D,KAAMP,EACNQ,OAAQP,KAGZtD,EAAE,QAAShB,IAAAA,WAAec,MAAM,mDAChCE,EACE,wBACAzL,OAAOmH,KAAKvD,KAAKI,OAAOwK,aAAae,KAAI,SAACC,GACxC,IAAIC,EAASZ,EAAK7K,OAAOwK,YAAYgB,GASrC,MAPsB,iBAAXC,IACTA,EAAS,CACPhB,QAASgB,EACTf,SAAU,SAIPjD,EAAE,MAAO,CACdA,EAAE,8BAA+B,CAC/B1K,MAAOyO,EACPN,QAASC,IAAS,QAASN,EAAKa,kBAAkB7D,KAAKgD,EAAMW,MAE/DG,IAAAA,UAAiB,CACfC,QAASf,EAAKZ,oBACdtC,SAAUkD,EAAKgB,sBAAsBhE,KAAKgD,EAAMW,EAAMC,GACtD1O,MAAO0O,EAAOhB,SAAW,UAE3BkB,IAAAA,UAAiB,CACfC,QAASf,EAAKiB,6BACdnE,SAAUkD,EAAKkB,uBAAuBlE,KAAKgD,EAAMW,EAAMC,GACvD1O,MAAO0O,EAAOf,UAAY,UAE5BsB,IAAAA,UACE,CACE7M,KAAM,SACNkI,UAAW,yBACX4E,QAASpB,EAAKqB,eAAerE,KAAKgD,EAAMW,IAE1C,MAGN,IACA/D,EAAE,MACFA,EAAE,MAAO,CACPA,EAAE,+CAAgD,CAChD1K,MAAO6C,KAAK+K,YAAYC,QACxBM,QAASC,IAAS,QAASvL,KAAK+K,YAAYC,SAE9Ce,IAAAA,UAAiB,CACfC,QAAShM,KAAKqK,oBACd5C,UAAW,qBACX6D,QAASC,IAAS,QAASvL,KAAK+K,YAAYF,SAC5C1N,MAAO6C,KAAK+K,YAAYF,YAE1BkB,IAAAA,UAAiB,CACfC,QAAShM,KAAKkM,6BACdzE,UAAW,qBACX6D,QAASC,IAAS,QAASvL,KAAK+K,YAAYD,UAC5C3N,MAAO6C,KAAK+K,YAAYD,aAE1BsB,IAAAA,UACE,CACE7M,KAAM,SACNkI,UAAW,yBACX4E,QAASrM,KAAKuM,YAAYtE,KAAKjI,OAEjC,QAIN6H,EAAE,YAAahB,IAAAA,WAAec,MAAM,2CACpCyE,IAAAA,UACE,CACE3E,UAAW,SACX4E,QAAO,WACLxF,IAAAA,MAAU2F,KAAKtF,EACjB,GAEFL,IAAAA,WAAec,MAAM,yCAEvBE,EAAE,YAAahB,IAAAA,WAAec,MAAM,mDACpC3H,KAAKyM,gCAEP5E,EAAE,2BAA4B,CAC5BA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,mDACjCE,EAAE,YAAahB,IAAAA,WAAec,MAAM,iDACpCE,EAAE,MAAO,CACPkE,IAAAA,UAAiB,CACfC,QAAShM,KAAKiK,+BACdlC,SAAU/H,KAAKI,OAAOsM,wBACtBvP,MAAO6C,KAAKI,OAAOsM,2BAA6B,aAItD7E,EAAE,WAAY,CACZA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,yCACjCE,EAAE,YAAahB,IAAAA,WAAec,MAAM,uCACpCgF,IAAAA,UACE,CACEtO,MAAO2B,KAAKI,OAAOwM,eAAgB,EACnC7E,SAAU/H,KAAKI,OAAOwM,YAExB/F,IAAAA,WAAec,MAAM,0CAEvBE,EAAE,QAAShB,IAAAA,WAAec,MAAM,6CAChCE,EAAE,QAAS,CACTJ,UAAW,cACXtK,MAAO6C,KAAKI,OAAOyM,kBAAoB,IACvCvB,QAASC,IAAS,QAASvL,KAAKI,OAAOyM,gBACvC3E,UAAWlI,KAAKI,OAAOwM,aACvBrN,KAAM,SACNiM,IAAK,QAGT3D,EAAE,WAAY,CACZA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,mDACjCE,EAAE,YAAahB,IAAAA,WAAec,MAAM,iDACpCE,EAAE,QAAS,CACTJ,UAAW,cACXtK,MAAO6C,KAAKI,OAAO0M,+BAAiC,GACpDxB,QAASC,IAAS,QAASvL,KAAKI,OAAO0M,iCAG3CjF,EAAE,WAAY,CACZA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,4CACjCE,EAAE,YAAahB,IAAAA,WAAec,MAAM,0CACpCgF,IAAAA,UACE,CACEtO,MAAO2B,KAAKI,OAAO2M,mBAAoB,EACvChF,SAAU/H,KAAKI,OAAO2M,gBAExBlG,IAAAA,WAAec,MAAM,6CAEvBE,EAAE,QAAShB,IAAAA,WAAec,MAAM,+CAChCE,EAAE,MAAO,CACPkE,IAAAA,UAAiB,CACfC,QAAShM,KAAK2J,mBACd5B,SAAU/H,KAAKI,OAAO4M,kBACtB7P,MAAO6C,KAAKI,OAAO4M,qBAAuB,mBAG9CnF,EAAE,QAAS,CAAC,EAAGhB,IAAAA,WAAec,MAAM,2CACpCnB,EAAkByG,UAAU,CAC1BlK,KAAM,gBACNiE,KAAM,oBAGVa,EAAE,WAAY,CACZA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,6DACjCE,EAAE,YAAahB,IAAAA,WAAec,MAAM,2DACpCgF,IAAAA,UACE,CACEtO,MAAO2B,KAAKI,OAAO8M,6BAA8B,EACjDnF,SAAU/H,KAAKI,OAAO8M,0BAExBrG,IAAAA,WAAec,MAAM,8DAEvBE,EAAE,SAAUhB,IAAAA,WAAec,MAAM,2DACjCE,EAAE,YAAahB,IAAAA,WAAec,MAAM,yDACpCgF,IAAAA,UACE,CACEtO,MAAO2B,KAAKI,OAAO+M,2BAA4B,EAC/CpF,SAAU/H,KAAKI,OAAO+M,wBAExBtG,IAAAA,WAAec,MAAM,8DAGzBE,EAAE,WAAY,CACZA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,wCACjCE,EAAE,QAAShB,IAAAA,WAAec,MAAM,0CAChCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAOgN,UAAY,GAC/B9B,QAASC,IAAS,QAASvL,KAAKI,OAAOgN,YAI3CpN,KAAKqN,eAAeC,UAEpBlB,IAAAA,UACE,CACE7M,KAAM,SACNkI,UAAW,yBACX8B,QAASvJ,KAAKuJ,QACdrB,UAAWlI,KAAKuN,WAElB1G,IAAAA,WAAec,MAAM,4CAOnC,EAACP,EAEDiG,aAAA,WACE,IAAMG,EAAQ,IAAIC,KAwGlB,YAtG0CvR,IAAtC8D,KAAKqK,oBAA2B,OAClCmD,EAAME,IACJ,QACA7F,EAAA,OAAKJ,UAAU,SACbI,EAAA,gBACEA,EAAA,cAAShB,IAAAA,WAAec,MAAM,wCAC9BE,EAAA,SACG8F,IAAK,6BAA8B,IACnC9G,IAAAA,WAAec,MAAM,oCAAqC,CACzDjC,EAAGmC,EAAC+F,IAAI,CAAC9F,KAAK,wBAAwB+F,UAAU,EAAMhF,OAAO,cAGjEhB,EAAA,aAAQhB,IAAAA,WAAec,MAAM,4CAC7BE,EAAA,SAAOJ,UAAU,cAActK,MAAO6C,KAAKI,OAAO0N,iBAAmB,GAAIxC,QAASC,IAAS,QAASvL,KAAKI,OAAO0N,mBAGpH,UAIsC5R,IAAtC8D,KAAKqK,oBAA2B,OAClCmD,EAAME,IACJ,QACA7F,EAAE,SAAU,CACVA,EAAE,WAAY,CACZA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,wCACjCE,EAAE,QAAShB,IAAAA,WAAec,MAAM,sCAChCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAO2N,YAAc,GACjCzC,QAASC,IAAS,QAASvL,KAAKI,OAAO2N,YAEzClG,EAAE,QAAS,CAAC,EAAGhB,IAAAA,WAAec,MAAM,yCACpCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAO4N,eAAiB,GACpC1C,QAASC,IAAS,QAASvL,KAAKI,OAAO4N,eAEzCnG,EAAE,QAAS,CAAC,EAAGhB,IAAAA,WAAec,MAAM,yCACpCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAO6N,eAAiB,GACpC3C,QAASC,IAAS,QAASvL,KAAKI,OAAO6N,mBAI7C,SAIuC/R,IAAvC8D,KAAKqK,oBAAoB,WAC3BmD,EAAME,IACJ,SACA7F,EAAE,OAAQ,CACRA,EAAE,WAAY,CACZA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,yCACjCE,EAAE,YAAahB,IAAAA,WAAec,MAAM,oDACpCE,EAAE,QAAShB,IAAAA,WAAec,MAAM,uCAChCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAO8N,YAAc,GACjC5C,QAASC,IAAS,QAASvL,KAAKI,OAAO8N,YAEzCrG,EAAE,QAAShB,IAAAA,WAAec,MAAM,0CAChCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAO+N,eAAiB,GACpC7C,QAASC,IAAS,QAASvL,KAAKI,OAAO+N,eAEzCtG,EAAE,QAAShB,IAAAA,WAAec,MAAM,0CAChCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAOgO,eAAiB,GACpC9C,QAASC,IAAS,QAASvL,KAAKI,OAAOgO,eAEzCvG,EAAE,QAAShB,IAAAA,WAAec,MAAM,0CAChCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAOiO,eAAiB,GACpC/C,QAASC,IAAS,QAASvL,KAAKI,OAAOiO,iBAG3CxG,EAAE,WAAY,CACZA,EAAE,SAAUhB,IAAAA,WAAec,MAAM,kDACjCE,EAAE,YAAahB,IAAAA,WAAec,MAAM,sDACpCE,EAAE,QAAShB,IAAAA,WAAec,MAAM,4CAChCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAOkO,iBAAmB,GACtChD,QAASC,IAAS,QAASvL,KAAKI,OAAOkO,iBAEzC3B,IAAAA,UACE,CACEtO,MAAO2B,KAAKI,OAAOmO,8BAA+B,EAClDxG,SAAU/H,KAAKI,OAAOmO,2BAExB1H,IAAAA,WAAec,MAAM,2DAEvBE,EAAE,QAAShB,IAAAA,WAAec,MAAM,uCAChCE,EAAE,oBAAqB,CACrB1K,MAAO6C,KAAKI,OAAOoO,YAAc,GACjClD,QAASC,IAAS,QAASvL,KAAKI,OAAOoO,YAEzC3G,EAAE,YAAahB,IAAAA,WAAec,MAAM,2CAGxC,IAIG6F,CACT,EAACpG,EAED8E,2BAAA,WACE,IAAMF,EAAU,CAAC,EAEjB,IAAK,IAAIyC,KAAUzO,KAAKuK,gBACjBvK,KAAKuK,gBAAgBhO,eAAekS,KAIzCzC,EAAQyC,GAAUzO,KAAKuK,gBAAgBkE,GAAQ1L,MAGjD,OAAOiJ,CACT,EAAC5E,EAED0E,kBAAA,SAAkBF,EAAMzO,GACtB6C,KAAKI,OAAOwK,YAAYzN,GAAS6C,KAAKI,OAAOwK,YAAYgB,GAEzD5L,KAAKsM,eAAeV,EACtB,EAACxE,EAED6E,sBAAA,SAAsBL,EAAMC,EAAQ1O,GAClC0O,EAAOhB,QAAU1N,EACjB6C,KAAKI,OAAOwK,YAAYgB,GAAQC,CAClC,EAACzE,EAED+E,uBAAA,SAAuBP,EAAMC,EAAQ1O,GACnC0O,EAAOf,SAAW3N,EAClB6C,KAAKI,OAAOwK,YAAYgB,GAAQC,CAClC,EAACzE,EAEDkF,eAAA,SAAeV,UACN5L,KAAKI,OAAOwK,YAAYgB,EACjC,EAACxE,EAEDqF,4BAAA,WACE,IAAMiC,EAAW,GAEjB,IAAK,IAAI5D,KAAY9K,KAAKuK,gBACnBvK,KAAKuK,gBAAgBhO,eAAeuO,IAIzC4D,EAASzM,KACP4F,EAAA,UACG7H,KAAKuK,gBAAgBO,GAAU/H,KAAK,KAAG8E,EAAE8G,MAAM3O,KAAKuK,gBAAgBO,GAAU8D,eAKrF,OAAO/G,EAAE,KAAM6G,EACjB,EAACtH,EAEDmF,YAAA,WACEvM,KAAKI,OAAOwK,YAAY5K,KAAK+K,YAAYC,SAAW,CAClDH,QAAS7K,KAAK+K,YAAYF,UAC1BC,SAAU9K,KAAK+K,YAAYD,YAG7B9K,KAAK+K,YAAYC,MAAM,IACvBhL,KAAK+K,YAAYF,QAAQ,SACzB7K,KAAK+K,YAAYD,SAAS,OAC5B,EAEA1D,EAMAmG,QAAA,WAAU,IAAAsB,EAAA,KACFC,EAAc9O,KAAKwJ,OAAOuF,MAAK,SAAC7R,GAAG,OAAK2R,EAAKzO,OAAOlD,OAAW2J,IAAAA,KAASsD,SAAS0E,EAAKvE,UAAUpN,GAAK,IACrG8R,EAAkBhP,KAAKyJ,WAAWsF,MAAK,SAAC7R,GAAG,OAAK2R,EAAKzO,OAAOlD,QAAuD,MAA3C2J,IAAAA,KAASsD,SAAS0E,EAAKvE,UAAUpN,IAAc,IACvH+R,EAAejP,KAAK0J,QAAQqF,MAAK,SAAC7R,GAAG,OAAKuN,KAAKyE,UAAUL,EAAKzO,OAAOlD,QAAY2J,IAAAA,KAASsD,SAAS0E,EAAKvE,UAAUpN,GAAK,IAE7H,OAAO4R,GAAeE,GAAmBC,CAC3C,EAEA7H,EAKAgE,SAAA,SAAS+D,GAAG,IAAAC,EAAA,KAKV,GAHAD,EAAEE,kBAGErP,KAAKuJ,QAAT,CAGAvJ,KAAKuJ,SAAU,EAGf1C,IAAAA,OAAWyI,QAAQtP,KAAKuP,cAExB,IAAMpF,EAAW,CAAC,EAGlBnK,KAAKwJ,OAAOjJ,SAAQ,SAACrD,GAAG,OAAMiN,EAASiF,EAAK9E,UAAUpN,IAAQkS,EAAKhP,OAAOlD,IAAM,IAChF8C,KAAKyJ,WAAWlJ,SAAQ,SAACrD,GAAG,OAAMiN,EAASiF,EAAK9E,UAAUpN,IAAQkS,EAAKhP,OAAOlD,IAAM,IACpF8C,KAAK0J,QAAQnJ,SAAQ,SAACrD,GAAG,OAAMiN,EAASiF,EAAK9E,UAAUpN,IAAQuN,KAAKyE,UAAUE,EAAKhP,OAAOlD,KAAO,IAGjGsS,IAAarF,GACVpJ,MAAK,WAEJqO,EAAKG,aAAe1I,IAAAA,OAAW2F,KAAKiD,IAAO,CAAElQ,KAAM,WAAasH,IAAAA,WAAec,MAAM,qCACvF,IAAE,OACK,WAAO,IACb5G,MAAK,WAEJqO,EAAK7F,SAAU,EACf1B,EAAEsB,QACJ,GA1BsB,CA2B1B,EAEA/B,EAKAkD,UAAA,SAAUpN,GACR,OAAO8C,KAAKoK,eAAiB,IAAMlN,CACrC,EAACmM,CAAA,CAniB4B,CAASqG,KCjBxC,MAAM,EAA+B1J,OAAOC,KAAKC,OAAO,iBCAlD,EAA+BF,OAAOC,KAAKC,OAAO,6B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,gC,aCAzC,SAASyJ,IAetB,OAdAA,EAAWvT,OAAOwT,QAAU,SAAU/G,GACpC,IAAK,IAAIpG,EAAI,EAAGA,EAAIkE,UAAUnE,OAAQC,IAAK,CACzC,IAAIoN,EAASlJ,UAAUlE,GAEvB,IAAK,IAAIvF,KAAO2S,EACVzT,OAAOC,UAAUE,eAAeqD,KAAKiQ,EAAQ3S,KAC/C2L,EAAO3L,GAAO2S,EAAO3S,GAG3B,CAEA,OAAO2L,CACT,EAEO8G,EAASjJ,MAAM1G,KAAM2G,UAC9B,CChBA,SAASmJ,EAAmBC,EAAKpP,EAASC,EAAQoP,EAAOC,EAAQ/S,EAAKsB,GACpE,IACE,IAAI6C,EAAO0O,EAAI7S,GAAKsB,GAChBrB,EAAQkE,EAAKlE,KACnB,CAAE,MAAO8D,GAEP,YADAL,EAAOK,EAET,CAEII,EAAK7B,KACPmB,EAAQxD,GAERkG,QAAQ1C,QAAQxD,GAAO4D,KAAKiP,EAAOC,EAEvC,CAEe,SAASC,EAAkBvQ,GACxC,OAAO,WACL,IAAI/B,EAAOoC,KACPmQ,EAAOxJ,UACX,OAAO,IAAItD,SAAQ,SAAU1C,EAASC,GACpC,IAAImP,EAAMpQ,EAAG+G,MAAM9I,EAAMuS,GAEzB,SAASH,EAAM7S,GACb2S,EAAmBC,EAAKpP,EAASC,EAAQoP,EAAOC,EAAQ,OAAQ9S,EAClE,CAEA,SAAS8S,EAAOzS,GACdsS,EAAmBC,EAAKpP,EAASC,EAAQoP,EAAOC,EAAQ,QAASzS,EACnE,CAEAwS,OAAM9T,EACR,GACF,CACF,C,sBClCA,MAAM,EAA+B8J,OAAOC,KAAKC,OAAO,c,aCAlDkK,EAAgB,IAAIC,IAAoB,CAE5C,CAAC,YAAa,qBACd,CAAC,YAAa,qBACd,CAAC,aAAc,qBACf,CAAC,gBAAiB,qBAClB,CAAC,YAAa,qBACd,CAAC,YAAa,qBACd,CAAC,aAAc,qBAGf,CAAC,kBAAmB,uBACpB,CAAC,8BAA+B,uBAChC,CAAC,mBAAoB,uBACrB,CAAC,sBAAuB,uBACxB,CAAC,+BAAgC,uBACjC,CAAC,oBAAqB,uBACtB,CAAC,8BAA+B,uBAGhC,CAAC,aAAc,mBACf,CAAC,WAAY,mBACb,CAAC,WAAY,oBACb,CAAC,YAAa,oBACd,CAAC,WAAY,oBACb,CAAC,kBAAmB,oBACpB,CAAC,mBAAoB,oBACrB,CAAC,sBAAuB,oBACxB,CAAC,0BAA2B,oBAC5B,CAAC,kBAAmB,oBACpB,CAAC,WAAY,oBAGb,CAAC,wBAAyB,oBAC1B,CAAC,qBAAsB,oBACvB,CAAC,0EAA2E,oBAC5E,CAAC,0CAA2C,oBAC5C,CAAC,2BAA4B,qBAC7B,CAAC,oEAAqE,qBACtE,CAAC,iDAAkD,qBACnD,CAAC,gCAAiC,0BAClC,CAAC,4EAA6E,0BAC9E,CAAC,kDAAmD,0BACpD,CAAC,kBAAmB,mBACpB,CAAC,kBAAmB,mBAGpB,CAAC,uBAAwB,eACzB,CAAC,iCAAkC,eACnC,CAAC,+BAAgC,eAGjC,CAAC,aAAc,qBACf,CAAC,YAAa,qBACd,CAAC,cAAe,qBAChB,CAAC,YAAa,qBACd,CAAC,YAAa,qBACd,CAAC,aAAc,qBACf,CAAC,aAAc,qBACf,CAAC,eAAgB,qBAGjB,CAAC,kBAAmB,qBACpB,CAAC,YAAa,qBACd,CAAC,kBAAmB,uBAGP,SAASC,EAAWC,GAEjC,OACEH,EAAcvK,IAAI0K,KAGZA,EAASC,WAAW,UACf,oBACED,EAASC,WAAW,UACtB,oBACED,EAASC,WAAW,UACtB,oBAIF,cAGb,CCjFqD,IAShCC,EAAqB,SAAAtJ,GAAA,SAAAsJ,IAAA,QAAA/H,EAAAgI,EAAA/J,UAAAnE,OAAA2N,EAAA,IAAAQ,MAAAD,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAAT,EAAAS,GAAAjK,UAAAiK,GAOhB,OAPgBlI,EAAAvB,EAAAvH,KAAA8G,MAAAS,EAAA,OAAA0J,OAAAV,KAAA,MACxCrH,MAAQ,GAAEJ,EACVoI,UAAY,KAAIpI,EAChBsD,QAAU,CACR+E,QAAQ,EACRC,QAAQ,GACTtI,EACDa,SAAmB,EAAKb,CAAA,CAPgBrC,EAAAoK,EAAAtJ,GAOhB,IAAAC,EAAAqJ,EAAApU,UAkIvB,OAlIuB+K,EAExBC,OAAA,SAAOC,GACLH,EAAA9K,UAAMgL,OAAMzH,KAAC,KAAA0H,EACf,EAACF,EAEDK,UAAA,WACE,MAAO,qCACT,EAACL,EAEDM,MAAA,WACE,OAAOb,IAAAA,WAAec,MAAM,gDAC9B,EAACP,EAED6J,aAAA,SAAa9B,GACXnP,KAAKkR,SAASP,MAAMQ,KAAKhC,EAAEtG,OAAOC,OACpC,EAAC1B,EAED8J,SAAA,SAASE,GAAkB,IAAAC,GACzBA,EAACrR,KAAK8I,OAAiB7G,KAAIyE,MAAA2K,EAAID,GAC/BvJ,EAAEsB,QACJ,EAAC/B,EAEDkK,WAAA,SAAWnC,GACTA,EAAEE,iBACFF,EAAEoC,iBACJ,EAACnK,EAEDoK,OAAA,SAAOrC,GACLA,EAAEE,iBACFF,EAAEoC,kBACEpC,EAAEsC,cAAgBtC,EAAEsC,aAAa3I,OACnC9I,KAAKkR,SAASP,MAAMQ,KAAKhC,EAAEsC,aAAa3I,OAE5C,EAAC1B,EAEDsK,gBAAA,WACM1R,KAAK8Q,WACP9Q,KAAK8Q,UAAUa,OAEnB,EAACvK,EAEDQ,QAAA,WAAU,IAAAqD,EAAA,KACR,OACEpD,EAAA,OAAKJ,UAAU,cACbI,EAAA,OACEJ,UAAU,iCACV4E,QAAS,kBAAMpB,EAAKyG,iBAAiB,EACrCE,WAAY5R,KAAKsR,WAAWrJ,KAAKjI,MACjC6R,OAAQ7R,KAAKwR,OAAOvJ,KAAKjI,OAExB6G,IAAAA,WAAec,MAAM,oDACtBE,EAAA,SACEtI,KAAK,OACLuS,UAAQ,EACR/J,SAAU/H,KAAKiR,aAAahJ,KAAKjI,MACjC+R,MAAO,CAAEC,QAAS,EAAGC,SAAU,WAAYpI,KAAM,WACjDqI,SAAU,SAAC5K,GACT2D,EAAK6F,UAAYxJ,EAAM6K,GACzB,KAGJtK,EAAA,OAAKJ,UAAU,+BACZzH,KAAK8I,MAAM6C,KAAI,SAACyG,GACf,IAAMC,EAAUD,EAAK7S,KAAKiR,WAAW,UACrC,OACE3I,EAAA,OAAKJ,UAAU,gBACZ4K,EAAUxK,EAAA,OAAKyK,IAAKC,IAAIC,gBAAgBJ,GAAOK,IAAKL,EAAKrP,OAAW8E,EAAA,KAAGJ,UAAW6I,EAAW8B,EAAK7S,QACnGsI,EAAA,OAAKJ,UAAU,qBAAqB2K,EAAKrP,MAEzC8E,EAACuE,IAAM,CACL3E,UAAU,uDACVkG,KAAK,eACLtB,QAAS,WACPpB,EAAKnC,MAAQmC,EAAKnC,MAAM4J,QAAO,SAACC,GAAC,OAAKA,IAAMP,CAAI,GAClD,IAIR,KAEFvK,EAAA,OAAKJ,UAAU,4CACbI,EAAC8E,IAAM,CAACtO,MAAO2B,KAAKgM,QAAQgF,OAAQjJ,SAAU,SAAC5K,GAAc,OAAM8N,EAAKe,QAAQgF,OAAS7T,CAAK,GAC3F0J,IAAAA,WAAec,MAAM,qEAG1BE,EAAA,OAAKJ,UAAU,mDACbI,EAACuE,IAAM,CACL3E,UAAU,yBACV8B,QAASvJ,KAAKuJ,QACd8C,QAASrM,KAAK0L,OAAOzD,KAAKjI,MAC1BkI,UAAWlI,KAAK8I,MAAMtG,QAAUxC,KAAKuJ,SAEpC1C,IAAAA,WAAec,MAAM,oDAKhC,EAACP,EAEKsE,OAAM,eAAAkH,EAAA1C,EAAA2C,IAAAA,MAAZ,SAAAC,IAAA,IAAAC,EAAAC,EAAAC,EAAApE,EAAA,YAAAgE,IAAAA,MAAA,SAAAK,GAAA,cAAAA,EAAAtP,KAAAsP,EAAA3R,MAAA,OAaK,OAZHvB,KAAKuJ,SAAU,EACf1B,EAAEsB,SAEI4J,EAAW,IAAInK,SAGrB5I,KAAK8I,MAAMvI,SAAQ,SAAC6R,GAClBW,EAAShK,OAAO,UAAWqJ,EAC7B,IAEAhW,OAAOmH,KAAKvD,KAAKgM,SAASzL,SAAQ,SAACrD,GACjC6V,EAAShK,OAAO,WAAW7L,EAAG,IAAK2R,EAAK7C,QAAQ9O,GAClD,IAAGgW,EAAA3R,KAAA,EAEmBsF,IAAAA,QAAqC,CACzDtI,OAAQ,OACRyK,IAAKnC,IAAAA,MAAUC,UAAU,UAAY,cACrCmC,UAAW,SAACC,GAAa,OAAKA,CAAG,EACjCP,KAAMoK,IACN,OALIC,EAAOE,EAAAjU,KAOPgU,EAAgBpM,IAAAA,MAAUsM,YAAYH,GAE5ChT,KAAK+G,MAAMqM,iBAAiBH,GAC5BjT,KAAK8I,MAAQ,GACb9I,KAAKqT,OAELrT,KAAKuJ,SAAU,EACf1B,EAAEsB,SAAS,yBAAA+J,EAAAnP,OAAA,GAAA+O,EAAA,UACZ,yBAAAF,EAAAlM,MAAA,KAAAC,UAAA,EA9BW,GA8BX8J,CAAA,CAzIuC,CAASrH,KCbnD,MAAM,EAA+BpD,OAAOC,KAAKC,OAAO,oB,aCkBnCoN,GAAY,SAAAC,GAAA,SAAAD,IAAA,QAAA5K,EAAAgI,EAAA/J,UAAAnE,OAAA2N,EAAA,IAAAQ,MAAAD,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAAT,EAAAS,GAAAjK,UAAAiK,GAyG9B,OAzG8BlI,EAAA6K,EAAA3T,KAAA8G,MAAA6M,EAAA,OAAA1C,OAAAV,KAAA,MAC/BiC,UAAI,EAAA1J,EACJ8K,cAAQ,EAAA9K,EACR+K,aAAuB,EAAI/K,EA6F3BgL,iBAAmB,WACjBhL,EAAK+K,aAAc,EACnB5L,EAAEsB,QACJ,EAACT,EAGDiL,gBAAkB,WAChBjL,EAAK+K,aAAc,EACnB5L,EAAEsB,QACJ,EAACT,CAAA,CAzG8BrC,EAAAiN,EAAAC,GAyG9B,IAAAnM,EAAAkM,EAAAjX,UAOA,OAPA+K,EApGDC,OAAA,SAAOC,GACLiM,EAAAlX,UAAMgL,OAAMzH,KAAC,KAAA0H,GAEbtH,KAAKoS,KAAOpS,KAAK+G,MAAMqL,IACzB,EAAChL,EAEDwM,KAAA,WAAO,IAAA3I,EAAA,KACCoH,EAAUrS,KAAKoS,KAAK7S,OAAOiR,WAAW,UACtCqD,EAAWvD,EAAWtQ,KAAKoS,KAAK7S,QAEhCuU,EAAa9T,KAAKoS,KAAK2B,kBAAoB,cAAgB,gBAEjE,OACElM,EAAA,OAAKJ,UAAU,eAAevK,IAAK8C,KAAKoS,KAAK4B,QAC3CnM,EAAA,OAAKJ,UAAU,6BACbI,EAAA,YACG8F,IAAKmG,GACL9T,KAAKoS,KAAK6B,aAGfpM,EAAA,OAAKJ,UAAU,wBAAwB4E,QAAS,kBAAMpB,EAAKiJ,YAAYjJ,EAAKmH,KAAK,GAC9EC,EACCrS,KAAKyT,YACH5L,EAAA,OACEJ,UAAWzH,KAAK+G,MAAMoN,eACtB7B,IAAKtS,KAAKoS,KAAKpJ,MACfO,QAAQ,OACR6K,QAASpU,KAAK0T,iBACdW,OAAQrU,KAAK2T,gBACblB,IAAKzS,KAAKoS,KAAK6B,aAGjBtG,IAvBQ,8BAuBQ,CAAElG,UAAW,kBAG/BkG,IAAKkG,EAAU,CAAEpM,UAAW,mBAGhCI,EAAA,OAAKJ,UAAU,yBAAyBzH,KAAKsU,cAAchH,WAGjE,EAAClG,EAEDkN,YAAA,WAA0C,IAAAzF,EAAA,KAClCrB,EAAQ,IAAIC,KAElBD,EAAME,IACJ,YACA7F,EAACuE,IAAM,CAAC3E,UAAU,sBAAsBkG,KAAK,qBAAqBtB,QAAS,kBAAMwC,EAAK0F,cAAc,EAAE,aAAW,UAGnH/G,EAAME,IACJ,WACA7F,EAACuE,IAAM,CAAC3E,UAAU,sBAAsBkG,KAAK,kBAAkBtB,QAAS,kBAAMmI,OAAOC,KAAK5F,EAAKuD,KAAKpJ,MAAM,EAAE,aAAW,cAGzH,IAAM0L,EAAe1U,KAAKoS,KAAK2B,kBAAoB,cAAgB/T,KAAKoS,KAAKpB,SAAW,aAAe,mBAKvG,OAJAxD,EAAME,IAAI,YAAa7F,EAACuE,IAAM,CAAC3E,UAAU,sBAAsBkG,KAAM+G,EAAcrI,QAAS,kBAAMwC,EAAK8F,UAAU,EAAE,aAAW,UAE9HnH,EAAME,IAAI,SAAU7F,EAACuE,IAAM,CAAC3E,UAAU,sBAAsBkG,KAAK,eAAetB,QAAS,kBAAMwC,EAAK+F,eAAe,EAAE,aAAW,YAEzHpH,CACT,EAACpG,EAEKwN,cAAa,eAAAC,EAAA3E,EAAA2C,IAAAA,MAAnB,SAAAC,IAAA,IAAAkB,EAAA,OAAAnB,IAAAA,MAAA,SAAAK,GAAA,cAAAA,EAAAtP,KAAAsP,EAAA3R,MAAA,OACoE,IAArDuT,QAAQ,8CAET,CAAF5B,EAAA3R,KAAA,QACqB,OAAvByS,EAAOhU,KAAKoS,KAAK4B,OAAMd,EAAA3R,KAAA,EACvBsF,IAAAA,QAAY,CAChBtI,OAAQ,SACRyK,IAAKnC,IAAAA,MAAUC,UAAU,UAAY,sBAAwBkN,IAC7D,OAEEhU,KAAK+G,MAAMgO,UACb/U,KAAK+G,MAAMgO,SAAS/U,KAAKoS,MAC1B,wBAAAc,EAAAnP,OAAA,GAAA+O,EAAA,UAEJ,yBAAA+B,EAAAnO,MAAA,KAAAC,UAAA,EAdkB,GAclBS,EAEDmN,aAAA,WAEES,QAAQC,IAAI,iBACd,EAAC7N,EAEDuN,SAAA,WAEEK,QAAQC,IAAI,YACd,EAQA7N,EAMA8M,YAAA,SAAY9B,GACNpS,KAAK+G,MAAMmO,cACblV,KAAK+G,MAAMmO,aAAa9C,EAG5B,EAACkB,CAAA,CAhH8B,CAAS6B,KClB1C,MAAM,GAA+BnP,OAAOC,KAAKC,OAAO,0B,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,6B,eCwBnCkP,GAAW,SAAA7B,GAAA,SAAA6B,IAAA,QAAA1M,EAAAgI,EAAA/J,UAAAnE,OAAA2N,EAAA,IAAAQ,MAAAD,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAAT,EAAAS,GAAAjK,UAAAiK,GAgJ7B,OAhJ6BlI,EAAA6K,EAAA3T,KAAA8G,MAAA6M,EAAA,OAAA1C,OAAAV,KAAA,MAC9BkF,kBAAY,EAAA3M,EACZ+K,aAAuB,EAAI/K,EAC3B0J,UAAI,EAAA1J,EACJmL,cAAQ,EAAAnL,EACR4M,gBAAU,EAAA5M,EACV6M,kBAAY,EAAA7M,EA+HZgL,iBAAmB,WACjBhL,EAAK+K,aAAc,EACnB/K,EAAKmL,SAAW,8BAChBnL,EAAK6M,cAAe,EACpB1N,EAAEsB,QACJ,EAACT,EAGDiL,gBAAkB,WAChBjL,EAAK+K,aAAc,EACnB5L,EAAEsB,QACJ,EAACT,CAAA,CAhJ6BrC,EAAA+O,EAAA7B,GAgJ7B,IAAAnM,EAAAgO,EAAA/Y,UA8BA,OA9BA+K,EAxIDC,OAAA,SAAOC,GACLiM,EAAAlX,UAAMgL,OAAMzH,KAAC,KAAA0H,GAEbtH,KAAKoS,KAAOpS,KAAK+G,MAAMqL,KACvBpS,KAAKqV,kBAA2CnZ,IAA5B8D,KAAK+G,MAAMsO,cAAqCrV,KAAK+G,MAAMsO,aAC/ErV,KAAK6T,SAAWvD,EAAWtQ,KAAKoS,KAAK7S,QACrCS,KAAKsV,gBAAuCpZ,IAA1B8D,KAAK+G,MAAMuO,YAAmCtV,KAAK+G,MAAMuO,WAC3EtV,KAAKuV,kBAA6CrZ,IAA9B8D,KAAK+G,MAAMyO,gBAAsCxV,KAAK+G,MAAMyO,cAClF,EAACpO,EAEDqO,eAAA,SAAenO,GACbiM,EAAAlX,UAAMoZ,eAAc7V,KAAC,KAAA0H,GAGrBtH,KAAKsV,gBAAuCpZ,IAA1B8D,KAAK+G,MAAMuO,YAAmCtV,KAAK+G,MAAMuO,UAC7E,EAAClO,EAEDwM,KAAA,WAAO,IAAA3I,EAAA,KACCoH,EAAUrS,KAAKoS,KAAK7S,OAAOiR,WAAW,UAEtCkF,EAAoB1V,KAAKsV,WAAa,WAAa,GAEzD,OACEzN,EAAA,OACEJ,UAAS,gBAAkBiO,EAC3BxY,IAAK8C,KAAKoS,KAAK4B,OACf3H,QAAS,WACHpB,EAAKsK,eAAiBtK,EAAKoK,eAC7BpK,EAAKqK,YAAcrK,EAAKqK,WACxBrK,EAAKlE,MAAMmN,YAAYjJ,EAAKmH,MAEhC,EACAlK,UAAWlI,KAAKuV,cAAgBvV,KAAKqV,cAEpCrV,KAAKyT,aAAepB,EACnBxK,EAAA,OACEyK,IAAKtS,KAAKoS,KAAKpJ,MACfvB,UAAU,yBACVkO,WAAW,EACXvB,QAASpU,KAAK0T,iBACdW,OAAQrU,KAAK2T,gBACblB,IAAKzS,KAAKoS,KAAK6B,aAGjBjU,KAAK4V,YAAY5V,KAAK6T,UAGxBhM,EAAA,OAAKJ,UAAU,oBAAoBzH,KAAKsU,YAAYtU,KAAKoS,MAAM9E,WAE/DzF,EAAA,OAAKJ,UAAU,iBACbI,EAACgO,KAAO,CAACC,KAAM9V,KAAKoS,KAAK6B,YACvBpM,EAAA,YAAO7H,KAAKoS,KAAK6B,cAIpBjU,KAAKqV,cACJxN,EAAA,OAAKkO,MAAM,mBAAmBC,KAAK,SAAS,aAAYnP,IAAAA,WAAec,MAAM,+CAC3EE,EAACM,IAAgB,OAK3B,EAACf,EAEDwO,YAAA,SAAY/B,GACV,OACEhM,EAAA,QACEJ,UAAU,gBACVuO,KAAK,eACLjE,MAAO,CACLkE,QAAS,OACTC,WAAY,SACZC,eAAgB,SAChBC,OAAQ,SAGTzI,IAAK,SAASkG,GAGrB,EAACzM,EAEDkN,YAAA,SAAYlC,GAAwC,IAAAvD,EAAA,KAC5CrB,EAAQ,IAAIC,KAElB2E,EAAKiE,eACH7I,EAAME,IACJ,YACA7F,EAACuE,IAAM,CAAC3E,UAAU,sCAAsCkG,KAAK,qBAAqB,aAAW,OAAOtB,QAAS,kBAAMwC,EAAK0F,cAAc,IACtI,KAGJ,IAAM+B,EAAclE,EAAKmE,WAAa,4CAA8C,qCA8BpF,OA5BAnE,EAAKoE,WACHhJ,EAAME,IACJ,YACA7F,EAACuE,IAAM,CACL3E,UAAU,sCACVkG,KAAM3N,KAAKoS,KAAKpB,SAAW,aAAe,mBAC1C,aAAYnK,IAAAA,WAAec,MAAM3H,KAAKoS,KAAKpB,SAAcsF,EAAW,uBAA4BA,EAAW,uBAAwB,CACjIG,SAAUrE,EAAK6B,aAEjB/L,SAAUlI,KAAKqV,aACfhJ,QAAS,SAAC8C,GAAQ,OAAKN,EAAKwE,KAAKlE,EAAE,IAErC,IAGJiD,EAAKsE,aACHlJ,EAAME,IACJ,cACA7F,EAACuE,IAAM,CACL3E,UAAU,sCACVkG,KAAK,eACL,aAAY9G,IAAAA,WAAec,MAAM,kDAAmD,CAAE8O,SAAUrE,EAAK6B,aACrG/L,SAAUlI,KAAKqV,aACfhJ,QAAS,kBAAMwC,EAAK+F,eAAe,IAErC,IAGGpH,CACT,EAUApG,EAMAmN,aAAA,WACES,QAAQC,IAAI,iBACd,EAAC7N,EAEDiM,KAAA,SAAKlE,GACHA,EAAEoC,kBAIEvR,KAAK+G,MAAM4P,QACb3W,KAAK+G,MAAM4P,OAAO3W,KAAKoS,KAE3B,EAAChL,EAEKwN,cAAa,eAAAC,EAAA3E,EAAA2C,IAAAA,MAAnB,SAAAC,IAAA,IAAAkB,EAAA,OAAAnB,IAAAA,MAAA,SAAAK,GAAA,cAAAA,EAAAtP,KAAAsP,EAAA3R,MAAA,OACoE,IAArDuT,QAAQ,8CAET,CAAF5B,EAAA3R,KAAA,QACqB,OAAvByS,EAAOhU,KAAKoS,KAAK4B,OAAMd,EAAA3R,KAAA,EACvBsF,IAAAA,QAAY,CAChBtI,OAAQ,SACRyK,IAAKnC,IAAAA,MAAUC,UAAU,UAAY,sBAAwBkN,IAC7D,OAEEhU,KAAK+G,MAAMgO,UACb/U,KAAK+G,MAAMgO,SAAS/U,KAAKoS,MAC1B,wBAAAc,EAAAnP,OAAA,GAAA+O,EAAA,UAEJ,yBAAA+B,EAAAnO,MAAA,KAAAC,UAAA,EAdkB,GAclByO,CAAA,CA9K6B,CAASD,KCxBzC,MAAM,GAA+BnP,OAAOC,KAAKC,OAAO,4B,eC2B1B0Q,GAAgB,SAAArD,GAAA,SAAAqD,IAAA,QAAAlO,EAAAgI,EAAA/J,UAAAnE,OAAA2N,EAAA,IAAAQ,MAAAD,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAAT,EAAAS,GAAAjK,UAAAiK,GAMnC,OANmClI,EAAA6K,EAAA3T,KAAA8G,MAAA6M,EAAA,OAAA1C,OAAAV,KAAA,MAC5C0G,KAAoB,KAAInO,EACxBoO,aAAO,EAAApO,EACPqO,sBAAgB,EAAArO,EAChBsO,qBAAe,EAAAtO,EACfuO,sBAAgB,EAAAvO,EAChBwO,eAAS,EAAAxO,CAAA,CANmCrC,EAAAuQ,EAAArD,GAMnC,IAAAnM,EAAAwP,EAAAva,UA4LR,OA5LQ+K,EAQTC,OAAA,SAAOC,GACLiM,EAAAlX,UAAMgL,OAAMzH,KAAC,KAAA0H,GAEbtH,KAAK8W,QAAU9W,KAAK+G,MAAMoQ,WAC1BnX,KAAK+W,iBAAmB/W,KAAK+G,MAAMgQ,kBAAoB,KACvD/W,KAAKgX,gBAAkBhX,KAAK+G,MAAMiQ,kBAAmB,EACrDhX,KAAKiX,iBAAmB,GACxBjX,KAAKkX,UAAYlX,KAAK+G,MAAMmQ,UAE5BlX,KAAKoX,cACP,EAAChQ,EAEDwM,KAAA,WAAO,IAAA3I,EAAA,KACL,OACEpD,EAAA,OAAKJ,UAAU,sCAAsC,YAAU,UAE5DzH,KAAKqX,aAAgD,IAAjCrX,KAAKsX,iBAAiB9U,QACzCqF,EAAA,OAAKJ,UAAW,sBACbZ,IAAAA,WAAec,MAAM,oCAEtBE,EAACM,IAAgB,QAInBnI,KAAKqX,aAAgD,IAAjCrX,KAAKsX,iBAAiB9U,QAC1CqF,EAAA,OAAKJ,UAAU,eACbI,EAAA,KAAGJ,UAAU,oBAAoBZ,IAAAA,WAAec,MAAM,oCAI1DE,EAAA,UACG7H,KAAKsX,iBAAiB3L,KAAI,SAACyG,GAAe,IAAAmF,EAAAC,EACnC3D,EAAWvD,EAAW8B,EAAK7S,QAC3BiW,GAAiBvK,EAAK8L,kBAAmB9L,EAAKsK,aAAanD,GAE3D+B,EAAiBsD,KAAU,CAC/B,WAEa,sBAAb5D,GAAoC,sBAEpC5I,EAAKlE,MAAM2Q,eAAiBzM,EAAKlE,MAAM2Q,cAAcC,QAAiB,OAAVJ,EAACnF,EAAKwF,MAAIL,EAAI,KAAO,GAAK,sBAGlFlC,EAAepK,EAAKgM,iBAAiBY,SAASzF,EAAK4B,QAEzD,OACEnM,EAAA,MAAI,YAAWwN,EAAcnY,IAAKkV,EAAK4B,QACrCnM,EAACuN,GAAW,CACVhD,KAAMA,EACNoD,eAAgBA,EAChBF,WAAYrK,EAAKlE,MAAM2Q,eAAiBzM,EAAKlE,MAAM2Q,cAAcC,QAAiB,OAAVH,EAACpF,EAAKwF,MAAIJ,EAAI,KAAO,EAC7FrD,eAAgBA,EAChBkB,aAAcA,EACdsB,OAAQ1L,EAAK0J,SAAS1M,KAAKgD,GAC3BiJ,YAAajJ,EAAKiJ,YAAYjM,KAAKgD,GACnC4L,KAAM5L,EAAKlE,MAAM8P,KACjB9B,SAAU9J,EAAK8J,SAAS9M,KAAKgD,KAIrC,IAECjL,KAAK8X,kBACJjQ,EAAA,OAAKJ,UAAW,uBACdI,EAACuE,IAAM,CAAC3E,UAAW,yBAA0BS,SAAUlI,KAAKqX,YAAa9N,QAASvJ,KAAKqX,YAAahL,QAAS,kBAAMpB,EAAK8M,UAAU,GAC/HlR,IAAAA,WAAec,MAAM,mDAOpC,EAACP,EAED2N,SAAA,SAAS3C,GACHpS,KAAK+G,MAAMgO,UACb/U,KAAK+G,MAAMgO,SAAS3C,EAExB,EAEAhL,EAEA8M,YAAA,SAAY9B,GAENpS,KAAK+G,MAAMmO,aACblV,KAAK+G,MAAMmO,aAAa9C,GAKtBpS,KAAK+G,MAAMiQ,iBACbxC,OAAOC,KAAKrC,EAAKpJ,MAGrB,EAAC5B,EAEDmO,aAAA,SAAanD,GACX,IAAM7B,EAAW6B,EAAK7S,OAGtB,OAAIoR,MAAMqH,QAAQhY,KAAK+W,kBACd/W,KAAK+W,iBAAiBY,QAAQpH,IAAa,EAIjB,UAA1BvQ,KAAK+W,iBACLxG,EAASsH,SAAS,UAIQ,UAA1B7X,KAAK+W,iBACLxG,EAASsH,SAAS,UAIQ,UAA1B7X,KAAK+W,kBACLxG,EAASsH,SAAS,SAI7B,EAEAzQ,EAMMuN,SAAQ,eAAAsD,EAAA/H,EAAA2C,IAAAA,MAAd,SAAAC,EAAeV,GAAU,IAAA4B,EAAAsC,EAAA4B,EAAAC,EAAA1V,EAAA,OAAAoQ,IAAAA,MAAA,SAAAK,GAAA,cAAAA,EAAAtP,KAAAsP,EAAA3R,MAAA,OACC,GAAlByS,EAAO5B,EAAK4B,QAEdhU,KAAKiX,iBAAiBY,SAAS7D,GAAO,CAAFd,EAAA3R,KAAA,eAAA2R,EAAA9T,OAAA,iBAYvC,GAVDY,KAAKiX,iBAAiBhV,KAAK+R,GAErBsC,EAAclE,EAAKmE,WAAa,4CAA8C,sCAE1DzB,QACxBsD,KACEvR,IAAAA,WAAec,MAAMyK,EAAKpB,SAAcsF,EAAW,qBAA0BA,EAAW,qBAAsB,CAC5GG,SAAUrE,EAAK6B,eAKE,CAAFf,EAAA3R,KAAA,gBAAA2R,EAAAtP,KAAA,EAAAsP,EAAA3R,KAAA,GAESsF,IAAAA,QAA8B,CACtDtI,OAAQ,QACRyK,IAAQnC,IAAAA,MAAUC,UAAU,UAAS,mBACrC6B,KAAM,CAAEqL,KAAAA,KACR,QAJIkE,EAAWhF,EAAAjU,KAMjB4H,IAAAA,MAAUsM,YAAY+E,GACtBrQ,EAAEsB,SAEFtC,IAAAA,OAAW2F,KAAKiD,IAAO,CAAElQ,KAAM,WAAa,CAC1CoO,IAAKyE,EAAKpB,SAAW,mBAAqB,cAC1C,IACAnK,IAAAA,WAAec,MAAU,MAAJyK,GAAAA,EAAMpB,SAAcsF,EAAW,gBAAqBA,EAAW,mBAGlFtW,KAAKkX,UAAUL,OACXsB,EAAQnY,KAAKkX,UAAUpO,MAAMuP,WAAU,SAACjG,GAAU,OAAK4B,IAAS5B,EAAK4B,MAAM,IACjFhU,KAAKkX,UAAUpO,MAAMwP,OAAOH,EAAO,IACpCjF,EAAA3R,KAAA,iBAAA2R,EAAAtP,KAAA,GAAAsP,EAAAqF,GAAArF,EAAA,SAEDrM,IAAAA,OAAW2F,KACTiD,IACA,CAAElQ,KAAM,SACRsH,IAAAA,WAAec,MAAU,MAAJyK,GAAAA,EAAMpB,SAAcsF,EAAW,aAAkBA,EAAW,aAAc,CAC7FG,SAAUrE,EAAK6B,cAEjB,QAIiC,OAJjCf,EAAAtP,KAAA,GAGInB,EAAIzC,KAAKiX,iBAAiBU,QAAQ3D,GACxChU,KAAKiX,iBAAiBqB,OAAO7V,EAAG,GAAGyQ,EAAAxO,OAAA,6BAAAwO,EAAAnP,OAAA,GAAA+O,EAAA,yBAGxC,gBAAA0F,GAAA,OAAAP,EAAAvR,MAAA,KAAAC,UAAA,EApDa,GAoDbiQ,CAAA,CAlM2C,CAASzB,KCxB1CsD,GAAU9I,EAAA,GCCS,CAC9B2D,aAAAA,GACA7C,sBAAAA,EACAiI,aCF+B,SAAAC,GAAA,SAAAD,IAAA,OAAAC,EAAAjS,MAAA,KAAAC,YAAA,KAAAN,EAAAqS,EAAAC,GAAA,IAAAvR,EAAAsR,EAAArc,UAwB9B,OAxB8B+K,EACxBgQ,aAAP,WAEEpX,KAAKkX,UAAU0B,QAAQ5Y,KAAK+G,MAAM8P,MAAQhQ,IAAAA,QAAYgQ,MAItD7W,KAAK6W,KAAO7W,KAAKkX,UAAUL,IAC7B,EAACzP,EAED0Q,eAAA,WACE,OAAO9X,KAAKkX,UAAUY,gBACxB,EAAC1Q,EAED2Q,SAAA,WACE/X,KAAKkX,UAAUa,UACjB,EAAC3Q,EAEDiQ,UAAA,WACE,OAAOrX,KAAKkX,UAAUG,WACxB,EAACjQ,EAEDkQ,eAAA,WACE,OAAOtX,KAAKkX,UAAUpO,KACxB,EAAC4P,CAAA,CAxB8B,CAAS9B,KFDrB,CACnBvN,WAAAA,IGLF,MAAM,GAA+BrD,OAAOC,KAAKC,OAAO,oB,eCAxD,MAAM,GAA+BF,OAAOC,KAAKC,OAAO,gB,eCEnC2S,GAAI,SAAAC,GAAA,SAAAD,IAAA,OAAAC,EAAApS,MAAA,KAAAC,YAAA,KAAAN,EAAAwS,EAAAC,GAAA,IAAA1R,EAAAyR,EAAAxc,UAmEtB,OAnEsB+K,EACvB6M,SAAA,WACE,OAAO8E,KAAAA,UAAwB,YAAYnZ,KAAKI,KAClD,EAACoH,EAEDJ,KAAA,WACE,OAAO+R,KAAAA,UAAwB,QAAQnZ,KAAKI,KAC9C,EAACoH,EAED4B,IAAA,WACE,OAAO+P,KAAAA,UAAwB,OAAOnZ,KAAKI,KAC7C,EAACoH,EAED4R,KAAA,WACE,OAAOD,KAAAA,UAAwB,QAAQnZ,KAAKI,KAC9C,EAACoH,EAED7H,KAAA,WACE,OAAOwZ,KAAAA,UAAwB,QAAQnZ,KAAKI,KAC9C,EAACoH,EAED6R,UAAA,WACE,OAAOF,KAAAA,UAAwB,aAAanZ,KAAKI,KACnD,EAACoH,EAED8R,UAAA,WACE,OAAOH,KAAAA,UAAgB,YAAaA,KAAAA,eAAqBnZ,KAAKI,KAChE,EAACoH,EAED4M,KAAA,WACE,OAAO+E,KAAAA,UAAwB,QAAQnZ,KAAKI,KAC9C,EAACoH,EAED+R,IAAA,WACE,OAAOJ,KAAAA,UAAwB,OAAOnZ,KAAKI,KAC7C,EAACoH,EAED4J,OAAA,WACE,OAAO+H,KAAAA,UAAyB,UAAUnZ,KAAKI,KACjD,EAACoH,EAEDgS,OAAA,WACE,OAAOL,KAAAA,UAAwB,UAAUnZ,KAAKI,KAChD,EAACoH,EAEDmP,SAAA,WACE,OAAOwC,KAAAA,UAAyB,UAAUnZ,KAAKI,KACjD,EAACoH,EAED2M,gBAAA,WACE,OAAOgF,KAAAA,UAAyB,mBAAmBnZ,KAAKI,KAC1D,EAACoH,EAEDiP,YAAA,WACE,OAAO0C,KAAAA,UAAyB,eAAenZ,KAAKI,KACtD,EAACoH,EAEDoP,QAAA,WACE,OAAOuC,KAAAA,UAAyB,WAAWnZ,KAAKI,KAClD,EAACoH,EAEDsP,UAAA,WACE,OAAOqC,KAAAA,UAAyB,aAAanZ,KAAKI,KACpD,EAACoH,EAEDiS,YAAA,WACE,MAAO,gBAAkBrZ,KAAKsZ,OAAS,IAAMtZ,KAAK4X,KAAO,GAC3D,EAACiB,CAAA,CAnEsB,CAASE,MCClC,WACE,IAAIQ,KAAAA,QACD7L,IAAI,QAASmL,IACbnL,IAAI,eAAgBmL,KCNnB,GAA+B7S,OAAOC,KAAKC,OAAO,8B,eCInCsT,GAAc,SAAAb,GAAA,SAAAa,IAAA,OAAAb,EAAAjS,MAAA,KAAAC,YAAA,KAAAN,EAAAmT,EAAAb,GAAA,IAAAvR,EAAAoS,EAAAnd,UAmBhC,OAnBgC+K,EAC1BgQ,aAAP,WACEpX,KAAKkX,UAAUuC,aACjB,EAACrS,EAED0Q,eAAA,WACE,OAAO9X,KAAKkX,UAAUY,gBACxB,EAAC1Q,EAED2Q,SAAA,WACE/X,KAAKkX,UAAUa,UACjB,EAAC3Q,EAEDiQ,UAAA,WACE,OAAOrX,KAAKkX,UAAUG,WACxB,EAACjQ,EAEDkQ,eAAA,WACE,OAAOtX,KAAKkX,UAAUpO,KACxB,EAAC0Q,CAAA,CAnBgC,CAAS5C,ICCvB8C,GAAa,WAOhC,SAAAA,EAAYC,QAAoB,IAApBA,IAAAA,GAAuB,GAAK,KANjC9C,UAAI,OACJ/N,WAAK,OACJ8Q,iBAAW,OACXrQ,aAAO,OACPoQ,iBAAW,EAGjB3Z,KAAK6W,KAAO,KACZ7W,KAAK8I,MAAQ,GACb9I,KAAK4Z,aAAc,EACnB5Z,KAAKuJ,SAAU,EACfvJ,KAAK2Z,YAAcA,CACrB,CAEA,IAAAvS,EAAAsS,EAAArd,UAyHC,OAzHD+K,EAIOwR,QAAP,SAAe/B,GACTA,IAAS7W,KAAK6W,OAElB7W,KAAK6W,KAAOA,EACZ7W,KAAK8I,MAAQ,GACb9I,KAAKyZ,cACP,EAACrS,EAEMyS,QAAP,WACE7Z,KAAK8I,MAAQ,GACb9I,KAAKyZ,cACL5R,EAAEsB,QACJ,EAEA/B,EAKaqS,YAAW,eAAAK,EAAA5J,EAAA2C,IAAAA,MAAxB,SAAAC,EAAyBiH,GAAc,IAAAC,EAAAC,EAAAjH,EAAA,OAAAH,IAAAA,MAAA,SAAAK,GAAA,cAAAA,EAAAtP,KAAAsP,EAAA3R,MAAA,OAAI,QAAJ,IAAdwY,IAAAA,EAAiB,GACnC/Z,KAAK2Z,aAAgB3Z,KAAK6W,KAAI,CAAA3D,EAAA3R,KAAA,eAAA2R,EAAA9T,OAAA,SAASiE,QAAQzC,OAAO,iBAAe,OAiBzE,OAfDZ,KAAKuJ,SAAU,EAEXyQ,EAAgB,cAChBC,EAA+B,CAAC,GAE/Bja,KAAK2Z,aAAe3Z,KAAK6W,KAC5BoD,EAAS,CACPvH,OAAQ,CAAEmE,KAAM7W,KAAK6W,KAAKe,MAC1BsC,KAAM,CAAEH,OAAAA,KAGVC,EAAQ,0BACRC,EAAS,CACPC,KAAM,CAAEH,OAAAA,KAEX7G,EAAA3R,KAAA,EAEqBsF,IAAAA,MAAUsT,KAAaH,EAAOC,GAAO,OAA9C,OAAPjH,EAAOE,EAAAjU,KAAAiU,EAAA9T,OAAA,SAENY,KAAKoa,aAAapH,IAAQ,yBAAAE,EAAAnP,OAAA,GAAA+O,EAAA,UAClC,gBAAA0F,GAAA,OAAAsB,EAAApT,MAAA,KAAAC,UAAA,EAvBuB,GAyBxBS,EAGa2Q,SAAQ,eAAAsC,EAAAnK,EAAA2C,IAAAA,MAArB,SAAAyH,IAAA,OAAAzH,IAAAA,MAAA,SAAA0H,GAAA,cAAAA,EAAA3W,KAAA2W,EAAAhZ,MAAA,OACsB,OAApBvB,KAAKuJ,SAAU,EAAKgR,EAAAnb,OAAA,SACbY,KAAKyZ,YAAYzZ,KAAK8I,MAAMtG,SAAO,wBAAA+X,EAAAxW,OAAA,GAAAuW,EAAA,UAC3C,yBAAAD,EAAA3T,MAAA,KAAAC,UAAA,EAHoB,GAGpBS,EAEOgT,aAAR,SAAqBpH,GAA2D,IAAAwH,EAAAC,EAK9E,OAJAza,KAAK8I,MAAQkK,EACbhT,KAAKuJ,SAAU,EACfvJ,KAAK4Z,cAA+B,OAAhBY,EAACxH,EAAQ0H,UAAc,OAAPD,EAAfD,EAAiBG,SAAjBF,EAAwBlZ,MAC7CsG,EAAEsB,SACK6J,CACT,EAEA5L,EAIOwT,UAAP,SAAiB9R,GACW,IAAA+R,EAAtBlK,MAAMqH,QAAQlP,IAChB+R,EAAA7a,KAAK8I,OAAMgS,QAAOpU,MAAAmU,EAAI/R,GAEtB9I,KAAK8I,MAAMgS,QAAQhS,GAErBjB,EAAEsB,QACJ,EAEA/B,EAIO2T,eAAP,SAAsBjS,GAChB6H,MAAMqH,QAAQlP,GAChB9I,KAAK8I,MAAQ9I,KAAK8I,MAAM4J,QAAO,SAACN,GAAI,OAAMtJ,EAAM+O,SAASzF,EAAK,IAE9DpS,KAAK8I,MAAQ9I,KAAK8I,MAAM4J,QAAO,SAACN,GAAI,OAAKA,IAAStJ,CAAK,IAGzDjB,EAAEsB,QACJ,EAEA/B,EAIO4T,SAAP,WACE,OAAOhb,KAAK8I,MAAMtG,OAAS,CAC7B,EAEA4E,EAIOiQ,UAAP,WACE,OAAOrX,KAAKuJ,OACd,EAEAnC,EAIO0Q,eAAP,WACE,OAAO9X,KAAK4Z,WACd,EAEAxS,EAIO6T,MAAP,WACE,OAAQjb,KAAKgb,aAAehb,KAAKqX,WACnC,EAACqC,CAAA,CAxI+B,GCMbwB,GAAgB,SAAAC,GAAA,SAAAD,IAAA,QAAAxS,EAAAgI,EAAA/J,UAAAnE,OAAA2N,EAAA,IAAAQ,MAAAD,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAAT,EAAAS,GAAAjK,UAAAiK,GAG1B,OAH0BlI,EAAAyS,EAAAvb,KAAA8G,MAAAyU,EAAA,OAAAtK,OAAAV,KAAA,MACnCiL,cAAwB,GAAE1S,EAC1B2S,YAAsB,EAAC3S,EACvBwO,eAAS,EAAAxO,CAAA,CAH0BrC,EAAA6U,EAAAC,GAG1B,IAAA/T,EAAA8T,EAAA7e,UAuER,OAvEQ+K,EAETC,OAAA,SAAOC,GACL6T,EAAA9e,UAAMgL,OAAMzH,KAAC,KAAA0H,GAEbtH,KAAKkX,UAAY,IAAIwC,IAAc,EACrC,EAACtS,EAEDkU,WAAA,WACE,MAAO,CACL7T,UAAW,2BACXkG,KAAM,qBACNjG,MAAOb,IAAAA,WAAec,MAAM,yCAC5BiH,YAAa/H,IAAAA,WAAec,MAAM,+CAEtC,EAACP,EAEDQ,QAAA,WACE,OACEC,EAAA,OAAKJ,UAAU,6BACbI,EAAA,KAAGJ,UAAU,YAAYZ,IAAAA,WAAec,MAAM,iDAC9CE,EAAA,WACAA,EAAA,OAAKJ,UAAU,kCAAkCzH,KAAKub,kBAAkBjO,WACxEzF,EAAA,WACAA,EAAA,OAAKJ,UAAU,6BACbI,EAAC2R,GAAc,CAAC3C,KAAMhQ,IAAAA,QAAYgQ,KAAMM,YAAY,EAAOD,UAAWlX,KAAKkX,UAAWnC,SAAU/U,KAAK+U,SAAS9M,KAAKjI,SAI3H,EAACoH,EAEDoU,gBAAA,WAAkB,IAAAvQ,EAAA,KAChBpE,IAAAA,MAAU2F,KAAKiE,EAAuB,CACpC2C,iBAAkB,SAACtK,GACjBmC,EAAKwQ,eAAe3S,EACtB,GAEJ,EAAC1B,EAEDmU,gBAAA,WAA8C,IAAA1M,EAAA,KACtCrB,EAAQ,IAAIC,KAWlB,OATAD,EAAME,IAAI,UAAW7F,EAACuE,IAAM,CAAC3E,UAAU,sBAAsBkG,KAAK,cAActB,QAAS,kBAAMwC,EAAKgL,SAAS,KAE7GrM,EAAME,IACJ,aACA7F,EAACuE,IAAM,CAAC3E,UAAU,SAASkG,KAAK,gBAAgBtB,QAAS,kBAAMwC,EAAK2M,iBAAiB,GAClF3U,IAAAA,WAAec,MAAM,uDAInB6F,CACT,EAACpG,EAEDsU,gBAAA,SAAgBtJ,GAGd,OAFc,IAAI3E,IAGpB,EAACrG,EAEDqU,eAAA,SAAe3S,GACbkM,QAAQC,IAAI,kBAAmBnM,GAC/B9I,KAAKkX,UAAU0D,UAAU9R,EAC3B,EAAC1B,EAEDyS,QAAA,WACE7Z,KAAKkX,UAAU2C,SACjB,EAACzS,EAED2N,SAAA,SAAS3C,GACPpS,KAAKkX,UAAU6D,eAAe3I,EAChC,EAAC8I,CAAA,CA1EkC,CAAsDS,MCP3F,SAAe,GAAf9K,OACK+K,GAAM,EAET,IAAIrC,KAAAA,SACD7L,IAAI,eAAgB,WAAYwN,MCCrCrU,IAAAA,aAAiB6G,IAAI,cAAc,WACjC7G,IAAAA,cAAiB,IACV,cACJgV,aAAaxS,GACbyS,mBACC,CACEnO,KAAM,cACNoO,MAAOlV,IAAAA,WAAec,MAAM,6CAC5BqU,WAAY,qBAEd,QACA,IAEDF,mBACC,CACEnO,KAAM,kBACNoO,MAAOlV,IAAAA,WAAec,MAAM,+CAC5BqU,WAAY,sBACZC,YAAY,GAEd,OACA,IAEDH,mBACC,CACEnO,KAAM,aACNoO,MAAOlV,IAAAA,WAAec,MAAM,wDAC5BqU,WAAY,8BAEd,WACA,IAEDF,mBACC,CACEnO,KAAM,eACNoO,MAAOlV,IAAAA,WAAec,MAAM,+DAC5BqU,WAAY,gCAEd,WACA,IAEDF,mBACC,CACEnO,KAAM,kBACNoO,MAAOlV,IAAAA,WAAec,MAAM,oDAC5BqU,WAAY,kCAEd,SAEDF,mBACC,CACEnO,KAAM,kBACNoO,MAAOlV,IAAAA,WAAec,MAAM,oDAC5BqU,WAAY,kCAEd,UCxDJJ,EAAAA,EAAAA,QAAOM,IAAAA,UAAoB,SAAS,SAAU1O,GAC5CA,EAAME,IACJ,iBACA7F,EAACsU,IAAU,CAACrU,KAAMjB,IAAAA,MAAU,gBAAiB8G,KAAK,qBAAqBjG,MAAOb,IAAAA,WAAec,MAAM,0CAChGd,IAAAA,WAAec,MAAM,+CAExB,GAEJ,GDsDF,G","sources":["webpack://@fof/upload/./node_modules/@babel/runtime/regenerator/index.js","webpack://@fof/upload/./node_modules/regenerator-runtime/runtime.js","webpack://@fof/upload/webpack/bootstrap","webpack://@fof/upload/webpack/runtime/compat get default export","webpack://@fof/upload/webpack/runtime/define property getters","webpack://@fof/upload/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/upload/webpack/runtime/make namespace object","webpack://@fof/upload/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/upload/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://@fof/upload/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Button']\"","webpack://@fof/upload/external root \"flarum.core.compat['admin/utils/saveSettings']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Alert']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Select']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Switch']\"","webpack://@fof/upload/external root \"flarum.core.compat['admin/components/UploadImageButton']\"","webpack://@fof/upload/./src/admin/components/UploadImageButton.ts","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/withAttr']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/Stream']\"","webpack://@fof/upload/external root \"flarum.core.compat['admin/components/ExtensionPage']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/ItemList']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Modal']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/LoadingIndicator']\"","webpack://@fof/upload/./src/admin/components/InspectMimeModal.js","webpack://@fof/upload/external root \"flarum.core.compat['common/helpers/icon']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Link']\"","webpack://@fof/upload/./src/admin/components/UploadPage.js","webpack://@fof/upload/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/upload/external root \"flarum.core.compat['admin/components/AdminNav']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/LinkButton']\"","webpack://@fof/upload/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://@fof/upload/./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://@fof/upload/external root \"flarum.core.compat['common/app']\"","webpack://@fof/upload/./src/common/mimeToIcon.ts","webpack://@fof/upload/./src/common/components/UploadSharedFileModal.tsx","webpack://@fof/upload/external root \"flarum.core.compat['common/Component']\"","webpack://@fof/upload/./src/common/components/UploadedFile.tsx","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/classList']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/components/Tooltip']\"","webpack://@fof/upload/./src/common/components/DisplayFile.tsx","webpack://@fof/upload/external root \"flarum.core.compat['common/utils/extractText']\"","webpack://@fof/upload/./src/common/components/AbstractFIleList.tsx","webpack://@fof/upload/./src/admin/components/index.ts","webpack://@fof/upload/./src/common/components/index.ts","webpack://@fof/upload/./src/common/components/UserFileList.tsx","webpack://@fof/upload/external root \"flarum.core.compat['common/extenders']\"","webpack://@fof/upload/external root \"flarum.core.compat['common/Model']\"","webpack://@fof/upload/./src/common/models/File.ts","webpack://@fof/upload/./src/common/extend.ts","webpack://@fof/upload/external root \"flarum.core.compat['admin/components/AdminPage']\"","webpack://@fof/upload/./src/common/components/SharedFileList.tsx","webpack://@fof/upload/./src/common/states/FileListState.ts","webpack://@fof/upload/./src/admin/components/SharedUploadPage.tsx","webpack://@fof/upload/./src/admin/extend.ts","webpack://@fof/upload/./src/admin/index.ts","webpack://@fof/upload/./src/admin/extendAdminNav.tsx"],"sourcesContent":["module.exports = require(\"regenerator-runtime\");\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = GeneratorFunctionPrototype;\n define(Gp, \"constructor\", GeneratorFunctionPrototype);\n define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n });\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n define(Gp, iteratorSymbol, function() {\n return this;\n });\n\n define(Gp, \"toString\", function() {\n return \"[object Generator]\";\n });\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, in modern engines\n // we can explicitly access globalThis. In older engines we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/utils/saveSettings'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Alert'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Select'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Switch'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/UploadImageButton'];","import app from 'flarum/admin/app';\nimport FlarumUploadImageButton from 'flarum/admin/components/UploadImageButton';\n\nexport default class UploadImageButton extends FlarumUploadImageButton {\n resourceUrl() {\n return app.forum.attribute('apiUrl') + '/' + this.attrs.path;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/withAttr'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/Stream'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/ExtensionPage'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/utils/ItemList'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Modal'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LoadingIndicator'];","import app from 'flarum/admin/app';\nimport Modal from 'flarum/common/components/Modal';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\n\nexport default class InspectMimeModal extends Modal {\n oninit(vnode) {\n super.oninit(vnode);\n\n this.uploading = false;\n this.inspection = {};\n }\n\n className() {\n return 'Modal--small fof-upload-inspect-mime-modal';\n }\n\n title() {\n return app.translator.trans('fof-upload.admin.inspect-mime.title');\n }\n\n content() {\n return (\n
    \n

    \n {app.translator.trans('fof-upload.admin.inspect-mime.description', {\n a: ,\n })}\n

    \n

    {app.translator.trans('fof-upload.admin.inspect-mime.select')}

    \n
    \n \n {this.uploading ? LoadingIndicator.component() : null}\n
    \n
    \n
    {app.translator.trans('fof-upload.admin.inspect-mime.laravel-validation')}
    \n
    \n {typeof this.inspection.laravel_validation === 'undefined' ? (\n {app.translator.trans('fof-upload.admin.inspect-mime.no-file-selected')}\n ) : this.inspection.laravel_validation ? (\n app.translator.trans('fof-upload.admin.inspect-mime.validation-passed')\n ) : (\n app.translator.trans('fof-upload.admin.inspect-mime.validation-failed', {\n error: this.inspection.laravel_validation_error || '?',\n })\n )}\n
    \n
    \n
    \n
    {app.translator.trans('fof-upload.admin.inspect-mime.mime-detector')}
    \n
    \n {this.inspection.mime_detector ? (\n {this.inspection.mime_detector}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
    \n
    \n
    \n
    {app.translator.trans('fof-upload.admin.inspect-mime.mime-fileinfo')}
    \n
    \n {this.inspection.php_mime ? (\n {this.inspection.php_mime}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
    \n
    \n
    \n
    {app.translator.trans('fof-upload.admin.inspect-mime.guessed-extension')}
    \n
    \n {this.inspection.guessed_extension ? (\n {this.inspection.guessed_extension}\n ) : (\n {app.translator.trans('fof-upload.admin.inspect-mime.not-available')}\n )}\n
    \n
    \n
    \n );\n }\n\n onupload(event) {\n const body = new FormData();\n\n for (let i = 0; i < event.target.files.length; i++) {\n body.append('files[]', event.target.files[i]);\n }\n\n this.uploading = true;\n\n return app\n .request({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload/inspect-mime',\n serialize: (raw) => raw,\n body,\n })\n .then((result) => {\n this.uploading = false;\n this.inspection = result;\n m.redraw();\n })\n .catch((error) => {\n this.uploading = false;\n this.inspection = {};\n m.redraw();\n\n throw error;\n });\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/helpers/icon'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Link'];","import app from 'flarum/admin/app';\nimport Button from 'flarum/common/components/Button';\nimport saveSettings from 'flarum/admin/utils/saveSettings';\nimport Alert from 'flarum/common/components/Alert';\nimport Select from 'flarum/common/components/Select';\nimport Switch from 'flarum/common/components/Switch';\nimport UploadImageButton from './UploadImageButton';\nimport withAttr from 'flarum/common/utils/withAttr';\nimport Stream from 'flarum/common/utils/Stream';\nimport ExtensionPage from 'flarum/admin/components/ExtensionPage';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport InspectMimeModal from './InspectMimeModal';\nimport icon from 'flarum/common/helpers/icon';\nimport Link from 'flarum/common/components/Link';\n\n/* global m */\n\nexport default class UploadPage extends ExtensionPage {\n oninit(vnode) {\n super.oninit(vnode);\n // whether we are saving the settings or not right now\n this.loading = false;\n\n // the fields we need to watch and to save\n this.fields = [\n // image\n 'resizeMaxWidth',\n 'cdnUrl',\n 'maxFileSize',\n 'whitelistedClientExtensions',\n 'composerButtonVisiblity',\n // watermark\n 'watermark',\n 'watermarkPosition',\n // Imgur\n 'imgurClientId',\n // AWS\n 'awsS3Key',\n 'awsS3Secret',\n 'awsS3Bucket',\n 'awsS3Region',\n 'awsS3Endpoint',\n 'awsS3ACL',\n // QIniu\n 'qiniuKey',\n 'qiniuSecret',\n 'qiniuBucket',\n ];\n\n // the checkboxes we need to watch and to save.\n this.checkboxes = ['mustResize', 'addsWatermarks', 'disableHotlinkProtection', 'disableDownloadLogging', 'awsS3UsePathStyleEndpoint'];\n\n // fields that are objects\n this.objects = ['mimeTypes'];\n\n // watermark positions\n this.watermarkPositions = {\n 'top-left': 'top-left',\n 'top-right': 'top-right',\n 'bottom-left': 'bottom-left',\n 'bottom-right': 'bottom-right',\n center: 'center',\n left: 'left',\n top: 'top',\n right: 'right',\n bottom: 'bottom',\n };\n\n // Composer button options\n this.composerButtonVisiblityOptions = {\n both: app.translator.trans('fof-upload.admin.labels.composer_buttons.options.both'),\n 'upload-btn': app.translator.trans('fof-upload.admin.labels.composer_buttons.options.upload-btn'),\n 'media-btn': app.translator.trans('fof-upload.admin.labels.composer_buttons.options.media-btn'),\n };\n\n // get the saved settings from the database\n const settings = app.data.settings;\n\n // our package prefix (to be added to every field and checkbox in the setting table)\n this.settingsPrefix = 'fof-upload';\n\n // Options for the Upload methods dropdown menu.\n this.uploadMethodOptions = settings[this.addPrefix('availableUploadMethods')] || {};\n // Options for the Template dropdown menu.\n this.templateOptions = settings[this.addPrefix('availableTemplates')] || {};\n // Contains current values.\n this.values = {};\n // bind the values of the fields and checkboxes to the getter/setter functions\n this.fields.forEach((key) => (this.values[key] = Stream(settings[this.addPrefix(key)])));\n this.checkboxes.forEach((key) => (this.values[key] = Stream(settings[this.addPrefix(key)] === '1')));\n this.objects.forEach((key) => (this.values[key] = settings[this.addPrefix(key)] ? Stream(JSON.parse(settings[this.addPrefix(key)])) : Stream()));\n\n // Set a sane default in case no mimeTypes have been configured yet.\n // Since 'local' (or others) can now be disabled, pick the last entry in the object for default\n this.defaultAdap = Object.keys(this.uploadMethodOptions)[Object.keys(this.uploadMethodOptions).length - 1];\n this.values.mimeTypes() ||\n (this.values.mimeTypes = Stream({\n '^image\\\\/.*': {\n adapter: this.defaultAdap,\n template: 'image-preview',\n },\n }));\n\n this.newMimeType = {\n regex: Stream(''),\n adapter: Stream(this.defaultAdap),\n template: Stream('file'),\n };\n }\n\n /**\n * Show the actual ImageUploadPage.\n *\n * @returns {*}\n */\n content() {\n const max_post = app.data.settings[this.addPrefix('php_ini.post_max_size')];\n const max_upload = app.data.settings[this.addPrefix('php_ini.upload_max_filesize')];\n return [\n m('.UploadPage', [\n m('.container', [\n m(\n 'form',\n {\n onsubmit: this.onsubmit.bind(this),\n },\n [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.preferences.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.preferences.max_file_size')),\n m('input.FormControl', {\n value: this.values.maxFileSize(),\n oninput: withAttr('value', this.values.maxFileSize),\n type: 'number',\n min: '0',\n }),\n m(\n '.helpText',\n app.translator.trans('fof-upload.admin.labels.preferences.php_ini_values', {\n post: max_post,\n upload: max_upload,\n })\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.preferences.mime_types')),\n m(\n '.MimeTypes--Container',\n Object.keys(this.values.mimeTypes()).map((mime) => {\n let config = this.values.mimeTypes()[mime];\n // Compatibility for older versions.\n if (typeof config !== 'object') {\n config = {\n adapter: config,\n template: 'file',\n };\n }\n\n return m('div', [\n m('input.FormControl.MimeTypes', {\n value: mime,\n oninput: withAttr('value', this.updateMimeTypeKey.bind(this, mime)),\n }),\n Select.component({\n options: this.uploadMethodOptions,\n onchange: this.updateMimeTypeAdapter.bind(this, mime, config),\n value: config.adapter || 'local',\n }),\n Select.component({\n options: this.getTemplateOptionsForInput(),\n onchange: this.updateMimeTypeTemplate.bind(this, mime, config),\n value: config.template || 'local',\n }),\n Button.component(\n {\n type: 'button',\n className: 'Button Button--warning',\n onclick: this.deleteMimeType.bind(this, mime),\n },\n 'x'\n ),\n ]);\n }),\n m('br'),\n m('div', [\n m('input.FormControl.MimeTypes.add-MimeType-key', {\n value: this.newMimeType.regex(),\n oninput: withAttr('value', this.newMimeType.regex),\n }),\n Select.component({\n options: this.uploadMethodOptions,\n className: 'add-MimeType-value',\n oninput: withAttr('value', this.newMimeType.adapter),\n value: this.newMimeType.adapter(),\n }),\n Select.component({\n options: this.getTemplateOptionsForInput(),\n className: 'add-MimeType-value',\n oninput: withAttr('value', this.newMimeType.template),\n value: this.newMimeType.template(),\n }),\n Button.component(\n {\n type: 'button',\n className: 'Button Button--warning',\n onclick: this.addMimeType.bind(this),\n },\n '+'\n ),\n ])\n ),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.mime_types')),\n Button.component(\n {\n className: 'Button',\n onclick() {\n app.modal.show(InspectMimeModal);\n },\n },\n app.translator.trans('fof-upload.admin.labels.inspect-mime')\n ),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.download_templates')),\n this.templateOptionsDescriptions(),\n ]),\n m('fieldset.composerButtons', [\n m('legend', app.translator.trans('fof-upload.admin.labels.composer_buttons.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.composer_buttons')),\n m('div', [\n Select.component({\n options: this.composerButtonVisiblityOptions,\n onchange: this.values.composerButtonVisiblity,\n value: this.values.composerButtonVisiblity() || 'both',\n }),\n ]),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.resize.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.resize')),\n Switch.component(\n {\n state: this.values.mustResize() || false,\n onchange: this.values.mustResize,\n },\n app.translator.trans('fof-upload.admin.labels.resize.toggle')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.resize.max_width')),\n m('input', {\n className: 'FormControl',\n value: this.values.resizeMaxWidth() || 100,\n oninput: withAttr('value', this.values.resizeMaxWidth),\n disabled: !this.values.mustResize(),\n type: 'number',\n min: '0',\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.client_extension.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.client_extension')),\n m('input', {\n className: 'FormControl',\n value: this.values.whitelistedClientExtensions() || '',\n oninput: withAttr('value', this.values.whitelistedClientExtensions),\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.watermark.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.watermark')),\n Switch.component(\n {\n state: this.values.addsWatermarks() || false,\n onchange: this.values.addsWatermarks,\n },\n app.translator.trans('fof-upload.admin.labels.watermark.toggle')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.watermark.position')),\n m('div', [\n Select.component({\n options: this.watermarkPositions,\n onchange: this.values.watermarkPosition,\n value: this.values.watermarkPosition() || 'bottom-right',\n }),\n ]),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.watermark.file')),\n UploadImageButton.component({\n name: 'fof-watermark',\n path: 'fof/watermark',\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.disable-hotlink-protection.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.disable-hotlink-protection')),\n Switch.component(\n {\n state: this.values.disableHotlinkProtection() || false,\n onchange: this.values.disableHotlinkProtection,\n },\n app.translator.trans('fof-upload.admin.labels.disable-hotlink-protection.toggle')\n ),\n m('legend', app.translator.trans('fof-upload.admin.labels.disable-download-logging.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.disable-download-logging')),\n Switch.component(\n {\n state: this.values.disableDownloadLogging() || false,\n onchange: this.values.disableDownloadLogging,\n },\n app.translator.trans('fof-upload.admin.labels.disable-download-logging.toggle')\n ),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.local.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.local.cdn_url')),\n m('input.FormControl', {\n value: this.values.cdnUrl() || '',\n oninput: withAttr('value', this.values.cdnUrl),\n }),\n ]),\n\n this.adaptorItems().toArray(),\n\n Button.component(\n {\n type: 'submit',\n className: 'Button Button--primary',\n loading: this.loading,\n disabled: !this.changed(),\n },\n app.translator.trans('core.admin.settings.submit_button')\n ),\n ]\n ),\n ]),\n ]),\n ];\n }\n\n adaptorItems() {\n const items = new ItemList();\n\n if (this.uploadMethodOptions['imgur'] !== undefined) {\n items.add(\n 'imgur',\n
    \n
    \n {app.translator.trans('fof-upload.admin.labels.imgur.title')}\n

    \n {icon('fas fa-exclamation-circle')}{' '}\n {app.translator.trans('fof-upload.admin.labels.imgur.tos', {\n a: ,\n })}\n

    \n \n \n
    \n
    ,\n 100\n );\n }\n\n if (this.uploadMethodOptions['qiniu'] !== undefined) {\n items.add(\n 'qiniu',\n m('.qiniu', [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.qiniu.title')),\n m('label', app.translator.trans('fof-upload.admin.labels.qiniu.key')),\n m('input.FormControl', {\n value: this.values.qiniuKey() || '',\n oninput: withAttr('value', this.values.qiniuKey),\n }),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.qiniu.secret')),\n m('input.FormControl', {\n value: this.values.qiniuSecret() || '',\n oninput: withAttr('value', this.values.qiniuSecret),\n }),\n m('label', {}, app.translator.trans('fof-upload.admin.labels.qiniu.bucket')),\n m('input.FormControl', {\n value: this.values.qiniuBucket() || '',\n oninput: withAttr('value', this.values.qiniuBucket),\n }),\n ]),\n ]),\n 80\n );\n }\n\n if (this.uploadMethodOptions['aws-s3'] !== undefined) {\n items.add(\n 'aws-s3',\n m('.aws', [\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.aws-s3.title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_instance_profile')),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.key')),\n m('input.FormControl', {\n value: this.values.awsS3Key() || '',\n oninput: withAttr('value', this.values.awsS3Key),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.secret')),\n m('input.FormControl', {\n value: this.values.awsS3Secret() || '',\n oninput: withAttr('value', this.values.awsS3Secret),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.bucket')),\n m('input.FormControl', {\n value: this.values.awsS3Bucket() || '',\n oninput: withAttr('value', this.values.awsS3Bucket),\n }),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.region')),\n m('input.FormControl', {\n value: this.values.awsS3Region() || '',\n oninput: withAttr('value', this.values.awsS3Region),\n }),\n ]),\n m('fieldset', [\n m('legend', app.translator.trans('fof-upload.admin.labels.aws-s3.advanced_title')),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_compatible_storage')),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.endpoint')),\n m('input.FormControl', {\n value: this.values.awsS3Endpoint() || '',\n oninput: withAttr('value', this.values.awsS3Endpoint),\n }),\n Switch.component(\n {\n state: this.values.awsS3UsePathStyleEndpoint() || false,\n onchange: this.values.awsS3UsePathStyleEndpoint,\n },\n app.translator.trans('fof-upload.admin.labels.aws-s3.use_path_style_endpoint')\n ),\n m('label', app.translator.trans('fof-upload.admin.labels.aws-s3.acl')),\n m('input.FormControl', {\n value: this.values.awsS3ACL() || '',\n oninput: withAttr('value', this.values.awsS3ACL),\n }),\n m('.helpText', app.translator.trans('fof-upload.admin.help_texts.s3_acl')),\n ]),\n ]),\n 60\n );\n }\n\n return items;\n }\n\n getTemplateOptionsForInput() {\n const options = {};\n\n for (let option in this.templateOptions) {\n if (!this.templateOptions.hasOwnProperty(option)) {\n continue;\n }\n\n options[option] = this.templateOptions[option].name;\n }\n\n return options;\n }\n\n updateMimeTypeKey(mime, value) {\n this.values.mimeTypes()[value] = this.values.mimeTypes()[mime];\n\n this.deleteMimeType(mime);\n }\n\n updateMimeTypeAdapter(mime, config, value) {\n config.adapter = value;\n this.values.mimeTypes()[mime] = config;\n }\n\n updateMimeTypeTemplate(mime, config, value) {\n config.template = value;\n this.values.mimeTypes()[mime] = config;\n }\n\n deleteMimeType(mime) {\n delete this.values.mimeTypes()[mime];\n }\n\n templateOptionsDescriptions() {\n const children = [];\n\n for (let template in this.templateOptions) {\n if (!this.templateOptions.hasOwnProperty(template)) {\n continue;\n }\n\n children.push(\n
  • \n {this.templateOptions[template].name}: {m.trust(this.templateOptions[template].description)}\n
  • \n );\n }\n\n return m('ul', children);\n }\n\n addMimeType() {\n this.values.mimeTypes()[this.newMimeType.regex()] = {\n adapter: this.newMimeType.adapter(),\n template: this.newMimeType.template(),\n };\n\n this.newMimeType.regex('');\n this.newMimeType.adapter('local');\n this.newMimeType.template('file');\n }\n\n /**\n * Checks if the values of the fields and checkboxes are different from\n * the ones stored in the database\n *\n * @returns boolean\n */\n changed() {\n const fieldsCheck = this.fields.some((key) => this.values[key]() !== app.data.settings[this.addPrefix(key)]);\n const checkboxesCheck = this.checkboxes.some((key) => this.values[key]() !== (app.data.settings[this.addPrefix(key)] === '1'));\n const objectsCheck = this.objects.some((key) => JSON.stringify(this.values[key]()) !== app.data.settings[this.addPrefix(key)]);\n\n return fieldsCheck || checkboxesCheck || objectsCheck;\n }\n\n /**\n * Saves the settings to the database and redraw the page\n *\n * @param e\n */\n onsubmit(e) {\n // prevent the usual form submit behaviour\n e.preventDefault();\n\n // if the page is already saving, do nothing\n if (this.loading) return;\n\n // prevents multiple savings\n this.loading = true;\n\n // remove previous success popup\n app.alerts.dismiss(this.successAlert);\n\n const settings = {};\n\n // gets all the values from the form\n this.fields.forEach((key) => (settings[this.addPrefix(key)] = this.values[key]()));\n this.checkboxes.forEach((key) => (settings[this.addPrefix(key)] = this.values[key]()));\n this.objects.forEach((key) => (settings[this.addPrefix(key)] = JSON.stringify(this.values[key]())));\n\n // actually saves everything in the database\n saveSettings(settings)\n .then(() => {\n // on success, show popup\n this.successAlert = app.alerts.show(Alert, { type: 'success' }, app.translator.trans('core.admin.settings.saved_message'));\n })\n .catch(() => {})\n .then(() => {\n // return to the initial state and redraw the page\n this.loading = false;\n m.redraw();\n });\n }\n\n /**\n * Adds the prefix `this.settingsPrefix` at the beginning of `key`\n *\n * @returns string\n */\n addPrefix(key) {\n return this.settingsPrefix + '.' + key;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/AdminNav'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/LinkButton'];","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/app'];","const mimeToIconMap = new Map([\n // Image formats\n ['image/png', 'far fa-file-image'],\n ['image/jpg', 'far fa-file-image'],\n ['image/jpeg', 'far fa-file-image'],\n ['image/svg+xml', 'far fa-file-image'],\n ['image/gif', 'far fa-file-image'],\n ['image/bmp', 'far fa-file-image'],\n ['image/webp', 'far fa-file-image'],\n\n // Compressed file formats\n ['application/zip', 'far fa-file-archive'],\n ['application/x-7z-compressed', 'far fa-file-archive'],\n ['application/gzip', 'far fa-file-archive'],\n ['application/vnd.rar', 'far fa-file-archive'],\n ['application/x-rar-compressed', 'far fa-file-archive'],\n ['application/x-tar', 'far fa-file-archive'],\n ['application/x-iso9660-image', 'far fa-file-archive'],\n\n // Text and code file formats\n ['text/plain', 'far fa-file-alt'],\n ['text/csv', 'far fa-file-csv'],\n ['text/xml', 'far fa-file-code'],\n ['text/html', 'far fa-file-code'],\n ['text/css', 'far fa-file-code'],\n ['text/javascript', 'far fa-file-code'],\n ['application/json', 'far fa-file-code'],\n ['application/ld+json', 'far fa-file-code'],\n ['application/x-httpd-php', 'far fa-file-code'],\n ['application/xml', 'far fa-file-code'],\n ['text/xml', 'far fa-file-code'],\n\n // Document formats\n ['application/x-abiword', 'far fa-file-word'],\n ['application/msword', 'far fa-file-word'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'far fa-file-word'],\n ['application/vnd.oasis.opendocument.text', 'far fa-file-word'],\n ['application/vnd.ms-excel', 'far fa-file-excel'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'far fa-file-excel'],\n ['application/vnd.oasis.opendocument.spreadsheet', 'far fa-file-excel'],\n ['application/vnd.ms-powerpoint', 'far fa-file-powerpoint'],\n ['application/vnd.openxmlformats-officedocument.presentationml.presentation', 'far fa-file-powerpoint'],\n ['application/vnd.oasis.opendocument.presentation', 'far fa-file-powerpoint'],\n ['application/pdf', 'far fa-file-pdf'],\n ['application/rtf', 'far fa-file-alt'],\n\n // eBook formats\n ['application/epub+zip', 'far fa-book'],\n ['application/x-mobipocket-ebook', 'far fa-book'],\n ['application/vnd.amazon.ebook', 'far fa-book'],\n\n // Audio formats\n ['audio/mpeg', 'far fa-file-audio'],\n ['audio/wav', 'far fa-file-audio'],\n ['audio/x-wav', 'far fa-file-audio'],\n ['audio/aac', 'far fa-file-audio'],\n ['audio/ogg', 'far fa-file-audio'],\n ['audio/flac', 'far fa-file-audio'],\n ['audio/aiff', 'far fa-file-audio'],\n ['audio/x-aiff', 'far fa-file-audio'],\n\n // Video formats\n ['video/x-msvideo', 'far fa-file-video'],\n ['video/mp4', 'far fa-file-video'],\n ['video/quicktime', 'far fa-file-video'],\n]);\n\nexport default function mimeToIcon(fileType: string): string {\n // Directly return the icon if the fileType is in the map\n return (\n mimeToIconMap.get(fileType) ||\n (function () {\n // Check for generic types\n if (fileType.startsWith('image/')) {\n return 'far fa-file-image';\n } else if (fileType.startsWith('video/')) {\n return 'far fa-file-video';\n } else if (fileType.startsWith('audio/')) {\n return 'far fa-file-audio';\n }\n\n // Default icon\n return 'far fa-file';\n })()\n );\n}\n","import app from 'flarum/common/app';\nimport Modal, { IInternalModalAttrs } from 'flarum/common/components/Modal';\nimport Switch from 'flarum/common/components/Switch';\nimport mimeToIcon from '../mimeToIcon';\nimport Button from 'flarum/common/components/Button';\nimport type Mithril from 'mithril';\nimport { ApiResponsePlural } from 'flarum/common/Store';\nimport File from '../models/File';\n\ninterface CustomAttrs extends IInternalModalAttrs {\n onUploadComplete: (files: File | File[]) => void;\n}\n\nexport default class UploadSharedFileModal extends Modal {\n files = [];\n fileInput = null;\n options = {\n shared: true,\n hidden: false,\n };\n loading: boolean = false;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n }\n\n className() {\n return 'UploadSharedFileModal Modal--medium';\n }\n\n title() {\n return app.translator.trans('fof-upload.lib.upload-shared-file-modal.title');\n }\n\n onFileChange(e) {\n this.addFiles(Array.from(e.target.files));\n }\n\n addFiles(newFiles: File[]) {\n (this.files as File[]).push(...newFiles);\n m.redraw();\n }\n\n onDragOver(e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onDrop(e) {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer && e.dataTransfer.files) {\n this.addFiles(Array.from(e.dataTransfer.files));\n }\n }\n\n onDropzoneClick() {\n if (this.fileInput) {\n this.fileInput.click();\n }\n }\n\n content() {\n return (\n
    \n this.onDropzoneClick()}\n ondragover={this.onDragOver.bind(this)}\n ondrop={this.onDrop.bind(this)}\n >\n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.dropzone')}\n {\n this.fileInput = vnode.dom;\n }}\n />\n
    \n
    \n {this.files.map((file: File) => {\n const isImage = file.type.startsWith('image/');\n return (\n
    \n {isImage ? {file.name} : }\n
    {file.name}
    \n {/* Remove button */}\n {\n this.files = this.files.filter((f) => f !== file);\n }}\n />\n
    \n );\n })}\n
    \n
    \n (this.options.hidden = value)}>\n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.hide-from-media-gallery')}\n \n
    \n
    \n \n {app.translator.trans('fof-upload.lib.upload-shared-file-modal.upload')}\n \n
    \n \n );\n }\n\n async upload() {\n this.loading = true;\n m.redraw();\n\n const formData = new FormData();\n\n // Append each file to the form data\n this.files.forEach((file) => {\n formData.append('files[]', file);\n });\n\n Object.keys(this.options).forEach((key) => {\n formData.append(`options[${key}]`, this.options[key]);\n });\n\n const results = await app.request>({\n method: 'POST',\n url: app.forum.attribute('apiUrl') + '/fof/upload',\n serialize: (raw: FormData) => raw, // Prevent mithril from trying to serialize FormData\n body: formData,\n });\n\n const uploadedFiles = app.store.pushPayload(results);\n\n this.attrs.onUploadComplete(uploadedFiles);\n this.files = [];\n this.hide();\n\n this.loading = false;\n m.redraw();\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Component'];","import Component, { ComponentAttrs } from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\nimport mimeToIcon from '../mimeToIcon';\nimport File from '../models/File';\nimport icon from 'flarum/common/helpers/icon';\nimport app from 'flarum/common/app';\nimport classList from 'flarum/common/utils/classList';\n\ninterface CustomAttrs extends ComponentAttrs {\n file: File;\n selectable: boolean;\n fileClassNames: string;\n onDelete: (file: File) => void | undefined;\n onFileSelect: (file: File) => void | undefined;\n}\n\nexport default class UploadedFile extends Component {\n file!: File;\n callback!: () => void | undefined;\n imageLoaded: boolean = true;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.file = this.attrs.file;\n }\n\n view() {\n const isImage = this.file.type().startsWith('image/');\n const fileIcon = mimeToIcon(this.file.type());\n const errorIcon = 'fas fa-exclamation-triangle';\n const statusIcon = this.file.isPrivateShared() ? 'fas fa-lock' : 'fas fa-unlock';\n\n return (\n
    \n
    \n \n {icon(statusIcon)}\n {this.file.baseName()}\n \n
    \n
    this.onFileClick(this.file)}>\n {isImage ? (\n this.imageLoaded ? (\n \n ) : (\n icon(errorIcon, { className: 'icon-fallback' }) // Error icon for failed image load\n )\n ) : (\n icon(fileIcon, { className: 'icon-fallback' }) // Icon representing the file type\n )}\n
    \n
    {this.actionItems().toArray()}
    \n
    \n );\n }\n\n actionItems(): ItemList {\n const items = new ItemList();\n\n items.add(\n 'view-info',\n \n \n )}\n \n \n );\n }\n\n onDelete(file: File) {\n if (this.attrs.onDelete) {\n this.attrs.onDelete(file);\n }\n }\n\n // Common methods like onFileClick, isSelectable, hideFile...\n\n onFileClick(file: File) {\n // Custom functionality\n if (this.attrs.onFileSelect) {\n this.attrs.onFileSelect(file);\n return;\n }\n\n // Download on click\n if (this.attrs.downloadOnClick) {\n window.open(file.url());\n return;\n }\n }\n\n isSelectable(file: File) {\n const fileType = file.type();\n\n // Custom defined file types\n if (Array.isArray(this.restrictFileType)) {\n return this.restrictFileType.indexOf(fileType) >= 0;\n }\n\n // Image\n else if (this.restrictFileType === 'image') {\n return fileType.includes('image/');\n }\n\n // Audio\n else if (this.restrictFileType === 'audio') {\n return fileType.includes('audio/');\n }\n\n // Video\n else if (this.restrictFileType === 'video') {\n return fileType.includes('video/');\n }\n\n return false;\n }\n\n /**\n * Begins the hiding process for a file.\n *\n * - Shows a native confirmation dialog\n * - If confirmed, sends AJAX request to the hide file API\n */\n async hideFile(file: File) {\n const uuid = file.uuid();\n\n if (this.filesBeingHidden.includes(uuid)) return;\n\n this.filesBeingHidden.push(uuid);\n\n const transPrefix = file.isShared() ? 'fof-upload.lib.file_list.hide_shared_file' : 'fof-upload.lib.file_list.hide_file';\n\n const confirmToggleHide = confirm(\n extractText(\n app.translator.trans(file.hidden() ? `${transPrefix}.show_confirmation` : `${transPrefix}.hide_confirmation`, {\n fileName: file.baseName(),\n })\n )\n );\n\n if (confirmToggleHide) {\n try {\n const filePayload = await app.request({\n method: 'PATCH',\n url: `${app.forum.attribute('apiUrl')}/fof/upload/hide`,\n body: { uuid },\n });\n\n app.store.pushPayload(filePayload);\n m.redraw();\n\n app.alerts.show(Alert, { type: 'success' }, [\n icon(file.hidden() ? 'fas fa-eye-slash' : 'fas fa-eye'),\n ' ',\n app.translator.trans(file?.hidden() ? `${transPrefix}.hide_success` : `${transPrefix}.show_success`),\n ]);\n\n if (this.fileState.user) {\n const index = this.fileState.files.findIndex((file: File) => uuid === file.uuid());\n this.fileState.files.splice(index, 1);\n }\n } catch (error) {\n app.alerts.show(\n Alert,\n { type: 'error' },\n app.translator.trans(file?.hidden() ? `${transPrefix}.hide_fail` : `${transPrefix}.show_fail`, {\n fileName: file.baseName(),\n })\n );\n } finally {\n // Remove file from hiding list\n const i = this.filesBeingHidden.indexOf(uuid);\n this.filesBeingHidden.splice(i, 1);\n }\n }\n }\n}\n","import UploadPage from './UploadPage';\nimport { commonComponents } from '../../common/components';\n\nexport const components = {\n ...commonComponents,\n UploadPage,\n};\n","import UploadSharedFileModal from './UploadSharedFileModal';\nimport UploadedFile from './UploadedFile';\nimport UserFileList from './UserFileList';\n\nexport const commonComponents = {\n UploadedFile,\n UploadSharedFileModal,\n UserFileList,\n};\n","import app from 'flarum/common/app';\nimport File from '../models/File';\nimport AbstractFileList from './AbstractFIleList';\nimport FileListState from '../states/FileListState';\n\nexport default class UserFileList extends AbstractFileList {\n public loadFileList(): void {\n //app.fileListState.setUser(this.attrs.user || app.session.user);\n this.fileState.setUser(this.attrs.user || app.session.user);\n /**\n * The user who's media we are dealing with\n */\n this.user = this.fileState.user; //app.fileListState.user;\n }\n\n hasMoreResults(): boolean {\n return this.fileState.hasMoreResults();\n }\n\n loadMore(): void {\n this.fileState.loadMore();\n }\n\n isLoading(): boolean {\n return this.fileState.isLoading();\n }\n\n fileCollection(): File[] {\n return this.fileState.files;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extenders'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","import Model from 'flarum/common/Model';\n\nexport default class File extends Model {\n baseName() {\n return Model.attribute('baseName').call(this);\n }\n\n path() {\n return Model.attribute('path').call(this);\n }\n\n url() {\n return Model.attribute('url').call(this);\n }\n\n size() {\n return Model.attribute('size').call(this);\n }\n\n type() {\n return Model.attribute('type').call(this);\n }\n\n humanSize() {\n return Model.attribute('humanSize').call(this);\n }\n\n createdAt() {\n return Model.attribute('createdAt', Model.transformDate).call(this);\n }\n\n uuid() {\n return Model.attribute('uuid').call(this);\n }\n\n tag() {\n return Model.attribute('tag').call(this);\n }\n\n hidden() {\n return Model.attribute('hidden').call(this);\n }\n\n bbcode() {\n return Model.attribute('bbcode').call(this);\n }\n\n isShared() {\n return Model.attribute('shared').call(this);\n }\n\n isPrivateShared() {\n return Model.attribute('isPrivateShared').call(this);\n }\n\n canViewInfo() {\n return Model.attribute('canViewInfo').call(this);\n }\n\n canHide() {\n return Model.attribute('canHide').call(this);\n }\n\n canDelete() {\n return Model.attribute('canDelete').call(this);\n }\n\n apiEndpoint() {\n return '/fof/uploads' + (this.exists ? '/' + this.id() : '');\n }\n}\n","import Extend from 'flarum/common/extenders';\nimport File from './models/File';\n\nexport default [\n new Extend.Store() //\n .add('files', File)\n .add('shared-files', File),\n];\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/components/AdminPage'];","import app from 'flarum/common/app';\nimport File from '../models/File';\nimport AbstractFileList from './AbstractFIleList';\n\nexport default class SharedFileList extends AbstractFileList {\n public loadFileList(): void {\n this.fileState.loadResults();\n }\n\n hasMoreResults() {\n return this.fileState.hasMoreResults();\n }\n\n loadMore() {\n this.fileState.loadMore();\n }\n\n isLoading(): boolean {\n return this.fileState.isLoading();\n }\n\n fileCollection(): File[] {\n return this.fileState.files;\n }\n}\n","import app from 'flarum/common/app';\nimport User from 'flarum/common/models/User';\nimport File from '../models/File';\nimport { ApiQueryParamsPlural, ApiResponsePlural } from 'flarum/common/Store';\n\nexport default class FileListState {\n public user: User | null;\n public files: File[];\n private moreResults: boolean;\n private loading: boolean;\n private sharedFiles: boolean;\n\n constructor(sharedFiles: boolean = false) {\n this.user = null;\n this.files = [];\n this.moreResults = false;\n this.loading = false;\n this.sharedFiles = sharedFiles;\n }\n\n /**\n * Set the user and load their file list.\n * @param user The user whose files to load.\n */\n public setUser(user: User): void {\n if (user === this.user) return;\n\n this.user = user;\n this.files = [];\n this.loadResults();\n }\n\n public refresh(): void {\n this.files = [];\n this.loadResults();\n m.redraw();\n }\n\n /**\n * Load more files for the current user, starting from the given offset.\n * @param offset The starting index for loading more files.\n * @returns A promise resolving to the loaded files.\n */\n public async loadResults(offset: number = 0): Promise> {\n if (!this.sharedFiles && !this.user) return Promise.reject('User not set');\n\n this.loading = true;\n\n let route: string = 'fof/uploads';\n let params: ApiQueryParamsPlural = {};\n\n if (!this.sharedFiles && this.user) {\n params = {\n filter: { user: this.user.id() },\n page: { offset },\n } as ApiQueryParamsPlural;\n } else {\n route = 'fof/upload/shared-files';\n params = {\n page: { offset },\n } as ApiQueryParamsPlural;\n }\n\n const results = await app.store.find(route, params);\n\n return this.parseResults(results);\n }\n\n /**\n * Load the next set of results.\n */\n public async loadMore(): Promise> {\n this.loading = true;\n return this.loadResults(this.files.length);\n }\n\n private parseResults(results: ApiResponsePlural): ApiResponsePlural {\n this.files = results;\n this.loading = false;\n this.moreResults = !!results.payload?.links?.next;\n m.redraw();\n return results;\n }\n\n /**\n * Add files to the beginning of the list.\n * @param files The files to be added.\n */\n public addToList(files: File | File[]): void {\n if (Array.isArray(files)) {\n this.files.unshift(...files);\n } else {\n this.files.unshift(files);\n }\n m.redraw();\n }\n\n /**\n * Remove files from the list.\n * @param files The files to be removed.\n */\n public removeFromList(files: File | File[]): void {\n if (Array.isArray(files)) {\n this.files = this.files.filter((file) => !files.includes(file));\n } else {\n this.files = this.files.filter((file) => file !== files);\n }\n\n m.redraw();\n }\n\n /**\n * Check if there are files in the list.\n * @returns True if there are files, false otherwise.\n */\n public hasFiles(): boolean {\n return this.files.length > 0;\n }\n\n /**\n * Check if the file list is currently loading.\n * @returns True if loading, false otherwise.\n */\n public isLoading(): boolean {\n return this.loading;\n }\n\n /**\n * Check if there are more files to load.\n * @returns True if there are more files, false otherwise.\n */\n public hasMoreResults(): boolean {\n return this.moreResults;\n }\n\n /**\n * Check if the user has no files and the list is not loading.\n * @returns True if the list is empty and not loading, false otherwise.\n */\n public empty(): boolean {\n return !this.hasFiles() && !this.isLoading();\n }\n}\n","import app from 'flarum/admin/app';\nimport AdminPage, { AdminHeaderAttrs } from 'flarum/admin/components/AdminPage';\nimport Button from 'flarum/common/components/Button';\nimport { IPageAttrs } from 'flarum/common/components/Page';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\nimport UploadSharedFileModal from '../../common/components/UploadSharedFileModal';\nimport File from 'src/common/models/File';\nimport SharedFileList from '../../common/components/SharedFileList';\nimport FileListState from '../../common/states/FileListState';\n\nexport default class SharedUploadPage extends AdminPage {\n sharedUploads: File[] = [];\n currentPage: number = 1;\n fileState!: FileListState;\n\n oninit(vnode: Mithril.Vnode) {\n super.oninit(vnode);\n\n this.fileState = new FileListState(true);\n }\n\n headerInfo(): AdminHeaderAttrs {\n return {\n className: 'SharedUploadPage--header',\n icon: 'fas fa-file-upload',\n title: app.translator.trans('fof-upload.admin.shared-uploads.title'),\n description: app.translator.trans('fof-upload.admin.shared-uploads.description'),\n };\n }\n\n content(): Mithril.Children {\n return (\n
    \n

    {app.translator.trans('fof-upload.admin.shared-uploads.introduction')}

    \n
    \n
    {this.mainActionItems().toArray()}
    \n
    \n
    \n \n
    \n
    \n );\n }\n\n showUploadModal() {\n app.modal.show(UploadSharedFileModal, {\n onUploadComplete: (files: File | File[]) => {\n this.uploadComplete(files);\n },\n });\n }\n\n mainActionItems(): ItemList {\n const items = new ItemList();\n\n items.add('refresh', \n );\n\n return items;\n }\n\n fileActionItems(file: File): ItemList {\n const items = new ItemList();\n\n return items;\n }\n\n uploadComplete(files: File | File[]) {\n console.log('upload complete', files);\n this.fileState.addToList(files);\n }\n\n refresh() {\n this.fileState.refresh();\n }\n\n onDelete(file: File) {\n this.fileState.removeFromList(file);\n }\n}\n","import { default as extend } from '../common/extend';\nimport Extend from 'flarum/common/extenders';\nimport SharedUploadPage from './components/SharedUploadPage';\n\nexport default [\n ...extend,\n\n new Extend.Routes() //\n .add('adminUploads', '/uploads', SharedUploadPage),\n];\n","import app from 'flarum/admin/app';\nimport UploadPage from './components/UploadPage';\nimport extendAdminNav from './extendAdminNav';\nimport FileListState from '../common/states/FileListState';\n\nexport * from './components';\n\nexport { default as extend } from './extend';\n\napp.initializers.add('fof-upload', () => {\n app.extensionData\n .for('fof-upload')\n .registerPage(UploadPage)\n .registerPermission(\n {\n icon: 'far fa-file',\n label: app.translator.trans('fof-upload.admin.permissions.upload_label'),\n permission: 'fof-upload.upload',\n },\n 'start',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-download',\n label: app.translator.trans('fof-upload.admin.permissions.download_label'),\n permission: 'fof-upload.download',\n allowGuest: true,\n },\n 'view',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-eye',\n label: app.translator.trans('fof-upload.admin.permissions.view_user_uploads_label'),\n permission: 'fof-upload.viewUserUploads',\n },\n 'moderate',\n 50\n )\n .registerPermission(\n {\n icon: 'fas fa-trash',\n label: app.translator.trans('fof-upload.admin.permissions.delete_uploads_of_others_label'),\n permission: 'fof-upload.deleteUserUploads',\n },\n 'moderate',\n 50\n )\n .registerPermission(\n {\n icon: 'far fa-file-alt',\n label: app.translator.trans('fof-upload.admin.permissions.upload_shared_label'),\n permission: 'fof-upload.upload-shared-files',\n },\n 'start'\n )\n .registerPermission(\n {\n icon: 'far fa-file-alt',\n label: app.translator.trans('fof-upload.admin.permissions.access_shared_label'),\n permission: 'fof-upload.access-shared-files',\n },\n 'start'\n );\n\n extendAdminNav();\n\n //app.fileListState = new FileListState();\n});\n","import app from 'flarum/admin/app';\nimport { extend } from 'flarum/common/extend';\nimport AdminNav from 'flarum/admin/components/AdminNav';\nimport LinkButton from 'flarum/common/components/LinkButton';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport type Mithril from 'mithril';\n\nexport default function extendAdminNav() {\n extend(AdminNav.prototype, 'items', function (items: ItemList) {\n items.add(\n 'shared-uploads',\n \n {app.translator.trans('fof-upload.admin.nav.shared-uploads-button')}\n ,\n 49\n );\n });\n}\n"],"names":["module","exports","runtime","undefined","Op","Object","prototype","hasOwn","hasOwnProperty","$Symbol","Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","obj","key","value","defineProperty","enumerable","configurable","writable","err","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","_invoke","state","GenStateSuspendedStart","method","arg","GenStateExecuting","Error","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","done","GenStateSuspendedYield","makeInvokeMethod","fn","call","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","this","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","invoke","resolve","reject","result","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","TypeError","info","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","length","i","displayName","isGeneratorFunction","genFun","ctor","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","iter","keys","object","reverse","pop","skipTempReset","prev","charAt","slice","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","Function","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","a","definition","o","get","prop","r","flarum","core","compat","_setPrototypeOf","p","_inheritsLoose","subClass","superClass","UploadImageButton","_FlarumUploadImageBut","apply","arguments","resourceUrl","app","attribute","attrs","path","FlarumUploadImageButton","InspectMimeModal","_Modal","_proto","oninit","vnode","uploading","inspection","className","title","trans","content","m","href","onchange","onupload","bind","disabled","LoadingIndicator","laravel_validation","laravel_validation_error","mime_detector","php_mime","guessed_extension","event","_this","body","FormData","target","files","append","url","serialize","raw","redraw","Modal","UploadPage","_ExtensionPage","loading","fields","checkboxes","objects","watermarkPositions","center","left","top","right","bottom","composerButtonVisiblityOptions","both","settings","settingsPrefix","uploadMethodOptions","addPrefix","templateOptions","Stream","JSON","parse","defaultAdap","mimeTypes","adapter","template","newMimeType","regex","_this2","max_post","max_upload","onsubmit","maxFileSize","oninput","withAttr","min","post","upload","map","mime","config","updateMimeTypeKey","Select","options","updateMimeTypeAdapter","getTemplateOptionsForInput","updateMimeTypeTemplate","Button","onclick","deleteMimeType","addMimeType","show","templateOptionsDescriptions","composerButtonVisiblity","Switch","mustResize","resizeMaxWidth","whitelistedClientExtensions","addsWatermarks","watermarkPosition","component","disableHotlinkProtection","disableDownloadLogging","cdnUrl","adaptorItems","toArray","changed","items","ItemList","add","icon","Link","external","imgurClientId","qiniuKey","qiniuSecret","qiniuBucket","awsS3Key","awsS3Secret","awsS3Bucket","awsS3Region","awsS3Endpoint","awsS3UsePathStyleEndpoint","awsS3ACL","option","children","trust","description","_this3","fieldsCheck","some","checkboxesCheck","objectsCheck","stringify","e","_this4","preventDefault","dismiss","successAlert","saveSettings","Alert","ExtensionPage","_extends","assign","source","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","args","mimeToIconMap","Map","mimeToIcon","fileType","startsWith","UploadSharedFileModal","_len","Array","_key","concat","fileInput","shared","hidden","onFileChange","addFiles","from","newFiles","_ref","onDragOver","stopPropagation","onDrop","dataTransfer","onDropzoneClick","click","ondragover","ondrop","multiple","style","opacity","position","oncreate","dom","file","isImage","src","URL","createObjectURL","alt","filter","f","_upload","_regeneratorRuntime","_callee","formData","results","uploadedFiles","_context","pushPayload","onUploadComplete","hide","UploadedFile","_Component","callback","imageLoaded","handleImageError","handleImageLoad","view","fileIcon","statusIcon","isPrivateShared","uuid","baseName","onFileClick","fileClassNames","onerror","onload","actionItems","viewFileInfo","window","open","hideFileIcon","hideFile","confirmDelete","_confirmDelete","confirm","onDelete","console","log","onFileSelect","Component","DisplayFile","isFileHiding","isSelected","isSelectable","fileSelectable","onbeforeupdate","fileSelectedClass","draggable","displayIcon","Tooltip","text","class","role","display","alignItems","justifyContent","height","canViewInfo","transPrefix","isShared","canHide","fileName","canDelete","onHide","AbstractFileList","user","inModal","restrictFileType","downloadOnClick","filesBeingHidden","fileState","selectable","loadFileList","isLoading","fileCollection","_file$id","_file$id2","classList","selectedFiles","indexOf","id","includes","hasMoreResults","loadMore","isArray","_hideFile","filePayload","index","extractText","findIndex","splice","t0","_x","components","UserFileList","_AbstractFileList","setUser","File","_Model","Model","size","humanSize","createdAt","tag","bbcode","apiEndpoint","exists","Extend","SharedFileList","loadResults","FileListState","sharedFiles","moreResults","refresh","_loadResults","offset","route","params","page","find","parseResults","_loadMore","_callee2","_context2","_results$payload","_results$payload$link","payload","links","addToList","_this$files","unshift","removeFromList","hasFiles","empty","SharedUploadPage","_AdminPage","sharedUploads","currentPage","headerInfo","mainActionItems","showUploadModal","uploadComplete","fileActionItems","AdminPage","extend","registerPage","registerPermission","label","permission","allowGuest","AdminNav","LinkButton"],"sourceRoot":""} \ No newline at end of file