From 67748b058b1ef953db9e587c7d80b9187446f539 Mon Sep 17 00:00:00 2001 From: Conner McCall Date: Fri, 26 Jan 2024 09:12:33 -0600 Subject: [PATCH] adding masked email --- Dockerfile | 12 +- go.mod | 2 + go.sum | 4 + src/main.go | 32 +++- src/maskedmail.go | 29 ++++ static/maskedemail/icon-32x32.png | Bin 0 -> 1619 bytes .../maskedemail/images/icons/icon-128x128.png | Bin 0 -> 2319 bytes .../maskedemail/images/icons/icon-144x144.png | Bin 0 -> 2695 bytes .../maskedemail/images/icons/icon-152x152.png | Bin 0 -> 2917 bytes .../maskedemail/images/icons/icon-192x192.png | Bin 0 -> 3889 bytes .../maskedemail/images/icons/icon-384x384.png | 0 .../maskedemail/images/icons/icon-512x512.png | Bin 0 -> 8566 bytes .../maskedemail/images/icons/icon-72x72.png | Bin 0 -> 1334 bytes .../maskedemail/images/icons/icon-96x96.png | Bin 0 -> 1492 bytes static/maskedemail/index.html | 139 ++++++++++++++++++ static/maskedemail/lib/htmx.min.js | 1 + static/maskedemail/manifest.json | 52 +++++++ 17 files changed, 265 insertions(+), 6 deletions(-) create mode 100644 src/maskedmail.go create mode 100644 static/maskedemail/icon-32x32.png create mode 100644 static/maskedemail/images/icons/icon-128x128.png create mode 100644 static/maskedemail/images/icons/icon-144x144.png create mode 100644 static/maskedemail/images/icons/icon-152x152.png create mode 100644 static/maskedemail/images/icons/icon-192x192.png create mode 100644 static/maskedemail/images/icons/icon-384x384.png create mode 100644 static/maskedemail/images/icons/icon-512x512.png create mode 100644 static/maskedemail/images/icons/icon-72x72.png create mode 100644 static/maskedemail/images/icons/icon-96x96.png create mode 100644 static/maskedemail/index.html create mode 100644 static/maskedemail/lib/htmx.min.js create mode 100644 static/maskedemail/manifest.json diff --git a/Dockerfile b/Dockerfile index e7b1e2d..3c37898 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,14 @@ -FROM golang:1.17 +FROM golang:1.18 WORKDIR /go/src/app -COPY src build-src -RUN go mod init connermccall.me -RUN go get -u github.com/gin-gonic/gin -RUN go build build-src/main.go +COPY go.mod go.sum ./ +RUN go mod download && go mod verify +COPY src build-src + +RUN go build build-src/*.go +COPY static static RUN rm -rf src EXPOSE 8080/tcp diff --git a/go.mod b/go.mod index 6cb207d..28df293 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module connermccall.me go 1.17 require ( + github.com/dvcrn/maskedemail-cli v0.0.0-20230603113757-7a0ce82189f6 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-gonic/gin v1.7.7 // indirect github.com/go-playground/locales v0.13.0 // indirect @@ -12,6 +13,7 @@ require ( github.com/json-iterator/go v1.1.9 // indirect github.com/leodido/go-urn v1.2.0 // indirect github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 // indirect github.com/ugorji/go/codec v1.1.7 // indirect diff --git a/go.sum b/go.sum index abee8fc..87a1d27 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dvcrn/maskedemail-cli v0.0.0-20230603113757-7a0ce82189f6 h1:ORgd6cYAg5GdPNNE95vFXyy73rx8xy1XCprpVDGN1jE= +github.com/dvcrn/maskedemail-cli v0.0.0-20230603113757-7a0ce82189f6/go.mod h1:TU8E0RslsOUiXYsICzcpPcThV56wOhuGt+5+NNXDx6k= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= @@ -20,6 +22,8 @@ github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= diff --git a/src/main.go b/src/main.go index 779e85e..5092a43 100644 --- a/src/main.go +++ b/src/main.go @@ -2,10 +2,12 @@ package main import ( "bytes" + "encoding/json" + "fmt" "log" "net/http" "os" - "encoding/json" + "github.com/gin-gonic/gin" ) @@ -60,5 +62,33 @@ func main() { "message": "OK", }) }) + router.Static("/maskedemail", "./static/maskedemail") + router.GET("mask", func(c *gin.Context) { + description := c.Query("description") + if description == "" { + // Return an error response if description is not provided + c.JSON(http.StatusBadRequest, gin.H{"error": "Description is required"}) + return + } + htmlx := c.Query("htmlx") + domain := c.Query("domain") // This will be an empty string if not provided + + email, err := CreateMaskedEmail(description, domain) + if err != nil { + // Log the error and return an error response + log.Println("Error:", err) + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create masked email"}) + return + } + + log.Print(email) + if htmlx != "true" { + c.String(http.StatusOK, email) + } else { + res := fmt.Sprintf("

%s

", email) + c.String(http.StatusOK, res) + } + }) + router.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") } diff --git a/src/maskedmail.go b/src/maskedmail.go new file mode 100644 index 0000000..f0e4ac2 --- /dev/null +++ b/src/maskedmail.go @@ -0,0 +1,29 @@ +package main + +import ( + "log" + "os" + + "github.com/dvcrn/maskedemail-cli/pkg" +) + + + + +func CreateMaskedEmail(alias string, domain string) (string, error) { + var fastmailAPIKey, fastmailAccountId string + fastmailAPIKey = os.Getenv("FASTMAIL_API_KEY") + fastmailAccountId = os.Getenv("FASTMAIL_ACCOUNT_ID") + // Prepare the request payload + client := pkg.NewClient(fastmailAPIKey, "personal-api", "3654417c") + session, err := client.Session() + if err != nil { + log.Fatalf("initializing session: %v", err) + } + createRes, err := client.CreateMaskedEmail(session, fastmailAccountId, "", alias, "", true) + if err != nil { + log.Fatalf("error creating masked email: %v", err) + } + + return createRes.Email, nil +} \ No newline at end of file diff --git a/static/maskedemail/icon-32x32.png b/static/maskedemail/icon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e84bc4c9558bb4d16177a55e3efc78674546420b GIT binary patch literal 1619 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 literal 0 HcmV?d00001 diff --git a/static/maskedemail/images/icons/icon-144x144.png b/static/maskedemail/images/icons/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..4472364e488cb1e5d1a59bb4a5ee21a53f45399f GIT binary patch literal 2695 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 literal 0 HcmV?d00001 diff --git a/static/maskedemail/images/icons/icon-152x152.png b/static/maskedemail/images/icons/icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd27e6b37e7fd5cb5df958853ac77b77f4f0c66 GIT binary patch literal 2917 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 literal 0 HcmV?d00001 diff --git a/static/maskedemail/images/icons/icon-384x384.png b/static/maskedemail/images/icons/icon-384x384.png new file mode 100644 index 0000000..e69de29 diff --git a/static/maskedemail/images/icons/icon-512x512.png b/static/maskedemail/images/icons/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..d6981a1deb847b2a9a2682f8e8e420ab41f9290e GIT binary patch literal 8566 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 literal 0 HcmV?d00001 diff --git a/static/maskedemail/images/icons/icon-96x96.png b/static/maskedemail/images/icons/icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..0375111fce425bec300f134c60ab28ac19882808 GIT binary patch literal 1492 zcmV;_1uOcAP)fLrfxW;t$jpEY zgJ|$FAVQbw59q>$EDSyXK7a@!db)dvguD~C?_^eHRcAfA>Yj*$~=8&f#2e{ET|Q*Ae8u2JkO{=K%iK zfFcf_TdrP5h+w$K@Ai*9kw{+s-`XA%HJ=?QG8=#6;gI;)R&VRges6|5U+lmadC*Xj5x|edU<{nOY zyzm2!O*a92FYXOegts@4f%k;m#+N+g6Q5TB+;Z?~V&^>dM_cf=iV!6Ka)5kuF~f4| zdd^yyw~_$6tfC(RB3u>?8UpgjEB^+|vnx2J;1pm-R1^~7qDbFo0J7nCJJ1vINb>J_ z&SB*QkSFj{V2XM&VZ9Pm=9dkU-w6TaiQHo+KW|8c5czccv!~4~FM#je(X;^(V#$wv zx6?}j<_;0QNYDn#d%{EhU<3#aLGv0!h#_D0f?qss?)6Q0&Ners5`oel_mIywRP_2L z>>_{SG5Xyv5aD=<_E4J73&@vs_Hr6p=0R*DVm;wRM4LiaK0m+pK0k<6c?veTA4pr& z6X>_k0>nOKc}_JTLZ@HGt=V)(S)K=hJceMhIHR5DWPSE&3G$Ej@nzgHucI@T_hDpD z;P8$4bWV?0+N_VSqdECI6<_S^N z&P`>KI1*R#hXB5_yAQA0WAj@|$5Wj&&TZQ~eVi!GN}8v4X@f>)iRPg$9~Pb1prKoo z-r;No5%MNC>GgTLY96^sZ#(5CJ>8~SZJX*=s%@%Np>EVJ-xD^M8G_VRK{1lLDo|$~ zEj#O|>aJ#pPCBagglk3aYUqH+>aeLnhfV6TtYw#FFC1#|V|CgWhq0q4L^!Sq*Kw=qI{%4($S%X@tr`%`L6qxa19jewcAa;V{XC6L>b@RHUH4Cf*~}sL z_51@4f9NoSx`x?5EyoMwOA!n{wo85H^BejJ6D0YB$uSStho({b5ucVm;=`ezu|m?% uch$LMs!%8t3WY+UP$(1%g+iggYTyl$4s*k&hpXoR0000 + + + + + Create Masked Email + + + + + + + +
+
+ + + + +
Loading...
+
+
+ Reset +
+
+ + + \ No newline at end of file diff --git a/static/maskedemail/lib/htmx.min.js b/static/maskedemail/lib/htmx.min.js new file mode 100644 index 0000000..47eb70f --- /dev/null +++ b/static/maskedemail/lib/htmx.min.js @@ -0,0 +1 @@ +(function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(e,t){var r=dr(e,t||"post");return r.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Q.config.wsBinaryType;return t},version:"1.9.10"};var r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R};var w=["get","post","put","delete","patch"];var i=w.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");var S=e("head"),q=e("title"),H=e("svg",true);function e(e,t=false){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){return e.parentElement}function re(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function L(e,t,r){var n=te(t,r);var i=te(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function ne(t,r){var n=null;c(t,function(e){return n=L(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function A(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function a(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=re().createDocumentFragment()}return i}function N(e){return/",0);return i.querySelector("template").content}switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return a(""+n+"
",1);case"col":return a(""+n+"
",2);case"tr":return a(""+n+"
",2);case"td":case"th":return a(""+n+"
",3);case"script":case"style":return a("
"+n+"
",1);default:return a(n,0)}}function ie(e){if(e){e()}}function I(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function k(e){return I(e,"Function")}function P(e){return I(e,"Object")}function ae(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function M(e){var t=[];if(e){for(var r=0;r=0}function se(e){if(e.getRootNode&&e.getRootNode()instanceof window.ShadowRoot){return re().body.contains(e.getRootNode().host)}else{return re().body.contains(e)}}function D(e){return e.trim().split(/\s+/)}function le(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function E(e){try{return JSON.parse(e)}catch(e){b(e);return null}}function U(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function B(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(t){var e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function V(){Q.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function j(){Q.logger=null}function C(e,t){if(t){return e.querySelector(t)}else{return C(re(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(re(),e)}}function _(e,t){e=g(e);if(t){setTimeout(function(){_(e);e=null},t)}else{e.parentElement.removeChild(e)}}function z(e,t,r){e=g(e);if(r){setTimeout(function(){z(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=g(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function $(e,t){e=g(e);e.classList.toggle(t)}function W(e,t){e=g(e);oe(e.parentElement.children,function(e){n(e,t)});z(e,t)}function v(e,t){e=g(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function s(e,t){return e.substring(0,t.length)===t}function G(e,t){return e.substring(e.length-t.length)===t}function J(e){var t=e.trim();if(s(t,"<")&&G(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function Z(e,t){if(t.indexOf("closest ")===0){return[v(e,J(t.substr(8)))]}else if(t.indexOf("find ")===0){return[C(e,J(t.substr(5)))]}else if(t==="next"){return[e.nextElementSibling]}else if(t.indexOf("next ")===0){return[K(e,J(t.substr(5)))]}else if(t==="previous"){return[e.previousElementSibling]}else if(t.indexOf("previous ")===0){return[Y(e,J(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else{return re().querySelectorAll(J(t))}}var K=function(e,t){var r=re().querySelectorAll(t);for(var n=0;n=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function ue(e,t){if(t){return Z(e,t)[0]}else{return Z(re().body,e)[0]}}function g(e){if(I(e,"String")){return C(e)}else{return e}}function ve(e,t,r){if(k(t)){return{target:re().body,event:e,listener:t}}else{return{target:g(e),event:t,listener:r}}}function de(t,r,n){jr(function(){var e=ve(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=k(r);return e?r:n}function ge(t,r,n){jr(function(){var e=ve(t,r,n);e.target.removeEventListener(e.event,e.listener)});return k(r)?r:n}var me=re().createElement("output");function pe(e,t){var r=ne(e,t);if(r){if(r==="this"){return[xe(e,t)]}else{var n=Z(e,r);if(n.length===0){b('The selector "'+r+'" on '+t+" returned no matches!");return[me]}else{return n}}}}function xe(e,t){return c(e,function(e){return te(e,t)!=null})}function ye(e){var t=ne(e,"hx-target");if(t){if(t==="this"){return xe(e,"hx-target")}else{return ue(e,t)}}else{var r=ae(e);if(r.boosted){return re().body}else{return e}}}function be(e){var t=Q.config.attributesToSettle;for(var r=0;r0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=re().querySelectorAll(t);if(r){oe(r,function(e){var t;var r=i.cloneNode(true);t=re().createDocumentFragment();t.appendChild(r);if(!Se(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ce(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){Fe(o,e,e,t,a)}oe(a.elts,function(e){ce(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);fe(re().body,"htmx:oobErrorNoTarget",{content:i})}return e}function Ce(e,t,r){var n=ne(e,"hx-select-oob");if(n){var i=n.split(",");for(var a=0;a0){var r=t.replace("'","\\'");var n=e.tagName.replace(":","\\:");var i=o.querySelector(n+"[id='"+r+"']");if(i&&i!==o){var a=e.cloneNode();we(e,i);s.tasks.push(function(){we(e,a)})}}})}function Oe(e){return function(){n(e,Q.config.addedClass);zt(e);Nt(e);qe(e);ce(e,"htmx:load")}}function qe(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function m(e,t,r,n){Te(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;z(i,Q.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(Oe(i))}}}function He(e,t){var r=0;while(r-1){var t=e.replace(H,"");var r=t.match(q);if(r){return r[2]}}}function je(e,t,r,n,i,a){i.title=Ve(n);var o=l(n);if(o){Ce(r,o,i);o=Be(r,o,a);Re(o);return Fe(e,r,t,o,i)}}function _e(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=E(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!P(o)){o={value:o}}ce(r,a,o)}}}else{var s=n.split(",");for(var l=0;l0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=Tr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){fe(re().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Qe(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function y(e,t){var r="";while(e.length>0&&!t.test(e[0])){r+=e.shift()}return r}function tt(e){var t;if(e.length>0&&Ze.test(e[0])){e.shift();t=y(e,Ke).trim();e.shift()}else{t=y(e,x)}return t}var rt="input, textarea, select";function nt(e,t,r){var n=[];var i=Ye(t);do{y(i,Je);var a=i.length;var o=y(i,/[,\[\s]/);if(o!==""){if(o==="every"){var s={trigger:"every"};y(i,Je);s.pollInterval=d(y(i,/[,\[\s]/));y(i,Je);var l=et(e,i,"event");if(l){s.eventFilter=l}n.push(s)}else if(o.indexOf("sse:")===0){n.push({trigger:"sse",sseEvent:o.substr(4)})}else{var u={trigger:o};var l=et(e,i,"event");if(l){u.eventFilter=l}while(i.length>0&&i[0]!==","){y(i,Je);var f=i.shift();if(f==="changed"){u.changed=true}else if(f==="once"){u.once=true}else if(f==="consume"){u.consume=true}else if(f==="delay"&&i[0]===":"){i.shift();u.delay=d(y(i,x))}else if(f==="from"&&i[0]===":"){i.shift();if(Ze.test(i[0])){var c=tt(i)}else{var c=y(i,x);if(c==="closest"||c==="find"||c==="next"||c==="previous"){i.shift();var h=tt(i);if(h.length>0){c+=" "+h}}}u.from=c}else if(f==="target"&&i[0]===":"){i.shift();u.target=tt(i)}else if(f==="throttle"&&i[0]===":"){i.shift();u.throttle=d(y(i,x))}else if(f==="queue"&&i[0]===":"){i.shift();u.queue=y(i,x)}else if(f==="root"&&i[0]===":"){i.shift();u[f]=tt(i)}else if(f==="threshold"&&i[0]===":"){i.shift();u[f]=y(i,x)}else{fe(e,"htmx:syntax:error",{token:i.shift()})}}n.push(u)}}if(i.length===a){fe(e,"htmx:syntax:error",{token:i.shift()})}y(i,Je)}while(i[0]===","&&i.shift());if(r){r[t]=n}return n}function it(e){var t=te(e,"hx-trigger");var r=[];if(t){var n=Q.config.triggerSpecsCache;r=n&&n[t]||nt(e,t,n)}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(h(e,rt)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function at(e){ae(e).cancelled=true}function ot(e,t,r){var n=ae(e);n.timeout=setTimeout(function(){if(se(e)&&n.cancelled!==true){if(!ct(r,e,Wt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}ot(e,t,r)}},r.pollInterval)}function st(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function lt(t,r,e){if(t.tagName==="A"&&st(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=ee(t,"href")}else{var a=ee(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=ee(t,"action")}e.forEach(function(e){ht(t,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(n,i,e,t)},r,e,true)})}}function ut(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&v(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function ft(e,t){return ae(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function ct(e,t,r){var n=e.eventFilter;if(n){try{return n.call(t,r)!==true}catch(e){fe(re().body,"htmx:eventFilter:error",{error:e,source:n.source});return true}}return false}function ht(a,o,e,s,l){var u=ae(a);var t;if(s.from){t=Z(a,s.from)}else{t=[a]}if(s.changed){t.forEach(function(e){var t=ae(e);t.lastValue=e.value})}oe(t,function(n){var i=function(e){if(!se(a)){n.removeEventListener(s.trigger,i);return}if(ft(a,e)){return}if(l||ut(e,a)){e.preventDefault()}if(ct(s,a,e)){return}var t=ae(e);t.triggerSpec=s;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(a)<0){t.handledFor.push(a);if(s.consume){e.stopPropagation()}if(s.target&&e.target){if(!h(e.target,s.target)){return}}if(s.once){if(u.triggeredOnce){return}else{u.triggeredOnce=true}}if(s.changed){var r=ae(n);if(r.lastValue===n.value){return}r.lastValue=n.value}if(u.delayed){clearTimeout(u.delayed)}if(u.throttle){return}if(s.throttle>0){if(!u.throttle){o(a,e);u.throttle=setTimeout(function(){u.throttle=null},s.throttle)}}else if(s.delay>0){u.delayed=setTimeout(function(){o(a,e)},s.delay)}else{ce(a,"htmx:trigger");o(a,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:s.trigger,listener:i,on:n});n.addEventListener(s.trigger,i)})}var vt=false;var dt=null;function gt(){if(!dt){dt=function(){vt=true};window.addEventListener("scroll",dt);setInterval(function(){if(vt){vt=false;oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){mt(e)})}},200)}}function mt(t){if(!o(t,"data-hx-revealed")&&X(t)){t.setAttribute("data-hx-revealed","true");var e=ae(t);if(e.initHash){ce(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ce(t,"revealed")},{once:true})}}}function pt(e,t,r){var n=D(r);for(var i=0;i=0){var t=wt(n);setTimeout(function(){xt(s,r,n+1)},t)}};t.onopen=function(e){n=0};ae(s).webSocket=t;t.addEventListener("message",function(e){if(yt(s)){return}var t=e.data;R(s,function(e){t=e.transformResponse(t,null,s)});var r=T(s);var n=l(t);var i=M(n.children);for(var a=0;a0){ce(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(ut(e,u)){e.preventDefault()}})}else{fe(u,"htmx:noWebSocketSourceError")}}function wt(e){var t=Q.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(e,t,r){var n=D(r);for(var i=0;i0){setTimeout(i,n)}else{i()}}function Ht(t,i,e){var a=false;oe(w,function(r){if(o(t,"hx-"+r)){var n=te(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){Lt(t,e,i,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(r,n,e,t)})})}});return a}function Lt(n,e,t,r){if(e.sseEvent){Rt(n,r,e.sseEvent)}else if(e.trigger==="revealed"){gt();ht(n,r,t,e);mt(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=ue(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t0){t.polling=true;ot(n,r,e)}else{ht(n,r,t,e)}}function At(e){if(Q.config.allowScriptTags&&(e.type==="text/javascript"||e.type==="module"||e.type==="")){var t=re().createElement("script");oe(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){b(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function Nt(e){if(h(e,"script")){At(e)}oe(f(e,"script"),function(e){At(e)})}function It(e){var t=e.attributes;for(var r=0;r0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Bt(o)}for(var l in r){Ft(e,l,r[l])}}}function jt(e){Ae(e);for(var t=0;tQ.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(re().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Yt(e){if(!U()){return null}e=B(e);var t=E(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Zt();var r=T(t);var n=Ve(this.response);if(n){var i=C("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ue(t,e,r);nr(r.tasks);Jt=a;ce(re().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{fe(re().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function ar(e){er();e=e||location.pathname+location.search;var t=Yt(e);if(t){var r=l(t.content);var n=Zt();var i=T(n);Ue(n,r,i);nr(i.tasks);document.title=t.title;setTimeout(function(){window.scrollTo(0,t.scroll)},0);Jt=e;ce(re().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{ir(e)}}}function or(e){var t=pe(e,"hx-indicator");if(t==null){t=[e]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,Q.config.requestClass)});return t}function sr(e){var t=pe(e,"hx-disabled-elt");if(t==null){t=[]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","")});return t}function lr(e,t){oe(e,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,Q.config.requestClass)}});oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled")}})}function ur(e,t){for(var r=0;r=0}function wr(e,t){var r=t?t:ne(e,"hx-swap");var n={swapStyle:ae(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(e).boosted&&!br(e)){n["show"]="top"}if(r){var i=D(r);if(i.length>0){for(var a=0;a0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}else if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}else if(o.indexOf("focus-scroll:")===0){var v=o.substr("focus-scroll:".length);n["focusScroll"]=v=="true"}else if(a==0){n["swapStyle"]=o}else{b("Unknown modifier in hx-swap: "+o)}}}}return n}function Sr(e){return ne(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function Er(t,r,n){var i=null;R(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(Sr(r)){return pr(n)}else{return mr(n)}}}function T(e){return{tasks:[],elts:[e]}}function Cr(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=ue(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=ue(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function Rr(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=te(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=Tr(e,function(){return Function("return ("+a+")")()},{})}else{s=E(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return Rr(u(e),t,r,n)}function Tr(e,t,r){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return r}}function Or(e,t){return Rr(e,"hx-vars",true,t)}function qr(e,t){return Rr(e,"hx-vals",false,t)}function Hr(e){return le(Or(e),qr(e))}function Lr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Ar(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(re().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return t.test(e.getAllResponseHeaders())}function Nr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||I(r,"String")){return he(e,t,null,null,{targetOverride:g(r),returnPromise:true})}else{return he(e,t,g(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:g(r.target),swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return he(e,t,null,null,{returnPromise:true})}}function Ir(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function kr(e,t,r){var n;var i;if(typeof URL==="function"){i=new URL(t,document.location.href);var a=document.location.origin;n=a===i.origin}else{i=t;n=s(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!n){return false}}return ce(e,"htmx:validateUrl",le({url:i,sameHost:n},r))}function he(t,r,n,i,a,e){var o=null;var s=null;a=a!=null?a:{};if(a.returnPromise&&typeof Promise!=="undefined"){var l=new Promise(function(e,t){o=e;s=t})}if(n==null){n=re().body}var M=a.handler||Mr;var X=a.select||null;if(!se(n)){ie(o);return l}var u=a.targetOverride||ye(n);if(u==null||u==me){fe(n,"htmx:targetError",{target:te(n,"hx-target")});ie(s);return l}var f=ae(n);var c=f.lastButtonClicked;if(c){var h=ee(c,"formaction");if(h!=null){r=h}var v=ee(c,"formmethod");if(v!=null){if(v.toLowerCase()!=="dialog"){t=v}}}var d=ne(n,"hx-confirm");if(e===undefined){var D=function(e){return he(t,r,n,i,a,!!e)};var U={target:u,elt:n,path:r,verb:t,triggeringEvent:i,etc:a,issueRequest:D,question:d};if(ce(n,"htmx:confirm",U)===false){ie(o);return l}}var g=n;var m=ne(n,"hx-sync");var p=null;var x=false;if(m){var B=m.split(":");var F=B[0].trim();if(F==="this"){g=xe(n,"hx-sync")}else{g=ue(n,F)}m=(B[1]||"drop").trim();f=ae(g);if(m==="drop"&&f.xhr&&f.abortable!==true){ie(o);return l}else if(m==="abort"){if(f.xhr){ie(o);return l}else{x=true}}else if(m==="replace"){ce(g,"htmx:abort")}else if(m.indexOf("queue")===0){var V=m.split(" ");p=(V[1]||"last").trim()}}if(f.xhr){if(f.abortable){ce(g,"htmx:abort")}else{if(p==null){if(i){var y=ae(i);if(y&&y.triggerSpec&&y.triggerSpec.queue){p=y.triggerSpec.queue}}if(p==null){p="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(p==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="all"){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){he(t,r,n,i,a)})}ie(o);return l}}var b=new XMLHttpRequest;f.xhr=b;f.abortable=x;var w=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var j=ne(n,"hx-prompt");if(j){var S=prompt(j);if(S===null||!ce(n,"htmx:prompt",{prompt:S,target:u})){ie(o);w();return l}}if(d&&!e){if(!confirm(d)){ie(o);w();return l}}var E=xr(n,u,S);if(t!=="get"&&!Sr(n)){E["Content-Type"]="application/x-www-form-urlencoded"}if(a.headers){E=le(E,a.headers)}var _=dr(n,t);var C=_.errors;var R=_.values;if(a.values){R=le(R,a.values)}var z=Hr(n);var $=le(R,z);var T=yr($,n);if(Q.config.getCacheBusterParam&&t==="get"){T["org.htmx.cache-buster"]=ee(u,"id")||"true"}if(r==null||r===""){r=re().location.href}var O=Rr(n,"hx-request");var W=ae(n).boosted;var q=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;var H={boosted:W,useUrlParams:q,parameters:T,unfilteredParameters:$,headers:E,target:u,verb:t,errors:C,withCredentials:a.credentials||O.credentials||Q.config.withCredentials,timeout:a.timeout||O.timeout||Q.config.timeout,path:r,triggeringEvent:i};if(!ce(n,"htmx:configRequest",H)){ie(o);w();return l}r=H.path;t=H.verb;E=H.headers;T=H.parameters;C=H.errors;q=H.useUrlParams;if(C&&C.length>0){ce(n,"htmx:validation:halted",H);ie(o);w();return l}var G=r.split("#");var J=G[0];var L=G[1];var A=r;if(q){A=J;var Z=Object.keys(T).length!==0;if(Z){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=mr(T);if(L){A+="#"+L}}}if(!kr(n,A,H)){fe(n,"htmx:invalidPath",H);ie(s);return l}b.open(t.toUpperCase(),A,true);b.overrideMimeType("text/html");b.withCredentials=H.withCredentials;b.timeout=H.timeout;if(O.noHeaders){}else{for(var N in E){if(E.hasOwnProperty(N)){var K=E[N];Lr(b,N,K)}}}var I={xhr:b,target:u,requestConfig:H,etc:a,boosted:W,select:X,pathInfo:{requestPath:r,finalRequestPath:A,anchor:L}};b.onload=function(){try{var e=Ir(n);I.pathInfo.responsePath=Ar(b);M(n,I);lr(k,P);ce(n,"htmx:afterRequest",I);ce(n,"htmx:afterOnLoad",I);if(!se(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(se(r)){t=r}}if(t){ce(t,"htmx:afterRequest",I);ce(t,"htmx:afterOnLoad",I)}}ie(o);w()}catch(e){fe(n,"htmx:onLoadError",le({error:e},I));throw e}};b.onerror=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendError",I);ie(s);w()};b.onabort=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendAbort",I);ie(s);w()};b.ontimeout=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:timeout",I);ie(s);w()};if(!ce(n,"htmx:beforeRequest",I)){ie(o);w();return l}var k=or(n);var P=sr(n);oe(["loadstart","loadend","progress","abort"],function(t){oe([b,b.upload],function(e){e.addEventListener(t,function(e){ce(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ce(n,"htmx:beforeSend",I);var Y=q?null:Er(b,n,T);b.send(Y);return l}function Pr(e,t){var r=t.xhr;var n=null;var i=null;if(O(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(O(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(O(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=ne(e,"hx-push-url");var l=ne(e,"hx-replace-url");var u=ae(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function Mr(l,u){var f=u.xhr;var c=u.target;var e=u.etc;var t=u.requestConfig;var h=u.select;if(!ce(l,"htmx:beforeOnLoad",u))return;if(O(f,/HX-Trigger:/i)){_e(f,"HX-Trigger",l)}if(O(f,/HX-Location:/i)){er();var r=f.getResponseHeader("HX-Location");var v;if(r.indexOf("{")===0){v=E(r);r=v["path"];delete v["path"]}Nr("GET",r,v).then(function(){tr(r)});return}var n=O(f,/HX-Refresh:/i)&&"true"===f.getResponseHeader("HX-Refresh");if(O(f,/HX-Redirect:/i)){location.href=f.getResponseHeader("HX-Redirect");n&&location.reload();return}if(n){location.reload();return}if(O(f,/HX-Retarget:/i)){if(f.getResponseHeader("HX-Retarget")==="this"){u.target=l}else{u.target=ue(l,f.getResponseHeader("HX-Retarget"))}}var d=Pr(l,u);var i=f.status>=200&&f.status<400&&f.status!==204;var g=f.response;var a=f.status>=400;var m=Q.config.ignoreTitle;var o=le({shouldSwap:i,serverResponse:g,isError:a,ignoreTitle:m},u);if(!ce(c,"htmx:beforeSwap",o))return;c=o.target;g=o.serverResponse;a=o.isError;m=o.ignoreTitle;u.target=c;u.failed=a;u.successful=!a;if(o.shouldSwap){if(f.status===286){at(l)}R(l,function(e){g=e.transformResponse(g,f,l)});if(d.type){er()}var s=e.swapOverride;if(O(f,/HX-Reswap:/i)){s=f.getResponseHeader("HX-Reswap")}var v=wr(l,s);if(v.hasOwnProperty("ignoreTitle")){m=v.ignoreTitle}c.classList.add(Q.config.swappingClass);var p=null;var x=null;var y=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r;if(h){r=h}if(O(f,/HX-Reselect:/i)){r=f.getResponseHeader("HX-Reselect")}if(d.type){ce(re().body,"htmx:beforeHistoryUpdate",le({history:d},u));if(d.type==="push"){tr(d.path);ce(re().body,"htmx:pushedIntoHistory",{path:d.path})}else{rr(d.path);ce(re().body,"htmx:replacedInHistory",{path:d.path})}}var n=T(c);je(v.swapStyle,c,l,g,n,r);if(t.elt&&!se(t.elt)&&ee(t.elt,"id")){var i=document.getElementById(ee(t.elt,"id"));var a={preventScroll:v.focusScroll!==undefined?!v.focusScroll:!Q.config.defaultFocusScroll};if(i){if(t.start&&i.setSelectionRange){try{i.setSelectionRange(t.start,t.end)}catch(e){}}i.focus(a)}}c.classList.remove(Q.config.swappingClass);oe(n.elts,function(e){if(e.classList){e.classList.add(Q.config.settlingClass)}ce(e,"htmx:afterSwap",u)});if(O(f,/HX-Trigger-After-Swap:/i)){var o=l;if(!se(l)){o=re().body}_e(f,"HX-Trigger-After-Swap",o)}var s=function(){oe(n.tasks,function(e){e.call()});oe(n.elts,function(e){if(e.classList){e.classList.remove(Q.config.settlingClass)}ce(e,"htmx:afterSettle",u)});if(u.pathInfo.anchor){var e=re().getElementById(u.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title&&!m){var t=C("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}Cr(n.elts,v);if(O(f,/HX-Trigger-After-Settle:/i)){var r=l;if(!se(l)){r=re().body}_e(f,"HX-Trigger-After-Settle",r)}ie(p)};if(v.settleDelay>0){setTimeout(s,v.settleDelay)}else{s()}}catch(e){fe(l,"htmx:swapError",u);ie(x);throw e}};var b=Q.config.globalViewTransitions;if(v.hasOwnProperty("transition")){b=v.transition}if(b&&ce(l,"htmx:beforeTransition",u)&&typeof Promise!=="undefined"&&document.startViewTransition){var w=new Promise(function(e,t){p=e;x=t});var S=y;y=function(){document.startViewTransition(function(){S();return w})}}if(v.swapDelay>0){setTimeout(y,v.swapDelay)}else{y()}}if(a){fe(l,"htmx:responseError",le({error:"Response Status Error Code "+f.status+" from "+u.pathInfo.requestPath},u))}}var Xr={};function Dr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ur(e,t){if(t.init){t.init(r)}Xr[e]=le(Dr(),t)}function Br(e){delete Xr[e]}function Fr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=te(e,"hx-ext");if(t){oe(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Xr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return Fr(u(e),r,n)}var Vr=false;re().addEventListener("DOMContentLoaded",function(){Vr=true});function jr(e){if(Vr||re().readyState==="complete"){e()}else{re().addEventListener("DOMContentLoaded",e)}}function _r(){if(Q.config.includeIndicatorStyles!==false){re().head.insertAdjacentHTML("beforeend","")}}function zr(){var e=re().querySelector('meta[name="htmx-config"]');if(e){return E(e.content)}else{return null}}function $r(){var e=zr();if(e){Q.config=le(Q.config,e)}}jr(function(){$r();_r();var e=re().body;zt(e);var t=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=ae(t);if(r&&r.xhr){r.xhr.abort()}});const r=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){ar();oe(t,function(e){ce(e,"htmx:restored",{document:re(),triggerEvent:ce})})}else{if(r){r(e)}}};setTimeout(function(){ce(e,"htmx:load",{});e=null},0)});return Q}()}); \ No newline at end of file diff --git a/static/maskedemail/manifest.json b/static/maskedemail/manifest.json new file mode 100644 index 0000000..b5af60d --- /dev/null +++ b/static/maskedemail/manifest.json @@ -0,0 +1,52 @@ +{ + "name": "Masked Email Generator", + "short_name": "masked", + "theme_color": "#1a40bc", + "background_color": "#fff", + "display": "standalone", + "orientation": "portrait", + "scope": "/", + "start_url": "/maskedemail", + "icons": [ + { + "src": "./images/icons/icon-72x72.png", + "sizes": "72x72", + "type": "image/png" + }, + { + "src": "./images/icons/icon-96x96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "./images/icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "./images/icons/icon-144x144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "./images/icons/icon-152x152.png", + "sizes": "152x152", + "type": "image/png" + }, + { + "src": "./images/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "./images/icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "./images/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] + } \ No newline at end of file