CINXE.COM
AFRINIC Status
<!doctype html> <html lang="en" > <head> <script type="text/javascript" nonce="JsvqjUduuGFd6+AOkJzOgXtet0l8xHDv8psL/BphW/8=">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"92b677be6b","applicationID":"8841359","transactionName":"clcIRUBYW1xTRUsVTVNUD1IdR1ZXU0RLFlBeTw==","queueTime":1,"applicationTime":92,"agent":""}</script> <script type="text/javascript" nonce="JsvqjUduuGFd6+AOkJzOgXtet0l8xHDv8psL/BphW/8=">(window.NREUM||(NREUM={})).init={privacy:{cookies_enabled:true},ajax:{deny_list:[]}};(window.NREUM||(NREUM={})).loader_config={licenseKey:"92b677be6b",applicationID:"8841359"};;/*! For license information please see nr-loader-rum-1.285.0.min.js.LICENSE.txt */ (()=>{var e,t,r={8122:(e,t,r)=>{"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},2555:(e,t,r)=>{"use strict";r.d(t,{Vp:()=>c,fn:()=>s,x1:()=>u});var n=r(384),i=r(8122);const o={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){try{const t=c(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}function c(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function u(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.info=a[e])}},5217:(e,t,r)=>{"use strict";r.d(t,{D0:()=>m,gD:()=>v,xN:()=>h});r(860).K7.genericEvents;const n="experimental.marks",i="experimental.measures",o="experimental.resources",a=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var s=r(2614),c=r(944),u=r(384),l=r(8122);const d="[data-nr-mask]",f=()=>{const e={feature_flags:[],experimental:{marks:!1,measures:!1,resources:!1},mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},get feature_flags(){return e.feature_flags},set feature_flags(t){e.feature_flags=t},generic_events:{enabled:!0,autoStart:!0},harvest:{interval:30},jserrors:{enabled:!0,autoStart:!0},logging:{enabled:!0,autoStart:!0},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,autoStart:!0},performance:{get capture_marks(){return e.feature_flags.includes(n)||e.experimental.marks},set capture_marks(t){e.experimental.marks=t},get capture_measures(){return e.feature_flags.includes(i)||e.experimental.measures},set capture_measures(t){e.experimental.measures=t},capture_detail:!0,resources:{get enabled(){return e.feature_flags.includes(o)||e.experimental.resources},set enabled(t){e.experimental.resources=t},asset_types:[],first_party_domains:[],ignore_newrelic:!0}},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:s.wk,inactiveMs:s.BB},session_replay:{autoStart:!0,enabled:!1,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){a(t)?e.mask_selector="".concat(t,",").concat(d):""===t||null===t?e.mask_selector=d:(0,c.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){a(t)?e.block_selector+=",".concat(t):""!==t&&(0,c.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,c.R)(7,t)}},session_trace:{enabled:!0,autoStart:!0},soft_navigations:{enabled:!0,autoStart:!0},spa:{enabled:!0,autoStart:!0},ssl:void 0,user_actions:{enabled:!0,elementAttributes:["id","className","tagName","type"]}}},g={},p="All configuration objects require an agent identifier!";function m(e){if(!e)throw new Error(p);if(!g[e])throw new Error("Configuration for ".concat(e," was never set"));return g[e]}function h(e,t){if(!e)throw new Error(p);g[e]=(0,l.a)(t,f());const r=(0,u.nY)(e);r&&(r.init=g[e])}function v(e,t){if(!e)throw new Error(p);var r=m(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}},3371:(e,t,r)=>{"use strict";r.d(t,{V:()=>f,f:()=>d});var n=r(8122),i=r(384),o=r(6154),a=r(9324);let s=0;const c={buildEnv:a.F3,distMethod:a.Xs,version:a.xv,originTime:o.WN},u={customTransaction:void 0,disabled:!1,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,onerror:void 0,ptid:void 0,releaseIds:{},appMetadata:{},session:void 0,denyList:void 0,timeKeeper:void 0,obfuscator:void 0,harvester:void 0},l={};function d(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!l[e])throw new Error("Runtime for ".concat(e," was never set"));return l[e]}function f(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");l[e]={...(0,n.a)(t,u),...c},Object.hasOwnProperty.call(l[e],"harvestCount")||Object.defineProperty(l[e],"harvestCount",{get:()=>++s});const r=(0,i.nY)(e);r&&(r.runtime=l[e])}},9324:(e,t,r)=>{"use strict";r.d(t,{F3:()=>i,Xs:()=>o,xv:()=>n});const n="1.285.0",i="PROD",o="CDN"},6154:(e,t,r)=>{"use strict";r.d(t,{OF:()=>c,RI:()=>i,WN:()=>l,bv:()=>o,gm:()=>a,mw:()=>s,sb:()=>u});var n=r(1863);const i="undefined"!=typeof window&&!!window.document,o="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),s=Boolean("hidden"===a?.document?.visibilityState),c=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),u=c&&"undefined"==typeof SharedWorker,l=((()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);Array.isArray(e)&&e.length>=2&&e[1]})(),Date.now()-(0,n.t)())},3241:(e,t,r)=>{"use strict";r.d(t,{W:()=>o});var n=r(6154);const i="newrelic";function o(e={}){try{n.gm.dispatchEvent(new CustomEvent(i,{detail:e}))}catch(e){}}},1687:(e,t,r)=>{"use strict";r.d(t,{Ak:()=>c,Ze:()=>d,x3:()=>u});var n=r(7836),i=r(3606),o=r(860),a=r(2646);const s={};function c(e,t){const r={staged:!1,priority:o.P3[t]||0};l(e),s[e].get(t)||s[e].set(t,r)}function u(e,t){e&&s[e]&&(s[e].get(t)&&s[e].delete(t),g(e,t,!1),s[e].size&&f(e))}function l(e){if(!e)throw new Error("agentIdentifier required");s[e]||(s[e]=new Map)}function d(e="",t="feature",r=!1){if(l(e),!e||!s[e].get(t)||r)return g(e,t);s[e].get(t).staged=!0,f(e)}function f(e){const t=Array.from(s[e]);t.every((([e,t])=>t.staged))&&(t.sort(((e,t)=>e[1].priority-t[1].priority)),t.forEach((([t])=>{s[e].delete(t),g(e,t)})))}function g(e,t,r=!0){const o=e?n.ee.get(e):n.ee,s=i.i.handlers;if(!o.aborted&&o.backlog&&s){if(r){const e=o.backlog[t],r=s[t];if(r){for(let t=0;e&&t<e.length;++t)p(e[t],r);Object.entries(r).forEach((([e,t])=>{Object.values(t||{}).forEach((t=>{t[0]?.on&&t[0]?.context()instanceof a.y&&t[0].on(e,t[1])}))}))}}o.isolatedBacklog||delete s[t],o.backlog[t]=null,o.emit("drain-"+t,[])}}function p(e,t){var r=e[1];Object.values(t[r]||{}).forEach((t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],o=e[2];n.apply(i,o)}}))}},7836:(e,t,r)=>{"use strict";r.d(t,{P:()=>c,ee:()=>u});var n=r(384),i=r(8990),o=r(3371),a=r(2646),s=r(5607);const c="nr@context:".concat(s.W),u=function e(t,r){var n={},s={},l={},d=!1;try{d=16===r.length&&(0,o.f)(r).isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o&&(o=!0);if(u.aborted&&!i)return;t&&o&&t.emit(e,r,n);for(var a=g(n),c=m(e),l=c.length,d=0;d<l;d++)c[d].apply(a,r);var p=v()[s[e]];p&&p.push([f,e,r,a]);return a},get:h,listeners:m,context:g,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach((([e,n])=>{s[n]=t,t in r||(r[t]=[])}))},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach((e=>{delete f.backlog[e]}))},isBuffering:function(e){return!!v()[s[e]]},debugId:r,backlog:d?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:d};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function g(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,c,(()=>new a.y(c))):new a.y(c)}function p(e,t){n[e]=m(e).concat(t)}function m(e){return n[e]||[]}function h(t){return l[t]=l[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),l=(0,n.Zm)();l.ee||(l.ee=u)},2646:(e,t,r)=>{"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},9908:(e,t,r)=>{"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(7836).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},3606:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var n=r(9908);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.d,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.d);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},3878:(e,t,r)=>{"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function o(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>o,jT:()=>n,sp:()=>i})},5607:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});const n=(0,r(9566).bz)()},9566:(e,t,r)=>{"use strict";r.d(t,{LA:()=>s,bz:()=>a});var n=r(6154);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),i.split("").map((e=>"x"===e?o(t,r++).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var s=0;s<e;s++)a.push(o(r,i++).toString(16));return a.join("")}},2614:(e,t,r)=>{"use strict";r.d(t,{BB:()=>a,H3:()=>n,g:()=>u,iL:()=>c,tS:()=>s,uh:()=>i,wk:()=>o});const n="NRBA",i="SESSION",o=144e5,a=18e5,s={STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},c={SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},u={OFF:0,FULL:1,ERROR:2}},1863:(e,t,r)=>{"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},944:(e,t,r)=>{"use strict";function n(e,t){"function"==typeof console.debug&&console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t)}r.d(t,{R:()=>n})},5701:(e,t,r)=>{"use strict";r.d(t,{B:()=>a,t:()=>s});var n=r(7836),i=r(3241);const o=new Set,a={};function s(e,t){const r=n.ee.get(t);a[t]??={},e&&"object"==typeof e&&(o.has(t)||(r.emit("rumresp",[e]),a[t]=e,o.add(t),(0,i.W)({agentIdentifier:t,loaded:!0,type:"lifecycle",name:"load",feature:void 0,data:e})))}},8990:(e,t,r)=>{"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},6389:(e,t,r)=>{"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout((()=>{i=clearTimeout(i)}),t)),n||(clearTimeout(i),i=setTimeout((()=>{e.apply(this,r)}),t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},5289:(e,t,r)=>{"use strict";r.d(t,{GG:()=>o,sB:()=>a});var n=r(3878);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.sp)("load",e,t)}function a(e){if(i())return e();(0,n.DD)("DOMContentLoaded",e)}},384:(e,t,r)=>{"use strict";r.d(t,{NT:()=>o,US:()=>l,Zm:()=>a,bQ:()=>c,dV:()=>s,nY:()=>u,pV:()=>d});var n=r(6154),i=r(1863);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function s(){let e=a();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket}),e}function c(e,t){let r=a();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t}function u(e){let t=a();return t.initializedAgents?.[e]}function l(e,t){a()[e]=t}function d(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},2843:(e,t,r)=>{"use strict";r.d(t,{u:()=>i});var n=r(3878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",(function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)}),r,i)}},3434:(e,t,r)=>{"use strict";r.d(t,{Jt:()=>o,YM:()=>c});var n=r(7836),i=r(5607);const o="nr@original:".concat(i.W);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");const a="-"===n.charAt(0);for(let s=0;s<t.length;s++){const c=t[s],u=e[c];l(u)||(e[c]=r(u,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return l(t)?t:(r||(r=""),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){u([e],r)}for(var n in e)a.call(e,n)&&(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,l,d;try{a=this,o=[...arguments],l="function"==typeof n?n(o,a):n||{}}catch(t){u([t,"",[o,a,s],l],e)}i(r+"start",[o,a,s],l,c);try{return d=t.apply(a,o)}catch(e){throw i(r+"err",[o,a,e],l,c),e}finally{i(r+"end",[o,a,d],l,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){u([t,r,n,i],e)}s=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function l(e){return!(e&&"function"==typeof e&&e.apply&&!e[o])}},993:(e,t,r)=>{"use strict";r.d(t,{A$:()=>o,ET:()=>a,p_:()=>i});var n=r(860);const i={ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"},o={OFF:0,ERROR:1,WARN:2,INFO:3,DEBUG:4,TRACE:5},a="log";n.K7.logging},8154:(e,t,r)=>{"use strict";r.d(t,{z_:()=>o,XG:()=>s,TZ:()=>n,rs:()=>i,xV:()=>a});r(6154),r(9566),r(384);const n=r(860).K7.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},6630:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewEvent},782:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewTiming},6344:(e,t,r)=>{"use strict";r.d(t,{G4:()=>i});var n=r(2614);r(860).K7.sessionReplay;const i={RECORD:"recordReplay",PAUSE:"pauseReplay",REPLAY_RUNNING:"replayRunning",ERROR_DURING_REPLAY:"errorDuringReplay"};n.g.ERROR,n.g.FULL,n.g.OFF},4234:(e,t,r)=>{"use strict";r.d(t,{W:()=>o});var n=r(7836),i=r(1687);class o{constructor(e,t){this.agentIdentifier=e,this.ee=n.ee.get(e),this.featureName=t,this.blocked=!1}deregisterDrain(){(0,i.x3)(this.agentIdentifier,this.featureName)}}},7603:(e,t,r)=>{"use strict";r.d(t,{j:()=>V});var n=r(860),i=r(2555),o=r(3371),a=r(9908),s=r(7836),c=r(1687),u=r(5289),l=r(6154),d=r(944),f=r(8154),g=r(384),p=r(6344);const m=["setErrorHandler","finished","addToTrace","addRelease","recordCustomEvent","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId","setApplicationVersion","start",p.G4.RECORD,p.G4.PAUSE,"log","wrapLogger"],h=["setErrorHandler","finished","addToTrace","addRelease"];var v=r(1863),b=r(2614),y=r(993);var w=r(2646),R=r(3434);const A=new Map;function E(e,t,r,n){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,d.R)(29);const i=function(e){return(e||s.ee).get("logger")}(e),o=(0,R.YM)(i),a=new w.y(s.P);a.level=n.level,a.customAttributes=n.customAttributes;const c=t[r]?.[R.Jt]||t[r];return A.set(c,a),o.inPlace(t,[r],"wrap-logger-",(()=>A.get(c))),i}var _=r(3241),x=r(5701);function N(){const e=(0,g.pV)();m.forEach((t=>{e[t]=(...r)=>function(t,...r){let n=[];return Object.values(e.initializedAgents).forEach((e=>{e&&e.api?e.exposed&&e.api[t]&&n.push(e.api[t](...r)):(0,d.R)(38,t)})),n.length>1?n:n[0]}(t,...r)}))}const k={};function I(e,t,g=!1){t||(0,c.Ak)(e,"api");const m={};var w=s.ee.get(e),R=w.get("tracer");k[e]=b.g.OFF,w.on(p.G4.REPLAY_RUNNING,(t=>{k[e]=t}));var A="api-",N=A+"ixn-";function I(t,r,n,o){const a=(0,i.Vp)(e);return null===r?delete a.jsAttributes[t]:(0,i.x1)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),S(A,n,!0,o||null===r?"session":void 0)(t,r)}function T(){}m.log=function(e,{customAttributes:t={},level:r=y.p_.INFO}={}){(0,a.p)(f.xV,["API/log/called"],void 0,n.K7.metrics,w),function(e,t,r={},i=y.p_.INFO){(0,a.p)(f.xV,["API/logging/".concat(i.toLowerCase(),"/called")],void 0,n.K7.metrics,e),(0,a.p)(y.ET,[(0,v.t)(),t,r,i],void 0,n.K7.logging,e)}(w,e,t,r)},m.wrapLogger=(e,t,{customAttributes:r={},level:i=y.p_.INFO}={})=>{(0,a.p)(f.xV,["API/wrapLogger/called"],void 0,n.K7.metrics,w),E(w,e,t,{customAttributes:r,level:i})},h.forEach((e=>{m[e]=S(A,e,!0,"api")})),m.addPageAction=S(A,"addPageAction",!0,n.K7.genericEvents),m.recordCustomEvent=S(A,"recordCustomEvent",!0,n.K7.genericEvents),m.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,o.f)(e).customTransaction=(r||"http://custom.transaction")+t,S(A,"setPageViewName",!0)()},m.setCustomAttribute=function(e,t,r=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof t)||null===t)return I(e,t,"setCustomAttribute",r);(0,d.R)(40,typeof t)}else(0,d.R)(39,typeof e)},m.setUserId=function(e){if("string"==typeof e||null===e)return I("enduser.id",e,"setUserId",!0);(0,d.R)(41,typeof e)},m.setApplicationVersion=function(e){if("string"==typeof e||null===e)return I("application.version",e,"setApplicationVersion",!1);(0,d.R)(42,typeof e)},m.start=()=>{try{(0,a.p)(f.xV,["API/start/called"],void 0,n.K7.metrics,w),w.emit("manual-start-all")}catch(e){(0,d.R)(23,e)}},m[p.G4.RECORD]=function(){(0,a.p)(f.xV,["API/recordReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.RECORD,[],void 0,n.K7.sessionReplay,w)},m[p.G4.PAUSE]=function(){(0,a.p)(f.xV,["API/pauseReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.PAUSE,[],void 0,n.K7.sessionReplay,w)},m.interaction=function(e){return(new T).get("object"==typeof e?e:{})};const j=T.prototype={createTracer:function(e,t){var r={},i=this,o="function"==typeof t;return(0,a.p)(f.xV,["API/createTracer/called"],void 0,n.K7.metrics,w),g||(0,a.p)(N+"tracer",[(0,v.t)(),e,r],i,n.K7.spa,w),function(){if(R.emit((o?"":"no-")+"fn-start",[(0,v.t)(),i,o],r),o)try{return t.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw R.emit("fn-err",[arguments,this,t],r),t}finally{R.emit("fn-end",[(0,v.t)()],r)}}}};function S(t,r,i,o){return function(){return(0,a.p)(f.xV,["API/"+r+"/called"],void 0,n.K7.metrics,w),(0,_.W)({agentIdentifier:e,loaded:!!x.B?.[e],type:"data",name:"api",feature:t+r,data:{notSpa:i,bufferGroup:o}}),o&&(0,a.p)(t+r,[i?(0,v.t)():performance.now(),...arguments],i?null:this,o,w),i?void 0:this}}function O(){r.e(296).then(r.bind(r,8778)).then((({setAPI:t})=>{t(e),(0,c.Ze)(e,"api")})).catch((e=>{(0,d.R)(27,e),w.abort()}))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{j[e]=S(N,e,void 0,g?n.K7.softNav:n.K7.spa)})),m.setCurrentRouteName=g?S(N,"routeName",void 0,n.K7.softNav):S(A,"routeName",!0,n.K7.spa),m.noticeError=function(t,r){"string"==typeof t&&(t=new Error(t)),(0,a.p)(f.xV,["API/noticeError/called"],void 0,n.K7.metrics,w),(0,a.p)("err",[t,(0,v.t)(),!1,r,!!k[e]],void 0,n.K7.jserrors,w)},l.RI?(0,u.GG)((()=>O()),!0):O(),m}var T=r(5217),j=r(8122);const S={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},O={};const P=e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e};let K=!1;function V(e,t={},r,n){let{init:a,info:c,loader_config:u,runtime:d={},exposed:f=!0}=t;d.loaderType=r;const p=(0,g.pV)();c||(a=p.init,c=p.info,u=p.loader_config),(0,T.xN)(e.agentIdentifier,a||{}),function(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");O[e]=(0,j.a)(t,S);const r=(0,g.nY)(e);r&&(r.loader_config=O[e])}(e.agentIdentifier,u||{}),c.jsAttributes??={},l.bv&&(c.jsAttributes.isWorker=!0),(0,i.x1)(e.agentIdentifier,c);const m=(0,T.D0)(e.agentIdentifier),h=[c.beacon,c.errorBeacon];K||(m.proxy.assets&&(P(m.proxy.assets),h.push(m.proxy.assets)),m.proxy.beacon&&h.push(m.proxy.beacon),N(),(0,g.US)("activatedFeatures",x.B),e.runSoftNavOverSpa&&=!0===m.soft_navigations.enabled&&m.feature_flags.includes("soft_nav")),d.denyList=[...m.ajax.deny_list||[],...m.ajax.block_internal?h:[]],d.ptid=e.agentIdentifier,(0,o.V)(e.agentIdentifier,d),e.ee=s.ee.get(e.agentIdentifier),void 0===e.api&&(e.api=I(e.agentIdentifier,n,e.runSoftNavOverSpa)),void 0===e.exposed&&(e.exposed=f),K||(0,_.W)({agentIdentifier:e.agentIdentifier,loaded:!!x.B?.[e.agentIdentifier],type:"lifecycle",name:"initialize",feature:void 0,data:{init:m,info:c,loader_config:u,runtime:d}}),K=!0}},8374:(e,t,r)=>{r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860:(e,t,r)=>{"use strict";r.d(t,{$J:()=>l,K7:()=>c,P3:()=>u,XX:()=>i,Yy:()=>s,df:()=>o,qY:()=>n,v4:()=>a});const n="events",i="jserrors",o="browser/blobs",a="rum",s="browser/logs",c={ajax:"ajax",genericEvents:"generic_events",jserrors:i,logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations",spa:"spa"},u={[c.pageViewEvent]:1,[c.pageViewTiming]:2,[c.metrics]:3,[c.jserrors]:4,[c.spa]:5,[c.ajax]:6,[c.sessionTrace]:7,[c.softNav]:8,[c.sessionReplay]:9,[c.logging]:10,[c.genericEvents]:11},l={[c.pageViewEvent]:a,[c.pageViewTiming]:n,[c.ajax]:n,[c.spa]:n,[c.softNav]:n,[c.metrics]:i,[c.jserrors]:i,[c.sessionTrace]:o,[c.sessionReplay]:o,[c.logging]:s,[c.genericEvents]:"ins"}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"nr-rum-1.285.0.min.js",i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA-1.285.0.PROD:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),l=0;l<u.length;l++){var d=u[l];if(d.getAttribute("src")==r||d.getAttribute("data-webpack")==t+o){s=d;break}}if(!s){c=!0;var f={296:"sha512-Aa+vt/G+VUnXF5imJD27xfBbG00pJRbxEVq24dgn/KfPYsDLKETEMkS7ezrIti3e/7t6va9a0PBrFlxSB0FCeA=="};(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r,0!==s.src.indexOf(window.location.origin+"/")&&(s.crossOrigin="anonymous"),f[a]&&(s.integrity=f[a])}e[r]=[n];var g=(t,n)=>{s.onerror=s.onload=null,clearTimeout(p);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},p=setTimeout(g.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=g.bind(null,s.onerror),s.onload=g.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={374:0,840:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u<a.length;u++)o=a[u],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self["webpackChunk:NRBA-1.285.0.PROD"]=self["webpackChunk:NRBA-1.285.0.PROD"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{"use strict";i(8374);var e=i(944),t=i(6344),r=i(9566);class n{agentIdentifier;constructor(){this.agentIdentifier=(0,r.LA)(16)}#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}addPageAction(e,t){return this.#e("addPageAction",e,t)}recordCustomEvent(e,t){return this.#e("recordCustomEvent",e,t)}setPageViewName(e,t){return this.#e("setPageViewName",e,t)}setCustomAttribute(e,t,r){return this.#e("setCustomAttribute",e,t,r)}noticeError(e,t){return this.#e("noticeError",e,t)}setUserId(e){return this.#e("setUserId",e)}setApplicationVersion(e){return this.#e("setApplicationVersion",e)}setErrorHandler(e){return this.#e("setErrorHandler",e)}addRelease(e,t){return this.#e("addRelease",e,t)}log(e,t){return this.#e("log",e,t)}}class o extends n{#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}start(){return this.#e("start")}finished(e){return this.#e("finished",e)}recordReplay(){return this.#e(t.G4.RECORD)}pauseReplay(){return this.#e(t.G4.PAUSE)}addToTrace(e){return this.#e("addToTrace",e)}setCurrentRouteName(e){return this.#e("setCurrentRouteName",e)}interaction(){return this.#e("interaction")}wrapLogger(e,t,r){return this.#e("wrapLogger",e,t,r)}}var a=i(860),s=i(5217);const c=Object.values(a.K7);function u(e){const t={};return c.forEach((r=>{t[r]=function(e,t){return!0===(0,s.gD)(t,"".concat(e,".enabled"))}(r,e)})),t}var l=i(7603);var d=i(1687),f=i(4234),g=i(5289),p=i(6154),m=i(384);const h=e=>p.RI&&!0===(0,s.gD)(e,"privacy.cookies_enabled");function v(e){return!!(0,m.dV)().o.MO&&h(e)&&!0===(0,s.gD)(e,"session_trace.enabled")}var b=i(6389);class y extends f.W{constructor(e,t,r=!0){super(e.agentIdentifier,t),this.auto=r,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===e.init[this.featureName].autoStart&&(this.auto=!1),this.auto?(0,d.Ak)(e.agentIdentifier,t):this.ee.on("manual-start-all",(0,b.J)((()=>{(0,d.Ak)(e.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator(e)})))}importAggregator(t,r={}){if(this.featAggregate||!this.auto)return;let n;this.onAggregateImported=new Promise((e=>{n=e}));const o=async()=>{let o;try{if(h(this.agentIdentifier)){const{setupAgentSession:e}=await i.e(296).then(i.bind(i,3861));o=e(t)}}catch(t){(0,e.R)(20,t),this.ee.emit("internal-error",[t]),this.featureName===a.K7.sessionReplay&&this.abortHandler?.()}try{if(!this.#t(this.featureName,o))return(0,d.Ze)(this.agentIdentifier,this.featureName),void n(!1);const{lazyFeatureLoader:e}=await i.e(296).then(i.bind(i,6103)),{Aggregate:a}=await e(this.featureName,"aggregate");this.featAggregate=new a(t,r),t.runtime.harvester.initializedAggregates.push(this.featAggregate),n(!0)}catch(t){(0,e.R)(34,t),this.abortHandler?.(),(0,d.Ze)(this.agentIdentifier,this.featureName,!0),n(!1),this.ee&&this.ee.abort()}};p.RI?(0,g.GG)((()=>o()),!0):o()}#t(e,t){switch(e){case a.K7.sessionReplay:return v(this.agentIdentifier)&&!!t;case a.K7.sessionTrace:return!!t;default:return!0}}}var w=i(6630);class R extends y{static featureName=w.T;constructor(e,t=!0){super(e,w.T,t),this.importAggregator(e)}}var A=i(9908),E=i(2843),_=i(3878),x=i(782),N=i(1863);class k extends y{static featureName=x.T;constructor(e,t=!0){super(e,x.T,t),p.RI&&((0,E.u)((()=>(0,A.p)("docHidden",[(0,N.t)()],void 0,x.T,this.ee)),!0),(0,_.sp)("pagehide",(()=>(0,A.p)("winPagehide",[(0,N.t)()],void 0,x.T,this.ee))),this.importAggregator(e))}}var I=i(8154);class T extends y{static featureName=I.TZ;constructor(e,t=!0){super(e,I.TZ,t),p.RI&&document.addEventListener("securitypolicyviolation",(e=>{(0,A.p)(I.xV,["Generic/CSPViolation/Detected"],void 0,this.featureName,this.ee)})),this.importAggregator(e)}}new class extends o{constructor(t){super(),p.gm?(this.features={},(0,m.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(R),this.runSoftNavOverSpa=[...this.desiredFeatures].some((e=>e.featureName===a.K7.softNav)),(0,l.j)(this,t,t.loaderType||"agent"),this.run()):(0,e.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}run(){try{const t=u(this.agentIdentifier),r=[...this.desiredFeatures];r.sort(((e,t)=>a.P3[e.featureName]-a.P3[t.featureName])),r.forEach((r=>{if(!t[r.featureName]&&r.featureName!==a.K7.pageViewEvent)return;if(this.runSoftNavOverSpa&&r.featureName===a.K7.spa)return;if(!this.runSoftNavOverSpa&&r.featureName===a.K7.softNav)return;const n=function(e){switch(e){case a.K7.ajax:return[a.K7.jserrors];case a.K7.sessionTrace:return[a.K7.ajax,a.K7.pageViewEvent];case a.K7.sessionReplay:return[a.K7.sessionTrace];case a.K7.pageViewTiming:return[a.K7.pageViewEvent];default:return[]}}(r.featureName).filter((e=>!(e in this.features)));n.length>0&&(0,e.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)}))}catch(t){(0,e.R)(22,t);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,m.Zm)();delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return r.ee.get(this.agentIdentifier).abort(),!1}}}({features:[R,k,T],loaderType:"lite"})})()})();</script><script async src="https://www.googletagmanager.com/gtag/js?id=G-GKHZ2SCNR5" nonce="JsvqjUduuGFd6+AOkJzOgXtet0l8xHDv8psL/BphW/8="></script> <script nonce="JsvqjUduuGFd6+AOkJzOgXtet0l8xHDv8psL/BphW/8="> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag( 'js', new Date() ); gtag( 'config', 'G-GKHZ2SCNR5', { 'anonymize_ip': true } ); </script> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="generator" content="Sorry™ (https://www.sorryapp.com)" /> <title>AFRINIC Status</title> <meta name="description" content="Keep up to date with any interruptions to our service which may be affecting you." /> <meta name="robots" content="noindex, nofollow" /> <meta name="color-scheme" content="light"> <link rel="stylesheet" href="https://rsms.me/inter/inter.css"> <link rel="stylesheet" href="https://assets0.sorryapp.com/theme/asset/flavours/files/001/056/052/original/main.min.css?1738664115"> <link rel="canonical" href="https://status.afrinic.net/" /> </head> <body v-scope="OverviewController({ allowComponentSubscriptions: false })" @vue:mounted="mounted" class="bg-white dark:bg-gray-900 min-h-screen flex flex-col"> <div class="flex flex-1 flex-col"> <nav v-cloak class="bg-brand-header-background dark:bg-brand-dm-header-background inset-x-0 sticky top-0 z-10"> <div class="mx-auto px-4 sm:px-6 lg:px-8"> <div class="flex items-center justify-between"> <div class="flex items-center"> <div v-scope="Toggle()" class="sm:hidden flex"> <div class="-ml-2 mr-2 flex items-center"> <!-- Mobile menu button --> <button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-brand-header-contrast/60 hover:bg-brand-header-contrast/20 hover:text-brand-header-contrast/70 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500 dark:text-brand-dm-header-contrast/60 dark:hover:text-brand-dm-header-contrast/70 dark:hover:bg-brand-dm-header-contrast/20" aria-controls="mobile-menu" aria-expanded="false" @click="toggle"> <span class="sr-only"> Open main menu </span> <svg class="block h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> <path v-if="!isOpen" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" /> <path v-if="isOpen" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> </svg> </button> </div> <!-- Mobile menu, show/hide based on menu state. --> <div v-if="isOpen" id="mobile-menu" class="absolute top-16 right-0 left-0 bg-white dark:bg-gray-900 z-10"> <div class="px-2 pt-2 pb-3 space-y-1 sm:px-3"> <!-- Current: "bg-gray-900 text-white", Default: "text-gray-300 hover:bg-gray-700 hover:text-white" --> <a href="/history/2025/march" class="block px-3 py-2 rounded-md text-base font-medium text-gray-600 hover:bg-gray-50 hover:text-gray-800 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white"> History </a> <button v-if="!subscriber" href="#" class="block px-3 py-2 rounded-md text-base font-medium text-gray-600 hover:bg-gray-50 hover:text-gray-800 dark:text-gray-300 dark:hover:bg-gray-700 dark:hover:text-white" @click.prevent="open(panels.LOGIN)"> Manage Subscription </button> </div> <div class="pt-4 pb-3 border-t border-gray-200 dark:border-gray-700" v-if="subscriber"> <div class="flex items-center px-5 sm:px-6"> <div class="flex-shrink-0"> <img class="h-10 w-10 rounded-full" :src="subscriber && subscriber.avatar_url" alt=""> </div> <div class="ml-3"> <div class="text-base font-medium text-gray-800 dark:text-white">Your subscription</div> <div class="text-sm font-medium text-gray-500 dark:text-gray-400">{{ subscriber.email }}</div> </div> </div> <div class="mt-3 px-2 space-y-1 sm:px-3"> <a href="#" class="block px-3 py-2 rounded-md text-base font-medium text-gray-500 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white" role="menuitem" tabindex="-1" id="user-menu-item-0" @click.prevent="open(panels.PREFERENCES)"> Preferences </a> <a href="/audience/sign_out" class="block px-3 py-2 rounded-md text-base font-medium text-gray-500 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white" role="menuitem" tabindex="-1" id="user-menu-item-2"> Sign out </a> </div> </div> </div> </div> <div class="flex-shrink-0 flex items-center py-4"> <a href="/" target="_blank" class="hover:opacity-90"> <img class="hidden lg:block h-logo w-auto" src="https://assets2.sorryapp.com/brand_logos/files/000/001/618/landscape_small/logo-lrg-trans-2.png?1501569465" alt="AFRINIC Status"> <span class="sr-only"> Service Status </span> </a> </div> <div class="text-center sm:text-left ml-4 md:ml-6 flex md:space-x-8 h-16"> <!-- Current: "border-brand-primary-500 text-gray-900", Default: "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700" --> <a href="/" class="text-brand-header-contrast dark:text-brand-dm-header-contrast hover:text-brand-primary-500 dark:hover:text-brand-dm-primary-500 inline-flex items-center px-1 pt-1 text-sm font-medium"> Service Status </a> </div> </div> <div class="flex items-center h-16"> <div class="hidden sm:block flex-shrink-0 mr-8"> <a href="/history/2025/march" class="text-brand-primary-500 hover:text-brand-primary-400 dark:text-brand-dm-primary-500 dark:hover:text-brand-dm-primary-400 font-medium text-sm"> History </a> </div> <div class="hidden sm:block flex-shrink-0 mr-8" v-if="!subscriber"> <button href="#" class="text-brand-primary-500 hover:text-brand-primary-400 dark:text-brand-dm-primary-500 dark:hover:text-brand-dm-primary-400 font-medium text-sm" @click.prevent="open(panels.LOGIN)"> Manage Subscription </button> </div> <div class="hidden sm:block flex-shrink-0 mr-8"> <a href="https://afrinic.net/about/contact-us" target="_blank" class="text-brand-primary-500 hover:text-brand-primary-400 dark:text-brand-dm-primary-500 dark:hover:text-brand-dm-primary-400 font-medium text-sm">Support</a> </div> <div class="flex-shrink-0" v-if="!subscriber"> <button type="button" class="relative inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-brand-primary-contrast-500 bg-brand-primary-500 dark:text-brand-dm-primary-contrast-500 dark:bg-brand-dm-primary-500 shadow-sm hover:bg-brand-primary-600 dark:hover:bg-brand-dm-primary-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500" v-scope="SubscribeButton({ enforceBellSelect: false, enforceBellSelectMsg: 'Select a Service to subscribe' })" @click="click()"> <template v-if="checkedComponentCount"> <!-- Heroicon name: outline/bell-alert --> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="-ml-1 mr-2 h-5 w-5"> <path stroke-linecap="round" stroke-linejoin="round" d="M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0M3.124 7.5A8.969 8.969 0 015.292 3m13.416 0a8.969 8.969 0 012.168 4.5" /> </svg> <span> Confirm Subscription </span> </template> <template v-else> <!-- Heroicon name: outline/bell --> <svg xmlns="http://www.w3.org/2000/svg" class="-ml-1 mr-2 h-5 w-5" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" /> </svg> <span> Subscribe </span> </template> </button> </div> <li class="ml-4 list-none" v-if="subscriber && allow_component_subscriptions && unsavedChanges()"> <button @click="saveChanges()" class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-brand-primary-contrast-500 bg-brand-primary-500 dark:text-brand-dm-primary-contrast-500 dark:bg-brand-dm-primary-500 shadow-sm hover:bg-brand-primary-600 dark:hover:bg-brand-dm-primary-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500 disabled:opacity-50" :disabled="loading"> <!-- Heroicon name: outline/bell-alert --> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="-ml-1 mr-2 w-5 h-5"> <path stroke-linecap="round" stroke-linejoin="round" d="M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0M3.124 7.5A8.969 8.969 0 015.292 3m13.416 0a8.969 8.969 0 012.168 4.5" /> </svg> <span v-if="loading"> Saving... </span> <span v-else> Save Changes </span> </button> </li> <div class="hidden sm:block ml-4 flex-shrink-0 flex items-center" v-if="subscriber"> <div class="ml-3 relative" v-scope="Toggle()" v-click-outside="close()"> <div> <button type="button" class="bg-white dark:bg-gray-900 rounded-full flex items-center text-sm focus:outline-none focus:ring-2 focus:ring-offset-4 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500 text-gray-500 hover:text-gray-600 focus:text-brand-primary-500 dark:focus:text-brand-dm-primary-500" id="user-menu-button" aria-expanded="false" aria-haspopup="true" @click="toggle"> <span class="sr-only"> Open user menu </span> <img class="h-8 w-8 rounded-full" :src="subscriber && subscriber.avatar_url" alt="Your avatar"> <svg class="h-5 w-5 mx-1.5 my-1.5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"> <path d="M10 6a2 2 0 110-4 2 2 0 010 4zM10 12a2 2 0 110-4 2 2 0 010 4zM10 18a2 2 0 110-4 2 2 0 010 4z" /> </svg> </button> </div> <!-- Dropdown menu, show/hide based on menu state. Entering: "transition ease-out duration-200" From: "opacity-0 scale-95" To: "opacity-100 scale-100" Leaving: "transition ease-in duration-75" From: "opacity-100 scale-100" To: "opacity-0 scale-95" --> <div class="origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg py-1 bg-white dark:bg-gray-900 ring-1 ring-black ring-opacity-5 focus:outline-none z-10" role="menu" aria-orientation="vertical" aria-labelledby="user-menu-button" tabindex="-1" :class="[isOpen ? 'opacity-100' : 'opacity-0']"> <a href="#" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300" role="menuitem" tabindex="-1" id="user-menu-item-0" @click.prevent="open(panels.PREFERENCES)"> Preferences </a> <a href="/audience/sign_out" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300" role="menuitem" tabindex="-1" id="user-menu-item-2"> Sign out </a> </div> </div> </div> </div> </div> </div> </nav> <header class="bg-brand-header-background dark:bg-brand-dm-header-background"> <section class="px-4 sm:px-6 lg:px-8 pb-8 sm:pb-12 lg:pb-16"> <div class="max-w-3xl lg:max-w-4xl xl:max-w-5xl 2xl:max-w-7xl mx-auto"> <div class="text-center pt-8 sm:pt-12 lg:pt-16"> <!-- Heroicon: Badge Check --> <svg xmlns="http://www.w3.org/2000/svg" class="h-20 w-20 sm:h-24 sm:w-24 mb-8 mx-auto text-state-operational dark:text-state-dm-operational" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /> </svg> <h1 class="text-3xl tracking-tight font-extrabold text-brand-header-contrast dark:text-brand-dm-header-contrast sm:text-4xl md:text-5xl"> <span class="block xl:inline"> All systems are go! </span> </h1> <p class="mt-3 max-w-md mx-auto text-base text-brand-header-contrast/60 sm:text-lg md:mt-5 md:text-lg md:max-w-3xl dark:text-brand-dm-header-contrast/60"> Having trouble? <a href="https://afrinic.net/about/contact-us" class="text-brand-header-contrast/60 hover:text-brand-header-contrast/90 dark:text-brand-dm-header-contrast/60 dark:hover:text-brand-dm-header-contrast/90 pb-px underline">Please contact support</a> </p> </div> </div> </section> </header> <div class="bg-white dark:bg-gray-900 py-8 sm:py-12 lg:py-16 px-4 sm:px-6 lg:px-8"> <div class="relative max-w-3xl lg:max-w-4xl xl:max-w-5xl 2xl:max-w-7xl mx-auto"> <div class="mb-8 lg:mb-16"> <script id="component-grid-data" type="application/json"> [ { "id": 652, "state": "operational", "name": "WHOIS Database", "description": null, "parent_id": null, "link": null, "state_text": "Operational", "links": { "children": { "count": 5 } } , "metrics_summary": null } , { "id": 653, "state": "operational", "name": "MyAFRINIC Portal", "description": "(my.afrinic.net)", "parent_id": null, "link": null, "state_text": "Operational", "links": { "children": { "count": 0 } } , "metrics_summary": null } , { "id": 654, "state": "operational", "name": "AFRINIC Web Sites", "description": null, "parent_id": null, "link": null, "state_text": "Operational", "links": { "children": { "count": 5 } } , "metrics_summary": null } , { "id": 655, "state": "operational", "name": "Mailing Lists", "description": "(lists.afrinic.net)", "parent_id": null, "link": null, "state_text": "Operational", "links": { "children": { "count": 0 } } , "metrics_summary": null } , { "id": 676, "state": "operational", "name": "New Member Registration Portal", "description": "(nmrp.afrinic.net)", "parent_id": null, "link": null, "state_text": "Operational", "links": { "children": { "count": 0 } } , "metrics_summary": null } , { "id": 679, "state": "operational", "name": "DNS Services", "description": "DNS", "parent_id": null, "link": null, "state_text": "Operational", "links": { "children": { "count": 2 } } , "metrics_summary": null } , { "id": 677, "state": "operational", "name": "RPKI Systems", "description": null, "parent_id": null, "link": null, "state_text": "Operational", "links": { "children": { "count": 0 } } , "metrics_summary": null } , { "id": 656, "state": "operational", "name": "Other Systems", "description": "(One or more other components of our infrastructure)", "parent_id": null, "link": null, "state_text": "Operational", "links": { "children": { "count": 0 } } , "metrics_summary": null } ] </script> <template id="component-body-template"> <div class="flex flex-col gap-2"> <div class="flex items-baseline gap-2 md:gap-3"> <button v-if="hasChildren" @mouseover="fetchChildren()" @click="toggleChildren()" class="flex text-gray-500 hover:text-gray-600 dark:hover:text-gray-400 before:content-['\200B']"> <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path v-if="childrenExpanded" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z" /> <path v-if="!childrenExpanded" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z" /> </svg> </button> <p class="font-medium text-black dark:text-gray-100 [word-break:break-word]"> <span class="mr-1"> {{ name }} </span> <!-- Heroicon name: solid/information-circle --> <svg v-if="description" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="inline w-4 h-4 -mt-0.5 text-gray-400 hover:text-gray-500 dark:text-gray-500 dark:hover:text-gray-400" :data-tippy-content="description"> <path fill-rule="evenodd" d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 01.67 1.34l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 11-.671-1.34l.041-.022zM12 9a.75.75 0 100-1.5.75.75 0 000 1.5z" clip-rule="evenodd" /> </svg> </p> <div class="flex items-center gap-2 md:gap-3 ml-auto before:content-['\200B']" v-show="!childrenExpanded"> <template v-if="state === 'operational' && metrics_summary"> <div class="inline-flex gap-1 items-center rounded-full pl-2.5 bg-brand-green-500/10 dark:bg-brand-dm-green-500/20"> <template v-if="metrics_summary.url"> <a :href="metrics_summary.url" class="text-base whitespace-nowrap font-normal text-brand-green-500 dark:text-brand-dm-green-500 hover:text-brand-green-400 dark:hover:text-brand-dm-green-400"> {{ metrics_summary.percentage_uptime.words }} <span class="sr-only @sm/component:not-sr-only">Uptime</span> </a> </template> <template v-else> <button @mouseover="fetchChildren()" @click="toggleChildren()" class="text-base whitespace-nowrap font-normal text-brand-green-500 dark:text-brand-dm-green-500 hover:text-brand-green-400 dark:hover:text-brand-dm-green-400"> {{ metrics_summary.percentage_uptime.words }} <span class="sr-only @sm/component:not-sr-only">Uptime</span> </button> </template> <svg xmlns="http://www.w3.org/2000/svg" class="text-state-operational dark:text-state-dm-operational h-8 w-8" fill="currentColor" viewBox="0 0 20 20" stroke="none"> <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" /> </svg> </div> </template> <template v-else-if="state === 'operational'"> <svg xmlns="http://www.w3.org/2000/svg" class="text-state-operational dark:text-state-dm-operational h-8 w-8" fill="currentColor" viewBox="0 0 20 20" stroke="none"> <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd" /> </svg> </template> <template v-else-if="state === 'degraded'"> <svg xmlns="http://www.w3.org/2000/svg" class="text-state-degraded dark:text-state-dm-degraded h-8 w-8" fill="currentColor" viewBox="0 0 20 20" stroke="none"> <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z" clip-rule="evenodd" /> </svg> </template> <template v-else-if="state === 'under-maintenance'"> <svg xmlns="http://www.w3.org/2000/svg" class="text-state-under-maintenance dark:text-state-dm-under-maintenance h-8 w-8" fill="currentColor" viewBox="0 0 20 20" stroke="none"> <path fill-rule="evenodd" d="M6.8659,13.1812a.3812.3812,0,0,0-.5275,0,.37.37,0,0,0,0,.5181.3816.3816,0,0,0,.5275,0A.37.37,0,0,0,6.8659,13.1812Zm0,0a.3812.3812,0,0,0-.5275,0,.37.37,0,0,0,0,.5181.3816.3816,0,0,0,.5275,0A.37.37,0,0,0,6.8659,13.1812Zm0,0a.3812.3812,0,0,0-.5275,0,.37.37,0,0,0,0,.5181.3816.3816,0,0,0,.5275,0A.37.37,0,0,0,6.8659,13.1812ZM9.9932,2a8,8,0,1,0,.0136,0Zm1.6956,7.7619a.6806.6806,0,0,0-.7536.226c-.9044,1.14-3.4853,4.0785-3.6643,4.2483-.537.5463-.923.5369-1.4694,0-.5369-.5369-.5369-.9232,0-1.4695.1789-.1695,3.1178-2.7506,4.2577-3.6548a.6906.6906,0,0,0,.226-.7632,2.2555,2.2555,0,0,1,.5463-2.3171,2.2286,2.2286,0,0,1,2.44-.48.1643.1643,0,0,1,.0471.2732L12.1409,7.0019a.4383.4383,0,0,0,0,.6028l.3768.3768a.4208.4208,0,0,0,.595.0079h0l.0081-.0079,1.14-1.14a.171.171,0,0,1,.2826.0659,2.2473,2.2473,0,0,1-2.8546,2.8543Z" clip-rule="evenodd" /> </svg> </template> </div> </div> <div v-if="childrenExpanded"> <div v-if="children.length > 0" class="pl-9 flex flex-col gap-2"> <template v-for="(child, index) in children" :key="child.id"> <div v-scope="Component(child)"> </template> </div> <div v-else class="pl-9 flex flex-col gap-2"> <template v-for="index in childCount"> <div class="flex flex-col gap-2"> <div class="flex items-baseline gap-2 md:gap-3"> <span class="placeholder-name mr-1 rounded-full font-medium text-black text-gray-200 bg-gray-200 dark:text-gray-800 dark:bg-gray-800 animate-pulse"> Loading Component... </span> <div class="flex items-center gap-2 md:gap-3 ml-auto before:content-['\200B']"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="h-8 w-8 text-gray-200 dark:text-gray-800 animate-pulse"> <path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm0 8.625a1.125 1.125 0 1 0 0 2.25 1.125 1.125 0 0 0 0-2.25ZM15.375 12a1.125 1.125 0 1 1 2.25 0 1.125 1.125 0 0 1-2.25 0ZM7.5 10.875a1.125 1.125 0 1 0 0 2.25 1.125 1.125 0 0 0 0-2.25Z" clip-rule="evenodd" /> </svg> </div> </div> </div> </template> </div> </div> </div> </template> <template id="component-grid-template"> <div class="mb-16 flex flex-col-reverse gap-4"> <div :class="[maxColumnCount > 1 ? 'grid gap-4 xl:gap-6 lg:grid-cols-2 2xl:grid-cols-' + maxColumnCount : 'grid gap-4 xl:gap-6']"> <template v-for="(component, index) in rootComponents" :key="component.id"> <div class="py-2 px-4 sm:py-3 sm:px-5 md:py-4 md:px-6 text-gray-600 dark:text-gray-400 rounded-lg border border-gray-400 dark:border-gray-600 @container/component"> <div v-scope="Component(component)"></div> </div> </template> </div> <div v-if="anyMetrics" class="text-sm text-gray-500 text-right"> Past 30 days Uptime </div> </div> </template> <div v-scope="ComponentGrid({ targetColumnCount: 3 })" @vue:mounted="mounted"></div> </div> <div class="mb-8 lg:mb-16"> <h2 class="text-xl tracking-tight font-extrabold text-gray-900 dark:text-gray-100 sm:text-2xl mb-6 lg:mb-8"> Recent Notices... </h2> <div> <div class="grid gap-4 sd:gap-6 md:gap-8 md:grid-cols-2"> <div class="border-solid border-2 border-state-complete dark:border-state-dm-complete rounded-lg p-4 sm:p-6 text-left transition ease-in-out hover:-translate-y-1 hover:shadow-md duration-300 overflow-hidden"> <div class="mb-3 flex flex-col gap-3"> <div class="h-1 w-8 bg-state-complete dark:bg-state-dm-complete rounded-full"></div> <p class="text-gray-900/60 dark:text-gray-100/60"> Complete <small class="block text-gray-900/60 italic dark:text-gray-100/60"> Ended: <time datetime="2025-03-20T10:00:03+0000"> 10:00 UTC - 20 March 2025 </time> </small> </p> </div> <a href="/notices/pdmoegjg0ihnu7u7-urgent-maintenance-services-degradation" class="mt-1 sm:mt-2 block text-gray-900 dark:text-gray-100"> <p class="text-lg sm:text-xl font-semibold break-words"> URGENT Maintenance & Services Degradation </p> <p class="mt-2 sm:mt-3 text-sm sm:text-base font-normal break-words"> Dear All, We will be performing an urgent maintenance on one of our hosted primary datacenter today 20th March, 2024 between 09:45 and 10:00 UTC Due to this ... </p> <div class="mt-4 w-3/4 pr-2 text-xl font-medium text-gray-600 dark:text-gray-400 truncate"> <span class="inline-flex items-center rounded-md bg-gray-50 dark:bg-gray-400/10 px-2 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 ring-1 ring-inset ring-gray-500/10 dark:ring-gray-400/20 max-w-full [&:not(:first-child)]:ml-1"> <span class="truncate"> WHOIS Database </span> </span> <span class="inline-flex items-center rounded-md bg-gray-50 dark:bg-gray-400/10 px-2 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 ring-1 ring-inset ring-gray-500/10 dark:ring-gray-400/20 max-w-full [&:not(:first-child)]:ml-1"> <span class="truncate"> MyAFRINIC Portal </span> </span> <span class="inline-flex items-center rounded-md bg-gray-50 dark:bg-gray-400/10 px-2 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 ring-1 ring-inset ring-gray-500/10 dark:ring-gray-400/20 max-w-full [&:not(:first-child)]:ml-1"> <span class="truncate"> AFRINIC Web Sites </span> </span> <span class="inline-flex items-center rounded-md bg-gray-50 dark:bg-gray-400/10 px-2 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 ring-1 ring-inset ring-gray-500/10 dark:ring-gray-400/20 max-w-full [&:not(:first-child)]:ml-1"> <span class="truncate"> Mailing Lists </span> </span> <span class="inline-flex items-center rounded-md bg-gray-50 dark:bg-gray-400/10 px-2 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 ring-1 ring-inset ring-gray-500/10 dark:ring-gray-400/20 max-w-full [&:not(:first-child)]:ml-1"> <span class="truncate"> New Member Registration Portal </span> </span> <span class="inline-flex items-center rounded-md bg-gray-50 dark:bg-gray-400/10 px-2 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 ring-1 ring-inset ring-gray-500/10 dark:ring-gray-400/20 max-w-full [&:not(:first-child)]:ml-1"> <span class="truncate"> DNS Services </span> </span> <span class="inline-flex items-center rounded-md bg-gray-50 dark:bg-gray-400/10 px-2 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 ring-1 ring-inset ring-gray-500/10 dark:ring-gray-400/20 max-w-full [&:not(:first-child)]:ml-1"> <span class="truncate"> RPKI Systems </span> </span> </div> </a> <div class="mt-3"> <a href="/notices/pdmoegjg0ihnu7u7-urgent-maintenance-services-degradation" class="text-base font-semibold text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400"> View notice → </a> </div> </div> <div class="border-solid border-2 border-state-resolved dark:border-state-dm-resolved rounded-lg p-4 sm:p-6 text-left transition ease-in-out hover:-translate-y-1 hover:shadow-md duration-300 overflow-hidden"> <div class="mb-3 flex flex-col gap-3"> <div class="h-1 w-8 bg-state-resolved dark:bg-state-dm-resolved rounded-full"></div> <p class="text-gray-900/60 dark:text-gray-100/60"> Resolved <small class="block text-gray-900/60 italic dark:text-gray-100/60"> Ended: <time datetime="2025-03-03T08:02:36+0000"> 08:02 UTC - 3 March 2025 </time> </small> </p> </div> <a href="/notices/3rjrcyyzhw2a8etf-myafrinic-portal-issue" class="mt-1 sm:mt-2 block text-gray-900 dark:text-gray-100"> <p class="text-lg sm:text-xl font-semibold break-words"> MyAFRINIC portal issue </p> <div class="@container"> </div> <p class="mt-2 sm:mt-3 text-sm sm:text-base font-normal break-words"> We're currently facing connection issues with the MyAFRINIC portal. Our team is actively investigating the problem. Users may experience difficulties accessi... </p> <div class="mt-4 w-3/4 pr-2 text-xl font-medium text-gray-600 dark:text-gray-400 truncate"> <span class="inline-flex items-center rounded-md bg-gray-50 dark:bg-gray-400/10 px-2 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 ring-1 ring-inset ring-gray-500/10 dark:ring-gray-400/20 max-w-full [&:not(:first-child)]:ml-1"> <span class="truncate"> MyAFRINIC Portal </span> </span> </div> </a> <div class="mt-3"> <a href="/notices/3rjrcyyzhw2a8etf-myafrinic-portal-issue" class="text-base font-semibold text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400"> View notice → </a> </div> </div> <div class="border-solid border-2 border-state-resolved dark:border-state-dm-resolved rounded-lg p-4 sm:p-6 text-left transition ease-in-out hover:-translate-y-1 hover:shadow-md duration-300 overflow-hidden"> <div class="mb-3 flex flex-col gap-3"> <div class="h-1 w-8 bg-state-resolved dark:bg-state-dm-resolved rounded-full"></div> <p class="text-gray-900/60 dark:text-gray-100/60"> Resolved <small class="block text-gray-900/60 italic dark:text-gray-100/60"> Ended: <time datetime="2025-01-23T10:19:23+0000"> 10:19 UTC - 23 January 2025 </time> </small> </p> </div> <a href="/notices/mcrrz4p80wz5ihic-myafrinic-portal" class="mt-1 sm:mt-2 block text-gray-900 dark:text-gray-100"> <p class="text-lg sm:text-xl font-semibold break-words"> MyAFRINIC Portal </p> <div class="@container"> </div> <p class="mt-2 sm:mt-3 text-sm sm:text-base font-normal break-words"> Dear All, We are currently experiencing connection issues while accessing the MyAFRINIC portal. Our team is working to restore full functionality ASAP Regar... </p> <div class="mt-4 w-3/4 pr-2 text-xl font-medium text-gray-600 dark:text-gray-400 truncate"> <span class="inline-flex items-center rounded-md bg-gray-50 dark:bg-gray-400/10 px-2 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 ring-1 ring-inset ring-gray-500/10 dark:ring-gray-400/20 max-w-full [&:not(:first-child)]:ml-1"> <span class="truncate"> MyAFRINIC Portal </span> </span> </div> </a> <div class="mt-3"> <a href="/notices/mcrrz4p80wz5ihic-myafrinic-portal" class="text-base font-semibold text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400"> View notice → </a> </div> </div> </div> </div> </div> <div class="mb-8 lg:mb-16"> <h4 class="text-lg font-semibold text-gray-900 dark:text-gray-100"> Previous Notices </h4> <p class="my-3 text-base text-gray-500"> <span> Last incident at <time datetime="2025-03-20T10:00:03+0000"> 10:00 UTC - 20 March 2025 </time> </span> </p> <a href="/history/2025/march" class="text-base font-semibold text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400"> History for AFRINIC Status → </a> </div> </div> </div> </div> <footer class="bg-white dark:bg-gray-900 px-4 sm:px-6 lg:px-8"> <div class="max-w-3xl lg:max-w-4xl xl:max-w-5xl 2xl:max-w-7xl mx-auto py-0 overflow-hidden pb-8"> <div class="mt-8 flex flex-col md:flex-row justify-between items-start md:items-end gap-4"> <div class="flex flex-col flex-1 justify-start items-start gap-2"> <p class="text-sm text-gray-400"> © 2025 </p> <div class="flex justify-start items-start gap-4"> <div> <a href="/api" class="font-semibold text-sm text-gray-500 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"> Status API </a> </div> </div> </div> <div class="flex-1 flex flex-col gap-2"> <div class="flex justify-start md:justify-center gap-4"> <a href="https://twitter.com/@afrinic_it" target="_blank" class="text-gray-400 hover:text-gray-500 dark:text-gray-400 dark:hover:text-gray-300"> <i class="fa fa-twitter fa-fw"></i> <span class="sr-only">Twitter</span> <svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true"> <path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" /> </svg> </a> </div> <nav class="mx-0 md:mx-5 flex flex-wrap justify-center gap-4" aria-label="Footer" id="contact-support"> <div> <a href="mailto:noc@afrinic.net" target="_top" class="text-sm text-gray-500 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"> noc@afrinic.net </a> </div> <div> <a href="tel:+230 59 43 86 80" target="_top" class="text-sm text-gray-500 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"> +230 59 43 86 80 </a> </div> </nav> </div> <p class="flex-1 text-sm text-right powered-by"> <a target="_blank" rel="noopener noreferrer" href="https://www.sorryapp.com/powered-by/?utm_campaign=powered-by&utm_medium=status-page-footer&utm_source=status.afrinic.net">Powered by Sorry™</a> </p> </div> </div> </footer> <div v-cloak :class="[is_open ? 'visible' : 'hidden']" class="fixed inset-0 overflow-hidden z-20" aria-labelledby="slide-over-title" role="dialog" aria-modal="true"> <div class="absolute inset-0 overflow-hidden"> <!-- Background overlay, show/hide based on slide-over state. Entering: "ease-in-out duration-500" From: "opacity-0" To: "opacity-100" Leaving: "ease-in-out duration-500" From: "opacity-100" To: "opacity-0" --> <div :class="[is_open ? 'opacity-100' : 'opacity-0']" class="absolute inset-0 bg-gray-500 dark:bg-black bg-opacity-75 dark:bg-opacity-50 transition-opacity" aria-hidden="true" @click="close()"></div> <div class="fixed inset-y-0 right-0 pl-10 max-w-full flex"> <!-- Slide-over panel, show/hide based on slide-over state. Entering: "transition ease-in-out duration-500 sm:duration-700" From: "translate-x-full" To: "translate-x-0" Leaving: "transition ease-in-out duration-500 sm:duration-700" From: "translate-x-0" To: "translate-x-full" --> <div :class="[is_open ? 'transition-x-0' : 'opacity-x-full']" class="relative w-screen max-w-md"> <div class="absolute top-0 left-0 -ml-8 pt-4 pr-2 flex sm:-ml-10 sm:pr-4 opacity-100"> <!-- Close button, show/hide based on slide-over state. Entering: "ease-in-out duration-500" From: "opacity-0" To: "opacity-100" Leaving: "ease-in-out duration-500" From: "opacity-100" To: "opacity-0" --> <button type="button" class="rounded-md text-gray-300 hover:text-white focus:outline-none focus:ring-2 focus:ring-white" @click="close()"> <span class="sr-only">Close panel</span> <!-- Heroicon name: outline/x --> <svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /> </svg> </button> </div> <div class="h-full flex flex-col py-6 bg-white dark:bg-gray-900 shadow-xl overflow-y-scroll"> <div class="relative flex-1 px-4 sm:px-6"> <template v-if="current_panel == panels.LOGIN"> <div class="flex flex-col h-full"> <div class="grow flex flex-col justify-center"> <div> <h2 class="text-center mt-6 text-3xl leading-9 font-semibold text-gray-900 dark:text-gray-100"> Find Your Subscription </h2> <p class="text-center leading-6 font-normal text-gray-600 dark:text-gray-400 my-2 mx-8"> We’ll find your subscription and send you a link to login to manage your preferences. </p> </div> <div class="mt-8" v-scope="SubscriberForm()"> <form class="space-y-6" @submit.prevent="submit()"> <div> <label for="email" class="sr-only"> Email address </label> <input type="email" name="email" id="email" class="bg-white text-gray-900 dark:bg-gray-800 dark:text-gray-200 appearance-none block w-full px-3 py-2 border rounded-md shadow-sm" :class="[errorMessages().length > 0 ? 'border-brand-red-500 text-brand-red-500 placeholder-brand-red-500 focus:ring-brand-red-500 focus:border-brand-red-500 dark:border-brand-dm-red-500 dark:text-brand-dm-red-500 dark:placeholder-brand-dm-red-500 dark:focus:ring-brand-dm-red-500 dark:focus:border-brand-dm-red-500' : 'border-gray-300 dark:border-gray-700 placeholder-gray-400 dark:placeholder-gray-600 focus:ring-brand-primary-500 focus:border-brand-primary-500 dark:focus:ring-brand-dm-primary-500 dark:focus:border-brand-dm-primary-500']" placeholder="Email address" v-model="email" required> <p class="mt-2 text-sm text-brand-red-500 dark:text-brand-dm-red-500" v-for="error in errorMessages()"> {{ error }} </p> </div> <div> <button type="submit" class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-brand-primary-contrast-500 bg-brand-primary-500 hover:bg-brand-primary-600 dark:text-brand-dm-primary-contrast-500 dark:bg-brand-dm-primary-500 dark:hover:bg-brand-dm-primary-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500 disabled:opacity-50" :disabled="loading"> <span v-if="loading"> Loading... </span> <span v-else> Find Subscription </span> </button> </div> </form> </div> </div> <div class="mt-16 flex flex-col gap-4"> <div class="text-sm text-gray-500"> We will share your details with <a href="https://www.sorryapp.com/" target="_blank" class="text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400">Sorry™</a>, who we use to send status updates. You can unsubscribe at any time. </div> <div class="text-sm text-gray-500"> This site is protected by reCAPTCHA and the Google <a class="text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400" href="https://policies.google.com/privacy">Privacy Policy</a> and <a class="text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400" href="https://policies.google.com/terms">Terms of Service</a> apply. </div> </div> </div> </template> <template v-if="current_panel == panels.CHECK_INBOX"> <!-- Alert / Notification Wrapper --> <div class="flex flex-wrap content-center h-full"> <div class="py-4"> <!-- Alert / Notification Content. --> <div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-brand-green-500/10 dark:bg-brand-dm-green-500/10"> <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-brand-green-500 dark:text-brand-dm-green-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 4H6a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-2m-4-1v8m0 0l3-3m-3 3L9 8m-5 5h2.586a1 1 0 01.707.293l2.414 2.414a1 1 0 00.707.293h3.172a1 1 0 00.707-.293l2.414-2.414a1 1 0 01.707-.293H20" /> </svg> </div> <div class="mt-3 text-center"> <h3 class="text-lg leading-6 font-medium text-gray-900 dark:text-gray-100" id="modal-title"> Check Your Inbox </h3> <div class="mt-2 px-4 sm:px-6"> <p class="text-sm text-gray-500"> We’ve found your existing subscription and have emailed you a secure link to manage your preferences. </p> </div> </div> <div class="mt-5"> <button type="button" class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 dark:border-gray-700 shadow-sm px-4 py-2 text-base font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-900 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500" @click.prevent="close()"> Close </button> </div> </div> </div> </template> <template v-if="current_panel == panels.SUBSCRIBE"> <div class="flex flex-col h-full"> <div class="grow flex flex-col justify-center"> <div> <h2 class="text-center mt-6 text-3xl leading-9 font-semibold text-gray-900 dark:text-gray-100"> Subscribe to Status Updates </h2> <p class="text-center leading-6 font-normal text-gray-600 dark:text-gray-400 my-2 mx-8"> We’ll use your email to save your preferences so you can update them later. </p> </div> <div class="mt-8" v-scope="SubscriberForm()"> <form class="space-y-6" @submit.prevent="submit()"> <div> <label for="email" class="sr-only"> Email address </label> <div class="mt-1 relative rounded-md shadow-sm"> <input type="email" name="email" id="email" class="bg-white text-gray-900 dark:bg-gray-800 dark:text-gray-200 appearance-none block w-full px-3 py-2 border rounded-md shadow-sm" :class="[errorMessages().length > 0 ? 'border-brand-red-500 text-brand-red-500 placeholder-brand-red-500 focus:ring-brand-red-500 focus:border-brand-red-500 dark:border-brand-dm-red-500 dark:text-brand-dm-red-500 dark:placeholder-brand-dm-red-500 dark:focus:ring-brand-dm-red-500 dark:focus:border-brand-dm-red-500' : 'border-gray-300 dark:border-gray-700 placeholder-gray-400 dark:placeholder-gray-600 focus:ring-brand-primary-500 focus:border-brand-primary-500 dark:focus:ring-brand-dm-primary-500 dark:focus:border-brand-dm-primary-500']" placeholder="Email address" v-model="email" required> </div> <p class="mt-2 text-sm text-brand-red-500 dark:text-brand-dm-red-500" v-for="error in errorMessages()"> {{ error }} </p> </div> <div> <button type="submit" class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-brand-primary-contrast-500 bg-brand-primary-500 hover:bg-brand-primary-600 dark:text-brand-dm-primary-contrast-500 dark:bg-brand-dm-primary-500 dark:hover:bg-brand-dm-primary-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500 disabled:opacity-50" :disabled="loading"> <span v-if="loading"> Loading... </span> <span v-else> Start subscription </span> </button> </div> <div class="text-center"> <button class="font-medium text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400" @click.prevent="switchPanel(panels.LOGIN)"> Already subscribed? </button> </div> </form> </div> </div> <div class="mt-16 flex flex-col gap-4"> <div class="text-sm text-gray-500"> We will share your details with <a href="https://www.sorryapp.com/" target="_blank" class="text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400">Sorry™</a>, who we use to send status updates. You can unsubscribe at any time. </div> <div class="text-sm text-gray-500"> This site is protected by reCAPTCHA and the Google <a class="text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400" href="https://policies.google.com/privacy">Privacy Policy</a> and <a class="text-brand-primary-600 hover:text-brand-primary-400 dark:text-brand-dm-primary-600 dark:hover:text-brand-dm-primary-400" href="https://policies.google.com/terms">Terms of Service</a> apply. </div> </div> </div> </template> <template v-if="current_panel == panels.PREFERENCES"> <div class="h-full divide-y divide-gray-200 dark:divide-gray-800 flex flex-col"> <div class="h-full"> <div class="p-11 flex flex-col justify-center items-center my-3" v-if="pendingDoubleOptIns().length > 0"> <div class="flex justify-center items-center w-12 h-12 rounded-full bg-brand-green-500/10 dark:bg-brand-dm-green-500/10 my-3"> <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-brand-green-500 dark:text-brand-dm-green-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 4H6a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V6a2 2 0 00-2-2h-2m-4-1v8m0 0l3-3m-3 3L9 8m-5 5h2.586a1 1 0 01.707.293l2.414 2.414a1 1 0 00.707.293h3.172a1 1 0 00.707-.293l2.414-2.414a1 1 0 01.707-.293H20" /> </svg> </div> <div class="text-lg leading-6 font-medium text-gray-900 dark:text-gray-100 text-center my-2"> Check Your Inbox! </div> <div class="text-sm leading-5 font-normal text-gray-500 text-center"> You’re now subscribed, but you’ll need to confirm your contact details before receiving any status updates. </div> </div> <div> <div class="my-8 text-gray-900 dark:text-gray-100 font-medium"> How would you like to be notified? </div> <ul> <li class="p-4 my-3 border rounded-md flex" v-scope="NotificationChannelForm({ active: subscriber.notify_by_email, attribute_name: 'email', value: subscriber.email })" :class="[active ? 'border-brand-primary-500 dark:border-brand-dm-primary-500' : 'border-gray-300 dark:border-gray-700']"> <div class="mr-5"> <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-gray-900 dark:text-gray-100" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" /> </svg> </div> <div class="text-base flex-grow min-w-0 leading-6 font-medium text-gray-600 dark:text-gray-400"> <div> Email </div> <div> <div v-if="editable" class="text-sm leading-5 font-normal"> <form @submit.prevent="save()"> <input type="email" v-model="value" class="bg-white text-gray-900 dark:bg-gray-800 dark:text-gray-200 block w-full px-3 py-2 mt-3 mb-2 sm:text-sm rounded-md border" :class="[errors.length > 0 ? 'border-brand-red-500 text-brand-red-500 placeholder-brand-red-500 focus:ring-brand-red-500 focus:border-brand-red-500 dark:border-brand-dm-red-500 dark:text-brand-dm-red-500 dark:placeholder-brand-dm-red-500 dark:focus:ring-brand-dm-red-500 dark:focus:border-brand-dm-red-500' : 'border-gray-300 dark:border-gray-700 placeholder-gray-400 dark:placeholder-gray-600 focus:ring-brand-primary-500 focus:border-brand-primary-500 dark:focus:ring-brand-dm-primary-500 dark:focus:border-brand-dm-primary-500']" placeholder="joe@example.com" v-effect="if (editable) $el.focus()" ref="input"> <p class="mb-2 text-sm text-brand-red-500 dark:text-brand-dm-red-500" v-for="error in errors"> {{ error }} </p> <button type="submit" class="w-min inline-flex items-center px-2.5 py-1.5 border border-transparent text-xs font-medium rounded shadow-sm text-brand-primary-contrast-500 bg-brand-primary-500 hover:bg-brand-primary-600 dark:text-brand-dm-primary-contrast-500 dark:bg-brand-dm-primary-500 dark:hover:bg-brand-dm-primary-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500 disabled:opacity-50" :disabled="loading"> <span v-if="loading"> Saving... </span> <span v-else> Save </span> </button> <button type="button" @click.prevent="reset()" class="text-xs font-medium ml-3 text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-300"> Cancel </button> </form> </div> <div v-else> <div v-if="value" class="flex mr-8"> <div class="truncate"> {{ value }} </div> <button class="inline-block ml-3 text-brand-primary-500 hover:text-brand-primary-400 dark:text-brand-dm-primary-500 dark:hover:text-brand-dm-primary-400" @click="edit()"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" /> </svg> </button> </div> </div> </div> </div> <!-- Enabled: "bg-brand-primary-600", Not Enabled: "bg-gray-200" --> <button type="button" class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 text-brand-primary-contrast-500 dark:focus:ring-brand-dm-primary-500 dark:text-brand-dm-primary-contrast-500" role="switch" aria-checked="false" @click="toggleActive()" :class="[active ? 'bg-brand-primary-600 dark:bg-brand-dm-primary-600' : 'bg-gray-200 dark:bg-gray-800']"> <span class="sr-only"></span> <!-- Enabled: "translate-x-5", Not Enabled: "translate-x-0" --> <span class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white dark:bg-gray-900 shadow ring-0 transition ease-in-out duration-200" :class="[active ? 'translate-x-5' : 'translate-x-0']"> <!-- Enabled: "opacity-0 ease-out duration-100", Not Enabled: "opacity-100 ease-in duration-200" --> <span class="ease-in duration-200 absolute inset-0 h-full w-full flex items-center justify-center transition-opacity" aria-hidden="true" :class="[active ? 'opacity-100' : 'opacity-0']"> <svg class="h-3 w-3 text-gray-400 dark:text-gray-600" fill="none" viewBox="0 0 12 12"> <path d="M4 8l2-2m0 0l2-2M6 6L4 4m2 2l2 2" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /> </svg> </span> <!-- Enabled: "opacity-100 ease-in duration-200", Not Enabled: "opacity-0 ease-out duration-100" --> <span class="ease-out duration-100 absolute inset-0 h-full w-full flex items-center justify-center transition-opacity" aria-hidden="true" :class="[active ? 'opacity-0' : 'opacity-100']"> <svg class="h-3 w-3 text-brand-primary-600 dark:text-brand-dm-primary-600" fill="currentColor" viewBox="0 0 12 12"> <path d="M3.707 5.293a1 1 0 00-1.414 1.414l1.414-1.414zM5 8l-.707.707a1 1 0 001.414 0L5 8zm4.707-3.293a1 1 0 00-1.414-1.414l1.414 1.414zm-7.414 2l2 2 1.414-1.414-2-2-1.414 1.414zm3.414 2l4-4-1.414-1.414-4 4 1.414 1.414z" /> </svg> </span> </span> </button> </li> <li class="p-4 my-3 border rounded-md flex" v-scope="NotificationChannelForm({ active: subscriber.notify_by_slack_webhook_url, attribute_name: 'slack_webhook_url', value: subscriber.slack_webhook_url })" :class="[active ? 'border-brand-primary-500 dark:border-brand-dm-primary-500' : 'border-gray-300 dark:border-gray-700']"> <div class="mr-5"> <svg class="h-6 w-6 text-gray-900 dark:text-gray-100" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path d="M13.1385 3.00445C12.945 2.98944 12.7459 3.01205 12.5503 3.07747C11.768 3.33915 11.3449 4.18679 11.6065 4.96907L12.2245 6.81605L8.70221 7.99374L8.11133 6.22653C7.84965 5.44425 7.00201 5.02243 6.21973 5.28411C5.43677 5.54579 5.01563 6.39208 5.27731 7.17436L5.86819 8.94156L4.0212 9.55948C3.23893 9.82116 2.81575 10.6674 3.07743 11.4497C3.33911 12.232 4.18676 12.6552 4.96903 12.3935L6.81601 11.7756L7.9937 15.2978L6.22649 15.8887C5.44422 16.1504 5.02239 16.998 5.28407 17.7803C5.54576 18.5633 6.39205 18.9844 7.17432 18.7227L8.94153 18.1318L9.55944 19.9788C9.82113 20.7611 10.6674 21.1843 11.4497 20.9226C12.232 20.6609 12.6545 19.8133 12.3935 19.031L11.7755 17.184L15.2978 16.005L15.8887 17.7735C16.1503 18.5558 16.998 18.9776 17.7803 18.716C18.5632 18.4543 18.985 17.608 18.724 16.8257L18.1318 15.0572L19.9788 14.4392C20.7611 14.1776 21.1842 13.3313 20.9226 12.549C20.6609 11.7667 19.8132 11.3449 19.031 11.6066L17.184 12.2245L16.0063 8.70224L17.7735 8.11137C18.5558 7.84969 18.9776 7.00204 18.7159 6.21977C18.4542 5.43749 17.608 5.01567 16.8257 5.27735L15.0585 5.86822L14.4406 4.02124C14.2443 3.43453 13.7189 3.04949 13.1385 3.00445ZM13.1723 9.65007L14.35 13.1723L10.8277 14.35L9.65003 10.8278L13.1723 9.65007Z" /> </svg> </div> <div class="text-base flex-grow min-w-0 leading-6 font-medium text-gray-600 dark:text-gray-400"> <div> Slack </div> <div> <div v-if="editable" class="text-sm leading-5 font-normal"> <a href="/subscriber/auth/slack/initiate" class="inline-flex items-center mt-3 px-2.5 py-1.5 border border-transparent text-xs font-medium rounded shadow-sm text-white bg-slack-aubergine hover:bg-slack-aubergine-null focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500 disabled:opacity-50"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 mr-2" viewBox="0 0 122.8 122.8"> <path d="M25.8 77.6c0 7.1-5.8 12.9-12.9 12.9S0 84.7 0 77.6s5.8-12.9 12.9-12.9h12.9v12.9zm6.5 0c0-7.1 5.8-12.9 12.9-12.9s12.9 5.8 12.9 12.9v32.3c0 7.1-5.8 12.9-12.9 12.9s-12.9-5.8-12.9-12.9V77.6z" fill="#e01e5a"></path> <path d="M45.2 25.8c-7.1 0-12.9-5.8-12.9-12.9S38.1 0 45.2 0s12.9 5.8 12.9 12.9v12.9H45.2zm0 6.5c7.1 0 12.9 5.8 12.9 12.9s-5.8 12.9-12.9 12.9H12.9C5.8 58.1 0 52.3 0 45.2s5.8-12.9 12.9-12.9h32.3z" fill="#36c5f0"></path> <path d="M97 45.2c0-7.1 5.8-12.9 12.9-12.9s12.9 5.8 12.9 12.9-5.8 12.9-12.9 12.9H97V45.2zm-6.5 0c0 7.1-5.8 12.9-12.9 12.9s-12.9-5.8-12.9-12.9V12.9C64.7 5.8 70.5 0 77.6 0s12.9 5.8 12.9 12.9v32.3z" fill="#2eb67d"></path> <path d="M77.6 97c7.1 0 12.9 5.8 12.9 12.9s-5.8 12.9-12.9 12.9-12.9-5.8-12.9-12.9V97h12.9zm0-6.5c-7.1 0-12.9-5.8-12.9-12.9s5.8-12.9 12.9-12.9h32.3c7.1 0 12.9 5.8 12.9 12.9s-5.8 12.9-12.9 12.9H77.6z" fill="#ecb22e"></path> </svg> Add to Slack </a> </div> </div> </div> <!-- Enabled: "bg-brand-primary-600", Not Enabled: "bg-gray-200" --> <button type="button" class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 text-brand-primary-contrast-500 dark:focus:ring-brand-dm-primary-500 dark:text-brand-dm-primary-contrast-500" role="switch" aria-checked="false" @click="toggleActive()" :class="[active ? 'bg-brand-primary-600 dark:bg-brand-dm-primary-600' : 'bg-gray-200 dark:bg-gray-800']"> <span class="sr-only"></span> <!-- Enabled: "translate-x-5", Not Enabled: "translate-x-0" --> <span class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white dark:bg-gray-900 shadow ring-0 transition ease-in-out duration-200" :class="[active ? 'translate-x-5' : 'translate-x-0']"> <!-- Enabled: "opacity-0 ease-out duration-100", Not Enabled: "opacity-100 ease-in duration-200" --> <span class="ease-in duration-200 absolute inset-0 h-full w-full flex items-center justify-center transition-opacity" aria-hidden="true" :class="[active ? 'opacity-100' : 'opacity-0']"> <svg class="h-3 w-3 text-gray-400 dark:text-gray-600" fill="none" viewBox="0 0 12 12"> <path d="M4 8l2-2m0 0l2-2M6 6L4 4m2 2l2 2" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /> </svg> </span> <!-- Enabled: "opacity-100 ease-in duration-200", Not Enabled: "opacity-0 ease-out duration-100" --> <span class="ease-out duration-100 absolute inset-0 h-full w-full flex items-center justify-center transition-opacity" aria-hidden="true" :class="[active ? 'opacity-0' : 'opacity-100']"> <svg class="h-3 w-3 text-brand-primary-600 dark:text-brand-dm-primary-600" fill="currentColor" viewBox="0 0 12 12"> <path d="M3.707 5.293a1 1 0 00-1.414 1.414l1.414-1.414zM5 8l-.707.707a1 1 0 001.414 0L5 8zm4.707-3.293a1 1 0 00-1.414-1.414l1.414 1.414zm-7.414 2l2 2 1.414-1.414-2-2-1.414 1.414zm3.414 2l4-4-1.414-1.414-4 4 1.414 1.414z" /> </svg> </span> </span> </button> </li> </ul> </div> <div class="flex flex-row items-center bg-gray-100 dark:bg-gray-800 rounded-lg py-2 my-8"> <p class="italic text-gray-500 px-4"> Subscribe to other services using the bell icon on the subscribe button on the status page. </p> <div class="mx-5"> <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" /> </svg> </div> </div> </div> <div class="flex-shrink-0 py-4 flex justify-between"> <button type="button" class="py-2 px-4 text-sm font-medium text-brand-red-500 hover:text-brand-red-400 dark:text-brand-dm-red-500 dark:hover:text-brand-dm-red-400 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-red-500 dark:focus:ring-brand-dm-red-500" @click="switchPanel(panels.UNSUBSCRIBE)"> Unsubscribe completely </button> <button type="button" class="ml-4 inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-brand-primary-contrast-500 bg-brand-primary-500 hover:bg-brand-primary-600 dark:text-brand-dm-primary-contrast-500 dark:bg-brand-dm-primary-500 dark:hover:bg-brand-dm-primary-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500" @click="close()"> Done </button> </div> </div> </template> <template v-if="current_panel == panels.UNSUBSCRIBE"> <!-- Alert / Notification Wrapper --> <div class="flex flex-wrap content-center h-full"> <div class="py-4"> <!-- Alert / Notification Content. --> <div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-brand-red-500/10 dark:bg-brand-dm-red-500/10"> <!-- Heroicon name: outline/exclamation --> <svg class="h-6 w-6 text-brand-red-500 dark:text-brand-dm-red-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /> </svg> </div> <div class="mt-3 text-center"> <h3 class="text-lg leading-6 font-medium text-gray-900 dark:text-gray-100" id="modal-title"> Unsubscribe Completely? </h3> <div class="mt-2 px-4 sm:px-6"> <p class="text-sm text-gray-500"> You’ll no long receive any status updates from AFRINIC Status, are you sure? </p> </div> </div> <div class="mt-5" v-scope="UnsubscribeButton()"> <button type="button" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-brand-red-500 dark:bg-brand-dm-red-500 text-base font-medium text-brand-red-contrast-500 dark:text-brand-dm-red-contrast-500 hover:bg-brand-red-600 dark:hover:bg-brand-dm-red-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-red-500 dark:focus:ring-brand-dm-red-500 disabled:opacity-50" @click="click()" :disabled="loading"> <span v-if="loading"> Unsubscribing... </span> <span v-else> Yes, Unsubscribe Completely </span> </button> <button type="button" class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 dark:border-gray-700 shadow-sm px-4 py-2 text-base font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-900 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:focus:ring-brand-dm-primary-500" @click="switchPanel(panels.PREFERENCES)"> Cancel </button> <p v-for="error in errors" class="text-center mt-4 text-brand-red-600 dark:text-brand-dm-red-600"> {{ error }} </p> </div> </div> </div> </template> <template v-if="current_panel == panels.UNSUBSCRIBED"> <!-- Alert / Notification Wrapper --> <div class="flex flex-wrap content-center h-full"> <div class="py-4"> <!-- Alert / Notification Content. --> <div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-brand-green-500/10 dark:bg-brand-dm-green-500/10"> <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-brand-green-500 dark:text-brand-dm-green-500" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" /> </svg> </div> <div class="mt-3 text-center"> <h3 class="text-lg leading-6 font-medium text-gray-900 dark:text-gray-100" id="modal-title"> You’re Unsubscribed! </h3> <div class="mt-2 px-4 sm:px-6"> <p class="text-sm text-gray-500"> We’ll no longer send you any status updates about AFRINIC Status. </p> </div> </div> <div class="mt-5"> <button type="button" class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 dark:border-gray-700 shadow-sm px-4 py-2 text-base font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-900 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-brand-primary-500 dark:ocus:ring-brand-dm-primary-500" @click.prevent="close()"> Close </button> </div> </div> </div> </template> </div> </div> </div> </div> </div> </div> <script src="https://www.google.com/recaptcha/api.js?render=6Lc1z5MiAAAAAArBLreBfxilmog9tuu1Eqh2cCNM" nonce="JsvqjUduuGFd6+AOkJzOgXtet0l8xHDv8psL/BphW/8="></script> <script src="https://assets0.sorryapp.com/themes/000/025/497/assets/vendor.min.js?1738175145" nonce="JsvqjUduuGFd6+AOkJzOgXtet0l8xHDv8psL/BphW/8="></script> <script src="https://assets3.sorryapp.com/themes/000/025/497/assets/main.min.js?1738175145" nonce="JsvqjUduuGFd6+AOkJzOgXtet0l8xHDv8psL/BphW/8=" type="module"></script> <script id="initialSubscriberPayload" nonce="JsvqjUduuGFd6+AOkJzOgXtet0l8xHDv8psL/BphW/8="> window.components = [ { id: 652, parent_id: null }, { id: 670, parent_id: 652 }, { id: 671, parent_id: 652 }, { id: 672, parent_id: 652 }, { id: 3366, parent_id: 652 }, { id: 3367, parent_id: 652 }, { id: 653, parent_id: null }, { id: 654, parent_id: null }, { id: 673, parent_id: 654 }, { id: 674, parent_id: 654 }, { id: 675, parent_id: 654 }, { id: 678, parent_id: 654 }, { id: 929, parent_id: 654 }, { id: 655, parent_id: null }, { id: 676, parent_id: null }, { id: 679, parent_id: null }, { id: 931, parent_id: 679 }, { id: 930, parent_id: 679 }, { id: 677, parent_id: null }, { id: 656, parent_id: null }, ] </script> </body> </html>