{"mappings":"AACA,IAAIA,EAAUC,OACVC,EAAyBF,EAAQG,eACjCC,EAAiBC,MAAMC,QACvBC,EAASC,MACTC,EAAaC,UAGNC,EAAiBX,EAAQY,eAQ7B,SAASC,EAAeC,EAAQC,GACrC,MAAe,cAARA,GAAuBb,EAAuBc,KAAKF,EAAQC,GAWpE,IAAIE,EACgB,mBAAXC,OACHA,OACA,SAAUC,GACR,MAAO,KAAOA,GAKXC,EAAeH,EAAa,WAE5BI,EAAeJ,EAAa,WAE5BK,EAAeL,EAAa,WAQhC,SAASM,EAAWT,EAAQU,EAAMC,GACvCd,EAAeG,EAAQU,EAAM,CAC3BC,MAAOA,EACPC,kBAAwB,IAAVD,EACdE,YAAY,EACZC,UAAU,IASP,SAASC,EAASJ,GACvB,OAAiB,OAAVA,GAAmC,iBAAVA,IAAuBrB,EAAeqB,GAQjE,SAASK,EAAWL,GACzB,MAAwB,mBAAVA,EAaT,SAASM,EAAWC,EAASC,GAClC,MAAM,IAAKA,EAAU1B,EAASE,GAAYuB,GC/E5C,IAGWE,GAAe,EAEfC,EAAgB,GAEhBC,EAAY,EAKvB,SAASC,IAIP,IAHA,IAAIL,EAAU,2DAEVM,EAASH,EAAcG,OAClBC,EAAID,EAAS,GAAIC,EAAID,EAAQC,IAAK,CAEzCP,GACE,MACGO,EAAI,GACL,MAJOJ,EAAcI,GAKfC,MAAQ,aAGpBT,EAAWC,GAAS,GAOf,SAASS,EAAeC,GAC7B,IAAI7B,EAAe6B,EAAMrB,MAGrBc,EAAcQ,YAAYD,IAASN,IACvCD,EAAcS,KAAKF,GAGd7B,EAAe6B,EAAMpB,IACxBC,EAAWmB,EAAMpB,EAAc,IAI5BY,IAAc,CACjBA,GAAe,EAEf,IACE,KAAOE,EAAYD,EAAcG,OAAQF,KAEtC,EAAGD,EAAcC,MACdA,EApDI,KAoDqCC,IAEhD,QACCH,GAAe,EACfC,EAAgB,GAChBC,EAAY,IAMX,SAASS,EAASH,GAMvB,OALKZ,EAAWY,IACdX,EDM8B,qCCHhCU,EAAeC,GACRA,EChET,SAASI,EAAiBrB,GACpBI,EAASJ,IAAQsB,EAAgBtB,GAGrC,IAAIuB,EAAU,GAKd,SAASC,EAAcP,GACrB,IAAIH,EAAIS,EAAQL,YAAYD,GACxBH,GAAK,GAAGS,EAAQE,OAAOX,EAAG,GAGhC,MAAO,CACLY,IAAK,WAEH,IAAIT,EAAOP,EAAcC,GACrBM,IACMM,EAAQL,YAAYD,GACpB,IAENM,EAAQJ,KAAKF,GAEbA,EAAKpB,GAAcsB,KAAKK,KAI5B,OAAOxB,GAET2B,IAAK,SAASC,GACRxB,EAASwB,IAAWN,EAAgBM,GACxC5B,EAAQ4B,EAGR,IAAK,IAAId,EAAI,EAAGA,EAAIS,EAAQV,OAAQC,IAClCE,EAAeO,EAAQT,MAU/B,SAASQ,EAAgBjC,GACvB,IAAID,EAAeC,EAAQM,GAG3B,IAAK,IAAIL,KAFTQ,EAAWT,EAAQM,GAEHN,EACd,GAAID,EAAeC,EAAQC,GACzB,IACEJ,EAAeG,EAAQC,EAAK+B,EAAiBhC,EAAOC,KACpD,MAAOuC,KAMR,SAASC,EAAQzC,GAMtB,OALKe,EAASf,IAAYgB,EAAWhB,IACnCiB,EFE4B,sCEC9BgB,EAAgBjC,GACTA,ECvEF,SAAS0C,EAAO1C,GASrB,OARKe,EAASf,IAAYgB,EAAWhB,IACnCiB,EHmE4B,sCGhEzBlB,EAAeC,EAAQM,IAC1BG,EAAWT,EAAQM,GAGdN,ECjBT2C,eAAeC,EAAQC,EAAKC,GACxB,MAAMC,QAAiBC,MAAMH,EAAK,CAAEI,OAAQ,YAAQH,IAE9CI,EAASH,EAASG,OAElBvC,QAAcoC,EAASI,OACvBC,EAAQzC,GAAO6B,IAErB,OAAa,MAATY,EACO,QAAEF,EAAQE,MAAO,WAAMzC,GAEvB,QAAEuC,EAAQE,MAAOC,OAAOD,GAAQzC,MAAO,MCPtD,MAGM2C,EAAe,CACjB,CAAEC,WAAY,GAAIC,WAAY,GAAI9B,KAAM,WACxC,CAAE6B,WAAY,GAAIC,WAAY,GAAI9B,KAAM,QACxC,CAAE6B,WAAY,GAAIC,WAAY,GAAI9B,KAAM,UACxC,CAAE6B,WAAY,GAAIC,WAAY,GAAI9B,KAAM,QACxC,CAAE6B,WAAY,GAAIC,WAAY,GAAI9B,KAAM,UACxC,CAAE6B,WAAY,GAAIC,WAAY,GAAI9B,KAAM,WACxC,CAAE6B,WAAY,GAAIC,WAAY,GAAI9B,KAAM,SAG5C,IAAK,MAAM+B,KAAeH,EAAcZ,EAAOe,GAE/C,MAAMC,EAAKC,GAAOC,SAASC,eAAeF,GAEpCG,EAA0BJ,EAAE,eAC5BK,EAA0BL,EAAE,oBAC5BM,EAA0BN,EAAE,qBAC5BO,EAA0BP,EAAE,+BAC5BQ,EAA0BR,EAAE,8BAC5BS,EAA0BT,EAAE,4BAC5BU,EAA0BV,EAAE,+BAC5BW,EAA0BX,EAAE,qBAC5BY,EAA0BZ,EAAE,4BAC5Ba,EAA0Bb,EAAE,0BAC5Bc,EAA0Bd,EAAE,4BAC5Be,EAA0Bf,EAAE,+BAC5BgB,EAA0BhB,EAAE,sBAC5BiB,EAA0BjB,EAAE,+BAC5BkB,EAA0BlB,EAAE,2BAC5BmB,EAA0BnB,EAAE,oBAC5BoB,EAA0BpB,EAAE,4BAC5BqB,EAA0BrB,EAAE,oBAElCI,EAAUkB,iBAAiB,UAAWC,GAAOA,EAAGC,mBAEhDnB,EAAcpD,MAAQ,GACtBqD,EAAerD,MAAQ,IACvBsD,EAAwBkB,SAAU,EAClCjB,EAAuBiB,SAAU,EACjChB,EAAqBgB,SAAU,EAC/Bf,EAAwBe,SAAU,EAElC,MAAMC,EAAW3C,EAAQ,CACrB4C,WAAY,EACZ5B,YAAa,KAEb6B,aAAa,EAEbC,UAAU,EACVC,aAAa,EAEbC,YAAa,UACbC,WAAY,IAGhB3D,GAAS,KACLqD,EAAS3B,YAAcH,EAAa8B,EAASC,aAAe,QAGhErB,EAAegB,iBAAiB,UAAU,KACtCI,EAASC,WAAaM,OAAO3B,EAAerD,UAGhDsD,EAAwBe,iBAAiB,UAAU,KAC3Cf,EAAwBkB,UAASC,EAASE,aAAc,MAGhEpB,EAAuBc,iBAAiB,UAAU,KAC1Cd,EAAuBiB,UAASC,EAASE,aAAc,MAG/DnB,EAAqBa,iBAAiB,UAAU,KAC5CI,EAASG,WAAapB,EAAqBgB,WAG/Cf,EAAwBY,iBAAiB,UAAU,KAC/CI,EAASI,cAAgBpB,EAAwBe,WAGrD,MAAMS,EAAcC,IAChB,GAAc,MAAVA,EAAgB,OAAO,KAE3B,IAAIC,EAAS,gBAAgBC,KAAKF,GAClC,OAAc,MAAVC,EAAuB,KAEpBE,SAASF,EAAO,GAAI,KAGzBG,EAAkBtF,GACb,IAAMgF,OAAOhF,GAAOuF,SAAS,IAGxCnE,GAAS,KACLqD,EAASM,WAAaE,EAAWR,EAASK,gBAG9C1D,GAAS,KACLsC,EAAe8B,UAAYf,EAASI,eAGxCzD,GAAS,KACLuC,EAAqB3D,MAAQyE,EAASK,eAG1CnB,EAAqBU,iBAAiB,UAAU,KAC5CI,EAASK,YAAclB,EAAmB5D,MAAQ2D,EAAqB3D,SAG3E4D,EAAmB5D,MAAQ,GAC3B4D,EAAmB6B,YAAchB,EAASK,YAE1ClB,EAAmBS,iBAAiB,SAAS,KACzC,IAAIrE,EAAQiF,EAAWrB,EAAmB5D,OAC7B,MAATA,IAAeyE,EAASK,YAAcQ,EAAetF,OAG7D4D,EAAmBS,iBAAiB,UAAU,KAC1C,IAAIrE,EAAQiF,EAAWrB,EAAmB5D,OAC7B,MAATA,IAAe4D,EAAmB5D,MAAQsF,EAAetF,OAGjE,MAAM0F,EAAU5D,EAAQ,CACpB6D,QAAS,cACTC,QAAS,OAGPC,EAAQC,GAAQA,EAAIC,UAAUC,IAAI,aAClCC,EAAQH,GAAQA,EAAIC,UAAUG,OAAO,aAE3C9E,GAAS,KACLyE,EAAK9B,GACL8B,EAAK7B,GACL6B,EAAK5B,GAEmB,gBAApByB,EAAQC,SACRM,EAAKjC,QACLiC,EAAKlC,IAIe,YAApB2B,EAAQC,SACRM,EAAKhC,QACLgC,EAAKlC,SAFT,KAOJ3C,GAAS,KACLyE,EAAK3B,GACL2B,EAAKzB,GAEL,IAAIwB,EAAUF,EAAQE,QACtB,GAAe,MAAXA,EAAJ,CAEA,GAAqB,UAAjBA,EAAQO,KAAkB,CAC1B,IAAI1D,EAAQmD,EAAQnD,MAGpB,OAFa,MAATA,IAAe0B,EAAqBiC,UAAY3D,QACpDwD,EAAK/B,GAIY,UAAjB0B,EAAQO,MACRF,EAAK7B,OAKb,MAAMiC,EAAOvE,EAAQ,CACjB9B,MAAO,KACPsG,QAAQ,IAGNC,EAAYC,IACI,MAAdH,EAAKrG,QACLqG,EAAKrG,MAAS,WACV,UACUwG,IACR,MAAO3E,GACL4E,QAAQhE,MAAMZ,GACjB,QACGwE,EAAKrG,MAAQ,OANP,KAYtBoB,GAAS,KACLiF,EAAKC,OAAuB,MAAdD,EAAKrG,SAGvB,MAAM0G,GAAQ5E,EAAQ,CAClB6E,OAAQ,KACRC,WAAY,KACZC,YAAa,OAGjBzF,GAAS,KACLgC,EAAcoC,SAAWa,EAAKC,UAGlClF,GAAS,KACLyC,EAAqB2B,SAAWa,EAAKC,QAA0B,MAAhBI,GAAMC,UAGzDvF,GAAS,KACL0C,EAAwB0B,SAAWa,EAAKC,QAA+B,MAArBI,GAAMG,eAG5DzD,EAAciB,iBAAiB,UAAU,KACrCkC,GAASvE,UAEL,IAAI8E,EAAO1D,EAAc2D,MAAMC,KAAK,GACpC,GAAY,MAARF,EAAc,OAElBpB,EAAQC,QAAU,UAClBD,EAAQE,QAAU,KAElB,IAAIqB,EAAUP,GAAMC,QAAQzE,IAO5B,GANe,MAAX+E,GAAiBC,IAAIC,gBAAgBF,GAEzCP,GAAMC,OAAS,KACfD,GAAME,WAAa,KACnBF,GAAMG,YAAc,KAEhBC,EAAKM,KAnOM,QAsOX,OAFA1B,EAAQC,QAAU,UAClBD,EAAQE,QAAU7D,EAAO,CAAEoE,KAAM,QAAS1D,MAAO,2DAIrD,IAAIP,EAAMgF,IAAIG,gBAAgBP,SAExB,IAAIQ,SAAQ,CAACC,EAASC,KAExBpD,EAAcqD,SAAW,OACzBrD,EAAcsD,IAAM,GAEpB,IAAIC,EAAS,KACT,IAAIC,EAAQxD,EAAcyD,aACtBC,EAAS1D,EAAc2D,cAEvBH,EAAQ,GAAKE,EAAS,GACtBpC,EAAQC,QAAU,KAClBD,EAAQE,QAAU7D,EAAO,CAAEoE,KAAM,QAAS1D,MAAO,4CAEjDiD,EAAQC,QAAU,KAClBD,EAAQE,QAAU7D,EAAO,CAAEoE,KAAM,UACjCO,GAAMC,OAAS5E,EAAO,MAAE+E,MAAM5E,QAAK0F,SAAOE,KAG9CE,IACAT,KAGAU,EAAU,KACVvC,EAAQC,QAAU,KAClBD,EAAQE,QAAU7D,EAAO,CAAEoE,KAAM,QAAS1D,MAAO,8BAEjDuF,IACAT,KAGAS,EAAkB,KAClB5D,EAAc8D,oBAAoB,OAAQP,GAC1CvD,EAAc8D,oBAAoB,QAASD,IAG/C7D,EAAcC,iBAAiB,OAAQsD,GACvCvD,EAAcC,iBAAiB,QAAS4D,GAExC7D,EAAcsD,IAAMxF,WAOhC,MA4BMiG,GAAsB,KACxB,IAAIC,EAAU,GAEVC,EA/BqB,MACzB,IAAIC,EAAS5B,GAAMC,OACnB,GAAc,MAAV2B,EAAgB,OAAO,KAE3B,IAAIC,EAAS,CAAEX,MAAOU,EAAOV,MAAOE,OAAQQ,EAAOR,QAqBnD,OAnBIS,EAAOX,MA7Ra,MA8RpBW,EAAS,CACLX,MA/RgB,IAgShBE,OAASS,EAAOT,OAASS,EAAOX,MAhShB,MAoSpBW,EAAOT,OApSa,MAqSpBS,EAAS,CACLX,MAAQW,EAAOX,MAAQW,EAAOT,OAtSd,IAuShBA,OAvSgB,MA2SxBS,EAAS,CACLX,MAAOY,KAAKC,MAAMF,EAAOX,OACzBE,OAAQU,KAAKC,MAAMF,EAAOT,SAGvB/F,EAAOwG,IAMGG,GAiBjB,OAhBAN,EAAQR,MAAQS,EAAWT,MAC3BQ,EAAQN,OAASO,EAAWP,OAE5BM,EAAQxF,WAAa6B,EAAS3B,YAAYF,WAC1CwF,EAAQvF,WAAa4B,EAAS3B,YAAYD,WAE1CuF,EAAQxD,SAAWH,EAASG,SAC5BwD,EAAQzD,YAAcF,EAASE,YAC/ByD,EAAQvD,YAAcJ,EAASI,YAE3BJ,EAASI,YACTuD,EAAQO,YAAclE,EAASM,YAAc,EAAI,OAAU,EAE3DqD,EAAQO,WAAa,EAGlB5G,EAAOqG,IAGlBvE,EAAqBQ,iBAAiB,SAAS,KAC3CkC,GAASvE,UAEL,IAAI2E,EAASD,GAAMC,OACnB,GAAc,MAAVA,EAAgB,OAEpBjB,EAAQC,QAAU,UAElB,IAAIiB,EAAaF,GAAME,WACvB,GAAkB,MAAdA,EACA,IACI,IA1VhBrE,OA0VsBA,EA1VtBE,MA0V8BA,EA1V9BzC,MA0VqCA,SD3UXmC,EC2UqCwE,EAAOG,KD1U3D7E,EAAQ,cAAeE,IC2UlB,GAAa,MAATnC,EAQA,OALA0F,EAAQC,QAAU,UAClBD,EAAQE,QAAU7D,EAAO,CACrBoE,KAAM,QACN1D,MAAO,+DAAiEF,EAAS,eAAiBE,KALtGmE,EAAa7E,EAAO/B,GAS1B,MAAO6B,GAML,OALA6D,EAAQC,QAAU,UAClBD,EAAQE,QAAU7D,EAAO,CACrBoE,KAAM,QACN1D,MAAO,uEAAyEZ,KD1V7F,IAAmBM,ECgWlB,IAAI0E,EACJ,IACI,IAjXZtE,OAiXkBA,EAjXlBE,MAiX0BA,EAjX1BzC,MAiXiCA,SD9VT4I,EC8ViChC,ED9V1BwB,EC8VsCD,KD3V1DlG,EAFK,aAAe,IAAI4G,gBAAgB,CAAC,CAAC,OAAQnG,OAAOkG,EAAM9B,SACzD,IAAIgC,KAAK,CAACC,KAAKC,UAAUZ,IAAW,CAAEjC,KAAM,uBC6VjD,GAAa,MAATnG,EAQA,OALA0F,EAAQC,QAAU,UAClBD,EAAQE,QAAU7D,EAAO,CACrBoE,KAAM,QACN1D,MAAO,sDAAwDF,EAAS,eAAiBE,KAL7FoE,EAAc9E,EAAO/B,GAS3B,MAAOiJ,GAML,OALAvD,EAAQC,QAAU,UAClBD,EAAQE,QAAU7D,EAAO,CACrBoE,KAAM,QACN1D,MAAO,8DAAgEwG,KD7WhF,IAAiBL,EAAOR,ECkXvB1B,GAAME,WAAaA,EACnBF,GAAMG,YAAcA,QAEd,IAAIS,SAAQ,CAACC,EAASC,KAExB,IAAIG,EAAS,KACTjC,EAAQC,QAAU,KAClBD,EAAQE,QAAU7D,EAAO,CAAEoE,KAAM,UAEjC6B,IACAT,KAGAU,EAAU,KACVvC,EAAQC,QAAU,KAClBD,EAAQE,QAAU7D,EAAO,CAAEoE,KAAM,QAAS1D,MAAO,gCAEjDuF,IACAT,KAGAS,EAAkB,KAClB5D,EAAc8D,oBAAoB,OAAQP,GAC1CvD,EAAc8D,oBAAoB,QAASD,IAG/C7D,EAAcC,iBAAiB,OAAQsD,GACvCvD,EAAcC,iBAAiB,QAAS4D,GAExCvC,EAAQE,QAAU,KAElBxB,EAAcqD,SAAW,OACzBrD,EAAcsD,IAAMb,EAAYC,cAO5ChD,EAAwBO,iBAAiB,SAAS,KAC9CkC,GAASvE,UAEL,IAAI2E,EAASD,GAAMC,OACnB,GAAc,MAAVA,EAAgB,OAEpB,IAGIuC,EAHArC,EAAcH,GAAMG,YACxB,GAAmB,MAAfA,EAAqB,OAGzBqC,EAAWvC,EAAOG,KAAK/F,KACvBmI,EAAWA,EAASC,QAAO,aAAe,IAC1CD,EAAWA,EAAW,IAAMrC,EAAYC,KAAKsC,UAAU,GAAI,IAAM,OAEjE,IAAIlH,EAAM,IAAIgF,IAAImC,SAASC,MAC3BpH,EAAIqH,SAAW1C,EAAYC,KAC3B5E,EAAIsH,OAAS9G,OAAO,IAAImG,gBAAgB,CAAC,CAAC,aAAcK,MACxDhH,EAAIuH,KAAO,GAEX,IAAIC,EAAQzG,SAASd,KAAKwH,YAAY1G,SAAS2G,cAAc,MAC7DF,EAAMJ,KAAO5G,OAAOR,GACpBwH,EAAMG,QACNH,EAAMxD","sources":["node_modules/patella/lib/util.js","node_modules/patella/lib/computed.js","node_modules/patella/lib/reactive.js","node_modules/patella/lib/ignore.js","src/scripts/api.js","src/scripts/index.js"],"sourcesContent":["// Global object/function references\nvar _Object = Object;\nvar _Object_hasOwnProperty = _Object.hasOwnProperty;\nvar _Array_isArray = Array.isArray;\nvar _Error = Error;\nvar _TypeError = TypeError;\n\n/** Reference to global Object.defineProperty */\nexport var defineProperty = _Object.defineProperty;\n\n/**\n * Checks if an object has a specified property as its own property (ignores prototype properties and `__proto__`)\n * @param object Object to check\n * @param key Property key\n * @returns Does `object` have the property `key`?\n */\nexport function hasOwnProperty(object, key) {\n return key !== \"__proto__\" && _Object_hasOwnProperty.call(object, key);\n}\n\n/**\n * Creates an ECMAScript 6 Symbol, falling back to a simple string in environments that do not support Symbols\n * @param description Symbol description\n * @returns Symbol object or string\n * @function\n */\n/* c8 ignore start */\n/* istanbul ignore next */\nvar createSymbol =\n typeof Symbol === \"function\"\n ? Symbol\n : function (description) {\n return \"__\" + description;\n };\n/* c8 ignore stop */\n\n/** Hint property to indicate if an object has been observed */\nexport var HINT_OBSERVE = createSymbol(\"observe\");\n/** Hint property to indicate if a function has been disposed */\nexport var HINT_DISPOSE = createSymbol(\"dispose\");\n/** Hint property that contains a function's dependency disposal callbacks */\nexport var HINT_DEPENDS = createSymbol(\"depends\");\n\n/**\n * Defines a hint property on an object\n * @param object Object to define property on\n * @param hint Property key\n * @param {*} [value] Property value, property will be made non-configurable if this is unset (`undefined`)\n */\nexport function defineHint(object, hint, value) {\n defineProperty(object, hint, {\n value: value,\n configurable: value !== void 0,\n enumerable: false,\n writable: false\n });\n}\n\n/**\n * Checks if a value is a normal object, ignores functions and arrays\n * @param value Value to check\n * @returns Is `value` a normal object?\n */\nexport function isObject(value) {\n return value !== null && typeof value === \"object\" && !_Array_isArray(value);\n}\n\n/**\n * Checks if a value is a function\n * @param value Value to check\n * @return Is `value` a function?\n */\nexport function isFunction(value) {\n return typeof value === \"function\";\n}\n\n/** Error message printed when an argument is of an incorrect type (not a normal object) */\nexport var MESSAGE_NOT_OBJECT = \"Argument 'object' is not an object\";\n/** Error message printed when an argument is of an incorrect type (not a function) */\nexport var MESSAGE_NOT_FUNCTION = \"Argument 'func' is not a function\";\n\n/**\n * Throws an error message\n * @param message Message to construct the error with\n * @param generic Should the more generic `Error` be thrown instead of `TypeError`?\n */\nexport function throwError(message, generic) {\n throw new (generic ? _Error : _TypeError)(message);\n}\n","import {\n isFunction,\n hasOwnProperty,\n HINT_DISPOSE, HINT_DEPENDS, defineHint,\n MESSAGE_NOT_FUNCTION, throwError\n} from \"./util.js\";\n\n/** Maximum queue length */\nvar MAX_QUEUE = 2000;\n\n/** Is the queue being executed? */\nexport var computedLock = false;\n/** Queue of computed functions to be called */\nexport var computedQueue = [];\n/** Current index into `computedQueue` */\nexport var computedI = 0;\n\n/**\n * Throws an error indicating that the computed queue has overflowed\n */\nfunction computedOverflow() {\n var message = \"Computed queue overflow! Last 10 functions in the queue:\";\n\n var length = computedQueue.length;\n for (var i = length - 11; i < length; i++) {\n var func = computedQueue[i];\n message +=\n \"\\n\"\n + (i + 1)\n + \": \"\n + (func.name || \"anonymous\");\n }\n\n throwError(message, true);\n}\n\n/**\n * Attempts to add a function to the computed queue, then attempts to lock and execute the computed queue\n * @param func Function to queue\n */\nexport function computedNotify(func) {\n if (hasOwnProperty(func, HINT_DISPOSE)) return;\n\n // Only add to the queue if not already pending execution\n if (computedQueue.lastIndexOf(func) >= computedI) return;\n computedQueue.push(func);\n\n // Make sure that the function in question has a depends hint\n if (!hasOwnProperty(func, HINT_DEPENDS)) {\n defineHint(func, HINT_DEPENDS, []);\n }\n\n // Attempt to lock and execute the queue\n if (!computedLock) {\n computedLock = true;\n\n try {\n for (; computedI < computedQueue.length; computedI++) {\n // Indirectly call the function to avoid leaking `computedQueue` as `this`\n (0, computedQueue[computedI])();\n if (computedI > MAX_QUEUE) /* @__NOINLINE */ computedOverflow();\n }\n } finally {\n computedLock = false;\n computedQueue = [];\n computedI = 0;\n }\n }\n}\n\n/** See lib/patella.d.ts */\nexport function computed(func) {\n if (!isFunction(func)) {\n throwError(MESSAGE_NOT_FUNCTION);\n }\n\n computedNotify(func);\n return func;\n}\n","import { computedQueue, computedI, computedNotify } from \"./computed.js\";\nimport {\n isObject, isFunction,\n hasOwnProperty, defineProperty,\n HINT_OBSERVE, HINT_DEPENDS, defineHint,\n MESSAGE_NOT_OBJECT, throwError\n} from \"./util.js\";\n\n/**\n * Generates a property descriptor for a reactive property\n * @param value Initial property value\n * @returns Property descriptor object\n */\nfunction reactiveProperty(value) {\n if (isObject(value)) reactiveObserve(value);\n\n // List of computed functions that depend on this property\n var depends = [];\n /**\n * Remove a computed function from this reactive property\n * @param func Computed function to remove\n */\n function dependsRemove(func) {\n var i = depends.lastIndexOf(func);\n if (i >= 0) depends.splice(i, 1);\n }\n\n return {\n get: function() {\n // Add the current executing computed function to this reactive property's dependencies\n var func = computedQueue[computedI];\n if (func) {\n var i = depends.lastIndexOf(func);\n if (i < 0) {\n // Add them to our dependencies\n depends.push(func);\n // Add us to their dependants\n func[HINT_DEPENDS].push(dependsRemove);\n }\n }\n\n return value;\n },\n set: function(newValue) {\n if (isObject(newValue)) reactiveObserve(newValue);\n value = newValue;\n\n // Notify all dependencies\n for (var i = 0; i < depends.length; i++) {\n computedNotify(depends[i]);\n }\n }\n };\n}\n\n/**\n * Observes an object by making all of its enumerable properties reactive\n * @param object Object to observe\n */\nfunction reactiveObserve(object) {\n if (hasOwnProperty(object, HINT_OBSERVE)) return;\n defineHint(object, HINT_OBSERVE);\n\n for (var key in object) {\n if (hasOwnProperty(object, key)) {\n try {\n defineProperty(object, key, reactiveProperty(object[key]));\n } catch (err) {}\n }\n }\n}\n\n/** See lib/patella.d.ts */\nexport function observe(object) {\n if (!isObject(object) && !isFunction(object)) {\n throwError(MESSAGE_NOT_OBJECT);\n }\n\n reactiveObserve(object);\n return object;\n}\n","import {\n isObject, isFunction,\n hasOwnProperty,\n HINT_OBSERVE, defineHint,\n MESSAGE_NOT_OBJECT, throwError\n} from \"./util.js\";\n\n/** See lib/patella.d.ts */\nexport function ignore(object) {\n if (!isObject(object) && !isFunction(object)) {\n throwError(MESSAGE_NOT_OBJECT);\n }\n\n if (!hasOwnProperty(object, HINT_OBSERVE)) {\n defineHint(object, HINT_OBSERVE);\n }\n\n return object;\n}\n","async function apiPost(url, body) {\r\n const response = await fetch(url, { method: 'POST', body });\r\n\r\n const status = response.status;\r\n\r\n const value = await response.json();\r\n const error = value?.err;\r\n\r\n if (error == null) {\r\n return { status, error: null, value };\r\n } else {\r\n return { status, error: String(error), value: null };\r\n }\r\n}\r\n\r\nexport function apiUpload(body) {\r\n return apiPost('/api/upload', body);\r\n}\r\n\r\nexport function apiSpin(token, options) {\r\n const url = '/api/spin?' + new URLSearchParams([['file', String(token.file)]]);\r\n const body = new Blob([JSON.stringify(options)], { type: 'application/json' });\r\n return apiPost(url, body);\r\n}\r\n","import { observe, computed, ignore } from 'patella';\r\n\r\nimport { apiUpload, apiSpin } from './api.js';\r\n\r\nconst envMaxFileSize = 5 * 1024 * 1024;\r\nconst envResolutionTarget = 400;\r\n\r\nconst speedConfigs = [\r\n { frameCount: 90, frameDelay: 32, name: 'Slowest' },\r\n { frameCount: 60, frameDelay: 32, name: 'Slow' },\r\n { frameCount: 60, frameDelay: 16, name: 'Normal' },\r\n { frameCount: 48, frameDelay: 16, name: 'Fast' },\r\n { frameCount: 32, frameDelay: 16, name: 'Faster' },\r\n { frameCount: 24, frameDelay: 16, name: 'Fastest' },\r\n { frameCount: 16, frameDelay: 16, name: 'HELP' }\r\n];\r\n\r\nfor (const speedConfig of speedConfigs) ignore(speedConfig);\r\n\r\nconst $ = (id) => document.getElementById(id);\r\n\r\nconst $settings = $('gs-settings')\r\n , $settingsFile = $('gs-settings-file')\r\n , $settingsSpeed = $('gs-settings-speed')\r\n , $settingsDirectionRight = $('gs-settings-direction-right')\r\n , $settingsDirectionLeft = $('gs-settings-direction-left')\r\n , $settingsOptionsCrop = $('gs-settings-options-crop')\r\n , $settingsOptionsFlatten = $('gs-settings-options-flatten')\r\n , $settingsColor = $('gs-settings-color')\r\n , $settingsColorPicker = $('gs-settings-color-picker')\r\n , $settingsColorText = $('gs-settings-color-text')\r\n , $settingsSubmitApply = $('gs-settings-submit-apply')\r\n , $settingsSubmitDownload = $('gs-settings-submit-download')\r\n , $previewOverlay = $('gs-preview-overlay')\r\n , $previewIconPlaceholder = $('gs-preview-icon-placeholder')\r\n , $previewIconLoading = $('gs-preview-icon-loading')\r\n , $previewError = $('gs-preview-error')\r\n , $previewErrorContent = $('gs-preview-error-content')\r\n , $previewImage = $('gs-preview-image');\r\n\r\n$settings.addEventListener('submit', (ev) => ev.preventDefault());\r\n\r\n$settingsFile.value = '';\r\n$settingsSpeed.value = '2';\r\n$settingsDirectionRight.checked = true;\r\n$settingsDirectionLeft.checked = false;\r\n$settingsOptionsCrop.checked = false;\r\n$settingsOptionsFlatten.checked = false;\r\n\r\nconst settings = observe({\r\n speedIndex: 2,\r\n speedConfig: null,\r\n\r\n flagReverse: false,\r\n\r\n flagCrop: false,\r\n flagFlatten: false,\r\n\r\n colorString: '#0eaaaa',\r\n colorValue: 0\r\n});\r\n\r\ncomputed(() => {\r\n settings.speedConfig = speedConfigs[settings.speedIndex] ?? null;\r\n});\r\n\r\n$settingsSpeed.addEventListener('change', () => {\r\n settings.speedIndex = Number($settingsSpeed.value);\r\n});\r\n\r\n$settingsDirectionRight.addEventListener('change', () => {\r\n if ($settingsDirectionRight.checked) settings.flagReverse = false;\r\n});\r\n\r\n$settingsDirectionLeft.addEventListener('change', () => {\r\n if ($settingsDirectionLeft.checked) settings.flagReverse = true;\r\n});\r\n\r\n$settingsOptionsCrop.addEventListener('change', () => {\r\n settings.flagCrop = !!$settingsOptionsCrop.checked;\r\n});\r\n\r\n$settingsOptionsFlatten.addEventListener('change', () => {\r\n settings.flagFlatten = !!$settingsOptionsFlatten.checked;\r\n});\r\n\r\nconst colorParse = (string) => {\r\n if (string == null) return null;\r\n\r\n let result = /([\\da-f]{6})/i.exec(string);\r\n if (result == null) return null;\r\n\r\n return parseInt(result[1], 16);\r\n};\r\n\r\nconst colorStringify = (value) => {\r\n return '#' + Number(value).toString(16);\r\n};\r\n\r\ncomputed(() => {\r\n settings.colorValue = colorParse(settings.colorString);\r\n});\r\n\r\ncomputed(() => {\r\n $settingsColor.disabled = !settings.flagFlatten;\r\n});\r\n\r\ncomputed(() => {\r\n $settingsColorPicker.value = settings.colorString;\r\n});\r\n\r\n$settingsColorPicker.addEventListener('change', () => {\r\n settings.colorString = $settingsColorText.value = $settingsColorPicker.value;\r\n});\r\n\r\n$settingsColorText.value = '';\r\n$settingsColorText.placeholder = settings.colorString;\r\n\r\n$settingsColorText.addEventListener('input', () => {\r\n let value = colorParse($settingsColorText.value);\r\n if (value != null) settings.colorString = colorStringify(value);\r\n});\r\n\r\n$settingsColorText.addEventListener('change', () => {\r\n let value = colorParse($settingsColorText.value);\r\n if (value != null) $settingsColorText.value = colorStringify(value);\r\n});\r\n\r\nconst preview = observe({\r\n overlay: 'placeholder',\r\n content: null\r\n});\r\n\r\nconst hide = ($el) => $el.classList.add('gs-hidden');\r\nconst show = ($el) => $el.classList.remove('gs-hidden');\r\n\r\ncomputed(() => {\r\n hide($previewOverlay);\r\n hide($previewIconPlaceholder);\r\n hide($previewIconLoading);\r\n\r\n if (preview.overlay === 'placeholder') {\r\n show($previewIconPlaceholder);\r\n show($previewOverlay);\r\n return;\r\n }\r\n\r\n if (preview.overlay === 'loading') {\r\n show($previewIconLoading);\r\n show($previewOverlay);\r\n return;\r\n }\r\n});\r\n\r\ncomputed(() => {\r\n hide($previewError);\r\n hide($previewImage);\r\n\r\n let content = preview.content;\r\n if (content == null) return;\r\n\r\n if (content.type === 'error') {\r\n let error = content.error;\r\n if (error != null) $previewErrorContent.innerText = error;\r\n show($previewError);\r\n return;\r\n }\r\n\r\n if (content.type === 'image') {\r\n show($previewImage);\r\n return;\r\n }\r\n});\r\n\r\nconst task = observe({\r\n value: null,\r\n locked: false\r\n});\r\n\r\nconst taskNext = (provider) => {\r\n if (task.value == null) {\r\n task.value = (async () => {\r\n try {\r\n await provider();\r\n } catch (err) {\r\n console.error(err);\r\n } finally {\r\n task.value = null;\r\n }\r\n })();\r\n }\r\n};\r\n\r\ncomputed(() => {\r\n task.locked = task.value != null;\r\n});\r\n\r\nconst state = observe({\r\n source: null,\r\n tokenInput: null,\r\n tokenOutput: null\r\n});\r\n\r\ncomputed(() => {\r\n $settingsFile.disabled = task.locked;\r\n});\r\n\r\ncomputed(() => {\r\n $settingsSubmitApply.disabled = task.locked || state.source == null;\r\n});\r\n\r\ncomputed(() => {\r\n $settingsSubmitDownload.disabled = task.locked || state.tokenOutput == null;\r\n});\r\n\r\n$settingsFile.addEventListener('change', () => {\r\n taskNext(async () => {\r\n\r\n let file = $settingsFile.files.item(0);\r\n if (file == null) return;\r\n\r\n preview.overlay = 'loading';\r\n preview.content = null;\r\n\r\n let urlPrev = state.source?.url;\r\n if (urlPrev != null) URL.revokeObjectURL(urlPrev);\r\n\r\n state.source = null;\r\n state.tokenInput = null;\r\n state.tokenOutput = null;\r\n\r\n if (file.size > envMaxFileSize) {\r\n preview.overlay = null;\r\n preview.content = ignore({ type: 'error', error: 'Uploaded image is too large, maximum file size is 5mb' });\r\n return;\r\n }\r\n\r\n let url = URL.createObjectURL(file);\r\n\r\n await new Promise((resolve, reject) => {\r\n\r\n $previewImage.decoding = 'sync';\r\n $previewImage.src = '';\r\n\r\n let onLoad = () => {\r\n let width = $previewImage.naturalWidth;\r\n let height = $previewImage.naturalHeight;\r\n\r\n if (width < 4 || height < 4) {\r\n preview.overlay = null;\r\n preview.content = ignore({ type: 'error', error: 'Uploaded image is invalid / too small' });\r\n } else {\r\n preview.overlay = null;\r\n preview.content = ignore({ type: 'image' });\r\n state.source = ignore({ file, url, width, height });\r\n }\r\n\r\n removeListeners();\r\n resolve();\r\n };\r\n\r\n let onError = () => {\r\n preview.overlay = null;\r\n preview.content = ignore({ type: 'error', error: 'Uploaded image is invalid' });\r\n\r\n removeListeners();\r\n resolve();\r\n };\r\n\r\n let removeListeners = () => {\r\n $previewImage.removeEventListener('load', onLoad);\r\n $previewImage.removeEventListener('error', onError);\r\n };\r\n\r\n $previewImage.addEventListener('load', onLoad);\r\n $previewImage.addEventListener('error', onError);\r\n\r\n $previewImage.src = url;\r\n\r\n });\r\n\r\n });\r\n});\r\n\r\nconst optionsGetResolution = () => {\r\n let actual = state.source;\r\n if (actual == null) return null;\r\n\r\n let target = { width: actual.width, height: actual.height };\r\n\r\n if (target.width > envResolutionTarget) {\r\n target = {\r\n width: envResolutionTarget,\r\n height: (target.height / target.width) * envResolutionTarget\r\n };\r\n }\r\n\r\n if (target.height > envResolutionTarget) {\r\n target = {\r\n width: (target.width / target.height) * envResolutionTarget,\r\n height: envResolutionTarget\r\n };\r\n }\r\n\r\n target = {\r\n width: Math.round(target.width),\r\n height: Math.round(target.height)\r\n };\r\n\r\n return ignore(target);\r\n};\r\n\r\nconst optionsFromSettings = () => {\r\n let options = {};\r\n\r\n let resolution = optionsGetResolution();\r\n options.width = resolution.width;\r\n options.height = resolution.height;\r\n\r\n options.frameCount = settings.speedConfig.frameCount;\r\n options.frameDelay = settings.speedConfig.frameDelay;\r\n\r\n options.flagCrop = settings.flagCrop;\r\n options.flagReverse = settings.flagReverse;\r\n options.flagFlatten = settings.flagFlatten;\r\n\r\n if (settings.flagFlatten) {\r\n options.background = (settings.colorValue << 8 | 0xFF) >>> 0;\r\n } else {\r\n options.background = 0;\r\n }\r\n\r\n return ignore(options);\r\n};\r\n\r\n$settingsSubmitApply.addEventListener('click', () => {\r\n taskNext(async () => {\r\n\r\n let source = state.source;\r\n if (source == null) return;\r\n\r\n preview.overlay = 'loading';\r\n\r\n let tokenInput = state.tokenInput;\r\n if (tokenInput == null) {\r\n try {\r\n let { status, error, value } = await apiUpload(source.file);\r\n if (value != null) {\r\n tokenInput = ignore(value);\r\n } else {\r\n preview.overlay = null;\r\n preview.content = ignore({\r\n type: 'error',\r\n error: 'Failed to upload source image, server responded with status ' + status + ', message:\\n' + error\r\n });\r\n return;\r\n }\r\n } catch (err) {\r\n preview.overlay = null;\r\n preview.content = ignore({\r\n type: 'error',\r\n error: 'Failed to upload source image, unexpected internal error occurred:\\n' + err\r\n });\r\n return;\r\n }\r\n }\r\n\r\n let tokenOutput;\r\n try {\r\n let { status, error, value } = await apiSpin(tokenInput, optionsFromSettings());\r\n if (value != null) {\r\n tokenOutput = ignore(value);\r\n } else {\r\n preview.overlay = null;\r\n preview.content = ignore({\r\n type: 'error',\r\n error: 'Failed to spin image, server responded with status ' + status + ', message:\\n' + error\r\n });\r\n return;\r\n }\r\n } catch (err) {\r\n preview.overlay = null;\r\n preview.content = ignore({\r\n type: 'error',\r\n error: 'Failed to spin image, unexpected internal error occurred:\\n' + err\r\n });\r\n return;\r\n }\r\n\r\n state.tokenInput = tokenInput;\r\n state.tokenOutput = tokenOutput;\r\n\r\n await new Promise((resolve, reject) => {\r\n\r\n let onLoad = () => {\r\n preview.overlay = null;\r\n preview.content = ignore({ type: 'image' });\r\n\r\n removeListeners();\r\n resolve();\r\n };\r\n\r\n let onError = () => {\r\n preview.overlay = null;\r\n preview.content = ignore({ type: 'error', error: 'Failed to load output image' });\r\n\r\n removeListeners();\r\n resolve();\r\n };\r\n\r\n let removeListeners = () => {\r\n $previewImage.removeEventListener('load', onLoad);\r\n $previewImage.removeEventListener('error', onError);\r\n };\r\n\r\n $previewImage.addEventListener('load', onLoad);\r\n $previewImage.addEventListener('error', onError);\r\n\r\n preview.content = null;\r\n\r\n $previewImage.decoding = 'sync';\r\n $previewImage.src = tokenOutput.file;\r\n\r\n });\r\n\r\n });\r\n});\r\n\r\n$settingsSubmitDownload.addEventListener('click', () => {\r\n taskNext(async () => {\r\n\r\n let source = state.source;\r\n if (source == null) return;\r\n\r\n let tokenOutput = state.tokenOutput;\r\n if (tokenOutput == null) return;\r\n\r\n let filename;\r\n filename = source.file.name;\r\n filename = filename.replace(/\\.[^/.]*?$/, '');\r\n filename = filename + '-' + tokenOutput.file.substring(23, 27) + '.gif';\r\n\r\n let url = new URL(location.href);\r\n url.pathname = tokenOutput.file;\r\n url.search = String(new URLSearchParams([['attachment', filename]]));\r\n url.hash = '';\r\n\r\n let $link = document.body.appendChild(document.createElement('a'));\r\n $link.href = String(url);\r\n $link.click();\r\n $link.remove();\r\n\r\n });\r\n});\r\n"],"names":["$ee8d2ed178a3126c$var$_Object","Object","$ee8d2ed178a3126c$var$_Object_hasOwnProperty","hasOwnProperty","$ee8d2ed178a3126c$var$_Array_isArray","Array","isArray","$ee8d2ed178a3126c$var$_Error","Error","$ee8d2ed178a3126c$var$_TypeError","TypeError","$ee8d2ed178a3126c$export$fdab3c20aae16ddf","defineProperty","$ee8d2ed178a3126c$export$5a15a386532a5ea4","object","key","call","$ee8d2ed178a3126c$var$createSymbol","Symbol","description","$ee8d2ed178a3126c$export$cc1fec799b17f02c","$ee8d2ed178a3126c$export$92575bae6daf02e3","$ee8d2ed178a3126c$export$22032fbbc2452628","$ee8d2ed178a3126c$export$29680e2e9ab5404b","hint","value","configurable","enumerable","writable","$ee8d2ed178a3126c$export$a6cdc56e425d0d0a","$ee8d2ed178a3126c$export$f6e2535fb5126e54","$ee8d2ed178a3126c$export$8bf7aba4a9e09055","message","generic","$e75791361898ec8b$export$234c81d1ee156880","$e75791361898ec8b$export$2f7c44278fd2200b","$e75791361898ec8b$export$ac79203035bb18fa","$e75791361898ec8b$var$computedOverflow","length","i","name","$e75791361898ec8b$export$2b807b987ae4175a","func","lastIndexOf","push","$e75791361898ec8b$export$2983e091f1a1e8e2","$787720fdf6109908$var$reactiveProperty","$787720fdf6109908$var$reactiveObserve","depends","dependsRemove","splice","get","set","newValue","err","$787720fdf6109908$export$d1203567a167490e","$cfa14e6dc72f7963$export$738b109e247a462c","async","$38284ca8c0530ade$var$apiPost","url","body","response","fetch","method","status","json","error","String","$cba3eb2abed8e80a$var$speedConfigs","frameCount","frameDelay","speedConfig","$cba3eb2abed8e80a$var$$","id","document","getElementById","$cba3eb2abed8e80a$var$$settings","$cba3eb2abed8e80a$var$$settingsFile","$cba3eb2abed8e80a$var$$settingsSpeed","$cba3eb2abed8e80a$var$$settingsDirectionRight","$cba3eb2abed8e80a$var$$settingsDirectionLeft","$cba3eb2abed8e80a$var$$settingsOptionsCrop","$cba3eb2abed8e80a$var$$settingsOptionsFlatten","$cba3eb2abed8e80a$var$$settingsColor","$cba3eb2abed8e80a$var$$settingsColorPicker","$cba3eb2abed8e80a$var$$settingsColorText","$cba3eb2abed8e80a$var$$settingsSubmitApply","$cba3eb2abed8e80a$var$$settingsSubmitDownload","$cba3eb2abed8e80a$var$$previewOverlay","$cba3eb2abed8e80a$var$$previewIconPlaceholder","$cba3eb2abed8e80a$var$$previewIconLoading","$cba3eb2abed8e80a$var$$previewError","$cba3eb2abed8e80a$var$$previewErrorContent","$cba3eb2abed8e80a$var$$previewImage","addEventListener","ev","preventDefault","checked","$cba3eb2abed8e80a$var$settings","speedIndex","flagReverse","flagCrop","flagFlatten","colorString","colorValue","Number","$cba3eb2abed8e80a$var$colorParse","string","result","exec","parseInt","$cba3eb2abed8e80a$var$colorStringify","toString","disabled","placeholder","$cba3eb2abed8e80a$var$preview","overlay","content","$cba3eb2abed8e80a$var$hide","$el","classList","add","$cba3eb2abed8e80a$var$show","remove","type","innerText","$cba3eb2abed8e80a$var$task","locked","$cba3eb2abed8e80a$var$taskNext","provider","console","$cba3eb2abed8e80a$var$state","source","tokenInput","tokenOutput","file","files","item","urlPrev","URL","revokeObjectURL","size","createObjectURL","Promise","resolve","reject","decoding","src","onLoad","width","naturalWidth","height","naturalHeight","removeListeners","onError","removeEventListener","$cba3eb2abed8e80a$var$optionsFromSettings","options","resolution","actual","target","Math","round","$cba3eb2abed8e80a$var$optionsGetResolution","background","token","URLSearchParams","Blob","JSON","stringify","err1","filename","replace","substring","location","href","pathname","search","hash","$link","appendChild","createElement","click"],"version":3,"file":"index.04b9f210.js.map"}